[PATCH 0/6] Rewrite chewing internal in Rust #347

81 views
Skip to first unread message

Kan-Ru Chen

unread,
Jan 26, 2023, 8:42:27 PM1/26/23
to chewin...@googlegroups.com, czc...@czchen.org, jser...@gmail.com, Kan-Ru Chen
Hi, I plan to merge the Rust rewrite in to mainline and continue the
development with the following plan.

## Goal

Rewrite libchewing in Rust, to encourage more radical development and
contribution.

The rough plan is as following

1. Deprecate autotools support because Cmake works pretty well, there's no need
to maintain two build systems.
2. Integrate Rust build system with CMake so we can link the static library
produced by Rust with C code.
3. Rewrite all core concepts in Rust (**we are here**)
4. Rewrite the line editor interface in Rust
5. Build libchewing dynamic library directly from Rust (*optional*)
6. Publish stable release of the chewing crate <https://crates.io/crates/chewing>

Current state

* All zhuyin, dictionary, conversion algorithm are available in Rust
* init_database is rewrote in Rust using the new chewing crate
* About 30% of the new code is documented <https://docs.rs/chewing>

To do

* Design and rewrite the symbol table feature, maybe we can build on the new
dictionary format
* Design and write the line editor that should provide similar API provided by
chewingio.c
* choice.c is intertwined with chewingio.c and chewingutil.c so we probably
need to consider it in this design
* Document and stabilize the public API

## New features

* Public Bopomofo & Syllable API
* Public Dictionary reader and builder API
* New static dictionary format defined in RIFF container format
* Platform independent, extensively documented
* Allow embedding metadata including author, copyright, software used, etc.
* New sqlite user dictionary format and auto migration support, in order to
support the same dictionary interface.
* New stackable dictionary. Allow users to share and stack user defined
dictionary on top of system dictionary.

## Deprecated feature

* Plain text user dictionary (hash.dat)
* Old binary user dictionary (uhash.dat)
* Can always provide auto migrator if needed. Patches welcome.

Please review! The same PR is available at <https://github.com/chewing/libchewing/pull/347>

Kan-Ru Chen (6):
build: deprecate autotools
build: refactor CMakeLists.txt
build: introduce rust implemented public interfaces
build: introduce rust implemented internals
rust: full internal implementation
rust: publish to crates.io

.gitignore | 14 +-
.gitmodules | 3 +
CMakeLists.txt | 249 +-
Cargo.lock | 751 +
Cargo.toml | 33 +
Makefile.am | 72 -
autogen.sh | 7 -
capi/chewing-internal/Cargo.toml | 17 +
capi/chewing-internal/build.rs | 8 +
capi/chewing-internal/cbindgen.toml | 34 +
.../include/chewing_internal.h | 512 +
capi/chewing-internal/src/binding.rs | 13 +
capi/chewing-internal/src/bopomofo.rs | 242 +
capi/chewing-internal/src/compat.rs | 11 +
capi/chewing-internal/src/conversion.rs | 94 +
capi/chewing-internal/src/dict.rs | 165 +
capi/chewing-internal/src/ffi.rs | 21 +
capi/chewing-internal/src/key2pho.rs | 132 +
capi/chewing-internal/src/lib.rs | 11 +
capi/chewing-internal/src/path.rs | 86 +
capi/chewing-internal/src/types.rs | 256 +
capi/chewing-internal/src/userphrase.rs | 299 +
capi/chewing-internal/src/utf8.rs | 94 +
capi/chewing-public/Cargo.toml | 15 +
capi/chewing-public/build.rs | 8 +
capi/chewing-public/cbindgen.toml | 84 +
capi/chewing-public/include/chewing_rs.h | 134 +
capi/chewing-public/src/io.rs | 18 +
capi/chewing-public/src/lib.rs | 1 +
capi/chewing-public/src/types.rs | 47 +
cmake/corrosion | 1 +
configure.ac | 235 -
data/CMakeLists.txt | 74 +
data/Makefile.am | 33 -
data/word.src | 26096 ++++++++++++++++
doc/CMakeLists.txt | 21 +
doc/Makefile.am | 3 -
include/chewing.h | 6 +-
include/chewingio.h | 6 +-
include/global.h | 24 -
include/internal/bopomofo-private.h | 4 +
include/internal/chewing-private.h | 56 +-
include/internal/hash-private.h | 1 -
include/internal/key2pho-private.h | 13 +-
include/mod_aux.h | 6 +-
m4/ax_pthread.m4 | 317 -
m4/ax_with_curses.m4 | 518 -
src/Makefile.am | 62 -
src/bopomofo.c | 21 +
src/chewing-sql.c | 82 +-
src/chewing.c | 0
src/chewingio.c | 223 +-
src/chewingutil.c | 166 +-
src/choice.c | 43 +-
src/common/Makefile.am | 19 -
src/common/key2pho.c | 22 +-
src/conversion.rs | 38 +
src/conversion/chewing_conversion.rs | 698 +
src/dict.c | 20 +-
src/dictionary.rs | 445 +
src/dictionary/layered.rs | 188 +
src/dictionary/sqlite.rs | 625 +
src/dictionary/trie.rs | 1224 +
src/editor.rs | 6 +
src/editor/estimate.rs | 112 +
src/editor/keymap.rs | 159 +
src/editor/layout.rs | 87 +
src/editor/layout/dc26.rs | 185 +
src/editor/layout/et.rs | 135 +
src/editor/layout/et26.rs | 222 +
src/editor/layout/ginyieh.rs | 134 +
src/editor/layout/hsu.rs | 281 +
src/editor/layout/ibm.rs | 135 +
src/editor/layout/pinyin.rs | 498 +
src/editor/layout/standard.rs | 136 +
src/hash.c | 54 +-
src/lib.rs | 9 +
src/mod_aux.c | 9 +-
src/path.rs | 58 +
src/pinyin.c | 42 +-
src/porting_layer/Makefile.am | 9 -
src/porting_layer/src/Makefile.am | 17 -
src/private.h | 37 +
src/tools/Makefile.am | 28 -
src/tree.c | 27 +-
src/userphrase-hash.c | 8 +-
src/userphrase-sql.c | 76 +-
src/zhuyin.rs | 5 +
src/zhuyin/bopomofo.rs | 298 +
src/zhuyin/syllable.rs | 485 +
test/CMakeLists.txt | 105 +
test/Makefile.am | 94 -
test/test-bopomofo.c | 6 +-
test/test-key2pho.c | 1 -
test/test-path.c | 11 +
test/testhelper.c | 8 +-
test/testhelper.h | 34 +-
thirdparty/sqlite-amalgamation/Makefile.am | 23 -
tools/Cargo.toml | 12 +
tools/src/bin/init_database.rs | 121 +
100 files changed, 36387 insertions(+), 2001 deletions(-)
create mode 100644 .gitmodules
create mode 100644 Cargo.lock
create mode 100644 Cargo.toml
delete mode 100644 Makefile.am
delete mode 100755 autogen.sh
create mode 100644 capi/chewing-internal/Cargo.toml
create mode 100644 capi/chewing-internal/build.rs
create mode 100644 capi/chewing-internal/cbindgen.toml
create mode 100644 capi/chewing-internal/include/chewing_internal.h
create mode 100644 capi/chewing-internal/src/binding.rs
create mode 100644 capi/chewing-internal/src/bopomofo.rs
create mode 100644 capi/chewing-internal/src/compat.rs
create mode 100644 capi/chewing-internal/src/conversion.rs
create mode 100644 capi/chewing-internal/src/dict.rs
create mode 100644 capi/chewing-internal/src/ffi.rs
create mode 100644 capi/chewing-internal/src/key2pho.rs
create mode 100644 capi/chewing-internal/src/lib.rs
create mode 100644 capi/chewing-internal/src/path.rs
create mode 100644 capi/chewing-internal/src/types.rs
create mode 100644 capi/chewing-internal/src/userphrase.rs
create mode 100644 capi/chewing-internal/src/utf8.rs
create mode 100644 capi/chewing-public/Cargo.toml
create mode 100644 capi/chewing-public/build.rs
create mode 100644 capi/chewing-public/cbindgen.toml
create mode 100644 capi/chewing-public/include/chewing_rs.h
create mode 100644 capi/chewing-public/src/io.rs
create mode 100644 capi/chewing-public/src/lib.rs
create mode 100644 capi/chewing-public/src/types.rs
create mode 160000 cmake/corrosion
delete mode 100644 configure.ac
create mode 100644 data/CMakeLists.txt
delete mode 100644 data/Makefile.am
create mode 100644 data/word.src
create mode 100644 doc/CMakeLists.txt
delete mode 100644 doc/Makefile.am
delete mode 100644 m4/ax_pthread.m4
delete mode 100644 m4/ax_with_curses.m4
delete mode 100644 src/Makefile.am
create mode 100644 src/chewing.c
delete mode 100644 src/common/Makefile.am
create mode 100644 src/conversion.rs
create mode 100644 src/conversion/chewing_conversion.rs
create mode 100644 src/dictionary.rs
create mode 100644 src/dictionary/layered.rs
create mode 100644 src/dictionary/sqlite.rs
create mode 100644 src/dictionary/trie.rs
create mode 100644 src/editor.rs
create mode 100644 src/editor/estimate.rs
create mode 100644 src/editor/keymap.rs
create mode 100644 src/editor/layout.rs
create mode 100644 src/editor/layout/dc26.rs
create mode 100644 src/editor/layout/et.rs
create mode 100644 src/editor/layout/et26.rs
create mode 100644 src/editor/layout/ginyieh.rs
create mode 100644 src/editor/layout/hsu.rs
create mode 100644 src/editor/layout/ibm.rs
create mode 100644 src/editor/layout/pinyin.rs
create mode 100644 src/editor/layout/standard.rs
create mode 100644 src/lib.rs
create mode 100644 src/path.rs
delete mode 100644 src/porting_layer/Makefile.am
delete mode 100644 src/porting_layer/src/Makefile.am
delete mode 100644 src/tools/Makefile.am
create mode 100644 src/zhuyin.rs
create mode 100644 src/zhuyin/bopomofo.rs
create mode 100644 src/zhuyin/syllable.rs
create mode 100644 test/CMakeLists.txt
delete mode 100644 test/Makefile.am
delete mode 100644 thirdparty/sqlite-amalgamation/Makefile.am
create mode 100644 tools/Cargo.toml
create mode 100644 tools/src/bin/init_database.rs

--
2.39.1

Kan-Ru Chen

unread,
Jan 26, 2023, 8:42:39 PM1/26/23
to chewin...@googlegroups.com, czc...@czchen.org, jser...@gmail.com, Kan-Ru Chen
---
Makefile.am | 72 ---
autogen.sh | 7 -
configure.ac | 235 ----------
data/Makefile.am | 33 --
doc/Makefile.am | 3 -
m4/ax_pthread.m4 | 317 -------------
m4/ax_with_curses.m4 | 518 ---------------------
src/Makefile.am | 62 ---
src/common/Makefile.am | 19 -
src/porting_layer/Makefile.am | 9 -
src/porting_layer/src/Makefile.am | 17 -
src/tools/Makefile.am | 28 --
test/Makefile.am | 94 ----
thirdparty/sqlite-amalgamation/Makefile.am | 23 -
14 files changed, 1437 deletions(-)
delete mode 100644 Makefile.am
delete mode 100755 autogen.sh
delete mode 100644 configure.ac
delete mode 100644 data/Makefile.am
delete mode 100644 doc/Makefile.am
delete mode 100644 m4/ax_pthread.m4
delete mode 100644 m4/ax_with_curses.m4
delete mode 100644 src/Makefile.am
delete mode 100644 src/common/Makefile.am
delete mode 100644 src/porting_layer/Makefile.am
delete mode 100644 src/porting_layer/src/Makefile.am
delete mode 100644 src/tools/Makefile.am
delete mode 100644 test/Makefile.am
delete mode 100644 thirdparty/sqlite-amalgamation/Makefile.am

diff --git a/Makefile.am b/Makefile.am
deleted file mode 100644
index 1742a80..0000000
--- a/Makefile.am
+++ /dev/null
@@ -1,72 +0,0 @@
-ACLOCAL_AMFLAGS = -I m4
-AUTOMAKE_OPTIONS = foreign
-
-if WITH_INTERNAL_SQLITE3
-SUBDIRS = thirdparty/sqlite-amalgamation
-else
-SUBDIRS =
-endif
-SUBDIRS += src/tools data src test doc
-
-CMAKE_FILES = \
- cmake/config.h.in \
- cmake/FindCurses.cmake \
- cmake/version.texi.in \
- CMakeLists.txt \
- $(NULL)
-
-CONTRIB_FILES = \
- contrib/python/test.py \
- contrib/python/chewing.py \
- contrib/simple-select.c \
- contrib/Makefile \
- $(NULL)
-
-EXTRA_DIST = \
- autogen.sh \
- $(CMAKE_FILES) \
- $(CONTRIB_FILES) \
- $(NULL)
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = chewing.pc
-
-chewing_includedir = $(includedir)/chewing
-chewing_include_HEADERS = \
- include/chewingio.h \
- include/mod_aux.h \
- include/chewing.h \
- include/chewing-compat.h \
- include/global.h \
- $(NULL)
-
-noinst_HEADERS =\
- include/internal/chewing-private.h \
- include/internal/chewing-sql.h \
- include/internal/chewing-utf8-util.h \
- include/internal/chewingutil.h \
- include/internal/choice-private.h \
- include/internal/dict-private.h \
- include/internal/global-private.h \
- include/internal/hash-private.h \
- include/internal/key2pho-private.h \
- include/internal/memory-private.h \
- include/internal/pinyin-private.h \
- include/internal/tree-private.h \
- include/internal/userphrase-private.h \
- include/internal/bopomofo-private.h \
- thirdparty/sqlite-amalgamation/sqlite3ext.h \
- thirdparty/sqlite-amalgamation/sqlite3.h \
- $(NULL)
-
-dist_noinst_DATA = \
- README.md \
- $(NULL)
-
-# Maintainer's release target
-release:
- $(MAKE) distdir
- $(top_srcdir)/scripts/git2cl > $(distdir)/ChangeLog
- cat $(top_srcdir)/scripts/ChangeLog-svn >> $(distdir)/ChangeLog
- tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
- $(am__remove_distdir)
diff --git a/autogen.sh b/autogen.sh
deleted file mode 100755
index 8f66be3..0000000
--- a/autogen.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#! /bin/sh
-
-AUTORECONF_ARGS=-i
-mkdir -p m4
-AUTORECONF_ARGS="$AUTORECONF_ARGS -I m4"
-
-autoreconf $AUTORECONF_ARGS
diff --git a/configure.ac b/configure.ac
deleted file mode 100644
index e1c7399..0000000
--- a/configure.ac
+++ /dev/null
@@ -1,235 +0,0 @@
-# Process this file with autoconf to produce a configure script.
-
-AC_PREREQ([2.65])
-
-# Update CMakeLists.txt if version is changed.
-AC_INIT([libchewing],[0.5.1],[chewin...@googlegroups.com])
-AC_CONFIG_AUX_DIR([build-aux])
-AC_CONFIG_SRCDIR([src/chewingio.c])
-AC_CONFIG_MACRO_DIR([m4])
-
-AC_SUBST(PACKAGE_VERSION)
-
-# libtool versioning for libchewing
-
-# Update CMakeLists.txt if one of MAJOR/MINOR/REVISION is updated.
-#
-# We use major/minor/revision instead of current/revision/age format here is due
-# to buggy behavior in libtool in BSD family. See the following link for detail
-# information.
-#
-# https://lists.gnu.org/archive/html/bug-libtool/2011-05/msg00007.html
-#
-# The following link shows versioning policies in FreeBSD for your reference.
-#
-# http://www.freebsd.org/doc/en/books/developers-handbook/policies-shlib.html
-
-# increment if the interface has incompatible update (changes, removals).
-LIBCHEWING_MAJOR=3
-
-# increment if the inteface has compatible update (additions).
-# Set to 0 if MAJOR is increased.
-LIBCHEWING_MINOR=3
-
-# increment any time the source changes
-# Set to 0 if MAJOR or MINOR is increased.
-LIBCHEWING_REVISION=1
-
-AC_SUBST(LIBCHEWING_MAJOR)
-AC_SUBST(LIBCHEWING_MINOR)
-AC_SUBST(LIBCHEWING_REVISION)
-
-# Define a string for the earliest version that this release has
-# binary compatibility with. This is used for module locations.
-#
-# Update CMakeFiles.txt if LIBCHEWING_BINARY_VERSION is changed.
-LIBCHEWING_BINARY_VERSION=1.0.0
-AC_SUBST(LIBCHEWING_BINARY_VERSION)
-
-AC_DEFINE_UNQUOTED(LIBCHEWING_BINARY_VERSION,
- "$LIBCHEWING_BINARY_VERSION", [The binary version of libchewing.])
-AC_DEFINE_UNQUOTED(LIBCHEWING_VERSION,
- "$PACKAGE_VERSION", [The release version of libchewing.])
-
-# Init automake stuff
-AM_INIT_AUTOMAKE
-AM_SILENT_RULES([yes])
-AC_CONFIG_HEADERS([include/config.h])
-
-# Init libtool
-LT_INIT([win32-dll pic-only])
-
-# libtool option to control which symbols are exported
-# right now, symbols starting with _ are not exported
-AC_SUBST(LIBTOOL_EXPORT_OPTIONS, ['-export-symbols-regex "^[[^_]].*"'])
-
-# Checks for programs.
-AC_PROG_CC
-AC_PROG_CC_C99
-AM_PROG_CC_C_O
-AC_LANG(C)
-AC_C_BIGENDIAN
-
-# Checks for library functions.
-AC_FUNC_MALLOC
-AC_CHECK_FUNCS([strtok_r asprintf])
-
-# options
-AC_ARG_WITH([sqlite3],
- AS_HELP_STRING([--with-sqlite3], [Use sqlite3 to store userphrase @<:@default=yes@:>@]),
- [],
- [with_sqlite3=yes])
-AM_CONDITIONAL([WITH_SQLITE3], [test x"$with_sqlite3" = x"yes"])
-
-AC_ARG_WITH([internal-sqlite3],
- AS_HELP_STRING([--with-internal-sqlite3], [Use internal sqlite3 instead of system-wide @<:@default=no@:>@]),
- [],
- [with_internal_sqlite3=no])
-AM_CONDITIONAL([WITH_INTERNAL_SQLITE3], [test x"$with_internal_sqlite3" = x"yes"])
-
-# for sqlite
-AS_IF([test x"$with_sqlite3" = x"yes"], [
- AC_DEFINE([WITH_SQLITE3], [1], [Use sqlite3 to store userphrase])
- AS_IF([test x"$with_internal_sqlite3" = x"no"],
- [
- AC_SEARCH_LIBS([sqlite3_open], [sqlite3],
- [AS_IF([test x$ac_cv_search_sqlite3_open != x"none required"],
- [AM_LDFLAGS="$AM_LDFLAGS $ac_cv_search_sqlite3_open"])],
- [AC_MSG_ERROR([unable to find the sqlite3() function])])
- ],
- [
- AC_SEARCH_LIBS([dlopen], [dl dld],
- [AS_IF([test x$ac_cv_search_dlopen != x"none required"],
- [AM_LDFLAGS="$AM_LDFLAGS $ac_cv_search_dlopen"])],
- [AC_MSG_ERROR([unable to find the dlopen() function])])
- AX_PTHREAD([
- AM_CFLAGS="$AM_CFLAGS $PTHREAD_CFLAGS"
- AM_LDFLAGS="$AM_LDFLAGS $PTHREAD_LIBS"
- ], [AC_MSG_ERROR([cannot find pthread])])
- ])
-])
-
-# plat_mmap_posix
-AC_FUNC_MMAP
-
-# chewing-utf8-util.h
-AC_TYPE_SIZE_T
-
-# chewing-private.h
-AC_C_INLINE
-AC_TYPE_UINT16_T
-
-CC_FOR_BUILD=${CC_FOR_BUILD-${CC}}
-AC_SUBST(CC_FOR_BUILD)
-
-# Default CFLAGS
-AM_CFLAGS="$AM_CFLAGS -Wall $CFLAGS"
-
-# Add '_GNU_SOURCE' for asprintf
-AS_IF([test x$ac_cv_func_asprintf = xyes],
- [DEFAULT_CPPFLAGS="$DEFAULT_CPPFLAGS -D_GNU_SOURCE"])
-
-AX_WITH_CURSES
-AM_CONDITIONAL([ENABLE_TEXT_UI], [test x$ax_cv_ncursesw = "xyes"])
-
-# Options
-dnl Enable gcov for coverage test
-AC_ARG_ENABLE([gcov],
- [AS_HELP_STRING([--enable-gcov], [Turn on gcov support @<:@default=no@:>@])],
- [AS_CASE([${enableval}], [yes], [ENABLE_GCOV="true"], [ENABLE_GCOV="false"])],
- [ENABLE_GCOV="false"])
-AS_IF([test x$ENABLE_GCOV = x"true"], [AM_CFLAGS="$AM_CFLAGS --coverage" AM_LDFLAGS="$AM_LDFLAGS --coverage"])
-
-dnl Adds -fvisibility=hidden to CFLAGS if running with gcc 4 or greater.
-AC_MSG_CHECKING([whether the compiler supports GCC Visibility])
-dnl Check for gcc4 or greater
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-void
-#if defined(__GNUC__) && (__GNUC__ >= 4)
-foo () {};
-#endif
-]], [[]])],[
- has_visibility=yes
- AM_CFLAGS="$AM_CFLAGS -fvisibility=hidden"
-],[
- has_visibility=no
-])
-AC_MSG_RESULT($has_visibility)
-
-AC_CACHE_CHECK([whether the linker supports --no-undefined],
- [ac_cv_no_undefined],
- [
- saved_LDFLAGS="${LDFLAGS}"
- LDFLAGS="${LDFLAGS} -Wl,--no-undefined"
- AC_TRY_LINK([], [], [ac_cv_no_undefined=yes], [ac_cv_no_undefined=no])
- LDFLAGS="${saved_LDFLAGS}"
-])
-AS_IF([test x$ac_cv_no_undefined = "xyes"], [NO_UNDEFINED_LDFLAGS="-Wl,--no-undefined"])
-AC_SUBST(NO_UNDEFINED_LDFLAGS)
-
-# Platform-dependent
-dnl What kind of system are we using?
-case $host_os in
-win*|mingw*)
- SYSTEM=windows
- ;;
-cygwin*)
- SYSTEM=unix
- ;;
-*)
- SYSTEM=unix
- ;;
-esac
-
-case $SYSTEM in
-win)
-AC_DEFINE(UNDER_WINDOWS, 1,
- [Runtime is under Win32 environment])
- ;;
-unix)
-AC_DEFINE(UNDER_POSIX, 1,
- [Runtime is under POSIX environment])
- ;;
-esac
-
-AC_SUBST(AM_CFLAGS)
-AC_SUBST(AM_LDFLAGS)
-AC_SUBST(DEFAULT_CPPFLAGS)
-
-AC_CONFIG_LINKS([
- data/pinyin.tab:data/pinyin.tab
- data/swkb.dat:data/swkb.dat
- data/symbols.dat:data/symbols.dat
- test/stresstest.py:test/stresstest.py
-])
-
-AC_CONFIG_FILES([
- Makefile
- chewing.pc
- data/Makefile
- doc/Makefile
- libchewing.spec
- src/Makefile
- src/common/Makefile
- src/porting_layer/Makefile
- src/porting_layer/src/Makefile
- src/tools/Makefile
- test/Makefile
- thirdparty/sqlite-amalgamation/Makefile
-])
-AC_OUTPUT
-
-AC_MSG_RESULT([
-Build options:
- Build OS $build_os
- Host OS $host_os
- Version $PACKAGE_VERSION
- Install prefix $prefix
- Enable gcov $ENABLE_GCOV
- With sqlite3 $with_sqlite3
- With internal sqlite3 $with_internal_sqlite3
- Build TextUI sample $ax_cv_ncursesw
- Default CFLAGS $AM_CFLAGS
- Default CPPFLAGS $DEFAULT_CPPFLAGS
- Default LDFLAGS $AM_LDFLAGS
-])
diff --git a/data/Makefile.am b/data/Makefile.am
deleted file mode 100644
index 52b2791..0000000
--- a/data/Makefile.am
+++ /dev/null
@@ -1,33 +0,0 @@
-tooldir = $(top_builddir)/src/tools
-datas = \
- dictionary.dat \
- index_tree.dat \
- $(NULL)
-static_tables = pinyin.tab swkb.dat symbols.dat
-
-dist_noinst_DATA = \
- NOTE \
- phone.cin \
- phone.cin-CNS11643-complete.patch \
- svnrev \
- tsi.src \
- $(NULL)
-
-chewing_datadir = $(pkgdatadir)
-chewing_data_DATA = \
- $(static_tables) \
- $(datas) \
- $(NULL)
-
-all: $(datas)
-
-$(datas): gendata_stamp
-
-gendata_stamp: phone.cin tsi.src
- $(MAKE) gendata && \
- touch $@
-
-gendata:
- env LC_ALL=C $(tooldir)/init_database$(EXEEXT) $(top_srcdir)/data/phone.cin $(top_srcdir)/data/tsi.src
-
-CLEANFILES = $(datas) gendata_stamp
diff --git a/doc/Makefile.am b/doc/Makefile.am
deleted file mode 100644
index d784ea5..0000000
--- a/doc/Makefile.am
+++ /dev/null
@@ -1,3 +0,0 @@
-info_TEXINFOS = \
- libchewing.texi \
- $(NULL)
diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4
deleted file mode 100644
index 6d400ed..0000000
--- a/m4/ax_pthread.m4
+++ /dev/null
@@ -1,317 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_pthread.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
-#
-# DESCRIPTION
-#
-# This macro figures out how to build C programs using POSIX threads. It
-# sets the PTHREAD_LIBS output variable to the threads library and linker
-# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
-# flags that are needed. (The user can also force certain compiler
-# flags/libs to be tested by setting these environment variables.)
-#
-# Also sets PTHREAD_CC to any special C compiler that is needed for
-# multi-threaded programs (defaults to the value of CC otherwise). (This
-# is necessary on AIX to use the special cc_r compiler alias.)
-#
-# NOTE: You are assumed to not only compile your program with these flags,
-# but also link it with them as well. e.g. you should link with
-# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
-#
-# If you are only building threads programs, you may wish to use these
-# variables in your default LIBS, CFLAGS, and CC:
-#
-# LIBS="$PTHREAD_LIBS $LIBS"
-# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-# CC="$PTHREAD_CC"
-#
-# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
-# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
-# (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
-#
-# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
-# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
-# PTHREAD_CFLAGS.
-#
-# ACTION-IF-FOUND is a list of shell commands to run if a threads library
-# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
-# is not found. If ACTION-IF-FOUND is not specified, the default action
-# will define HAVE_PTHREAD.
-#
-# Please let the authors know if this macro fails on any platform, or if
-# you have any other suggestions or comments. This macro was based on work
-# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
-# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
-# Alejandro Forero Cuervo to the autoconf macro repository. We are also
-# grateful for the helpful feedback of numerous users.
-#
-# Updated for Autoconf 2.68 by Daniel Richard G.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Steven G. Johnson <ste...@alum.mit.edu>
-# Copyright (c) 2011 Daniel Richard G. <sk...@iSKUNK.ORG>
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation, either version 3 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-#serial 20
-
-AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
-AC_DEFUN([AX_PTHREAD], [
-AC_REQUIRE([AC_CANONICAL_HOST])
-AC_LANG_PUSH([C])
-ax_pthread_ok=no
-
-# We used to check for pthread.h first, but this fails if pthread.h
-# requires special compiler flags (e.g. on True64 or Sequent).
-# It gets checked for in the link test anyway.
-
-# First of all, check if the user has set any of the PTHREAD_LIBS,
-# etcetera environment variables, and if threads linking works using
-# them:
-if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
- save_LIBS="$LIBS"
- LIBS="$PTHREAD_LIBS $LIBS"
- AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
- AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes)
- AC_MSG_RESULT($ax_pthread_ok)
- if test x"$ax_pthread_ok" = xno; then
- PTHREAD_LIBS=""
- PTHREAD_CFLAGS=""
- fi
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
-fi
-
-# We must check for the threads library under a number of different
-# names; the ordering is very important because some systems
-# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
-# libraries is broken (non-POSIX).
-
-# Create a list of thread flags to try. Items starting with a "-" are
-# C compiler flags, and other items are library names, except for "none"
-# which indicates that we try without any flags at all, and "pthread-config"
-# which is a program returning the flags for the Pth emulation library.
-
-ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
-
-# The ordering *is* (sometimes) important. Some notes on the
-# individual items follow:
-
-# pthreads: AIX (must check this before -lpthread)
-# none: in case threads are in libc; should be tried before -Kthread and
-# other compiler flags to prevent continual compiler warnings
-# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
-# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
-# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
-# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
-# -pthreads: Solaris/gcc
-# -mthreads: Mingw32/gcc, Lynx/gcc
-# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
-# doesn't hurt to check since this sometimes defines pthreads too;
-# also defines -D_REENTRANT)
-# ... -mt is also the pthreads flag for HP/aCC
-# pthread: Linux, etcetera
-# --thread-safe: KAI C++
-# pthread-config: use pthread-config program (for GNU Pth library)
-
-case ${host_os} in
- solaris*)
-
- # On Solaris (at least, for some versions), libc contains stubbed
- # (non-functional) versions of the pthreads routines, so link-based
- # tests will erroneously succeed. (We need to link with -pthreads/-mt/
- # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
- # a function called by this macro, so we could check for that, but
- # who knows whether they'll stub that too in a future libc.) So,
- # we'll just look for -pthreads and -lpthread first:
-
- ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
- ;;
-
- darwin*)
- ax_pthread_flags="-pthread $ax_pthread_flags"
- ;;
-esac
-
-if test x"$ax_pthread_ok" = xno; then
-for flag in $ax_pthread_flags; do
-
- case $flag in
- none)
- AC_MSG_CHECKING([whether pthreads work without any flags])
- ;;
-
- -*)
- AC_MSG_CHECKING([whether pthreads work with $flag])
- PTHREAD_CFLAGS="$flag"
- ;;
-
- pthread-config)
- AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no)
- if test x"$ax_pthread_config" = xno; then continue; fi
- PTHREAD_CFLAGS="`pthread-config --cflags`"
- PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
- ;;
-
- *)
- AC_MSG_CHECKING([for the pthreads library -l$flag])
- PTHREAD_LIBS="-l$flag"
- ;;
- esac
-
- save_LIBS="$LIBS"
- save_CFLAGS="$CFLAGS"
- LIBS="$PTHREAD_LIBS $LIBS"
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-
- # Check for various functions. We must include pthread.h,
- # since some functions may be macros. (On the Sequent, we
- # need a special flag -Kthread to make this header compile.)
- # We check for pthread_join because it is in -lpthread on IRIX
- # while pthread_create is in libc. We check for pthread_attr_init
- # due to DEC craziness with -lpthreads. We check for
- # pthread_cleanup_push because it is one of the few pthread
- # functions on Solaris that doesn't have a non-functional libc stub.
- # We try pthread_create on general principles.
- AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
- static void routine(void *a) { a = 0; }
- static void *start_routine(void *a) { return a; }],
- [pthread_t th; pthread_attr_t attr;
- pthread_create(&th, 0, start_routine, 0);
- pthread_join(th, 0);
- pthread_attr_init(&attr);
- pthread_cleanup_push(routine, 0);
- pthread_cleanup_pop(0) /* ; */])],
- [ax_pthread_ok=yes],
- [])
-
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
-
- AC_MSG_RESULT($ax_pthread_ok)
- if test "x$ax_pthread_ok" = xyes; then
- break;
- fi
-
- PTHREAD_LIBS=""
- PTHREAD_CFLAGS=""
-done
-fi
-
-# Various other checks:
-if test "x$ax_pthread_ok" = xyes; then
- save_LIBS="$LIBS"
- LIBS="$PTHREAD_LIBS $LIBS"
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-
- # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
- AC_MSG_CHECKING([for joinable pthread attribute])
- attr_name=unknown
- for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
- AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
- [int attr = $attr; return attr /* ; */])],
- [attr_name=$attr; break],
- [])
- done
- AC_MSG_RESULT($attr_name)
- if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
- AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
- [Define to necessary symbol if this constant
- uses a non-standard name on your system.])
- fi
-
- AC_MSG_CHECKING([if more special flags are required for pthreads])
- flag=no
- case ${host_os} in
- aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
- osf* | hpux*) flag="-D_REENTRANT";;
- solaris*)
- if test "$GCC" = "yes"; then
- flag="-D_REENTRANT"
- else
- flag="-mt -D_REENTRANT"
- fi
- ;;
- esac
- AC_MSG_RESULT(${flag})
- if test "x$flag" != xno; then
- PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
- fi
-
- AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
- ax_cv_PTHREAD_PRIO_INHERIT, [
- AC_LINK_IFELSE([
- AC_LANG_PROGRAM([[#include <pthread.h>]], [[int i = PTHREAD_PRIO_INHERIT;]])],
- [ax_cv_PTHREAD_PRIO_INHERIT=yes],
- [ax_cv_PTHREAD_PRIO_INHERIT=no])
- ])
- AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"],
- AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.]))
-
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
-
- # More AIX lossage: compile with *_r variant
- if test "x$GCC" != xyes; then
- case $host_os in
- aix*)
- AS_CASE(["x/$CC"],
- [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
- [#handle absolute path differently from PATH based program lookup
- AS_CASE(["x$CC"],
- [x/*],
- [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
- [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
- ;;
- esac
- fi
-fi
-
-test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
-
-AC_SUBST(PTHREAD_LIBS)
-AC_SUBST(PTHREAD_CFLAGS)
-AC_SUBST(PTHREAD_CC)
-
-# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
-if test x"$ax_pthread_ok" = xyes; then
- ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
- :
-else
- ax_pthread_ok=no
- $2
-fi
-AC_LANG_POP
-])dnl AX_PTHREAD
diff --git a/m4/ax_with_curses.m4 b/m4/ax_with_curses.m4
deleted file mode 100644
index 33a37ac..0000000
--- a/m4/ax_with_curses.m4
+++ /dev/null
@@ -1,518 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_with_curses.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_WITH_CURSES
-#
-# DESCRIPTION
-#
-# This macro checks whether a SysV or X/Open-compatible Curses library is
-# present, along with the associated header file. The NcursesW
-# (wide-character) library is searched for first, followed by Ncurses,
-# then the system-default plain Curses. The first library found is the
-# one returned.
-#
-# The following options are understood: --with-ncursesw, --with-ncurses,
-# --without-ncursesw, --without-ncurses. The "--with" options force the
-# macro to use that particular library, terminating with an error if not
-# found. The "--without" options simply skip the check for that library.
-# The effect on the search pattern is:
-#
-# (no options) - NcursesW, Ncurses, Curses
-# --with-ncurses --with-ncursesw - NcursesW only [*]
-# --without-ncurses --with-ncursesw - NcursesW only [*]
-# --with-ncursesw - NcursesW only [*]
-# --with-ncurses --without-ncursesw - Ncurses only [*]
-# --with-ncurses - NcursesW, Ncurses [**]
-# --without-ncurses --without-ncursesw - Curses only
-# --without-ncursesw - Ncurses, Curses
-# --without-ncurses - NcursesW, Curses
-#
-# [*] If the library is not found, abort the configure script.
-#
-# [**] If the second library (Ncurses) is not found, abort configure.
-#
-# The following preprocessor symbols may be defined by this macro if the
-# appropriate conditions are met:
-#
-# HAVE_CURSES - if any SysV or X/Open Curses library found
-# HAVE_CURSES_ENHANCED - if library supports X/Open Enhanced functions
-# HAVE_CURSES_COLOR - if library supports color (enhanced functions)
-# HAVE_CURSES_OBSOLETE - if library supports certain obsolete features
-# HAVE_NCURSESW - if NcursesW (wide char) library is to be used
-# HAVE_NCURSES - if the Ncurses library is to be used
-#
-# HAVE_CURSES_H - if <curses.h> is present and should be used
-# HAVE_NCURSESW_H - if <ncursesw.h> should be used
-# HAVE_NCURSES_H - if <ncurses.h> should be used
-# HAVE_NCURSESW_CURSES_H - if <ncursesw/curses.h> should be used
-# HAVE_NCURSES_CURSES_H - if <ncurses/curses.h> should be used
-#
-# (These preprocessor symbols are discussed later in this document.)
-#
-# The following output variable is defined by this macro; it is precious
-# and may be overridden on the ./configure command line:
-#
-# CURSES_LIB - library to add to xxx_LDADD
-#
-# The library listed in CURSES_LIB is NOT added to LIBS by default. You
-# need to add CURSES_LIB to the appropriate xxx_LDADD line in your
-# Makefile.am. For example:
-#
-# prog_LDADD = @CURSES_LIB@
-#
-# If CURSES_LIB is set on the configure command line (such as by running
-# "./configure CURSES_LIB=-lmycurses"), then the only header searched for
-# is <curses.h>. The user may use the CPPFLAGS precious variable to
-# override the standard #include search path. If the user needs to
-# specify an alternative path for a library (such as for a non-standard
-# NcurseW), the user should use the LDFLAGS variable.
-#
-# The following shell variables may be defined by this macro:
-#
-# ax_cv_curses - set to "yes" if any Curses library found
-# ax_cv_curses_enhanced - set to "yes" if Enhanced functions present
-# ax_cv_curses_color - set to "yes" if color functions present
-# ax_cv_curses_obsolete - set to "yes" if obsolete features present
-#
-# ax_cv_ncursesw - set to "yes" if NcursesW library found
-# ax_cv_ncurses - set to "yes" if Ncurses library found
-# ax_cv_plaincurses - set to "yes" if plain Curses library found
-# ax_cv_curses_which - set to "ncursesw", "ncurses", "plaincurses" or "no"
-#
-# These variables can be used in your configure.ac to determine the level
-# of support you need from the Curses library. For example, if you must
-# have either Ncurses or NcursesW, you could include:
-#
-# AX_WITH_CURSES
-# if test "x$ax_cv_ncursesw" != xyes && test "x$ax_cv_ncurses" != xyes; then
-# AX_MSG_ERROR([requires either NcursesW or Ncurses library])
-# fi
-#
-# If any Curses library will do (but one must be present and must support
-# color), you could use:
-#
-# AX_WITH_CURSES
-# if test "x$ax_cv_curses" != xyes || test "x$ax_cv_curses_color" != xyes; then
-# AC_MSG_ERROR([requires an X/Open-compatible Curses library with color])
-# fi
-#
-# Certain preprocessor symbols and shell variables defined by this macro
-# can be used to determine various features of the Curses library. In
-# particular, HAVE_CURSES and ax_cv_curses are defined if the Curses
-# library found conforms to the traditional SysV and/or X/Open Base Curses
-# definition. Any working Curses library conforms to this level.
-#
-# HAVE_CURSES_ENHANCED and ax_cv_curses_enhanced are defined if the
-# library supports the X/Open Enhanced Curses definition. In particular,
-# the wide-character types attr_t, cchar_t and wint_t, the functions
-# wattr_set() and wget_wch() and the macros WA_NORMAL and _XOPEN_CURSES
-# are checked. The Ncurses library does NOT conform to this definition,
-# although NcursesW does.
-#
-# HAVE_CURSES_COLOR and ax_cv_curses_color are defined if the library
-# supports color functions and macros such as COLOR_PAIR, A_COLOR,
-# COLOR_WHITE, COLOR_RED and init_pair(). These are NOT part of the
-# X/Open Base Curses definition, but are part of the Enhanced set of
-# functions. The Ncurses library DOES support these functions, as does
-# NcursesW.
-#
-# HAVE_CURSES_OBSOLETE and ax_cv_curses_obsolete are defined if the
-# library supports certain features present in SysV and BSD Curses but not
-# defined in the X/Open definition. In particular, the functions
-# getattrs(), getcurx() and getmaxx() are checked.
-#
-# To use the HAVE_xxx_H preprocessor symbols, insert the following into
-# your system.h (or equivalent) header file:
-#
-# #if defined HAVE_NCURSESW_CURSES_H
-# # include <ncursesw/curses.h>
-# #elif defined HAVE_NCURSESW_H
-# # include <ncursesw.h>
-# #elif defined HAVE_NCURSES_CURSES_H
-# # include <ncurses/curses.h>
-# #elif defined HAVE_NCURSES_H
-# # include <ncurses.h>
-# #elif defined HAVE_CURSES_H
-# # include <curses.h>
-# #else
-# # error "SysV or X/Open-compatible Curses header file required"
-# #endif
-#
-# For previous users of this macro: you should not need to change anything
-# in your configure.ac or Makefile.am, as the previous (serial 10)
-# semantics are still valid. However, you should update your system.h (or
-# equivalent) header file to the fragment shown above. You are encouraged
-# also to make use of the extended functionality provided by this version
-# of AX_WITH_CURSES, as well as in the additional macros
-# AX_WITH_CURSES_PANEL, AX_WITH_CURSES_MENU and AX_WITH_CURSES_FORM.
-#
-# LICENSE
-#
-# Copyright (c) 2009 Mark Pulford <ma...@kyne.com.au>
-# Copyright (c) 2009 Damian Pietras <da...@daper.net>
-# Copyright (c) 2012 Reuben Thomas <r...@sc3d.org>
-# Copyright (c) 2011 John Zaitseff <J.Zai...@zap.org.au>
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation, either version 3 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-#serial 13
-
-AU_ALIAS([MP_WITH_CURSES], [AX_WITH_CURSES])
-AC_DEFUN([AX_WITH_CURSES], [
- AC_ARG_VAR([CURSES_LIB], [linker library for Curses, e.g. -lcurses])
- AC_ARG_WITH([ncurses], [AS_HELP_STRING([--with-ncurses],
- [force the use of Ncurses or NcursesW])],
- [], [with_ncurses=check])
- AC_ARG_WITH([ncursesw], [AS_HELP_STRING([--without-ncursesw],
- [do not use NcursesW (wide character support)])],
- [], [with_ncursesw=check])
-
- ax_saved_LIBS=$LIBS
- AS_IF([test "x$with_ncurses" = xyes || test "x$with_ncursesw" = xyes],
- [ax_with_plaincurses=no], [ax_with_plaincurses=check])
-
- ax_cv_curses_which=no
-
- # Test for NcursesW
-
- AS_IF([test "x$CURSES_LIB" = x && test "x$with_ncursesw" != xno], [
- LIBS="$ax_saved_LIBS -lncursesw"
-
- AC_CACHE_CHECK([for NcursesW wide-character library], [ax_cv_ncursesw], [
- AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])],
- [ax_cv_ncursesw=yes], [ax_cv_ncursesw=no])
- ])
- AS_IF([test "x$ax_cv_ncursesw" = xno && test "x$with_ncursesw" = xyes], [
- AC_MSG_ERROR([--with-ncursesw specified but could not find NcursesW library])
- ])
-
- AS_IF([test "x$ax_cv_ncursesw" = xyes], [
- ax_cv_curses=yes
- ax_cv_curses_which=ncursesw
- CURSES_LIB="-lncursesw"
- AC_DEFINE([HAVE_NCURSESW], [1], [Define to 1 if the NcursesW library is present])
- AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present])
-
- AC_CACHE_CHECK([for working ncursesw/curses.h], [ax_cv_header_ncursesw_curses_h], [
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- @%:@define _XOPEN_SOURCE_EXTENDED 1
- @%:@include <ncursesw/curses.h>
- ]], [[
- chtype a = A_BOLD;
- int b = KEY_LEFT;
- chtype c = COLOR_PAIR(1) & A_COLOR;
- attr_t d = WA_NORMAL;
- cchar_t e;
- wint_t f;
- int g = getattrs(stdscr);
- int h = getcurx(stdscr) + getmaxx(stdscr);
- initscr();
- init_pair(1, COLOR_WHITE, COLOR_RED);
- wattr_set(stdscr, d, 0, NULL);
- wget_wch(stdscr, &f);
- ]])],
- [ax_cv_header_ncursesw_curses_h=yes],
- [ax_cv_header_ncursesw_curses_h=no])
- ])
- AS_IF([test "x$ax_cv_header_ncursesw_curses_h" = xyes], [
- ax_cv_curses_enhanced=yes
- ax_cv_curses_color=yes
- ax_cv_curses_obsolete=yes
- AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions])
- AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
- AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features])
- AC_DEFINE([HAVE_NCURSESW_CURSES_H], [1], [Define to 1 if <ncursesw/curses.h> is present])
- ])
-
- AC_CACHE_CHECK([for working ncursesw.h], [ax_cv_header_ncursesw_h], [
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- @%:@define _XOPEN_SOURCE_EXTENDED 1
- @%:@include <ncursesw.h>
- ]], [[
- chtype a = A_BOLD;
- int b = KEY_LEFT;
- chtype c = COLOR_PAIR(1) & A_COLOR;
- attr_t d = WA_NORMAL;
- cchar_t e;
- wint_t f;
- int g = getattrs(stdscr);
- int h = getcurx(stdscr) + getmaxx(stdscr);
- initscr();
- init_pair(1, COLOR_WHITE, COLOR_RED);
- wattr_set(stdscr, d, 0, NULL);
- wget_wch(stdscr, &f);
- ]])],
- [ax_cv_header_ncursesw_h=yes],
- [ax_cv_header_ncursesw_h=no])
- ])
- AS_IF([test "x$ax_cv_header_ncursesw_h" = xyes], [
- ax_cv_curses_enhanced=yes
- ax_cv_curses_color=yes
- ax_cv_curses_obsolete=yes
- AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions])
- AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
- AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features])
- AC_DEFINE([HAVE_NCURSESW_H], [1], [Define to 1 if <ncursesw.h> is present])
- ])
-
- AC_CACHE_CHECK([for working ncurses.h], [ax_cv_header_ncurses_h_with_ncursesw], [
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- @%:@define _XOPEN_SOURCE_EXTENDED 1
- @%:@include <ncurses.h>
- ]], [[
- chtype a = A_BOLD;
- int b = KEY_LEFT;
- chtype c = COLOR_PAIR(1) & A_COLOR;
- attr_t d = WA_NORMAL;
- cchar_t e;
- wint_t f;
- int g = getattrs(stdscr);
- int h = getcurx(stdscr) + getmaxx(stdscr);
- initscr();
- init_pair(1, COLOR_WHITE, COLOR_RED);
- wattr_set(stdscr, d, 0, NULL);
- wget_wch(stdscr, &f);
- ]])],
- [ax_cv_header_ncurses_h_with_ncursesw=yes],
- [ax_cv_header_ncurses_h_with_ncursesw=no])
- ])
- AS_IF([test "x$ax_cv_header_ncurses_h_with_ncursesw" = xyes], [
- ax_cv_curses_enhanced=yes
- ax_cv_curses_color=yes
- ax_cv_curses_obsolete=yes
- AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions])
- AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
- AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features])
- AC_DEFINE([HAVE_NCURSES_H], [1], [Define to 1 if <ncurses.h> is present])
- ])
-
- AS_IF([test "x$ax_cv_header_ncursesw_curses_h" = xno && test "x$ax_cv_header_ncursesw_h" = xno && test "x$ax_cv_header_ncurses_h_with_ncursesw" = xno], [
- AC_MSG_WARN([could not find a working ncursesw/curses.h, ncursesw.h or ncurses.h])
- ])
- ])
- ])
-
- # Test for Ncurses
-
- AS_IF([test "x$CURSES_LIB" = x && test "x$with_ncurses" != xno && test "x$ax_cv_curses_which" = xno], [
- LIBS="$ax_saved_LIBS -lncurses"
-
- AC_CACHE_CHECK([for Ncurses library], [ax_cv_ncurses], [
- AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])],
- [ax_cv_ncurses=yes], [ax_cv_ncurses=no])
- ])
- AS_IF([test "x$ax_cv_ncurses" = xno && test "x$with_ncurses" = xyes], [
- AC_MSG_ERROR([--with-ncurses specified but could not find Ncurses library])
- ])
-
- AS_IF([test "x$ax_cv_ncurses" = xyes], [
- ax_cv_curses=yes
- ax_cv_curses_which=ncurses
- CURSES_LIB="-lncurses"
- AC_DEFINE([HAVE_NCURSES], [1], [Define to 1 if the Ncurses library is present])
- AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present])
-
- AC_CACHE_CHECK([for working ncurses/curses.h], [ax_cv_header_ncurses_curses_h], [
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- @%:@include <ncurses/curses.h>
- ]], [[
- chtype a = A_BOLD;
- int b = KEY_LEFT;
- chtype c = COLOR_PAIR(1) & A_COLOR;
- int g = getattrs(stdscr);
- int h = getcurx(stdscr) + getmaxx(stdscr);
- initscr();
- init_pair(1, COLOR_WHITE, COLOR_RED);
- ]])],
- [ax_cv_header_ncurses_curses_h=yes],
- [ax_cv_header_ncurses_curses_h=no])
- ])
- AS_IF([test "x$ax_cv_header_ncurses_curses_h" = xyes], [
- ax_cv_curses_color=yes
- ax_cv_curses_obsolete=yes
- AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
- AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features])
- AC_DEFINE([HAVE_NCURSES_CURSES_H], [1], [Define to 1 if <ncurses/curses.h> is present])
- ])
-
- AC_CACHE_CHECK([for working ncurses.h], [ax_cv_header_ncurses_h], [
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- @%:@include <ncurses.h>
- ]], [[
- chtype a = A_BOLD;
- int b = KEY_LEFT;
- chtype c = COLOR_PAIR(1) & A_COLOR;
- int g = getattrs(stdscr);
- int h = getcurx(stdscr) + getmaxx(stdscr);
- initscr();
- init_pair(1, COLOR_WHITE, COLOR_RED);
- ]])],
- [ax_cv_header_ncurses_h=yes],
- [ax_cv_header_ncurses_h=no])
- ])
- AS_IF([test "x$ax_cv_header_ncurses_h" = xyes], [
- ax_cv_curses_color=yes
- ax_cv_curses_obsolete=yes
- AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
- AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features])
- AC_DEFINE([HAVE_NCURSES_H], [1], [Define to 1 if <ncurses.h> is present])
- ])
-
- AS_IF([test "x$ax_cv_header_ncurses_curses_h" = xno && test "x$ax_cv_header_ncurses_h" = xno], [
- AC_MSG_WARN([could not find a working ncurses/curses.h or ncurses.h])
- ])
- ])
- ])
-
- # Test for plain Curses (or if CURSES_LIB was set by user)
-
- AS_IF([test "x$with_plaincurses" != xno && test "x$ax_cv_curses_which" = xno], [
- AS_IF([test "x$CURSES_LIB" != x], [
- LIBS="$ax_saved_LIBS $CURSES_LIB"
- ], [
- LIBS="$ax_saved_LIBS -lcurses"
- ])
-
- AC_CACHE_CHECK([for Curses library], [ax_cv_plaincurses], [
- AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])],
- [ax_cv_plaincurses=yes], [ax_cv_plaincurses=no])
- ])
-
- AS_IF([test "x$ax_cv_plaincurses" = xyes], [
- ax_cv_curses=yes
- ax_cv_curses_which=plaincurses
- AS_IF([test "x$CURSES_LIB" = x], [
- CURSES_LIB="-lcurses"
- ])
- AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present])
-
- # Check for base conformance (and header file)
-
- AC_CACHE_CHECK([for working curses.h], [ax_cv_header_curses_h], [
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- @%:@include <curses.h>
- ]], [[
- chtype a = A_BOLD;
- int b = KEY_LEFT;
- initscr();
- ]])],
- [ax_cv_header_curses_h=yes],
- [ax_cv_header_curses_h=no])
- ])
- AS_IF([test "x$ax_cv_header_curses_h" = xyes], [
- AC_DEFINE([HAVE_CURSES_H], [1], [Define to 1 if <curses.h> is present])
-
- # Check for X/Open Enhanced conformance
-
- AC_CACHE_CHECK([for X/Open Enhanced Curses conformance], [ax_cv_plaincurses_enhanced], [
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- @%:@define _XOPEN_SOURCE_EXTENDED 1
- @%:@include <curses.h>
- @%:@ifndef _XOPEN_CURSES
- @%:@error "this Curses library is not enhanced"
- "this Curses library is not enhanced"
- @%:@endif
- ]], [[
- chtype a = A_BOLD;
- int b = KEY_LEFT;
- chtype c = COLOR_PAIR(1) & A_COLOR;
- attr_t d = WA_NORMAL;
- cchar_t e;
- wint_t f;
- initscr();
- init_pair(1, COLOR_WHITE, COLOR_RED);
- wattr_set(stdscr, d, 0, NULL);
- wget_wch(stdscr, &f);
- ]])],
- [ax_cv_plaincurses_enhanced=yes],
- [ax_cv_plaincurses_enhanced=no])
- ])
- AS_IF([test "x$ax_cv_plaincurses_enhanced" = xyes], [
- ax_cv_curses_enhanced=yes
- ax_cv_curses_color=yes
- AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions])
- AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
- ])
-
- # Check for color functions
-
- AC_CACHE_CHECK([for Curses color functions], [ax_cv_plaincurses_color], [
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- @%:@define _XOPEN_SOURCE_EXTENDED 1
- @%:@include <curses.h>
- ]], [[
- chtype a = A_BOLD;
- int b = KEY_LEFT;
- chtype c = COLOR_PAIR(1) & A_COLOR;
- initscr();
- init_pair(1, COLOR_WHITE, COLOR_RED);
- ]])],
- [ax_cv_plaincurses_color=yes],
- [ax_cv_plaincurses_color=no])
- ])
- AS_IF([test "x$ax_cv_plaincurses_color" = xyes], [
- ax_cv_curses_color=yes
- AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)])
- ])
-
- # Check for obsolete functions
-
- AC_CACHE_CHECK([for obsolete Curses functions], [ax_cv_plaincurses_obsolete], [
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- @%:@include <curses.h>
- ]], [[
- chtype a = A_BOLD;
- int b = KEY_LEFT;
- int g = getattrs(stdscr);
- int h = getcurx(stdscr) + getmaxx(stdscr);
- initscr();
- ]])],
- [ax_cv_plaincurses_obsolete=yes],
- [ax_cv_plaincurses_obsolete=no])
- ])
- AS_IF([test "x$ax_cv_plaincurses_obsolete" = xyes], [
- ax_cv_curses_obsolete=yes
- AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features])
- ])
- ])
-
- AS_IF([test "x$ax_cv_header_curses_h" = xno], [
- AC_MSG_WARN([could not find a working curses.h])
- ])
- ])
- ])
-
- AS_IF([test "x$ax_cv_curses" != xyes], [ax_cv_curses=no])
- AS_IF([test "x$ax_cv_curses_enhanced" != xyes], [ax_cv_curses_enhanced=no])
- AS_IF([test "x$ax_cv_curses_color" != xyes], [ax_cv_curses_color=no])
- AS_IF([test "x$ax_cv_curses_obsolete" != xyes], [ax_cv_curses_obsolete=no])
-
- LIBS=$ax_saved_LIBS
-])dnl
diff --git a/src/Makefile.am b/src/Makefile.am
deleted file mode 100644
index 2992af5..0000000
--- a/src/Makefile.am
+++ /dev/null
@@ -1,62 +0,0 @@
-SUBDIRS = common porting_layer
-
-AM_CPPFLAGS = \
- -I$(top_srcdir)/include \
- -I$(top_srcdir)/include/internal \
- -I$(top_srcdir)/src/porting_layer/include \
- -DCHEWING_DATADIR=\"$(datadir)/libchewing\" \
- $(USERPHRASE_CPPFLAGS) \
- $(DEFAULT_CPPFLAGS) \
- $(NULL)
-
-noinst_HEADERS = \
- private.h \
- $(NULL)
-
-lib_LTLIBRARIES = libchewing.la
-libchewing_la_SOURCES = \
- compat.c \
- chewingio.c \
- chewingutil.c \
- choice.c \
- dict.c \
- tree.c \
- bopomofo.c \
- pinyin.c \
- mod_aux.c \
- userphrase.c \
- $(USERPHRASE_SOURCES) \
- $(NULL)
-
-libchewing_la_LIBADD = \
- $(top_builddir)/src/common/libcommon.la \
- $(top_builddir)/src/porting_layer/src/libporting_layer.la \
- $(NULL)
-
-libchewing_la_LDFLAGS = \
- -version-number $(LIBCHEWING_MAJOR):$(LIBCHEWING_MINOR):$(LIBCHEWING_REVISION) \
- -rpath $(libdir) \
- -no-undefined \
- $(NO_UNDEFINED_LDFLAGS) \
- -export-symbols-regex "^(chewing)_" \
- $(NULL)
-
-if WITH_SQLITE3
-libchewing_la_SOURCES += \
- chewing-sql.c \
- userphrase-sql.c \
- $(NULL)
-
-if WITH_INTERNAL_SQLITE3
-AM_CPPFLAGS += -I$(top_srcdir)/thirdparty/sqlite-amalgamation
-libchewing_la_LIBADD += \
- $(top_builddir)/thirdparty/sqlite-amalgamation/libsqlite3-internal.la \
- $(NULL)
-endif
-
-else
-libchewing_la_SOURCES += \
- hash.c \
- userphrase-hash.c \
- $(NULL)
-endif
diff --git a/src/common/Makefile.am b/src/common/Makefile.am
deleted file mode 100644
index 9b502d5..0000000
--- a/src/common/Makefile.am
+++ /dev/null
@@ -1,19 +0,0 @@
-AM_CPPFLAGS = \
- -I$(top_srcdir)/include \
- -I$(top_srcdir)/include/internal \
- -I$(top_srcdir)/src/porting_layer/include \
- $(DEFAULT_CPPFLAGS) \
- $(NULL)
-
-noinst_LTLIBRARIES = libcommon.la
-
-libcommon_la_SOURCES = \
- key2pho.c \
- chewing-utf8-util.c \
- $(NULL)
-
-if WITH_INTERNAL_SQLITE3
-AM_CPPFLAGS += \
- -I$(top_srcdir)/thirdparty/sqlite-amalgamation \
- $(NULL)
-endif
diff --git a/src/porting_layer/Makefile.am b/src/porting_layer/Makefile.am
deleted file mode 100644
index 005ab67..0000000
--- a/src/porting_layer/Makefile.am
+++ /dev/null
@@ -1,9 +0,0 @@
-SUBDIRS = src
-
-noinst_HEADERS = \
- include/plat_mmap.h \
- include/plat_types.h \
- include/plat_path.h \
- include/sys/plat_posix.h \
- include/sys/plat_windows.h \
- $(NULL)
diff --git a/src/porting_layer/src/Makefile.am b/src/porting_layer/src/Makefile.am
deleted file mode 100644
index cdcb606..0000000
--- a/src/porting_layer/src/Makefile.am
+++ /dev/null
@@ -1,17 +0,0 @@
-MAINTAINERCLEANFILES = Makefile.in
-
-AM_CPPFLAGS = \
- -DCHEWING_DATADIR=\"$(datadir)/libchewing\" \
- -I$(top_srcdir)/include \
- -I$(top_srcdir)/include/internal \
- -I$(top_srcdir)/src/porting_layer/include \
- $(DEFAULT_CPPFLAGS) \
- $(NULL)
-
-noinst_LTLIBRARIES = libporting_layer.la
-libporting_layer_la_SOURCES = \
- plat_mmap_posix.c \
- plat_mmap_windows.c \
- plat_path.c \
- rpl_malloc.c \
- $(NULL)
diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am
deleted file mode 100644
index 2104f43..0000000
--- a/src/tools/Makefile.am
+++ /dev/null
@@ -1,28 +0,0 @@
-AM_CPPFLAGS = \
- -I$(top_srcdir)/include \
- -I$(top_srcdir)/include/internal \
- -I$(top_srcdir)/src \
- -I$(top_srcdir)/src/porting_layer/include \
- -I$(top_srcdir)/thirdparty/sqlite-amalgamation \
- $(DEFAULT_CPPFLAGS) \
- $(NULL)
-
-CC = $(CC_FOR_BUILD)
-AM_CFLAGS = $(CFLAGS_FOR_BUILD)
-
-noinst_PROGRAMS = init_database dump_database
-
-init_database_SOURCES = \
- init_database.c \
- $(top_srcdir)/src/common/chewing-utf8-util.c \
- $(top_srcdir)/src/common/key2pho.c \
- $(NULL)
-
-dump_database_SOURCES = \
- dump_database.c \
- $(top_srcdir)/src/common/chewing-utf8-util.c \
- $(top_srcdir)/src/common/key2pho.c \
- $(top_srcdir)/src/porting_layer/src/plat_mmap_posix.c \
- $(top_srcdir)/src/porting_layer/src/plat_mmap_windows.c \
- $(top_srcdir)/src/porting_layer/src/rpl_malloc.c \
- $(NULL)
diff --git a/test/Makefile.am b/test/Makefile.am
deleted file mode 100644
index 81cd1e4..0000000
--- a/test/Makefile.am
+++ /dev/null
@@ -1,94 +0,0 @@
-valgrind-check: testchewing
- @echo "Please waiting for the valgrind results..."
- libtool --mode=execute valgrind \
- --leak-check=full \
- --show-reachable=yes \
- ./testchewing < $(srcdir)/data/default-test.txt
-
-noinst_LTLIBRARIES = libtesthelper.la
-
-dist_noinst_DATA = \
- data/default-test.txt \
- data/dictionary.dat \
- data/index_tree.dat \
- data/phone.cin \
- data/pinyin.tab \
- data/swkb.dat \
- data/symbols.dat \
- data/tsi.src \
- $(NULL)
-
-libtesthelper_la_SOURCES = \
- testhelper.c \
- $(NULL)
-
-libtesthelper_la_LIBADD = \
- $(top_builddir)/src/libchewing.la \
- $(NULL)
-
-TESTS = $(NATIVE_TESTS)
-NATIVE_TESTS = \
- test-bopomofo \
- test-config \
- test-easy-symbol \
- test-error-handling \
- test-fullshape \
- test-key2pho \
- test-keyboard \
- test-keyboardless \
- test-logger \
- test-mmap \
- test-path \
- test-reset \
- test-regression \
- test-symbol \
- test-special-symbol \
- test-struct-size \
- test-userphrase \
- test-utf8 \
- $(NULL)
-
-check_HEADERS = \
- testhelper.h \
- $(NULL)
-
-check_PROGRAMS = \
- performance \
- testchewing \
- simulate \
- randkeystroke \
- stress \
- $(TEXT_UI_BIN) \
- $(NATIVE_TESTS) \
- $(NULL)
-
-if ENABLE_TEXT_UI
-TEXT_UI_BIN=genkeystroke
-genkeystroke_SOURCES = genkeystroke.c
-genkeystroke_LDADD = $(LDADD) @CURSES_LIB@
-else
-TEXT_UI_BIN=
-endif
-
-AM_CPPFLAGS = \
- -I$(top_srcdir)/include \
- -I$(top_srcdir)/include/internal \
- -I$(top_srcdir)/src/porting_layer/include \
- -I$(top_srcdir)/test/ \
- -I$(top_srcdir)/thirdparty/sqlite-amalgamation \
- -DCHEWING_DATA_PREFIX="\"$(abs_top_builddir)/data\"" \
- -DTEST_HASH_DIR="\"$(PWD)\"" \
- -DTEST_DATA_DIR="\"$(abs_srcdir)/data\"" \
- $(DEFAULT_CPPFLAGS) \
- $(CHECK_CFLAGS) \
- $(NULL)
-
-LDADD = \
- $(top_builddir)/src/porting_layer/src/libporting_layer.la \
- $(top_builddir)/test/libtesthelper.la \
- $(top_builddir)/src/common/libcommon.la \
- $(NULL)
-
-AM_LDFLAGS = -static
-
-CLEANFILES = uhash.dat materials.txt-random chewing.sqlite3 test.sqlite3
diff --git a/thirdparty/sqlite-amalgamation/Makefile.am b/thirdparty/sqlite-amalgamation/Makefile.am
deleted file mode 100644
index 4ca17a4..0000000
--- a/thirdparty/sqlite-amalgamation/Makefile.am
+++ /dev/null
@@ -1,23 +0,0 @@
-AM_CPPFLAGS = \
- $(DEFAULT_CPPFLAGS) \
- $(NULL)
-
-AM_LDFLAGS = -static
-
-if WITH_SQLITE3
-if WITH_INTERNAL_SQLITE3
-noinst_LTLIBRARIES = libsqlite3-internal.la
-
-libsqlite3_internal_la_SOURCES = \
- sqlite3.c \
- $(NULL)
-
-check_PROGRAMS = sqlite3
-
-sqlite3_SOURCES = \
- shell.c \
- $(NULL)
-
-sqlite3_LDADD = libsqlite3-internal.la
-endif
-endif
--
2.39.1

Kan-Ru Chen

unread,
Jan 26, 2023, 8:42:43 PM1/26/23
to chewin...@googlegroups.com, czc...@czchen.org, jser...@gmail.com, Kan-Ru Chen
---
.gitignore | 11 ++-
CMakeLists.txt | 209 +++++---------------------------------------
data/CMakeLists.txt | 49 +++++++++++
doc/CMakeLists.txt | 21 +++++
test/CMakeLists.txt | 95 ++++++++++++++++++++
5 files changed, 192 insertions(+), 193 deletions(-)
create mode 100644 data/CMakeLists.txt
create mode 100644 doc/CMakeLists.txt
create mode 100644 test/CMakeLists.txt

diff --git a/.gitignore b/.gitignore
index 464539f..e917c79 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,12 +42,17 @@ include/config.h.in
include/stamp-h1

# cmake generated files
+/build
config.h
/libchewing.*
/libsqlite3_library.a
/libtesthelper.a
/libuserphrase.a
/Testing
+/CTestTestfile.cmake
+/CMakeCache.txt
+/CMakeFiles/
+/cmake_install.cmake

# test suite
test/genkeystroke
@@ -116,12 +121,6 @@ doc/libchewing.tps
doc/libchewing.vr
doc/libchewing.vrs

-# cmake
-/CTestTestfile.cmake
-/CMakeCache.txt
-/CMakeFiles/
-/cmake_install.cmake
-
# Visual Studio
*.pdb
*.vcxproj*
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 07112b0..406089d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,16 +1,16 @@
-cmake_minimum_required(VERSION 2.8.8)
+cmake_minimum_required(VERSION 3.19.0)
project(libchewing)

-# Update configure.ac if LIBCHEWING_VERSION is changed.
set(LIBCHEWING_VERSION 0.5.1)
set(PACKAGE_VERSION ${LIBCHEWING_VERSION})
-# Update configure.ac if LIBCHEWING_BINARY_VERSION is changed.
set(LIBCHEWING_BINARY_VERSION 1.0.0)
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

+enable_testing()
+
if(UNIX)
set(CMAKE_C_FLAGS "-g -O2 -Wall -fPIC ${CMAKE_C_FLAGS}")
- add_definitions(-DUNDER_POSIX -DPIC)
+ add_compile_definitions(UNDER_POSIX PIC)
endif()

include(CheckCCompilerFlag)
@@ -18,7 +18,7 @@ include(CheckCCompilerFlag)
if(${CMAKE_C_COMPILER_ID} STREQUAL "GNU" OR
${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
set(CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}")
- add_definitions(-D_GNU_SOURCE)
+ add_compile_definitions(_GNU_SOURCE)
option(ENABLE_GCOV "Coverage support" false)
if(ENABLE_GCOV)
set(CMAKE_C_FLAGS "-coverage ${CMAKE_C_FLAGS}")
@@ -44,12 +44,12 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC")
# encoding, thus it will complain about invalid character. Use
# /wd4819 can suppress this warning.
set(CMAKE_C_FLAGS "/wd4819 ${CMAKE_C_FLAGS}")
- add_definitions(/D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_DEPRECATE)
- add_definitions(/D__func__=__FUNCTION__)
+ add_compile_definitions(_CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE)
+ add_compile_definitions(__func__=__FUNCTION__)

# MSVC 2015 supports `snprintf`, so no need to redefine it
if(MSVC_VERSION LESS 1900)
- add_definitions(/Dsnprintf=_snprintf)
+ add_compile_definitions(snprintf=_snprintf)
endif()

option(BUILD_DLL "Build dynamic link library (*.dll) instead of static lib." false)
@@ -61,7 +61,7 @@ if(${FVISIBILITY_HIDDEN})
endif()

# automake compatibility
-add_definitions(-DHAVE_CONFIG_H=1)
+add_compile_definitions(HAVE_CONFIG_H=1)
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})

option(WITH_SQLITE3 "Use sqlite3 to store userphrase" true)
@@ -70,7 +70,6 @@ if(MSVC)
set(WITH_INTERNAL_SQLITE3 true)
endif()

-# Use valgrind when testing
option(USE_VALGRIND "Use valgrind when testing" true)

# Feature probe
@@ -121,9 +120,6 @@ set(TEST_BIN_DIR ${PROJECT_BINARY_DIR}/test)

include(GNUInstallDirs)

-set(INFO_SRC ${PROJECT_SOURCE_DIR}/doc/libchewing.texi)
-set(INFO_BIN ${PROJECT_BINARY_DIR}/doc/libchewing.info)
-
configure_file(
${PROJECT_SOURCE_DIR}/cmake/config.h.in
${PROJECT_BINARY_DIR}/include/config.h
@@ -155,11 +151,6 @@ include_directories(
${PROJECT_SOURCE_DIR}/src/porting_layer/include
)

-set(ALL_DATA
- ${DATA_BIN_DIR}/dictionary.dat
- ${DATA_BIN_DIR}/index_tree.dat
-)
-
set(ALL_INC
${INC_DIR}/chewing.h
${INC_DIR}/chewing-compat.h
@@ -168,166 +159,20 @@ set(ALL_INC
${INC_DIR}/mod_aux.h
)

-# info page
-find_program(MAKEINFO makeinfo)
-if (MAKEINFO)
- add_custom_command(
- OUTPUT
- ${INFO_BIN}
- COMMAND ${MAKEINFO} ${INFO_SRC} -o ${INFO_BIN} -I ${PROJECT_BINARY_DIR}/doc
- DEPENDS
- ${INFO_SRC}
- )
- add_custom_target(INFO ALL DEPENDS ${INFO_BIN})
- add_dependencies(check INFO)
-
- find_program(INSTALL_INFO NAMES ginstall-info install-info)
- if (INSTALL_INFO)
- install(FILES ${INFO_BIN} DESTINATION ${CMAKE_INSTALL_INFODIR})
- install(CODE "execute_process(COMMAND ${INSTALL_INFO} --info-dir=${CMAKE_INSTALL_INFODIR} ${INFO_BIN})")
- endif()
-endif()
-
-
-# We need to copy static data to binary tree when using out of tree build.
-set(ALL_STATIC_DATA
- ${DATA_BIN_DIR}/pinyin.tab
- ${DATA_BIN_DIR}/swkb.dat
- ${DATA_BIN_DIR}/symbols.dat
-)
-
-add_custom_target(all_static_data
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DATA_SRC_DIR}/pinyin.tab ${DATA_BIN_DIR}/pinyin.tab
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DATA_SRC_DIR}/swkb.dat ${DATA_BIN_DIR}/swkb.dat
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DATA_SRC_DIR}/symbols.dat ${DATA_BIN_DIR}/symbols.dat
-)
-
-set(ALL_STATIC_TEST stresstest.py)
-foreach(target ${ALL_STATIC_TEST})
- add_custom_target(${target} ALL
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${TEST_SRC_DIR}/${target} ${TEST_BIN_DIR}/${target}
- )
- add_dependencies(check ${target})
-endforeach()
-
-# tools
-set(ALL_TOOLS init_database dump_database)
-add_executable(init_database ${TOOLS_SRC_DIR}/init_database.c $<TARGET_OBJECTS:common>)
-add_executable(dump_database
- ${TOOLS_SRC_DIR}/dump_database.c
- ${SRC_DIR}/porting_layer/src/plat_mmap_posix.c
- ${SRC_DIR}/porting_layer/src/plat_mmap_windows.c
- ${SRC_DIR}/porting_layer/src/rpl_malloc.c
- $<TARGET_OBJECTS:common>
-)
-set_target_properties(${ALL_TOOLS} PROPERTIES
- RUNTIME_OUTPUT_DIRECTORY ${TOOLS_BIN_DIR}
- RUNTIME_OUTPUT_DIRECTORY_DEBUG ${TOOLS_BIN_DIR}
- RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${TOOLS_BIN_DIR}
- RUNTIME_OUTPUT_DIRECTORY_RELEASE ${TOOLS_BIN_DIR}
- RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${TOOLS_BIN_DIR}
-)
-
-# tools command
-add_custom_command(
- OUTPUT
- ${ALL_DATA}
- COMMAND ${CMAKE_COMMAND} -E make_directory ${DATA_BIN_DIR}
- COMMAND ${CMAKE_COMMAND} -E chdir ${DATA_BIN_DIR} ${TOOLS_BIN_DIR}/init_database ${DATA_SRC_DIR}/phone.cin ${DATA_SRC_DIR}/tsi.src
- DEPENDS
- ${ALL_TOOLS}
- ${DATA_SRC_DIR}/phone.cin
- ${DATA_SRC_DIR}/tsi.src
-)
-
-# test
-set(ALL_TESTCASES
- test-bopomofo
- test-config
- test-easy-symbol
- test-error-handling
- test-fullshape
- test-key2pho
- test-keyboard
- test-keyboardless
- test-logger
- test-mmap
- test-path
- test-regression
- test-reset
- test-special-symbol
- test-struct-size
- test-symbol
- test-userphrase
- test-utf8
-)
-set(ALL_TESTTOOLS
- performance
- randkeystroke
- simulate
- stress
- testchewing
-)
-
-if(${CURSES_FOUND})
- set(ALL_TESTTOOLS ${ALL_TESTTOOLS} genkeystroke)
-endif()
-
-enable_testing()
-
-set(ALL_TESTS ${ALL_TESTCASES} ${ALL_TESTTOOLS})
-
-foreach(target ${ALL_TESTCASES})
- add_test(${target} ${TEST_BIN_DIR}/${target})
-endforeach()
-
-if(USE_VALGRIND)
- find_program(VALGRIND valgrind)
- if(VALGRIND)
- foreach(target ${ALL_TESTCASES})
- add_test("valgrind-${target}" ${VALGRIND} --error-exitcode=255 --leak-check=full ${TEST_BIN_DIR}/${target})
- endforeach()
- endif()
-endif()
-
-foreach(target ${ALL_TESTS})
- add_executable(${target} ${TEST_SRC_DIR}/${target}.c)
- add_dependencies(${target} data all_static_data)
- add_dependencies(check ${target})
-endforeach()
+add_subdirectory(doc)
+add_subdirectory(test)
+add_subdirectory(data)

-add_library(testhelper STATIC
- ${TEST_SRC_DIR}/testhelper.c
- $<TARGET_OBJECTS:chewing>
- $<TARGET_OBJECTS:common>
-)
-target_link_libraries(testhelper userphrase)
-set_target_properties(testhelper PROPERTIES
- COMPILE_DEFINITIONS
- "CHEWING_DATA_PREFIX=\"${DATA_BIN_DIR}\";TEST_HASH_DIR=\"${TEST_BIN_DIR}\";TEST_DATA_DIR=\"${TEST_SRC_DIR}/data\";TESTDATA=\"${TEST_SRC_DIR}/default-test.txt\""
-)
+# library
+add_library(common OBJECT
+ ${INC_DIR}/internal/chewing-utf8-util.h
+ ${INC_DIR}/internal/key2pho-private.h
+ ${INC_DIR}/internal/memory-private.h

-set_target_properties(${ALL_TESTS} PROPERTIES
- RUNTIME_OUTPUT_DIRECTORY ${TEST_BIN_DIR}
- RUNTIME_OUTPUT_DIRECTORY_DEBUG ${TEST_BIN_DIR}
- RUNTIME_OUTPUT_DIRECTORY_RELEASE ${TEST_BIN_DIR}
- RUNTIME_OUTPUT_DIRECTORY_RELEASE ${TEST_BIN_DIR}
- RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${TEST_BIN_DIR}
- COMPILE_DEFINITIONS
- "CHEWING_DATA_PREFIX=\"${DATA_BIN_DIR}\";TEST_HASH_DIR=\"${TEST_BIN_DIR}\";TEST_DATA_DIR=\"${TEST_SRC_DIR}/data\""
+ ${SRC_DIR}/common/chewing-utf8-util.c
+ ${SRC_DIR}/common/key2pho.c
)
-foreach(target ${ALL_TESTS})
- target_link_libraries(${target} testhelper)
-endforeach()
-
-if (${CURSES_FOUND})
- target_link_libraries(genkeystroke ${CURSES_LIBRARIES})
-endif()

-# data
-add_custom_target(data ALL DEPENDS ${ALL_DATA})
-
-# library
add_library(chewing OBJECT
${ALL_INC}
${INC_DIR}/internal/chewing-private.h
@@ -361,8 +206,8 @@ add_library(chewing OBJECT
${SRC_DIR}/userphrase.c
${SRC_DIR}/bopomofo.c
)
-set_target_properties(chewing PROPERTIES
- COMPILE_DEFINITIONS "CHEWING_DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}/libchewing\""
+target_compile_definitions(chewing PRIVATE
+ CHEWING_DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}/libchewing\"
)

if (WITH_SQLITE3)
@@ -407,7 +252,7 @@ endif()

if (BUILD_DLL OR NOT MSVC)
if (MSVC)
- add_definitions(-DCHEWINGDLL_EXPORTS)
+ add_compile_definitions(CHEWINGDLL_EXPORTS)
endif()
add_library(chewing_shared SHARED
$<TARGET_OBJECTS:chewing>
@@ -441,16 +286,6 @@ set_target_properties(${LIBS} PROPERTIES
VERSION 3.3.1
)

-add_library(common OBJECT
- ${INC_DIR}/internal/chewing-utf8-util.h
- ${INC_DIR}/internal/key2pho-private.h
- ${INC_DIR}/internal/memory-private.h
-
- ${SRC_DIR}/common/chewing-utf8-util.c
- ${SRC_DIR}/common/key2pho.c
-)
-
-
# install
install(FILES ${ALL_DATA} DESTINATION ${CMAKE_INSTALL_DATADIR}/libchewing)
install(FILES ${ALL_STATIC_DATA} DESTINATION ${CMAKE_INSTALL_DATADIR}/libchewing)
diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt
new file mode 100644
index 0000000..4cb0068
--- /dev/null
+++ b/data/CMakeLists.txt
@@ -0,0 +1,49 @@
+set(ALL_DATA
+ ${DATA_BIN_DIR}/dictionary.dat
+ ${DATA_BIN_DIR}/index_tree.dat
+)
+
+add_custom_target(data ALL DEPENDS ${ALL_DATA})
+
+# We need to copy static data to binary tree when using out of tree build.
+set(ALL_STATIC_DATA
+ ${DATA_BIN_DIR}/pinyin.tab
+ ${DATA_BIN_DIR}/swkb.dat
+ ${DATA_BIN_DIR}/symbols.dat
+)
+
+add_custom_target(all_static_data
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DATA_SRC_DIR}/pinyin.tab ${DATA_BIN_DIR}/pinyin.tab
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DATA_SRC_DIR}/swkb.dat ${DATA_BIN_DIR}/swkb.dat
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DATA_SRC_DIR}/symbols.dat ${DATA_BIN_DIR}/symbols.dat
+)
+
+# tools
+set(ALL_TOOLS init_database dump_database)
+add_executable(init_database ${TOOLS_SRC_DIR}/init_database.c $<TARGET_OBJECTS:common>)
+add_executable(dump_database
+ ${TOOLS_SRC_DIR}/dump_database.c
+ ${SRC_DIR}/porting_layer/src/plat_mmap_posix.c
+ ${SRC_DIR}/porting_layer/src/plat_mmap_windows.c
+ ${SRC_DIR}/porting_layer/src/rpl_malloc.c
+ $<TARGET_OBJECTS:common>
+)
+set_target_properties(${ALL_TOOLS} PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY ${TOOLS_BIN_DIR}
+ RUNTIME_OUTPUT_DIRECTORY_DEBUG ${TOOLS_BIN_DIR}
+ RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${TOOLS_BIN_DIR}
+ RUNTIME_OUTPUT_DIRECTORY_RELEASE ${TOOLS_BIN_DIR}
+ RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${TOOLS_BIN_DIR}
+)
+
+# tools command
+add_custom_command(
+ OUTPUT
+ ${ALL_DATA}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${DATA_BIN_DIR}
+ COMMAND ${CMAKE_COMMAND} -E chdir ${DATA_BIN_DIR} ${TOOLS_BIN_DIR}/init_database ${DATA_SRC_DIR}/phone.cin ${DATA_SRC_DIR}/tsi.src
+ DEPENDS
+ ${ALL_TOOLS}
+ ${DATA_SRC_DIR}/phone.cin
+ ${DATA_SRC_DIR}/tsi.src
+)
\ No newline at end of file
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
new file mode 100644
index 0000000..ab66a56
--- /dev/null
+++ b/doc/CMakeLists.txt
@@ -0,0 +1,21 @@
+set(INFO_SRC ${PROJECT_SOURCE_DIR}/doc/libchewing.texi)
+set(INFO_BIN ${PROJECT_BINARY_DIR}/doc/libchewing.info)
+
+find_program(MAKEINFO makeinfo)
+if (MAKEINFO)
+ add_custom_command(
+ OUTPUT
+ ${INFO_BIN}
+ COMMAND ${MAKEINFO} ${INFO_SRC} -o ${INFO_BIN} -I ${PROJECT_BINARY_DIR}/doc
+ DEPENDS
+ ${INFO_SRC}
+ )
+ add_custom_target(INFO ALL DEPENDS ${INFO_BIN})
+ add_dependencies(check INFO)
+
+ find_program(INSTALL_INFO NAMES ginstall-info install-info)
+ if (INSTALL_INFO)
+ install(FILES ${INFO_BIN} DESTINATION ${CMAKE_INSTALL_INFODIR})
+ install(CODE "execute_process(COMMAND ${INSTALL_INFO} --info-dir=${CMAKE_INSTALL_INFODIR} ${INFO_BIN})")
+ endif()
+endif()
\ No newline at end of file
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000..627525b
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,95 @@
+set(ALL_TESTCASES
+ test-bopomofo
+ test-config
+ test-easy-symbol
+ test-error-handling
+ test-fullshape
+ test-key2pho
+ test-keyboard
+ test-keyboardless
+ test-logger
+ test-mmap
+ test-path
+ test-regression
+ test-reset
+ test-special-symbol
+ test-struct-size
+ test-symbol
+ test-userphrase
+ test-utf8
+)
+set(ALL_TESTTOOLS
+ performance
+ randkeystroke
+ simulate
+ stress
+ testchewing
+)
+
+if(${CURSES_FOUND})
+ set(ALL_TESTTOOLS ${ALL_TESTTOOLS} genkeystroke)
+endif()
+
+
+set(ALL_TESTS ${ALL_TESTCASES} ${ALL_TESTTOOLS})
+
+foreach(target ${ALL_TESTCASES})
+ add_test(${target} ${TEST_BIN_DIR}/${target})
+endforeach()
+
+if(USE_VALGRIND)
+ find_program(VALGRIND valgrind)
+ if(VALGRIND)
+ foreach(target ${ALL_TESTCASES})
+ add_test("valgrind-${target}" ${VALGRIND} --error-exitcode=255 --leak-check=full ${TEST_BIN_DIR}/${target})
+ endforeach()
+ endif()
+endif()
+
+foreach(target ${ALL_TESTS})
+ add_executable(${target} ${TEST_SRC_DIR}/${target}.c)
+ add_dependencies(${target} data all_static_data)
+ add_dependencies(check ${target})
+endforeach()
+
+add_library(testhelper STATIC
+ ${TEST_SRC_DIR}/testhelper.c
+ $<TARGET_OBJECTS:chewing>
+ $<TARGET_OBJECTS:common>
+)
+target_link_libraries(testhelper userphrase)
+target_compile_definitions(testhelper PRIVATE
+ CHEWING_DATA_PREFIX=\"${DATA_BIN_DIR}\"
+ TEST_HASH_DIR=\"${TEST_BIN_DIR}\"
+ TEST_DATA_DIR=\"${TEST_SRC_DIR}/data\"
+ TESTDATA=\"${TEST_SRC_DIR}/default-test.txt\"
+)
+
+set_target_properties(${ALL_TESTS} PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY ${TEST_BIN_DIR}
+ RUNTIME_OUTPUT_DIRECTORY_DEBUG ${TEST_BIN_DIR}
+ RUNTIME_OUTPUT_DIRECTORY_RELEASE ${TEST_BIN_DIR}
+ RUNTIME_OUTPUT_DIRECTORY_RELEASE ${TEST_BIN_DIR}
+ RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${TEST_BIN_DIR}
+)
+foreach(target ${ALL_TESTS})
+ target_link_libraries(${target} testhelper)
+ target_compile_definitions(${target} PRIVATE
+ CHEWING_DATA_PREFIX=\"${DATA_BIN_DIR}\"
+ TEST_HASH_DIR=\"${TEST_BIN_DIR}\"
+ TEST_DATA_DIR=\"${TEST_SRC_DIR}/data\"
+ TESTDATA=\"${TEST_SRC_DIR}/default-test.txt\"
+ )
+endforeach()
+
+if (${CURSES_FOUND})
+ target_link_libraries(genkeystroke ${CURSES_LIBRARIES})
+endif()
+
+set(ALL_STATIC_TEST stresstest.py)
+foreach(target ${ALL_STATIC_TEST})
+ add_custom_target(${target} ALL
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${TEST_SRC_DIR}/${target} ${TEST_BIN_DIR}/${target}
+ )
+ add_dependencies(check ${target})
+endforeach()
\ No newline at end of file
--
2.39.1

Kan-Ru Chen

unread,
Jan 26, 2023, 8:42:48 PM1/26/23
to chewin...@googlegroups.com, czc...@czchen.org, jser...@gmail.com, Kan-Ru Chen
---
.gitignore | 3 +
.gitmodules | 3 +
CMakeLists.txt | 15 ++
Cargo.lock | 328 +++++++++++++++++++++++
Cargo.toml | 17 ++
capi/chewing-public/Cargo.toml | 15 ++
capi/chewing-public/build.rs | 8 +
capi/chewing-public/cbindgen.toml | 84 ++++++
capi/chewing-public/include/chewing_rs.h | 134 +++++++++
capi/chewing-public/src/io.rs | 18 ++
capi/chewing-public/src/lib.rs | 1 +
capi/chewing-public/src/types.rs | 47 ++++
cmake/corrosion | 1 +
include/chewing.h | 6 +-
include/chewingio.h | 6 +-
include/global.h | 24 --
include/internal/chewing-private.h | 23 +-
include/internal/hash-private.h | 1 -
include/internal/key2pho-private.h | 4 +-
include/mod_aux.h | 6 +-
src/chewingio.c | 1 -
src/chewingutil.c | 1 -
src/choice.c | 1 -
src/common/key2pho.c | 7 +-
src/lib.rs | 0
src/mod_aux.c | 1 -
src/tree.c | 1 -
test/test-bopomofo.c | 1 -
test/test-key2pho.c | 1 -
test/testhelper.h | 24 ++
30 files changed, 724 insertions(+), 58 deletions(-)
create mode 100644 .gitmodules
create mode 100644 Cargo.lock
create mode 100644 Cargo.toml
create mode 100644 capi/chewing-public/Cargo.toml
create mode 100644 capi/chewing-public/build.rs
create mode 100644 capi/chewing-public/cbindgen.toml
create mode 100644 capi/chewing-public/include/chewing_rs.h
create mode 100644 capi/chewing-public/src/io.rs
create mode 100644 capi/chewing-public/src/lib.rs
create mode 100644 capi/chewing-public/src/types.rs
create mode 160000 cmake/corrosion
create mode 100644 src/lib.rs

diff --git a/.gitignore b/.gitignore
index e917c79..017d159 100644
--- a/.gitignore
+++ b/.gitignore
@@ -145,3 +145,6 @@ contrib/test.sqlite3

# python
*.pyc
+
+# rust
+/target
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..ab5575f
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "cmake/corrosion"]
+ path = cmake/corrosion
+ url = https://github.com/corrosion-rs/corrosion.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 406089d..f3c6edf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -72,6 +72,13 @@ endif()

option(USE_VALGRIND "Use valgrind when testing" true)

+option(WITH_RUST "Use rust implemented internals (experimental)" true)
+if (WITH_RUST)
+ add_subdirectory(cmake/corrosion)
+ corrosion_import_crate(MANIFEST_PATH Cargo.toml)
+ add_compile_definitions(WITH_RUST)
+endif()
+
# Feature probe
include(CheckTypeSize)
check_type_size(uint16_t UINT16_T)
@@ -159,6 +166,11 @@ set(ALL_INC
${INC_DIR}/mod_aux.h
)

+if (WITH_RUST)
+ include_directories(capi/chewing-public/include)
+ list(APPEND ALL_INC capi/chewing-public/include/chewing_rs.h)
+endif()
+
add_subdirectory(doc)
add_subdirectory(test)
add_subdirectory(data)
@@ -276,6 +288,9 @@ foreach(lib ${LIBS})
if (WITH_SQLITE3 AND NOT WITH_INTERNAL_SQLITE3)
target_link_libraries(${lib} ${SQLITE3_LIBRARY})
endif()
+ if (WITH_RUST)
+ target_link_libraries(${lib} chewing-public)
+ endif()
endforeach()

set_target_properties(${LIBS} PROPERTIES
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..8fcb491
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,328 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "cbindgen"
+version = "0.24.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6358dedf60f4d9b8db43ad187391afe959746101346fe51bb978126bec61dfb"
+dependencies = [
+ "clap",
+ "heck",
+ "indexmap",
+ "log",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_json",
+ "syn",
+ "tempfile",
+ "toml",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chewing"
+version = "0.5.1-alpha.1"
+
+[[package]]
+name = "chewing-public"
+version = "0.5.1-alpha.1"
+dependencies = [
+ "cbindgen",
+ "chewing",
+]
+
+[[package]]
+name = "clap"
+version = "3.2.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5"
+dependencies = [
+ "atty",
+ "bitflags",
+ "clap_lex",
+ "indexmap",
+ "strsim",
+ "termcolor",
+ "textwrap",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
+name = "fastrand"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "heck"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440"
+
+[[package]]
+name = "libc"
+version = "0.2.139"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "os_str_bytes"
+version = "6.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.50"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "remove_dir_all"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde"
+
+[[package]]
+name = "serde"
+version = "1.0.152"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.152"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.91"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "syn"
+version = "1.0.107"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "libc",
+ "redox_syscall",
+ "remove_dir_all",
+ "winapi",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d"
+
+[[package]]
+name = "toml"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..dce7216
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,17 @@
+[package]
+name = "chewing"
+description = "The Chewing (酷音) intelligent Zhuyin input method."
+license = "LGPL-2.1-or-later"
+documentation = "https://docs.rs/chewing"
+version = "0.5.1-alpha.1"
+edition = "2021"
+
+[dependencies]
+
+[dev-dependencies]
+
+[workspace]
+members = ["capi/chewing-public"]
+
+[profile.release]
+lto = "thin"
\ No newline at end of file
diff --git a/capi/chewing-public/Cargo.toml b/capi/chewing-public/Cargo.toml
new file mode 100644
index 0000000..69c32f9
--- /dev/null
+++ b/capi/chewing-public/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "chewing-public"
+description = "Public C API for the Chewing (酷音) intelligent Zhuyin input method."
+license = "LGPL-2.1-or-later"
+version = "0.5.1-alpha.1"
+edition = "2021"
+
+[dependencies]
+chewing = { version = "0.5.1-alpha.1", path = "../.." }
+
+[lib]
+crate-type = ["staticlib"]
+
+[build-dependencies]
+cbindgen = "0.24.3"
\ No newline at end of file
diff --git a/capi/chewing-public/build.rs b/capi/chewing-public/build.rs
new file mode 100644
index 0000000..00fe0e0
--- /dev/null
+++ b/capi/chewing-public/build.rs
@@ -0,0 +1,8 @@
+use std::env;
+
+fn main() {
+ let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
+ cbindgen::generate(crate_dir)
+ .expect("Unable to generate C headers for Rust code")
+ .write_to_file("include/chewing_rs.h");
+}
diff --git a/capi/chewing-public/cbindgen.toml b/capi/chewing-public/cbindgen.toml
new file mode 100644
index 0000000..16c1083
--- /dev/null
+++ b/capi/chewing-public/cbindgen.toml
@@ -0,0 +1,84 @@
+# See https://github.com/eqrion/cbindgen/blob/master/docs.md#cbindgentoml
+# for detailed documentation of every option here.
+
+language = "C"
+
+############## Options for Wrapping the Contents of the Header #################
+
+header = """
+/*
+ * Copyright (c) 2023
+ * libchewing Core Team. See ChangeLog for details.
+ *
+ * See the file "COPYING" for information on usage and redistribution
+ * of this file.
+ */"""
+autogen_warning = "/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */"
+include_guard = "chewing_public_bindings_h"
+pragma_once = true
+cpp_compat = true
+after_includes = """
+
+/** @brief context handle used for Chewing IM APIs
+ */
+typedef struct ChewingContext ChewingContext;
+
+/* specified to Chewing API */
+#if defined(_WIN32) || defined(_WIN64) || defined(_WIN32_WCE)
+# define CHEWING_DLL_IMPORT __declspec(dllimport)
+# define CHEWING_DLL_EXPORT __declspec(dllexport)
+# ifdef CHEWINGDLL_EXPORTS
+# define CHEWING_API CHEWING_DLL_EXPORT
+# define CHEWING_PRIVATE
+# elif CHEWINGDLL_IMPORTS
+# define CHEWING_API CHEWING_DLL_IMPORT
+# define CHEWING_PRIVATE
+# else
+# define CHEWING_API
+# define CHEWING_PRIVATE
+# endif
+#elif (__GNUC__ > 3) && (defined(__ELF__) || defined(__PIC__))
+# define CHEWING_API __attribute__((__visibility__("default")))
+# define CHEWING_PRIVATE __attribute__((__visibility__("hidden")))
+#else
+# define CHEWING_API
+# define CHEWING_PRIVATE
+#endif
+
+#ifndef UNUSED
+# if defined(__GNUC__) /* gcc specific */
+# define UNUSED __attribute__((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+#ifndef DEPRECATED
+# if defined(__GNUC__) && __GNUC__ > 3 || \
+ (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) /* gcc specific */
+# define DEPRECATED __attribute__((deprecated))
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+# define DEPRECATED_FOR(f) \
+ __attribute__((deprecated("Use " #f " instead")))
+# else
+# define DEPRECATED_FOR(f) DEPRECATED
+# endif
+# else
+# define DEPRECATED
+# define DEPRECATED_FOR(f)
+# endif
+#endif
+"""
+
+[parse]
+parse_deps = true
+include = ["chewing"]
+
+[struct]
+rename_fields = "CamelCase"
+
+[enum]
+rename_variants = "ScreamingSnakeCase"
+
+[export]
+include = ["KB", "ChewingConfigData", "IntervalType", "ChewingContext"]
diff --git a/capi/chewing-public/include/chewing_rs.h b/capi/chewing-public/include/chewing_rs.h
new file mode 100644
index 0000000..191f368
--- /dev/null
+++ b/capi/chewing-public/include/chewing_rs.h
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2023
+ * libchewing Core Team. See ChangeLog for details.
+ *
+ * See the file "COPYING" for information on usage and redistribution
+ * of this file.
+ */
+
+#ifndef chewing_public_bindings_h
+#define chewing_public_bindings_h
+
+#pragma once
+
+/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+/** @brief context handle used for Chewing IM APIs
+ */
+typedef struct ChewingContext ChewingContext;
+
+/* specified to Chewing API */
+#if defined(_WIN32) || defined(_WIN64) || defined(_WIN32_WCE)
+# define CHEWING_DLL_IMPORT __declspec(dllimport)
+# define CHEWING_DLL_EXPORT __declspec(dllexport)
+# ifdef CHEWINGDLL_EXPORTS
+# define CHEWING_API CHEWING_DLL_EXPORT
+# define CHEWING_PRIVATE
+# elif CHEWINGDLL_IMPORTS
+# define CHEWING_API CHEWING_DLL_IMPORT
+# define CHEWING_PRIVATE
+# else
+# define CHEWING_API
+# define CHEWING_PRIVATE
+# endif
+#elif (__GNUC__ > 3) && (defined(__ELF__) || defined(__PIC__))
+# define CHEWING_API __attribute__((__visibility__("default")))
+# define CHEWING_PRIVATE __attribute__((__visibility__("hidden")))
+#else
+# define CHEWING_API
+# define CHEWING_PRIVATE
+#endif
+
+#ifndef UNUSED
+# if defined(__GNUC__) /* gcc specific */
+# define UNUSED __attribute__((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+#ifndef DEPRECATED
+# if defined(__GNUC__) && __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) /* gcc specific */
+# define DEPRECATED __attribute__((deprecated))
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+# define DEPRECATED_FOR(f) __attribute__((deprecated("Use " #f " instead")))
+# else
+# define DEPRECATED_FOR(f) DEPRECATED
+# endif
+# else
+# define DEPRECATED
+# define DEPRECATED_FOR(f)
+# endif
+#endif
+
+
+#define CHINESE_MODE 1
+
+#define SYMBOL_MODE 0
+
+#define FULLSHAPE_MODE 1
+
+#define HALFSHAPE_MODE 0
+
+#define AUTOLEARN_DISABLED 1
+
+#define AUTOLEARN_ENABLED 0
+
+#define MIN_SELKEY 1
+
+#define MAX_SELKEY 10
+
+#define CHEWING_LOG_VERBOSE 1
+
+#define CHEWING_LOG_DEBUG 2
+
+#define CHEWING_LOG_INFO 3
+
+#define CHEWING_LOG_WARN 4
+
+#define CHEWING_LOG_ERROR 5
+
+/**
+ * Use "asdfjkl789" as selection key
+ */
+#define HSU_SELKEY_TYPE1 1
+
+/**
+ * Use "asdfzxcv89" as selection key
+ */
+#define HSU_SELKEY_TYPE2 2
+
+/**
+ * Deprecated, use chewing_set_ series of functions to set parameters instead.
+ */
+typedef struct ChewingConfigData {
+ int candPerPage;
+ int maxChiSymbolLen;
+ int selKey[MAX_SELKEY];
+ int bAddPhraseForward;
+ int bSpaceAsSelection;
+ int bEscCleanAllBuf;
+ int bAutoShiftCur;
+ int bEasySymbolInput;
+ int bPhraseChoiceRearward;
+ int bAutoLearn;
+ int hsuSelKeyType;
+} ChewingConfigData;
+
+typedef struct IntervalType {
+ /**
+ * Starting position of certain interval
+ */
+ int from;
+ /**
+ * Ending position of certain interval (exclusive)
+ */
+ int to;
+} IntervalType;
+
+#endif /* chewing_public_bindings_h */
diff --git a/capi/chewing-public/src/io.rs b/capi/chewing-public/src/io.rs
new file mode 100644
index 0000000..a80e5cc
--- /dev/null
+++ b/capi/chewing-public/src/io.rs
@@ -0,0 +1,18 @@
+use std::ffi::c_int;
+
+use crate::capi::internal::{binding, types::ChewingContext};
+
+#[no_mangle]
+pub extern "C" fn chewing_new() -> *mut ChewingContext {
+ unsafe { binding::chewing_new_c().cast() }
+}
+
+#[no_mangle]
+pub extern "C" fn chewing_set_maxChiSymbolLen(ctx: *mut ChewingContext, n: c_int) {
+ unsafe { binding::chewing_set_maxChiSymbolLen_c(ctx.cast(), n) }
+}
+
+#[no_mangle]
+pub extern "C" fn chewing_delete(ctx: *mut ChewingContext) {
+ unsafe { binding::chewing_delete_c(ctx.cast()) }
+}
\ No newline at end of file
diff --git a/capi/chewing-public/src/lib.rs b/capi/chewing-public/src/lib.rs
new file mode 100644
index 0000000..dd198c6
--- /dev/null
+++ b/capi/chewing-public/src/lib.rs
@@ -0,0 +1 @@
+pub mod types;
\ No newline at end of file
diff --git a/capi/chewing-public/src/types.rs b/capi/chewing-public/src/types.rs
new file mode 100644
index 0000000..d51fb9a
--- /dev/null
+++ b/capi/chewing-public/src/types.rs
@@ -0,0 +1,47 @@
+use std::ffi::c_int;
+
+pub const CHINESE_MODE: usize = 1;
+pub const SYMBOL_MODE: usize = 0;
+pub const FULLSHAPE_MODE: usize = 1;
+pub const HALFSHAPE_MODE: usize = 0;
+pub const AUTOLEARN_DISABLED: usize = 1;
+pub const AUTOLEARN_ENABLED: usize = 0;
+
+pub const MIN_SELKEY: usize = 1;
+pub const MAX_SELKEY: usize = 10;
+
+pub const CHEWING_LOG_VERBOSE: usize = 1;
+pub const CHEWING_LOG_DEBUG: usize = 2;
+pub const CHEWING_LOG_INFO: usize = 3;
+pub const CHEWING_LOG_WARN: usize = 4;
+pub const CHEWING_LOG_ERROR: usize = 5;
+
+/// Use "asdfjkl789" as selection key
+pub const HSU_SELKEY_TYPE1: usize = 1;
+/// Use "asdfzxcv89" as selection key
+pub const HSU_SELKEY_TYPE2: usize = 2;
+
+/// Deprecated, use chewing_set_ series of functions to set parameters instead.
+/// cbindgen:rename-all=CamelCase
+#[repr(C)]
+pub struct ChewingConfigData {
+ pub cand_per_page: c_int,
+ pub max_chi_symbol_len: c_int,
+ pub sel_key: [c_int; MAX_SELKEY],
+ pub b_add_phrase_forward: c_int,
+ pub b_space_as_selection: c_int,
+ pub b_esc_clean_all_buf: c_int,
+ pub b_auto_shift_cur: c_int,
+ pub b_easy_symbol_input: c_int,
+ pub b_phrase_choice_rearward: c_int,
+ pub b_auto_learn: c_int,
+ pub hsu_sel_key_type: c_int,
+}
+
+#[repr(C)]
+pub struct IntervalType {
+ /// Starting position of certain interval
+ pub from: c_int,
+ /// Ending position of certain interval (exclusive)
+ pub to: c_int,
+}
diff --git a/cmake/corrosion b/cmake/corrosion
new file mode 160000
index 0000000..e3d8d20
--- /dev/null
+++ b/cmake/corrosion
@@ -0,0 +1 @@
+Subproject commit e3d8d200082fd49350dc6b9c4f974efc2402f6ae
diff --git a/include/chewing.h b/include/chewing.h
index 8faceb7..08dc23f 100644
--- a/include/chewing.h
+++ b/include/chewing.h
@@ -44,8 +44,12 @@ extern "C" {
* specific functionality.
*/

+#ifdef WITH_RUST
+# include "chewing_rs.h"
+#else
+# include "global.h"
+#endif
#include "chewingio.h"
-#include "global.h"
#include "mod_aux.h"

/* backward compatibility */
diff --git a/include/chewingio.h b/include/chewingio.h
index de231cf..10e471d 100644
--- a/include/chewingio.h
+++ b/include/chewingio.h
@@ -22,7 +22,11 @@
* \author libchewing Core Team
*/

-#include "global.h"
+#ifdef WITH_RUST
+# include "chewing_rs.h"
+#else
+# include "global.h"
+#endif

#define KEYSTROKE_IGNORE 1
#define KEYSTROKE_COMMIT 2
diff --git a/include/global.h b/include/global.h
index 204cfa8..6907484 100644
--- a/include/global.h
+++ b/include/global.h
@@ -75,30 +75,6 @@
# endif
#endif

-/* The following macros are modified from GLIB.
- * from GNU cpp Manual:
- * C99 introduces the _Pragma operator. This feature addresses a major problem
- * with `#pragma': being a directive, it cannot be produced as the result of
- * macro expansion. _Pragma is an operator, much like sizeof or defined, and
- * can be embedded in a macro.
- */
-#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))
-# define BEGIN_IGNORE_DEPRECATIONS \
- _Pragma ("GCC diagnostic push") \
- _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
-# define END_IGNORE_DEPRECATIONS \
- _Pragma ("GCC diagnostic pop")
-#elif defined (_MSC_VER) && (_MSC_VER >= 1500)
-# define BEGIN_IGNORE_DEPRECATIONS \
- __pragma (warning (push)) \
- __pragma (warning (disable : 4996))
-# define END_IGNORE_DEPRECATIONS \
- __pragma (warning (pop))
-#else
-# define BEGIN_IGNORE_DEPRECATIONS
-# define END_IGNORE_DEPRECATIONS
-#endif
-
#define MIN_SELKEY 1
#define MAX_SELKEY 10

diff --git a/include/internal/chewing-private.h b/include/internal/chewing-private.h
index 260a0a7..17762f4 100644
--- a/include/internal/chewing-private.h
+++ b/include/internal/chewing-private.h
@@ -29,7 +29,11 @@
typedef SSIZE_T ssize_t;
#endif

-#include "global.h"
+#ifdef WITH_RUST
+# include "chewing_rs.h"
+#else
+# include "global.h"
+#endif
#include "plat_mmap.h"

#include "userphrase-private.h"
@@ -73,23 +77,6 @@ static inline int min(int a, int b)
}
#endif

-typedef enum KBTYPE {
- KBTYPE_STANDARD,
- KBTYPE_HSU,
- KBTYPE_IBM,
- KBTYPE_GIN_YIEH,
- KBTYPE_ET,
- KBTYPE_ET26,
- KBTYPE_DVORAK,
- KBTYPE_DVORAK_HSU,
- KBTYPE_DACHEN_CP26,
- KBTYPE_HANYU_PINYIN,
- KBTYPE_LUOMA_PINYIN,
- KBTYPE_MSP2, /* Mandarin Phonetic Symbols II */
- KBTYPE_CARPALX,
- KBTYPE_COUNT
-} KBTYPE;
-
/**
* @struct TreeType
* @brief node type of the system index tree
diff --git a/include/internal/hash-private.h b/include/internal/hash-private.h
index 09150e2..4a21f76 100644
--- a/include/internal/hash-private.h
+++ b/include/internal/hash-private.h
@@ -13,7 +13,6 @@
#define _CHEWING_HASH_PRIVATE_H
/* *INDENT-ON* */

-#include "global.h"
#include "userphrase-private.h"

#ifdef __MacOSX__
diff --git a/include/internal/key2pho-private.h b/include/internal/key2pho-private.h
index 9bb8fb7..b5dce61 100644
--- a/include/internal/key2pho-private.h
+++ b/include/internal/key2pho-private.h
@@ -79,7 +79,7 @@ uint16_t UintFromPhoneInx(const int ph_inx[]);
* @param[in] searchTimes times to search.
* @return 1 if succeed or 0 if failed.
*/
-int PhoneFromKey(char *pho, const char *inputkey, KBTYPE kbtype, int searchTimes);
+int PhoneFromKey(char *pho, const char *inputkey, int kbtype, int searchTimes);

/**
* @brief Get the string of phonetic symbols by its phonetic number.
@@ -97,7 +97,7 @@ int PhoneFromUint(char *phone, size_t phone_len, uint16_t phone_num);
* @param[in]
* @return
*/
-int PhoneInxFromKey(int key, int type, KBTYPE kbtype, int searchTimes);
+int PhoneInxFromKey(int key, int type, int kbtype, int searchTimes);

/**
* @brief
diff --git a/include/mod_aux.h b/include/mod_aux.h
index 96aa244..650c53d 100644
--- a/include/mod_aux.h
+++ b/include/mod_aux.h
@@ -18,7 +18,11 @@
* \author libchewing Core Team
*/

-#include "global.h"
+#ifdef WITH_RUST
+# include "chewing_rs.h"
+#else
+# include "global.h"
+#endif

/**
* @brief Chewing the state for input context during commit process
diff --git a/src/chewingio.c b/src/chewingio.c
index 5e6c285..3e37122 100644
--- a/src/chewingio.c
+++ b/src/chewingio.c
@@ -27,7 +27,6 @@
#include <stdio.h>

#include "chewing-utf8-util.h"
-#include "global.h"
#include "bopomofo-private.h"
#include "chewingutil.h"
#include "userphrase-private.h"
diff --git a/src/chewingutil.c b/src/chewingutil.c
index 01f6b6c..8344285 100644
--- a/src/chewingutil.c
+++ b/src/chewingutil.c
@@ -24,7 +24,6 @@
#include <stdio.h>

#include "chewing-utf8-util.h"
-#include "global.h"
#include "global-private.h"
#include "chewingutil.h"
#include "bopomofo-private.h"
diff --git a/src/choice.c b/src/choice.c
index b832bed..7759ab2 100644
--- a/src/choice.c
+++ b/src/choice.c
@@ -21,7 +21,6 @@
#include <assert.h>

#include "chewing-utf8-util.h"
-#include "global.h"
#include "dict-private.h"
#include "chewingutil.h"
#include "tree-private.h"
diff --git a/src/common/key2pho.c b/src/common/key2pho.c
index 85d94a6..7f74264 100644
--- a/src/common/key2pho.c
+++ b/src/common/key2pho.c
@@ -20,6 +20,7 @@
#include <stdio.h>
#include <string.h>
#include "chewing-utf8-util.h"
+#include "bopomofo-private.h"

/* NOTE:
* The reason why we convert string literal to hex representation is for the
@@ -69,7 +70,7 @@ static const char *const ph_str =
"\xCB\x99\xCB\x8A\xCB\x87\xCB\x8B";
/* ˙ˊˇˋ */

-static const char *const key_str[KBTYPE_COUNT] = {
+static const char *const key_str[KB_TYPE_NUM] = {
"1qaz2wsxedcrfv5tgbyhnujm8ik,9ol.0p;/-7634", /* standard kb */
"bpmfdtnlgkhjvcjvcrzasexuyhgeiawomnkllsdfj", /* hsu */
"1234567890-qwertyuiopasdfghjkl;zxcvbn/m,.", /* IBM */
@@ -122,7 +123,7 @@ uint16_t UintFromPhone(const char *zhuin)
return result;
}

-int PhoneFromKey(char *pho, const char *inputkey, KBTYPE kbtype, int searchTimes)
+int PhoneFromKey(char *pho, const char *inputkey, int kbtype, int searchTimes)
{
int len;
int i;
@@ -181,7 +182,7 @@ int PhoneFromUint(char *phone, size_t phone_len, uint16_t phone_num)
return 0;
}

-int PhoneInxFromKey(int key, int type, KBTYPE kbtype, int searchTimes)
+int PhoneInxFromKey(int key, int type, int kbtype, int searchTimes)
{
char keyStr[2];
char rtStr[10];
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..e69de29
diff --git a/src/mod_aux.c b/src/mod_aux.c
index ce9c7cb..7818f8d 100644
--- a/src/mod_aux.c
+++ b/src/mod_aux.c
@@ -16,7 +16,6 @@
#include <string.h>
#include <stdlib.h>

-#include "global.h"
#include "chewing-private.h"
#include "bopomofo-private.h"
#include "chewingio.h"
diff --git a/src/tree.c b/src/tree.c
index 84ddffc..f6d70dc 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -24,7 +24,6 @@
#include "chewing-private.h"
#include "chewing-utf8-util.h"
#include "userphrase-private.h"
-#include "global.h"
#include "global-private.h"
#include "dict-private.h"
#include "memory-private.h"
diff --git a/test/test-bopomofo.c b/test/test-bopomofo.c
index 2b1e6b9..37e01f2 100644
--- a/test/test-bopomofo.c
+++ b/test/test-bopomofo.c
@@ -19,7 +19,6 @@

#include "key2pho-private.h"
#include "bopomofo-private.h"
-#include "chewing.h"
#include "plat_types.h"
#include "testhelper.h"

diff --git a/test/test-key2pho.c b/test/test-key2pho.c
index 324268f..eb83a8c 100644
--- a/test/test-key2pho.c
+++ b/test/test-key2pho.c
@@ -13,7 +13,6 @@
#include <stdlib.h>

#include "testhelper.h"
-#include "global.h"
#include "chewing-utf8-util.h"
#include "key2pho-private.h"
#include "chewing-private.h"
diff --git a/test/testhelper.h b/test/testhelper.h
index 58c734a..dc2f2f7 100644
--- a/test/testhelper.h
+++ b/test/testhelper.h
@@ -19,6 +19,30 @@

#include "plat_path.h"

+/* The following macros are modified from GLIB.
+ * from GNU cpp Manual:
+ * C99 introduces the _Pragma operator. This feature addresses a major problem
+ * with `#pragma': being a directive, it cannot be produced as the result of
+ * macro expansion. _Pragma is an operator, much like sizeof or defined, and
+ * can be embedded in a macro.
+ */
+#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))
+# define BEGIN_IGNORE_DEPRECATIONS \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
+# define END_IGNORE_DEPRECATIONS \
+ _Pragma ("GCC diagnostic pop")
+#elif defined (_MSC_VER) && (_MSC_VER >= 1500)
+# define BEGIN_IGNORE_DEPRECATIONS \
+ __pragma (warning (push)) \
+ __pragma (warning (disable : 4996))
+# define END_IGNORE_DEPRECATIONS \
+ __pragma (warning (pop))
+#else
+# define BEGIN_IGNORE_DEPRECATIONS
+# define END_IGNORE_DEPRECATIONS
+#endif
+
#define KEY_DBLTAB 892 // <TT>
#define KEY_SSPACE 893 // <SS>
#define KEY_PPAGE 894 // <PU>
--
2.39.1

Kan-Ru Chen

unread,
Jan 26, 2023, 8:42:51 PM1/26/23
to chewin...@googlegroups.com, czc...@czchen.org, jser...@gmail.com, Kan-Ru Chen
---
CMakeLists.txt | 2 +
Cargo.lock | 31 ++
Cargo.toml | 5 +-
capi/chewing-internal/Cargo.toml | 15 +
capi/chewing-internal/build.rs | 8 +
capi/chewing-internal/cbindgen.toml | 34 ++
.../include/chewing_internal.h | 40 ++
capi/chewing-internal/src/key2pho.rs | 128 +++++
capi/chewing-internal/src/lib.rs | 1 +
data/CMakeLists.txt | 9 +-
include/internal/chewing-private.h | 1 +
include/internal/key2pho-private.h | 9 +-
src/common/key2pho.c | 15 +
src/lib.rs | 1 +
src/zhuyin.rs | 5 +
src/zhuyin/bopomofo.rs | 298 +++++++++++
src/zhuyin/syllable.rs | 485 ++++++++++++++++++
test/CMakeLists.txt | 3 +
18 files changed, 1086 insertions(+), 4 deletions(-)
create mode 100644 capi/chewing-internal/Cargo.toml
create mode 100644 capi/chewing-internal/build.rs
create mode 100644 capi/chewing-internal/cbindgen.toml
create mode 100644 capi/chewing-internal/include/chewing_internal.h
create mode 100644 capi/chewing-internal/src/key2pho.rs
create mode 100644 capi/chewing-internal/src/lib.rs
create mode 100644 src/zhuyin.rs
create mode 100644 src/zhuyin/bopomofo.rs
create mode 100644 src/zhuyin/syllable.rs

diff --git a/CMakeLists.txt b/CMakeLists.txt
index f3c6edf..76c155f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -167,6 +167,7 @@ set(ALL_INC
)

if (WITH_RUST)
+ include_directories(capi/chewing-internal/include)
include_directories(capi/chewing-public/include)
list(APPEND ALL_INC capi/chewing-public/include/chewing_rs.h)
endif()
@@ -290,6 +291,7 @@ foreach(lib ${LIBS})
endif()
if (WITH_RUST)
target_link_libraries(${lib} chewing-public)
+ target_link_libraries(${lib} chewing-internal)
endif()
endforeach()

diff --git a/Cargo.lock b/Cargo.lock
index 8fcb491..49659ae 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -53,6 +53,17 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "chewing"
version = "0.5.1-alpha.1"
+dependencies = [
+ "thiserror",
+]
+
+[[package]]
+name = "chewing-internal"
+version = "0.5.1-alpha.1"
+dependencies = [
+ "cbindgen",
+ "chewing",
+]

[[package]]
name = "chewing-public"
@@ -281,6 +292,26 @@ version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d"

+[[package]]
+name = "thiserror"
+version = "1.0.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
[[package]]
name = "toml"
version = "0.5.11"
diff --git a/Cargo.toml b/Cargo.toml
index dce7216..4db5cf4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -7,11 +7,12 @@ version = "0.5.1-alpha.1"
edition = "2021"

[dependencies]
+thiserror = "1.0.0"

[dev-dependencies]

[workspace]
-members = ["capi/chewing-public"]
+members = ["capi/chewing-internal", "capi/chewing-public"]

[profile.release]
-lto = "thin"
\ No newline at end of file
+lto = "thin"
diff --git a/capi/chewing-internal/Cargo.toml b/capi/chewing-internal/Cargo.toml
new file mode 100644
index 0000000..dd53c9b
--- /dev/null
+++ b/capi/chewing-internal/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "chewing-internal"
+description = "Internal C API for the Chewing (酷音) intelligent Zhuyin input method."
+license = "LGPL-2.1-or-later"
+version = "0.5.1-alpha.1"
+edition = "2021"
+
+[dependencies]
+chewing = { version = "0.5.1-alpha.1", path = "../.." }
+
+[lib]
+crate-type = ["staticlib"]
+
+[build-dependencies]
+cbindgen = "0.24.3"
diff --git a/capi/chewing-internal/build.rs b/capi/chewing-internal/build.rs
new file mode 100644
index 0000000..e1a2112
--- /dev/null
+++ b/capi/chewing-internal/build.rs
@@ -0,0 +1,8 @@
+use std::env;
+
+fn main() {
+ let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
+ cbindgen::generate(crate_dir)
+ .expect("Unable to generate C headers for Rust code")
+ .write_to_file("include/chewing_internal.h");
+}
diff --git a/capi/chewing-internal/cbindgen.toml b/capi/chewing-internal/cbindgen.toml
new file mode 100644
index 0000000..af85092
--- /dev/null
+++ b/capi/chewing-internal/cbindgen.toml
@@ -0,0 +1,34 @@
+# See https://github.com/eqrion/cbindgen/blob/master/docs.md#cbindgentoml
+# for detailed documentation of every option here.
+
+language = "C"
+
+############## Options for Wrapping the Contents of the Header #################
+
+header = """
+/*
+ * Copyright (c) 2022
+ * libchewing Core Team. See ChangeLog for details.
+ *
+ * See the file "COPYING" for information on usage and redistribution
+ * of this file.
+ */"""
+include_guard = "chewing_internal_bindings_h"
+autogen_warning = "/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */"
+pragma_once = true
+include_version = false
+cpp_compat = true
+usize_is_size_t = true
+
+[parse]
+parse_deps = true
+include = ["chewing"]
+
+[struct]
+rename_fields = "CamelCase"
+
+[enum]
+rename_variants = "ScreamingSnakeCase"
+
+[export]
+include = []
diff --git a/capi/chewing-internal/include/chewing_internal.h b/capi/chewing-internal/include/chewing_internal.h
new file mode 100644
index 0000000..3d7bbbf
--- /dev/null
+++ b/capi/chewing-internal/include/chewing_internal.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2022
+ * libchewing Core Team. See ChangeLog for details.
+ *
+ * See the file "COPYING" for information on usage and redistribution
+ * of this file.
+ */
+
+#ifndef chewing_internal_bindings_h
+#define chewing_internal_bindings_h
+
+#pragma once
+
+/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
+
+uint16_t UintFromPhone(const char *phone);
+
+uint16_t UintFromPhoneInx(const int *ph_inx);
+
+int PhoneFromUint(char *phone, size_t phone_len, uint16_t phone_num);
+
+ptrdiff_t UintArrayFromBopomofo(uint16_t *phone_seq, size_t phone_len, const char *bopomofo_buf);
+
+int GetPhoneLenFromUint(uint16_t phone_num);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif // __cplusplus
+
+#endif /* chewing_internal_bindings_h */
diff --git a/capi/chewing-internal/src/key2pho.rs b/capi/chewing-internal/src/key2pho.rs
new file mode 100644
index 0000000..270bb65
--- /dev/null
+++ b/capi/chewing-internal/src/key2pho.rs
@@ -0,0 +1,128 @@
+use std::{
+ ffi::{c_char, c_int, CStr},
+ ptr, slice,
+};
+
+use chewing::zhuyin::{Bopomofo, Syllable};
+
+#[no_mangle]
+pub extern "C" fn UintFromPhone(phone: *const c_char) -> u16 {
+ let cstr = unsafe { CStr::from_ptr(phone) };
+ let rstr = match cstr.to_str() {
+ Ok(rstr) => rstr,
+ Err(_) => return 0,
+ };
+ let syl: Syllable = match rstr.parse() {
+ Ok(syl) => syl,
+ Err(_) => return 0,
+ };
+ syl.to_u16()
+}
+
+#[no_mangle]
+pub extern "C" fn UintFromPhoneInx(ph_inx: *const c_int) -> u16 {
+ let ph_inx = unsafe { slice::from_raw_parts(ph_inx, 4) };
+ let mut builder = Syllable::builder();
+ if ph_inx[0] > 0 {
+ let bopomofo = match Bopomofo::from_initial(ph_inx[0] as u16) {
+ Ok(bopomofo) => bopomofo,
+ Err(_) => return 0,
+ };
+ builder = match builder.insert(bopomofo) {
+ Ok(builder) => builder,
+ Err(_) => return 0,
+ };
+ }
+ if ph_inx[1] > 0 {
+ let bopomofo = match Bopomofo::from_medial(ph_inx[1] as u16) {
+ Ok(bopomofo) => bopomofo,
+ Err(_) => return 0,
+ };
+ builder = match builder.insert(bopomofo) {
+ Ok(builder) => builder,
+ Err(_) => return 0,
+ };
+ }
+ if ph_inx[2] > 0 {
+ let bopomofo = match Bopomofo::from_rime(ph_inx[2] as u16) {
+ Ok(bopomofo) => bopomofo,
+ Err(_) => return 0,
+ };
+ builder = match builder.insert(bopomofo) {
+ Ok(builder) => builder,
+ Err(_) => return 0,
+ };
+ }
+ if ph_inx[3] > 0 {
+ let bopomofo = match Bopomofo::from_tone(ph_inx[3] as u16) {
+ Ok(bopomofo) => bopomofo,
+ Err(_) => return 0,
+ };
+ builder = match builder.insert(bopomofo) {
+ Ok(builder) => builder,
+ Err(_) => return 0,
+ };
+ }
+ let syl = builder.build();
+ if syl.is_empty() {
+ return 0;
+ }
+ syl.to_u16()
+}
+
+#[no_mangle]
+pub extern "C" fn PhoneFromUint(phone: *mut c_char, phone_len: usize, phone_num: u16) -> c_int {
+ let syl = match Syllable::try_from(phone_num) {
+ Ok(syl) => syl,
+ Err(_) => return 1,
+ };
+ let str = syl.to_string();
+ if phone_len < str.len() + 1 {
+ return 1;
+ }
+ unsafe {
+ phone.copy_from(str.as_ptr() as *const c_char, str.len());
+ ptr::write(phone.offset(str.len() as isize), 0);
+ }
+ 0
+}
+
+#[no_mangle]
+pub extern "C" fn UintArrayFromBopomofo(
+ phone_seq: *mut u16,
+ phone_len: usize,
+ bopomofo_buf: *const c_char,
+) -> isize {
+ let syllables_str = match unsafe { CStr::from_ptr(bopomofo_buf) }.to_str() {
+ Ok(str) => str,
+ Err(_) => return -1,
+ };
+ let syllables: Vec<_> = syllables_str
+ .split_ascii_whitespace()
+ .map(|it| it.parse::<Syllable>().map(|syl| syl.to_u16()))
+ .collect();
+ let len = syllables.len();
+ if syllables.iter().any(|it| it.is_err()) {
+ return -1;
+ }
+ if len > phone_len || phone_seq.is_null() {
+ return len as isize;
+ }
+ for (i, syl) in syllables.into_iter().enumerate() {
+ let syl_u16 = syl.unwrap();
+ unsafe { ptr::write(phone_seq.offset(i as isize), syl_u16) };
+ }
+ len as isize
+}
+
+#[no_mangle]
+pub extern "C" fn GetPhoneLenFromUint(phone_num: u16) -> c_int {
+ let syl = match Syllable::try_from(phone_num) {
+ Ok(syl) => syl,
+ Err(_) => return -1,
+ };
+ if syl.is_empty() {
+ return -1;
+ }
+ (syl.to_string().len() + 1) as c_int
+}
diff --git a/capi/chewing-internal/src/lib.rs b/capi/chewing-internal/src/lib.rs
new file mode 100644
index 0000000..e9c322e
--- /dev/null
+++ b/capi/chewing-internal/src/lib.rs
@@ -0,0 +1 @@
+pub mod key2pho;
\ No newline at end of file
diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt
index 4cb0068..aefc78a 100644
--- a/data/CMakeLists.txt
+++ b/data/CMakeLists.txt
@@ -19,8 +19,14 @@ add_custom_target(all_static_data
)

# tools
-set(ALL_TOOLS init_database dump_database)
+set(ALL_TOOLS init_database)
add_executable(init_database ${TOOLS_SRC_DIR}/init_database.c $<TARGET_OBJECTS:common>)
+if (WITH_RUST)
+target_link_libraries(init_database chewing-internal)
+endif()
+
+if (NOT WITH_RUST)
+list(APPEND ALL_TOOLS dump_database)
add_executable(dump_database
${TOOLS_SRC_DIR}/dump_database.c
${SRC_DIR}/porting_layer/src/plat_mmap_posix.c
@@ -28,6 +34,7 @@ add_executable(dump_database
${SRC_DIR}/porting_layer/src/rpl_malloc.c
$<TARGET_OBJECTS:common>
)
+endif()
set_target_properties(${ALL_TOOLS} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${TOOLS_BIN_DIR}
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${TOOLS_BIN_DIR}
diff --git a/include/internal/chewing-private.h b/include/internal/chewing-private.h
index 17762f4..2c3a7ab 100644
--- a/include/internal/chewing-private.h
+++ b/include/internal/chewing-private.h
@@ -31,6 +31,7 @@ typedef SSIZE_T ssize_t;

#ifdef WITH_RUST
# include "chewing_rs.h"
+# include "chewing_internal.h"
#else
# include "global.h"
#endif
diff --git a/include/internal/key2pho-private.h b/include/internal/key2pho-private.h
index b5dce61..b26cedb 100644
--- a/include/internal/key2pho-private.h
+++ b/include/internal/key2pho-private.h
@@ -33,6 +33,7 @@ typedef SSIZE_T ssize_t;

#include "chewing-private.h"

+#ifndef WITH_RUST
/**
* @brief Get the unsigned 16-bit representation of phonetic symbols.
*
@@ -70,6 +71,7 @@ uint16_t UintFromPhone(const char *phone);
* @return an 16-bit unsigned integer or 0 if any index is illegal.
*/
uint16_t UintFromPhoneInx(const int ph_inx[]);
+#endif

/**
* @brief Get the phonetic symbols by the given keystroke.
@@ -81,6 +83,7 @@ uint16_t UintFromPhoneInx(const int ph_inx[]);
*/
int PhoneFromKey(char *pho, const char *inputkey, int kbtype, int searchTimes);

+#ifndef WITH_RUST
/**
* @brief Get the string of phonetic symbols by its phonetic number.
* @param[out] phone destination string.
@@ -89,6 +92,7 @@ int PhoneFromKey(char *pho, const char *inputkey, int kbtype, int searchTimes);
* @return 1 if succeed or 0 if failed.
*/
int PhoneFromUint(char *phone, size_t phone_len, uint16_t phone_num);
+#endif

/**
* @brief Get the index of a phonetic symbols in its category.
@@ -108,6 +112,7 @@ int PhoneInxFromKey(int key, int type, int kbtype, int searchTimes);
*/
size_t BopomofoFromUintArray(char *const bopomofo_buf, const size_t bopomofo_len, const uint16_t *phoneSeq);

+#ifndef WITH_RUST
/**
* @brief
* @param[out]
@@ -116,6 +121,7 @@ size_t BopomofoFromUintArray(char *const bopomofo_buf, const size_t bopomofo_len
* @return
*/
ssize_t UintArrayFromBopomofo(uint16_t *phone_seq, const size_t phone_len, const char *bopomofo_buf);
+#endif

/**
* @brief Get the length of the array of phones.
@@ -137,13 +143,14 @@ size_t GetPhoneLen(const uint16_t *phoneSeq);
*/
size_t GetBopomofoBufLen(size_t len);

-
+#ifndef WITH_RUST
/**
* @brief Get the length of phonetic symbols by its phonetic number.
* @param[in] phone_num phonetic number.
* @return the length of phone.
*/
size_t GetPhoneLenFromUint(uint16_t phone_num);
+#endif

/* *INDENT-OFF* */
#endif
diff --git a/src/common/key2pho.c b/src/common/key2pho.c
index 7f74264..bed6fd7 100644
--- a/src/common/key2pho.c
+++ b/src/common/key2pho.c
@@ -45,8 +45,11 @@ const char *const zhuin_tab[] = { /* number of bits */
};

static const int zhuin_tab_num[] = { 22, 4, 14, 5 };
+
+#ifndef WITH_RUST
static const int shift[] = { 9, 7, 3, 0 };
static const int mask[] = { 0x1F, 0x3, 0xF, 0x7 };
+#endif

static const char *const ph_str =
"\xE3\x84\x85\xE3\x84\x86\xE3\x84\x87\xE3\x84\x88"
@@ -91,6 +94,7 @@ static const char *const key_str[KB_TYPE_NUM] = {
*
* return the number it means. 0 means error.
*/
+#ifndef WITH_RUST
uint16_t UintFromPhone(const char *zhuin)
{
const char *iter;
@@ -122,6 +126,7 @@ uint16_t UintFromPhone(const char *zhuin)
}
return result;
}
+#endif

int PhoneFromKey(char *pho, const char *inputkey, int kbtype, int searchTimes)
{
@@ -153,6 +158,7 @@ int PhoneFromKey(char *pho, const char *inputkey, int kbtype, int searchTimes)
return 1;
}

+#ifndef WITH_RUST
int PhoneFromUint(char *phone, size_t phone_len, uint16_t phone_num)
{
int i;
@@ -181,6 +187,7 @@ int PhoneFromUint(char *phone, size_t phone_len, uint16_t phone_num)
return -1;
return 0;
}
+#endif

int PhoneInxFromKey(int key, int type, int kbtype, int searchTimes)
{
@@ -201,6 +208,7 @@ int PhoneInxFromKey(int key, int type, int kbtype, int searchTimes)
return zhuin_tab_num[type] - ueStrLen(p);
}

+#ifndef WITH_RUST
uint16_t UintFromPhoneInx(const int ph_inx[])
{
int i;
@@ -215,6 +223,7 @@ uint16_t UintFromPhoneInx(const int ph_inx[])

return result;
}
+#endif

size_t GetPhoneLen(const uint16_t *phoneSeq)
{
@@ -227,6 +236,7 @@ size_t GetPhoneLen(const uint16_t *phoneSeq)
return len;
}

+#ifndef WITH_RUST
static size_t GetBopomofoCount(const char *bopomofo_buf)
{
size_t count = 0;
@@ -240,6 +250,7 @@ static size_t GetBopomofoCount(const char *bopomofo_buf)

return count;
}
+#endif

size_t BopomofoFromUintArray(char *const bopomofo_buf, const size_t bopomofo_len, const uint16_t *phoneSeq)
{
@@ -265,6 +276,7 @@ size_t BopomofoFromUintArray(char *const bopomofo_buf, const size_t bopomofo_len
return buf_len;
}

+#ifndef WITH_RUST
ssize_t UintArrayFromBopomofo(uint16_t *phone_seq, const size_t phone_len, const char *bopomofo_buf)
{
size_t i;
@@ -289,12 +301,14 @@ ssize_t UintArrayFromBopomofo(uint16_t *phone_seq, const size_t phone_len, const

return len;
}
+#endif

size_t GetBopomofoBufLen(size_t len)
{
return (MAX_UTF8_SIZE * BOPOMOFO_SIZE + 1) * len;
}

+#ifndef WITH_RUST
size_t GetPhoneLenFromUint(uint16_t phone_num)
{
int i;
@@ -311,3 +325,4 @@ size_t GetPhoneLenFromUint(uint16_t phone_num)
}
return len > 0 ? (len + 1) : -1;
}
+#endif
diff --git a/src/lib.rs b/src/lib.rs
index e69de29..fbc5f1b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -0,0 +1 @@
+pub mod zhuyin;
\ No newline at end of file
diff --git a/src/zhuyin.rs b/src/zhuyin.rs
new file mode 100644
index 0000000..bcbfab5
--- /dev/null
+++ b/src/zhuyin.rs
@@ -0,0 +1,5 @@
+mod bopomofo;
+mod syllable;
+
+pub use bopomofo::{Bopomofo, BopomofoKind, ParseBopomofoError};
+pub use syllable::{DecodeSyllableError, IntoSyllablesBytes, Syllable, SyllableBuilder};
diff --git a/src/zhuyin/bopomofo.rs b/src/zhuyin/bopomofo.rs
new file mode 100644
index 0000000..8da997b
--- /dev/null
+++ b/src/zhuyin/bopomofo.rs
@@ -0,0 +1,298 @@
+use std::fmt::{Display, Write};
+
+use thiserror::Error;
+
+/// The category of the phonetic symbols
+///
+/// Zhuyin, or Bopomofo, consists of 37 letters and 4 tone marks. They are
+/// categorized into one of the four categories:
+///
+/// 1. Initial sounds: ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙ
+/// 2. Medial glides: ㄧㄨㄩ
+/// 3. Rimes: ㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦ
+/// 4. Tonal marks: ˙ˊˇˋ
+#[derive(Debug, Clone, Copy, PartialEq)]
+pub enum BopomofoKind {
+ Initial = 0,
+ Medial,
+ Rime,
+ Tone,
+}
+
+/// Zhuyin Fuhao, often shortened as zhuyin and commonly called bopomofo
+///
+/// <https://simple.m.wikipedia.org/wiki/Zhuyin>
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub enum Bopomofo {
+ /// ㄅ
+ B = 0,
+ /// ㄆ
+ P,
+ /// ㄇ
+ M,
+ /// ㄈ
+ F,
+ /// ㄉ
+ D,
+ /// ㄊ
+ T,
+ /// ㄋ
+ N,
+ /// ㄌ
+ L,
+ /// ㄍ
+ G,
+ /// ㄎ
+ K,
+ /// ㄏ
+ H,
+ /// ㄐ
+ J,
+ /// ㄑ
+ Q,
+ /// ㄒ
+ X,
+ /// ㄓ
+ ZH,
+ /// ㄔ
+ CH,
+ /// ㄕ
+ SH,
+ /// ㄖ
+ R,
+ /// ㄗ
+ Z,
+ /// ㄘ
+ C,
+ /// ㄙ
+ S,
+ /// 一
+ I,
+ /// ㄨ
+ U,
+ /// ㄩ
+ IU,
+ /// ㄚ
+ A,
+ /// ㄛ
+ O,
+ /// ㄜ
+ E,
+ /// ㄝ
+ EH,
+ /// ㄞ
+ AI,
+ /// ㄟ
+ EI,
+ /// ㄠ
+ AU,
+ /// ㄡ
+ OU,
+ /// ㄢ
+ AN,
+ /// ㄣ
+ EN,
+ /// ㄤ
+ ANG,
+ /// ㄥ
+ ENG,
+ /// ㄦ
+ ER,
+ /// ˙
+ TONE5,
+ /// ˊ
+ TONE2,
+ /// ˇ
+ TONE3,
+ /// ˋ
+ TONE4,
+ /// ˉ
+ TONE1,
+}
+
+use Bopomofo::*;
+
+const INITIAL_MAP: [Bopomofo; 21] = [
+ B, P, M, F, D, T, N, L, G, K, H, J, Q, X, ZH, CH, SH, R, Z, C, S,
+];
+const MEDIAL_MAP: [Bopomofo; 3] = [I, U, IU];
+const RIME_MAP: [Bopomofo; 13] = [A, O, E, EH, AI, EI, AU, OU, AN, EN, ANG, ENG, ER];
+const TONE_MAP: [Bopomofo; 4] = [TONE5, TONE2, TONE3, TONE4];
+
+impl Bopomofo {
+ pub const fn kind(&self) -> BopomofoKind {
+ match self {
+ B | P | M | F | D | T | N | L | G | K | H | J | Q | X | ZH | CH | SH | R | Z | C
+ | S => BopomofoKind::Initial,
+ I | U | IU => BopomofoKind::Medial,
+ A | O | E | EH | AI | EI | AU | OU | AN | EN | ANG | ENG | ER => BopomofoKind::Rime,
+ TONE1 | TONE2 | TONE3 | TONE4 | TONE5 => BopomofoKind::Tone,
+ }
+ }
+ pub const fn from_initial(index: u16) -> Result<Bopomofo, ParseBopomofoError> {
+ if index < 1 || (index - 1) as usize >= INITIAL_MAP.len() {
+ return Err(ParseBopomofoError {
+ kind: ParseBopomofoErrorKind::IndexOutOfRange,
+ });
+ }
+ Ok(INITIAL_MAP[(index - 1) as usize])
+ }
+ pub const fn from_medial(index: u16) -> Result<Bopomofo, ParseBopomofoError> {
+ if index < 1 || (index - 1) as usize >= MEDIAL_MAP.len() {
+ return Err(ParseBopomofoError {
+ kind: ParseBopomofoErrorKind::IndexOutOfRange,
+ });
+ }
+ Ok(MEDIAL_MAP[(index - 1) as usize])
+ }
+ pub const fn from_rime(index: u16) -> Result<Bopomofo, ParseBopomofoError> {
+ if index < 1 || (index - 1) as usize >= RIME_MAP.len() {
+ return Err(ParseBopomofoError {
+ kind: ParseBopomofoErrorKind::IndexOutOfRange,
+ });
+ }
+ Ok(RIME_MAP[(index - 1) as usize])
+ }
+ pub const fn from_tone(index: u16) -> Result<Bopomofo, ParseBopomofoError> {
+ if index < 1 || (index - 1) as usize >= TONE_MAP.len() {
+ return Err(ParseBopomofoError {
+ kind: ParseBopomofoErrorKind::IndexOutOfRange,
+ });
+ }
+ Ok(TONE_MAP[(index - 1) as usize])
+ }
+
+ pub fn initial_index(&self) -> u16 {
+ (INITIAL_MAP.iter().position(|b| b == self).unwrap() + 1) as u16
+ }
+ pub fn medial_index(&self) -> u16 {
+ (MEDIAL_MAP.iter().position(|b| b == self).unwrap() + 1) as u16
+ }
+ pub fn rime_index(&self) -> u16 {
+ (RIME_MAP.iter().position(|b| b == self).unwrap() + 1) as u16
+ }
+ pub fn tone_index(&self) -> u16 {
+ (TONE_MAP.iter().position(|b| b == self).unwrap() + 1) as u16
+ }
+}
+
+#[derive(Error, Debug)]
+#[error("parse bopomofo error: {:?}", kind)]
+pub struct ParseBopomofoError {
+ pub kind: ParseBopomofoErrorKind,
+}
+
+#[derive(Debug)]
+pub enum ParseBopomofoErrorKind {
+ UnknownSymbol,
+ IndexOutOfRange,
+}
+
+impl Display for Bopomofo {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.write_char((*self).into())
+ }
+}
+
+impl From<Bopomofo> for char {
+ fn from(bopomofo: Bopomofo) -> Self {
+ match bopomofo {
+ Bopomofo::B => 'ㄅ',
+ Bopomofo::P => 'ㄆ',
+ Bopomofo::M => 'ㄇ',
+ Bopomofo::F => 'ㄈ',
+ Bopomofo::D => 'ㄉ',
+ Bopomofo::T => 'ㄊ',
+ Bopomofo::N => 'ㄋ',
+ Bopomofo::L => 'ㄌ',
+ Bopomofo::G => 'ㄍ',
+ Bopomofo::K => 'ㄎ',
+ Bopomofo::H => 'ㄏ',
+ Bopomofo::J => 'ㄐ',
+ Bopomofo::Q => 'ㄑ',
+ Bopomofo::X => 'ㄒ',
+ Bopomofo::ZH => 'ㄓ',
+ Bopomofo::CH => 'ㄔ',
+ Bopomofo::SH => 'ㄕ',
+ Bopomofo::R => 'ㄖ',
+ Bopomofo::Z => 'ㄗ',
+ Bopomofo::C => 'ㄘ',
+ Bopomofo::S => 'ㄙ',
+ Bopomofo::A => 'ㄚ',
+ Bopomofo::O => 'ㄛ',
+ Bopomofo::E => 'ㄜ',
+ Bopomofo::EH => 'ㄝ',
+ Bopomofo::AI => 'ㄞ',
+ Bopomofo::EI => 'ㄟ',
+ Bopomofo::AU => 'ㄠ',
+ Bopomofo::OU => 'ㄡ',
+ Bopomofo::AN => 'ㄢ',
+ Bopomofo::EN => 'ㄣ',
+ Bopomofo::ANG => 'ㄤ',
+ Bopomofo::ENG => 'ㄥ',
+ Bopomofo::ER => 'ㄦ',
+ Bopomofo::I => 'ㄧ',
+ Bopomofo::U => 'ㄨ',
+ Bopomofo::IU => 'ㄩ',
+ Bopomofo::TONE1 => 'ˉ',
+ Bopomofo::TONE5 => '˙',
+ Bopomofo::TONE2 => 'ˊ',
+ Bopomofo::TONE3 => 'ˇ',
+ Bopomofo::TONE4 => 'ˋ',
+ }
+ }
+}
+
+impl TryFrom<char> for Bopomofo {
+ type Error = ParseBopomofoError;
+
+ fn try_from(c: char) -> Result<Bopomofo, ParseBopomofoError> {
+ match c {
+ 'ㄅ' => Ok(Bopomofo::B),
+ 'ㄆ' => Ok(Bopomofo::P),
+ 'ㄇ' => Ok(Bopomofo::M),
+ 'ㄈ' => Ok(Bopomofo::F),
+ 'ㄉ' => Ok(Bopomofo::D),
+ 'ㄊ' => Ok(Bopomofo::T),
+ 'ㄋ' => Ok(Bopomofo::N),
+ 'ㄌ' => Ok(Bopomofo::L),
+ 'ㄍ' => Ok(Bopomofo::G),
+ 'ㄎ' => Ok(Bopomofo::K),
+ 'ㄏ' => Ok(Bopomofo::H),
+ 'ㄐ' => Ok(Bopomofo::J),
+ 'ㄑ' => Ok(Bopomofo::Q),
+ 'ㄒ' => Ok(Bopomofo::X),
+ 'ㄓ' => Ok(Bopomofo::ZH),
+ 'ㄔ' => Ok(Bopomofo::CH),
+ 'ㄕ' => Ok(Bopomofo::SH),
+ 'ㄖ' => Ok(Bopomofo::R),
+ 'ㄗ' => Ok(Bopomofo::Z),
+ 'ㄘ' => Ok(Bopomofo::C),
+ 'ㄙ' => Ok(Bopomofo::S),
+ 'ㄚ' => Ok(Bopomofo::A),
+ 'ㄛ' => Ok(Bopomofo::O),
+ 'ㄜ' => Ok(Bopomofo::E),
+ 'ㄝ' => Ok(Bopomofo::EH),
+ 'ㄞ' => Ok(Bopomofo::AI),
+ 'ㄟ' => Ok(Bopomofo::EI),
+ 'ㄠ' => Ok(Bopomofo::AU),
+ 'ㄡ' => Ok(Bopomofo::OU),
+ 'ㄢ' => Ok(Bopomofo::AN),
+ 'ㄣ' => Ok(Bopomofo::EN),
+ 'ㄤ' => Ok(Bopomofo::ANG),
+ 'ㄥ' => Ok(Bopomofo::ENG),
+ 'ㄦ' => Ok(Bopomofo::ER),
+ 'ㄧ' => Ok(Bopomofo::I),
+ 'ㄨ' => Ok(Bopomofo::U),
+ 'ㄩ' => Ok(Bopomofo::IU),
+ 'ˉ' => Ok(Bopomofo::TONE1),
+ '˙' => Ok(Bopomofo::TONE5),
+ 'ˊ' => Ok(Bopomofo::TONE2),
+ 'ˇ' => Ok(Bopomofo::TONE3),
+ 'ˋ' => Ok(Bopomofo::TONE4),
+ _ => Err(ParseBopomofoError {
+ kind: ParseBopomofoErrorKind::UnknownSymbol,
+ }),
+ }
+ }
+}
diff --git a/src/zhuyin/syllable.rs b/src/zhuyin/syllable.rs
new file mode 100644
index 0000000..f58fced
--- /dev/null
+++ b/src/zhuyin/syllable.rs
@@ -0,0 +1,485 @@
+use std::{
+ fmt::{Display, Write},
+ str::FromStr,
+};
+
+use thiserror::Error;
+
+use super::{Bopomofo, BopomofoKind, ParseBopomofoError};
+
+/// The consonants and vowels that are taken together to make a single sound.
+///
+/// <https://en.m.wikipedia.org/wiki/Syllable#Chinese_model>
+#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
+pub struct Syllable {
+ value: u16,
+}
+
+impl Syllable {
+ pub const fn new() -> Syllable {
+ Syllable { value: 0 }
+ }
+
+ pub const fn builder() -> SyllableBuilder {
+ SyllableBuilder::new()
+ }
+ pub const fn initial(&self) -> Option<Bopomofo> {
+ let index = self.value >> 9;
+ if index == 0 {
+ None
+ } else {
+ match Bopomofo::from_initial(index) {
+ Ok(v) => Some(v),
+ Err(_) => panic!(),
+ }
+ }
+ }
+ #[allow(clippy::unusual_byte_groupings)]
+ pub const fn medial(&self) -> Option<Bopomofo> {
+ let index = (self.value & 0b0000000_11_0000_000) >> 7;
+ if index == 0 {
+ None
+ } else {
+ match Bopomofo::from_medial(index) {
+ Ok(v) => Some(v),
+ Err(_) => panic!(),
+ }
+ }
+ }
+ #[allow(clippy::unusual_byte_groupings)]
+ pub const fn rime(&self) -> Option<Bopomofo> {
+ let index = (self.value & 0b0000000_00_1111_000) >> 3;
+ if index == 0 {
+ None
+ } else {
+ match Bopomofo::from_rime(index) {
+ Ok(v) => Some(v),
+ Err(_) => panic!(),
+ }
+ }
+ }
+ #[allow(clippy::unusual_byte_groupings)]
+ pub const fn tone(&self) -> Option<Bopomofo> {
+ let index = self.value & 0b0000000_00_0000_111;
+ if index == 0 {
+ None
+ } else {
+ match Bopomofo::from_tone(index) {
+ Ok(v) => Some(v),
+ Err(_) => panic!(),
+ }
+ }
+ }
+ pub fn remove_initial(&mut self) -> Option<Bopomofo> {
+ let ret = self.initial();
+ self.value &= 0b0000_0001_1111_1111;
+ ret
+ }
+ pub fn remove_medial(&mut self) -> Option<Bopomofo> {
+ let ret = self.medial();
+ self.value &= 0b1111_1110_0111_1111;
+ ret
+ }
+ pub fn remove_rime(&mut self) -> Option<Bopomofo> {
+ let ret = self.rime();
+ self.value &= 0b1111_1111_1000_0111;
+ ret
+ }
+ pub fn remove_tone(&mut self) -> Option<Bopomofo> {
+ let ret = self.tone();
+ self.value &= 0b1111_1111_1111_1000;
+ ret
+ }
+ pub fn is_empty(&self) -> bool {
+ self.value == 0
+ }
+ pub fn has_initial(&self) -> bool {
+ self.initial().is_some()
+ }
+ pub fn has_medial(&self) -> bool {
+ self.medial().is_some()
+ }
+ pub fn has_rime(&self) -> bool {
+ self.rime().is_some()
+ }
+ pub fn has_tone(&self) -> bool {
+ self.tone().is_some()
+ }
+ /// Returns the `Syllable` encoded in a u16 integer.
+ ///
+ /// The data layout used:
+ ///
+ /// ```text
+ /// 0 1
+ /// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+ /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ /// | Initial | M | Rime |Tone |
+ /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ /// ```
+ pub fn to_u16(&self) -> u16 {
+ debug_assert!(
+ !self.is_empty(),
+ "empty syllable cannot be converted to u16"
+ );
+ self.value
+ }
+ /// Returns the `Syllable` encoded in a u16 integer in little-endian bytes.
+ ///
+ /// The data layout used:
+ ///
+ /// ```text
+ /// 0 1
+ /// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+ /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ /// | Initial | M | Rime |Tone |
+ /// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ /// ```
+ pub fn to_le_bytes(&self) -> [u8; 2] {
+ self.to_u16().to_le_bytes()
+ }
+ pub fn update(&mut self, bopomofo: Bopomofo) {
+ match bopomofo.kind() {
+ BopomofoKind::Initial => {
+ self.remove_initial();
+ self.value |= (bopomofo as u16 + 1) << 9;
+ }
+ BopomofoKind::Medial => {
+ self.remove_medial();
+ self.value |= (bopomofo as u16 - 20) << 7;
+ }
+ BopomofoKind::Rime => {
+ self.remove_rime();
+ self.value |= (bopomofo as u16 - 23) << 3;
+ }
+ BopomofoKind::Tone => {
+ self.remove_tone();
+ self.value |= bopomofo as u16 - 36;
+ }
+ };
+ }
+ pub fn pop(&mut self) -> Option<Bopomofo> {
+ if self.tone().is_some() {
+ return self.remove_tone();
+ }
+ if self.rime().is_some() {
+ return self.remove_rime();
+ }
+ if self.medial().is_some() {
+ return self.remove_medial();
+ }
+ if self.initial().is_some() {
+ return self.remove_initial();
+ }
+ None
+ }
+ pub fn clear(&mut self) {
+ *self = Syllable::new()
+ }
+}
+
+impl Default for Syllable {
+ fn default() -> Self {
+ Syllable::new()
+ }
+}
+
+impl From<Syllable> for u16 {
+ fn from(syl: Syllable) -> Self {
+ syl.to_u16()
+ }
+}
+
+impl From<&Syllable> for u16 {
+ fn from(syl: &Syllable) -> Self {
+ syl.to_u16()
+ }
+}
+
+impl TryFrom<u16> for Syllable {
+ type Error = DecodeSyllableError;
+
+ #[allow(clippy::unusual_byte_groupings)]
+ fn try_from(value: u16) -> Result<Self, Self::Error> {
+ // TODO check invalid value
+ Ok(Syllable { value })
+ }
+}
+
+impl FromStr for Syllable {
+ type Err = ParseSyllableError;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let mut builder = Syllable::builder();
+ for c in s.chars() {
+ let bopomofo = Bopomofo::try_from(c)?;
+ builder = builder.insert(bopomofo)?;
+ }
+ Ok(builder.build())
+ }
+}
+
+pub trait IntoSyllablesBytes {
+ fn into_syllables_bytes(self) -> Vec<u8>;
+}
+
+impl<T> IntoSyllablesBytes for T
+where
+ T: IntoIterator,
+ T::Item: Into<u16>,
+{
+ fn into_syllables_bytes(self) -> Vec<u8> {
+ let mut syllables_bytes = vec![];
+ self.into_iter()
+ .for_each(|syl| syllables_bytes.extend_from_slice(&syl.into().to_le_bytes()));
+ syllables_bytes
+ }
+}
+
+impl Display for Syllable {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ for &bopomofo in [&self.initial(), &self.medial(), &self.rime(), &self.tone()] {
+ if let Some(bopomofo) = bopomofo {
+ f.write_char(bopomofo.into())?;
+ }
+ }
+ Ok(())
+ }
+}
+
+#[derive(Debug)]
+pub struct SyllableBuilder {
+ value: u16,
+ step: u8,
+}
+
+impl Default for SyllableBuilder {
+ fn default() -> SyllableBuilder {
+ SyllableBuilder::new()
+ }
+}
+
+impl SyllableBuilder {
+ pub const fn new() -> SyllableBuilder {
+ SyllableBuilder { value: 0, step: 0 }
+ }
+ pub const fn insert(
+ mut self,
+ bopomofo: Bopomofo,
+ ) -> Result<SyllableBuilder, BuildSyllableError> {
+ match bopomofo.kind() {
+ BopomofoKind::Initial => {
+ if self.step > 0 {
+ return Err(BuildSyllableError {
+ msg: "bopomofo is in incorrect order",
+ });
+ }
+ if self.value & 0b1111_1110_0000_0000 != 0 {
+ return Err(BuildSyllableError {
+ msg: "multiple initial bopomofo",
+ });
+ }
+ self.step = 1;
+ self.value |= (bopomofo as u16 + 1) << 9;
+ }
+ BopomofoKind::Medial => {
+ if self.step > 1 {
+ return Err(BuildSyllableError {
+ msg: "bopomofo is in incorrect order",
+ });
+ }
+ if self.value & 0b0000_0001_1000_0000 != 0 {
+ return Err(BuildSyllableError {
+ msg: "multiple medial bopomofo",
+ });
+ }
+ self.step = 2;
+ self.value |= (bopomofo as u16 - 20) << 7;
+ }
+ BopomofoKind::Rime => {
+ if self.step > 2 {
+ return Err(BuildSyllableError {
+ msg: "bopomofo is in incorrect order",
+ });
+ }
+ if self.value & 0b0000_0000_0111_1000 != 0 {
+ return Err(BuildSyllableError {
+ msg: "multiple rime bopomofo",
+ });
+ }
+ self.step = 3;
+ self.value |= (bopomofo as u16 - 23) << 3;
+ }
+ BopomofoKind::Tone => {
+ if self.step > 3 {
+ return Err(BuildSyllableError {
+ msg: "bopomofo is in incorrect order",
+ });
+ }
+ if self.value & 0b0000_0000_0000_0111 != 0 {
+ return Err(BuildSyllableError {
+ msg: "multiple tone bopomofo",
+ });
+ }
+ self.step = 4;
+ self.value |= bopomofo as u16 - 36;
+ }
+ };
+ Ok(self)
+ }
+ pub const fn build(self) -> Syllable {
+ Syllable { value: self.value }
+ }
+}
+
+#[derive(Error, Debug)]
+#[error("syllable decode error: {msg}")]
+pub struct DecodeSyllableError {
+ msg: String,
+ source: Box<dyn std::error::Error>,
+}
+
+#[derive(Error, Debug)]
+#[error("syllable build error: {msg}")]
+pub struct BuildSyllableError {
+ msg: &'static str,
+}
+
+#[derive(Error, Debug)]
+#[error("syllable parse error")]
+pub struct ParseSyllableError {
+ source: Box<dyn std::error::Error>,
+}
+
+impl From<ParseBopomofoError> for ParseSyllableError {
+ fn from(value: ParseBopomofoError) -> Self {
+ ParseSyllableError {
+ source: value.into(),
+ }
+ }
+}
+
+impl From<BuildSyllableError> for ParseSyllableError {
+ fn from(value: BuildSyllableError) -> Self {
+ ParseSyllableError {
+ source: value.into(),
+ }
+ }
+}
+
+/// Build a syllable from bopomofos
+///
+/// # Examples
+///
+/// Build a syllable
+/// ```
+/// use chewing::zhuyin::Bopomofo::{K, U, TONE4};
+/// use chewing::syl;
+///
+/// let syl = syl![K, U, TONE4];
+///
+/// assert_eq!("ㄎㄨˋ", syl.to_string());
+/// ```
+#[macro_export]
+macro_rules! syl {
+ () => { $crate::zhuyin::Syllable::new() };
+ ($($bopomofo:expr),+) => {
+ {
+ let mut builder = $crate::zhuyin::Syllable::builder();
+ $(builder = match builder.insert($bopomofo) {
+ Ok(b) => b,
+ Err(_) => panic!("unable to build syllable"),
+ };)+
+ builder.build()
+ }
+ };
+}
+
+#[cfg(test)]
+mod test {
+
+ use super::{Bopomofo, Syllable};
+
+ #[test]
+ fn syllable_hsu_sdf_as_u16() {
+ let syl = Syllable::builder().insert(Bopomofo::S).unwrap().build();
+ assert_eq!(0x2A00, syl.to_u16());
+
+ let syl = Syllable::builder().insert(Bopomofo::D).unwrap().build();
+ assert_eq!(0xA00, syl.to_u16());
+
+ let syl = Syllable::builder().insert(Bopomofo::F).unwrap().build();
+ assert_eq!(0x800, syl.to_u16());
+ }
+
+ #[test]
+ #[should_panic]
+ fn empty_syllable_as_u16() {
+ Syllable::builder().build().to_u16();
+ }
+
+ #[test]
+ fn syllable_as_u16_roundtrip() {
+ let syl = Syllable::builder().insert(Bopomofo::S).unwrap().build();
+ assert_eq!(syl, syl.to_u16().try_into().unwrap());
+ }
+
+ #[test]
+ fn syl_macro_rules() {
+ let syl = syl![];
+ assert_eq!(Syllable::new(), syl);
+
+ let syl = syl![Bopomofo::S];
+ assert_eq!(
+ Syllable::builder().insert(Bopomofo::S).unwrap().build(),
+ syl
+ );
+
+ let syl = syl![Bopomofo::S, Bopomofo::I, Bopomofo::EN, Bopomofo::TONE4];
+ assert_eq!(
+ Syllable::builder()
+ .insert(Bopomofo::S)
+ .unwrap()
+ .insert(Bopomofo::I)
+ .unwrap()
+ .insert(Bopomofo::EN)
+ .unwrap()
+ .insert(Bopomofo::TONE4)
+ .unwrap()
+ .build(),
+ syl
+ );
+ }
+
+ #[test]
+ #[should_panic]
+ fn syl_macro_rules_fool_proof() {
+ syl![Bopomofo::S, Bopomofo::D];
+ }
+
+ #[test]
+ fn syl_macro_rules_comiles_in_const() {
+ const SYLLABLE: Syllable = syl![Bopomofo::S, Bopomofo::I, Bopomofo::EN];
+ assert_eq!(
+ Syllable::builder()
+ .insert(Bopomofo::S)
+ .unwrap()
+ .insert(Bopomofo::I)
+ .unwrap()
+ .insert(Bopomofo::EN)
+ .unwrap()
+ .build(),
+ SYLLABLE
+ );
+ }
+
+ #[test]
+ fn new_and_pop_bopomofo() {
+ let mut syl = syl![Bopomofo::S, Bopomofo::I, Bopomofo::EN, Bopomofo::TONE4];
+ assert_eq!(Some(Bopomofo::TONE4), syl.pop());
+ assert_eq!(Some(Bopomofo::EN), syl.pop());
+ assert_eq!(Some(Bopomofo::I), syl.pop());
+ assert_eq!(Some(Bopomofo::S), syl.pop());
+ assert_eq!(None, syl.pop());
+ assert_eq!(syl![], syl);
+ }
+}
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 627525b..821bf58 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -48,6 +48,9 @@ endif()

foreach(target ${ALL_TESTS})
add_executable(${target} ${TEST_SRC_DIR}/${target}.c)
+ if (WITH_RUST)
+ target_link_libraries(${target} chewing-internal)
+ endif()
add_dependencies(${target} data all_static_data)
add_dependencies(check ${target})
endforeach()
--
2.39.1

Kan-Ru Chen

unread,
Jan 26, 2023, 8:43:02 PM1/26/23
to chewin...@googlegroups.com, czc...@czchen.org, jser...@gmail.com, Kan-Ru Chen
---
CMakeLists.txt | 35 +-
Cargo.lock | 398 +-
Cargo.toml | 11 +-
capi/chewing-internal/Cargo.toml | 4 +-
capi/chewing-internal/cbindgen.toml | 4 +-
.../include/chewing_internal.h | 472 +
capi/chewing-internal/src/binding.rs | 13 +
capi/chewing-internal/src/bopomofo.rs | 242 +
capi/chewing-internal/src/compat.rs | 11 +
capi/chewing-internal/src/conversion.rs | 94 +
capi/chewing-internal/src/dict.rs | 165 +
capi/chewing-internal/src/ffi.rs | 21 +
capi/chewing-internal/src/key2pho.rs | 16 +-
capi/chewing-internal/src/lib.rs | 12 +-
capi/chewing-internal/src/path.rs | 86 +
capi/chewing-internal/src/types.rs | 256 +
capi/chewing-internal/src/userphrase.rs | 299 +
capi/chewing-internal/src/utf8.rs | 94 +
capi/chewing-public/Cargo.toml | 2 +-
capi/chewing-public/src/lib.rs | 2 +-
data/CMakeLists.txt | 24 +-
data/word.src | 26096 ++++++++++++++++
include/internal/bopomofo-private.h | 4 +
include/internal/chewing-private.h | 32 +-
src/bopomofo.c | 21 +
src/chewing-sql.c | 82 +-
src/chewing.c | 0
src/chewingio.c | 222 +-
src/chewingutil.c | 165 +-
src/choice.c | 42 +-
src/conversion.rs | 38 +
src/conversion/chewing_conversion.rs | 698 +
src/dict.c | 20 +-
src/dictionary.rs | 445 +
src/dictionary/layered.rs | 188 +
src/dictionary/sqlite.rs | 625 +
src/dictionary/trie.rs | 1224 +
src/editor.rs | 6 +
src/editor/estimate.rs | 112 +
src/editor/keymap.rs | 159 +
src/editor/layout.rs | 87 +
src/editor/layout/dc26.rs | 185 +
src/editor/layout/et.rs | 135 +
src/editor/layout/et26.rs | 222 +
src/editor/layout/ginyieh.rs | 134 +
src/editor/layout/hsu.rs | 281 +
src/editor/layout/ibm.rs | 135 +
src/editor/layout/pinyin.rs | 498 +
src/editor/layout/standard.rs | 136 +
src/hash.c | 54 +-
src/lib.rs | 10 +-
src/mod_aux.c | 8 +-
src/path.rs | 58 +
src/pinyin.c | 42 +-
src/private.h | 37 +
src/tree.c | 26 +-
src/userphrase-hash.c | 8 +-
src/userphrase-sql.c | 76 +-
test/CMakeLists.txt | 13 +-
test/test-bopomofo.c | 5 +
test/test-path.c | 11 +
test/testhelper.c | 8 +-
test/testhelper.h | 10 +-
tools/Cargo.toml | 12 +
tools/src/bin/init_database.rs | 121 +
65 files changed, 34410 insertions(+), 342 deletions(-)
create mode 100644 capi/chewing-internal/src/binding.rs
create mode 100644 capi/chewing-internal/src/bopomofo.rs
create mode 100644 capi/chewing-internal/src/compat.rs
create mode 100644 capi/chewing-internal/src/conversion.rs
create mode 100644 capi/chewing-internal/src/dict.rs
create mode 100644 capi/chewing-internal/src/ffi.rs
create mode 100644 capi/chewing-internal/src/path.rs
create mode 100644 capi/chewing-internal/src/types.rs
create mode 100644 capi/chewing-internal/src/userphrase.rs
create mode 100644 capi/chewing-internal/src/utf8.rs
create mode 100644 data/word.src
create mode 100644 src/chewing.c
create mode 100644 src/conversion.rs
create mode 100644 src/conversion/chewing_conversion.rs
create mode 100644 src/dictionary.rs
create mode 100644 src/dictionary/layered.rs
create mode 100644 src/dictionary/sqlite.rs
create mode 100644 src/dictionary/trie.rs
create mode 100644 src/editor.rs
create mode 100644 src/editor/estimate.rs
create mode 100644 src/editor/keymap.rs
create mode 100644 src/editor/layout.rs
create mode 100644 src/editor/layout/dc26.rs
create mode 100644 src/editor/layout/et.rs
create mode 100644 src/editor/layout/et26.rs
create mode 100644 src/editor/layout/ginyieh.rs
create mode 100644 src/editor/layout/hsu.rs
create mode 100644 src/editor/layout/ibm.rs
create mode 100644 src/editor/layout/pinyin.rs
create mode 100644 src/editor/layout/standard.rs
create mode 100644 src/path.rs
create mode 100644 tools/Cargo.toml
create mode 100644 tools/src/bin/init_database.rs

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 76c155f..90ab4f5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -75,7 +75,7 @@ option(USE_VALGRIND "Use valgrind when testing" true)
option(WITH_RUST "Use rust implemented internals (experimental)" true)
if (WITH_RUST)
add_subdirectory(cmake/corrosion)
- corrosion_import_crate(MANIFEST_PATH Cargo.toml)
+ corrosion_import_crate(MANIFEST_PATH Cargo.toml NO_LINKER_OVERRIDE)
add_compile_definitions(WITH_RUST)
endif()

@@ -167,8 +167,8 @@ set(ALL_INC
)

if (WITH_RUST)
- include_directories(capi/chewing-internal/include)
include_directories(capi/chewing-public/include)
+ include_directories(capi/chewing-internal/include)
list(APPEND ALL_INC capi/chewing-public/include/chewing_rs.h)
endif()

@@ -182,8 +182,7 @@ add_library(common OBJECT
${INC_DIR}/internal/key2pho-private.h
${INC_DIR}/internal/memory-private.h

- ${SRC_DIR}/common/chewing-utf8-util.c
- ${SRC_DIR}/common/key2pho.c
+ src/chewing.c
)

add_library(chewing OBJECT
@@ -191,19 +190,28 @@ add_library(chewing OBJECT
${INC_DIR}/internal/chewing-private.h
${INC_DIR}/internal/chewingutil.h
${INC_DIR}/internal/choice-private.h
- ${INC_DIR}/internal/dict-private.h
${INC_DIR}/internal/global-private.h
- ${INC_DIR}/internal/pinyin-private.h
- ${INC_DIR}/internal/tree-private.h
- ${INC_DIR}/internal/userphrase-private.h
- ${INC_DIR}/internal/bopomofo-private.h

${SRC_DIR}/compat.c
${SRC_DIR}/chewingio.c
${SRC_DIR}/chewingutil.c
${SRC_DIR}/choice.c
- ${SRC_DIR}/dict.c
${SRC_DIR}/mod_aux.c
+ ${SRC_DIR}/private.h
+)
+if (NOT WITH_RUST)
+target_sources(common PRIVATE
+ ${SRC_DIR}/common/chewing-utf8-util.c
+ ${SRC_DIR}/common/key2pho.c
+)
+target_sources(chewing PRIVATE
+ ${INC_DIR}/internal/dict-private.h
+ ${INC_DIR}/internal/pinyin-private.h
+ ${INC_DIR}/internal/tree-private.h
+ ${INC_DIR}/internal/userphrase-private.h
+ ${INC_DIR}/internal/bopomofo-private.h
+
+ ${SRC_DIR}/dict.c
${SRC_DIR}/pinyin.c
${SRC_DIR}/porting_layer/include/plat_mmap.h
${SRC_DIR}/porting_layer/include/plat_path.h
@@ -214,15 +222,16 @@ add_library(chewing OBJECT
${SRC_DIR}/porting_layer/src/plat_mmap_windows.c
${SRC_DIR}/porting_layer/src/plat_path.c
${SRC_DIR}/porting_layer/src/rpl_malloc.c
- ${SRC_DIR}/private.h
${SRC_DIR}/tree.c
${SRC_DIR}/userphrase.c
${SRC_DIR}/bopomofo.c
)
+endif()
target_compile_definitions(chewing PRIVATE
CHEWING_DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}/libchewing\"
)

+if (NOT WITH_RUST)
if (WITH_SQLITE3)
add_library(userphrase STATIC
${INC_DIR}/internal/chewing-sql.h
@@ -262,6 +271,7 @@ else()
${SRC_DIR}/userphrase-hash.c
)
endif()
+endif()

if (BUILD_DLL OR NOT MSVC)
if (MSVC)
@@ -285,13 +295,14 @@ if (NOT BUILD_DLL)
endif()

foreach(lib ${LIBS})
- target_link_libraries(${lib} userphrase)
if (WITH_SQLITE3 AND NOT WITH_INTERNAL_SQLITE3)
target_link_libraries(${lib} ${SQLITE3_LIBRARY})
endif()
if (WITH_RUST)
target_link_libraries(${lib} chewing-public)
target_link_libraries(${lib} chewing-internal)
+ else()
+ target_link_libraries(${lib} userphrase)
endif()
endforeach()

diff --git a/Cargo.lock b/Cargo.lock
index 49659ae..3574fae 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2,13 +2,30 @@
# It is not intended for manual editing.
version = 3

+[[package]]
+name = "ahash"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
+dependencies = [
+ "getrandom",
+ "once_cell",
+ "version_check",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61"
+
[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
dependencies = [
- "hermit-abi",
+ "hermit-abi 0.1.19",
"libc",
"winapi",
]
@@ -19,6 +36,16 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"

+[[package]]
+name = "binary-layout"
+version = "3.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4eb8cda7e0cb274442a8ac32a9d5719e89355a4871be9dccae681fb8f5e9ec1c"
+dependencies = [
+ "doc-comment",
+ "paste",
+]
+
[[package]]
name = "bitflags"
version = "1.3.2"
@@ -31,7 +58,7 @@ version = "0.24.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6358dedf60f4d9b8db43ad187391afe959746101346fe51bb978126bec61dfb"
dependencies = [
- "clap",
+ "clap 3.2.23",
"heck",
"indexmap",
"log",
@@ -44,6 +71,12 @@ dependencies = [
"toml",
]

+[[package]]
+name = "cc"
+version = "1.0.78"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d"
+
[[package]]
name = "cfg-if"
version = "1.0.0"
@@ -54,7 +87,14 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
name = "chewing"
version = "0.5.1-alpha.1"
dependencies = [
+ "binary-layout",
+ "dirs-next",
+ "indexmap",
+ "riff",
+ "rusqlite",
+ "tempfile",
"thiserror",
+ "tracing",
]

[[package]]
@@ -63,6 +103,8 @@ version = "0.5.1-alpha.1"
dependencies = [
"cbindgen",
"chewing",
+ "chewing-public",
+ "ffi-opaque",
]

[[package]]
@@ -73,6 +115,16 @@ dependencies = [
"chewing",
]

+[[package]]
+name = "chewing-tools"
+version = "0.5.1-alpha.1"
+dependencies = [
+ "anyhow",
+ "chewing",
+ "clap 4.1.4",
+ "thiserror",
+]
+
[[package]]
name = "clap"
version = "3.2.23"
@@ -81,13 +133,26 @@ checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5"
dependencies = [
"atty",
"bitflags",
- "clap_lex",
+ "clap_lex 0.2.4",
"indexmap",
"strsim",
"termcolor",
"textwrap",
]

+[[package]]
+name = "clap"
+version = "4.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f13b9c79b5d1dd500d20ef541215a6423c75829ef43117e1b4d17fd8af0b5d76"
+dependencies = [
+ "bitflags",
+ "clap_lex 0.3.1",
+ "is-terminal",
+ "strsim",
+ "termcolor",
+]
+
[[package]]
name = "clap_lex"
version = "0.2.4"
@@ -97,6 +162,75 @@ dependencies = [
"os_str_bytes",
]

+[[package]]
+name = "clap_lex"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
+name = "dirs-next"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
+dependencies = [
+ "cfg-if",
+ "dirs-sys-next",
+]
+
+[[package]]
+name = "dirs-sys-next"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi",
+]
+
+[[package]]
+name = "doc-comment"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+
+[[package]]
+name = "errno"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "fallible-iterator"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
+
+[[package]]
+name = "fallible-streaming-iterator"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
+
[[package]]
name = "fastrand"
version = "1.8.0"
@@ -106,11 +240,40 @@ dependencies = [
"instant",
]

+[[package]]
+name = "ffi-opaque"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec54ac60a7f2ee9a97cad9946f9bf629a3bc6a7ae59e68983dc9318f5a54b81a"
+
+[[package]]
+name = "getrandom"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
[[package]]
name = "hashbrown"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+dependencies = [
+ "ahash",
+]
+
+[[package]]
+name = "hashlink"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa"
+dependencies = [
+ "hashbrown",
+]

[[package]]
name = "heck"
@@ -127,6 +290,15 @@ dependencies = [
"libc",
]

+[[package]]
+name = "hermit-abi"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
+dependencies = [
+ "libc",
+]
+
[[package]]
name = "indexmap"
version = "1.9.2"
@@ -146,6 +318,28 @@ dependencies = [
"cfg-if",
]

+[[package]]
+name = "io-lifetimes"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e"
+dependencies = [
+ "libc",
+ "windows-sys",
+]
+
+[[package]]
+name = "is-terminal"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189"
+dependencies = [
+ "hermit-abi 0.2.6",
+ "io-lifetimes",
+ "rustix",
+ "windows-sys",
+]
+
[[package]]
name = "itoa"
version = "1.0.5"
@@ -158,6 +352,22 @@ version = "0.2.139"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"

+[[package]]
+name = "libsqlite3-sys"
+version = "0.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29f835d03d717946d28b1d1ed632eb6f0e24a299388ee623d0c23118d3e8a7fa"
+dependencies = [
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
+
[[package]]
name = "log"
version = "0.4.17"
@@ -167,12 +377,36 @@ dependencies = [
"cfg-if",
]

+[[package]]
+name = "once_cell"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66"
+
[[package]]
name = "os_str_bytes"
version = "6.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"

+[[package]]
+name = "paste"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba"
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
+
[[package]]
name = "proc-macro2"
version = "1.0.50"
@@ -200,6 +434,17 @@ dependencies = [
"bitflags",
]

+[[package]]
+name = "redox_users"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
+dependencies = [
+ "getrandom",
+ "redox_syscall",
+ "thiserror",
+]
+
[[package]]
name = "remove_dir_all"
version = "0.5.3"
@@ -209,6 +454,40 @@ dependencies = [
"winapi",
]

+[[package]]
+name = "riff"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9b1a3d5f46d53f4a3478e2be4a5a5ce5108ea58b100dcd139830eae7f79a3a1"
+
+[[package]]
+name = "rusqlite"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01e213bc3ecb39ac32e81e51ebe31fd888a940515173e3a18a35f8c6e896422a"
+dependencies = [
+ "bitflags",
+ "fallible-iterator",
+ "fallible-streaming-iterator",
+ "hashlink",
+ "libsqlite3-sys",
+ "smallvec",
+]
+
+[[package]]
+name = "rustix"
+version = "0.36.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03"
+dependencies = [
+ "bitflags",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys",
+]
+
[[package]]
name = "ryu"
version = "1.0.12"
@@ -246,6 +525,12 @@ dependencies = [
"serde",
]

+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
[[package]]
name = "strsim"
version = "0.10.0"
@@ -321,12 +606,62 @@ dependencies = [
"serde",
]

+[[package]]
+name = "tracing"
+version = "0.1.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+dependencies = [
+ "cfg-if",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
+dependencies = [
+ "once_cell",
+]
+
[[package]]
name = "unicode-ident"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"

+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
[[package]]
name = "winapi"
version = "0.3.9"
@@ -357,3 +692,60 @@ name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
diff --git a/Cargo.toml b/Cargo.toml
index 4db5cf4..7be2878 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -7,12 +7,19 @@ version = "0.5.1-alpha.1"
edition = "2021"

[dependencies]
+binary-layout = "3.0.0"
+dirs-next = "2.0.0"
+indexmap = "1.9.2"
+riff = "1.0.0"
+rusqlite = "0.28.0"
thiserror = "1.0.0"
+tracing = "0.1.37"

[dev-dependencies]
+tempfile = "3"

[workspace]
-members = ["capi/chewing-internal", "capi/chewing-public"]
+members = ["capi/chewing-internal", "capi/chewing-public", "tools"]

[profile.release]
-lto = "thin"
+lto = "thin"
\ No newline at end of file
diff --git a/capi/chewing-internal/Cargo.toml b/capi/chewing-internal/Cargo.toml
index dd53c9b..c5f1bed 100644
--- a/capi/chewing-internal/Cargo.toml
+++ b/capi/chewing-internal/Cargo.toml
@@ -7,9 +7,11 @@ edition = "2021"

[dependencies]
chewing = { version = "0.5.1-alpha.1", path = "../.." }
+chewing-public = { version = "0.5.1-alpha.1", path = "../chewing-public" }
+ffi-opaque = "2.0.0"

[lib]
-crate-type = ["staticlib"]
+crate-type = ["rlib", "staticlib"]

[build-dependencies]
cbindgen = "0.24.3"
diff --git a/capi/chewing-internal/cbindgen.toml b/capi/chewing-internal/cbindgen.toml
index af85092..afd1357 100644
--- a/capi/chewing-internal/cbindgen.toml
+++ b/capi/chewing-internal/cbindgen.toml
@@ -16,7 +16,7 @@ header = """
include_guard = "chewing_internal_bindings_h"
autogen_warning = "/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */"
pragma_once = true
-include_version = false
+includes = ["chewing_rs.h"]
cpp_compat = true
usize_is_size_t = true

@@ -31,4 +31,4 @@ rename_fields = "CamelCase"
rename_variants = "ScreamingSnakeCase"

[export]
-include = []
+include = ["BOPOMOFO", "KB", "UserUpdate", "ChewingContext", "Phrase"]
diff --git a/capi/chewing-internal/include/chewing_internal.h b/capi/chewing-internal/include/chewing_internal.h
index 3d7bbbf..9d2a690 100644
--- a/capi/chewing-internal/include/chewing_internal.h
+++ b/capi/chewing-internal/include/chewing_internal.h
@@ -18,11 +18,422 @@
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
+#include "chewing_rs.h"
+
+#define MAX_UTF8_SIZE 4
+
+#define MAX_UTF8_BUF (MAX_UTF8_SIZE + 1)
+
+#define BOPOMOFO_SIZE 4
+
+#define MAX_BOPOMOFO_UTF8_BUF ((BOPOMOFO_SIZE * MAX_UTF8_SIZE) + 1)
+
+#define PINYIN_SIZE 10
+
+#define MAX_PHRASE_LEN 11
+
+#define MAX_PHRASE_UTF8_BUF ((MAX_PHRASE_LEN * MAX_UTF8_SIZE) + 1)
+
+#define MAX_PHONE_SEQ_LEN 50
+
+#define MAX_PHONE_SEQ_BUF (MAX_PHONE_SEQ_LEN + 1)
+
+#define MAX_PHONE_SEQ_UTF8_BUF ((MAX_PHONE_SEQ_LEN * MAX_UTF8_SIZE) + 1)
+
+#define MIN_CHI_SYMBOL_LEN 0
+
+#define MAX_CHI_SYMBOL_LEN (MAX_PHONE_SEQ_LEN - MAX_PHRASE_LEN)
+
+#define MAX_INTERVAL (((MAX_PHONE_SEQ_LEN + 1) * MAX_PHONE_SEQ_LEN) / 2)
+
+#define MAX_CHOICE 567
+
+#define MAX_CHOICE_BUF 50
+
+#define EASY_SYMBOL_KEY_TAB_LEN 36
+
+#define AUX_PREFIX_LEN 3
+
+#define MAX_SHOW_MSG_BUF ((MAX_UTF8_SIZE * (MAX_PHRASE_LEN + AUX_PREFIX_LEN)) + 1)
+
+#define N_HASH_BIT 14
+
+#define HASH_TABLE_SIZE (1 << N_HASH_BIT)
+
+#define WORD_CHOICE 0
+
+#define SYMBOL_CATEGORY_CHOICE 1
+
+#define SYMBOL_CHOICE_INSERT 2
+
+#define SYMBOL_CHOICE_UPDATE 3
+
+typedef enum BOPOMOFO {
+ BOPOMOFO_IGNORE,
+ BOPOMOFO_ABSORB,
+ BOPOMOFO_COMMIT,
+ BOPOMOFO_KEY_ERROR,
+ BOPOMOFO_ERROR,
+ BOPOMOFO_NO_WORD,
+ BOPOMOFO_OPEN_SYMBOL_TABLE,
+} BOPOMOFO;
+
+typedef enum Category {
+ CHEWING_NONE,
+ CHEWING_CHINESE,
+ CHEWING_SYMBOL,
+} Category;
+
+typedef enum KB {
+ KB_DEFAULT,
+ KB_HSU,
+ KB_IBM,
+ KB_GIN_YIEH,
+ KB_ET,
+ KB_ET26,
+ KB_DVORAK,
+ KB_DVORAK_HSU,
+ KB_DACHEN_CP26,
+ KB_HANYU_PINYIN,
+ KB_THL_PINYIN,
+ KB_MPS2_PINYIN,
+ KB_CARPALX,
+ KB_TYPE_NUM,
+} KB;
+
+typedef enum KeyBehavior {
+ IGNORE = 0,
+ ABSORB,
+ COMMIT,
+ KEY_ERROR,
+ ERROR,
+ NO_WORD,
+ OPEN_SYMBOL_TABLE,
+} KeyBehavior;
+
+typedef enum KeyboardLayoutCompat {
+ DEFAULT = 0,
+ HSU,
+ IBM,
+ GIN_YIEH,
+ ET,
+ ET26,
+ DVORAK,
+ DVORAK_HSU,
+ DACHEN_CP26,
+ HANYU_PINYIN,
+ THL_PINYIN,
+ MPS2_PINYIN,
+ CARPALX,
+} KeyboardLayoutCompat;
+
+enum UserUpdate
+#ifdef __cplusplus
+ : uint8_t
+#endif // __cplusplus
+ {
+ USER_UPDATE_INSERT = 1,
+ USER_UPDATE_MODIFY = 2,
+ USER_UPDATE_FAIL = 4,
+};
+#ifndef __cplusplus
+typedef uint8_t UserUpdate;
+#endif // __cplusplus
+
+typedef struct ChewingConversionEngine ChewingConversionEngine;
+
+/**
+ * A collection of dictionaries that returns the union of the lookup results.
+ * # Examples
+ *
+ * ```
+ * # fn main() -> Result<(), Box<dyn std::error::Error>> {
+ * use std::collections::{HashMap, HashSet};
+ *
+ * use chewing::{dictionary::{LayeredDictionary, Dictionary}, syl, zhuyin::Bopomofo};
+ *
+ * let mut sys_dict = Box::new(HashMap::new());
+ * let mut user_dict = Box::new(HashMap::new());
+ * sys_dict.insert(
+ * vec![syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]],
+ * vec![("測", 1).into(), ("冊", 1).into(), ("側", 1).into()]
+ * );
+ * user_dict.insert(
+ * vec![syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]],
+ * vec![("策", 100).into(), ("冊", 100).into()]
+ * );
+ *
+ * let user_block_list = Box::new(HashSet::from(["側".to_string()]));
+ *
+ * let dict = LayeredDictionary::new(vec![sys_dict, user_dict], vec![user_block_list]);
+ * assert_eq!(
+ * [
+ * ("策", 100).into(),
+ * ("冊", 100).into(),
+ * ("測", 1).into(),
+ * ]
+ * .into_iter()
+ * .collect::<HashSet<_>>(),
+ * dict.lookup_phrase(&[
+ * syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]
+ * ])
+ * .collect::<HashSet<_>>(),
+ * );
+ * # Ok(())
+ * # }
+ * ```
+ */
+typedef struct LayeredDictionary LayeredDictionary;
+
+typedef struct SyllableEditorWithKeymap SyllableEditorWithKeymap;
+
+typedef struct TreeType TreeType;
+
+typedef struct UserphraseDbAndEstimate UserphraseDbAndEstimate;
+
+typedef struct AvailInfoAvail {
+ int len;
+ const void *id;
+} AvailInfoAvail;
+
+/**
+ * Information of available phrase or character choices.
+ */
+typedef struct AvailInfo {
+ /**
+ * All kinds of lengths of available phrases.
+ */
+ struct AvailInfoAvail avail[MAX_PHRASE_LEN];
+ /**
+ * Total number of available lengths.
+ */
+ int nAvail;
+ /**
+ * The current choosing available length.
+ */
+ int currentAvail;
+} AvailInfo;
+
+typedef struct ChoiceInfo {
+ /**
+ * Total page number.
+ */
+ int nPage;
+ /**
+ * Current page number.
+ */
+ int pageNo;
+ /**
+ * Number of choices per page.
+ */
+ int nChoicePerPage;
+ /**
+ * Store possible phrases for being chosen.
+ */
+ char totalChoiceStr[MAX_CHOICE][MAX_PHRASE_UTF8_BUF];
+ /**
+ * Number of phrases to choose.
+ */
+ int nTotalChoice;
+ int oldChiSymbolCursor;
+ int isSymbol;
+} ChoiceInfo;
+
+typedef struct PhrasingOutput {
+ IntervalType dispInterval[MAX_INTERVAL];
+ int nDispInterval;
+ int nNumCut;
+} PhrasingOutput;
+
+typedef struct BopomofoData {
+ struct SyllableEditorWithKeymap *editorWithKeymap;
+} BopomofoData;
+
+typedef struct PreeditBuf {
+ enum Category category;
+ uint8_t char_[MAX_UTF8_BUF];
+} PreeditBuf;
+
+typedef struct UserPhraseData {
+ uint16_t phoneSeq[MAX_PHONE_SEQ_LEN];
+ char wordSeq[MAX_PHRASE_UTF8_BUF];
+ int userfreq;
+ int recentTime;
+ int origfreq;
+ int maxfreq;
+} UserPhraseData;
+
+typedef struct SymbolEntry {
+ /**
+ * Total number of symbols in the category.
+ *
+ * If n_symbols = 0, the category is treat as a symbol,
+ * which is a zero-terminated utf-8 string.
+ *
+ * In that case, `symbols` is unused and isn't allocated at all.
+ */
+ int nSymbols;
+ /**
+ * Category name of the symbols.
+ */
+ char category[MAX_PHRASE_UTF8_BUF];
+ char symbols[0][MAX_UTF8_BUF];
+} SymbolEntry;
+
+typedef struct ChewingStaticData {
+ unsigned int nSymbolEntry;
+ struct SymbolEntry **symbolTable;
+ char *gEasySymbolValue[EASY_SYMBOL_KEY_TAB_LEN];
+ int gEasySymbolNum[EASY_SYMBOL_KEY_TAB_LEN];
+} ChewingStaticData;
+
+typedef struct ChewingData {
+ struct AvailInfo availInfo;
+ struct ChoiceInfo choiceInfo;
+ struct PhrasingOutput phrOut;
+ struct BopomofoData bopomofoData;
+ ChewingConfigData config;
+ /**
+ * Current input buffer, content == 0 means Chinese code
+ */
+ struct PreeditBuf preeditBuf[MAX_PHONE_SEQ_LEN];
+ int chiSymbolCursor;
+ int chiSymbolBufLen;
+ int pointStart;
+ int pointEnd;
+ int bShowMsg;
+ char showMsg[MAX_SHOW_MSG_BUF];
+ int showMsgLen;
+ uint16_t phoneSeq[MAX_PHONE_SEQ_LEN];
+ uint16_t phoneSeqAlt[MAX_PHONE_SEQ_LEN];
+ int nPhoneSeq;
+ char selectStr[MAX_PHONE_SEQ_LEN][MAX_PHRASE_UTF8_BUF];
+ IntervalType selectInterval[MAX_PHONE_SEQ_LEN];
+ int nSelect;
+ IntervalType preferInterval[MAX_INTERVAL];
+ int nPrefer;
+ int bUserArrCnnct[MAX_PHONE_SEQ_BUF];
+ int bUserArrBrkpt[MAX_PHONE_SEQ_BUF];
+ int bArrBrkpt[MAX_PHONE_SEQ_BUF];
+ int bSymbolArrBrkpt[MAX_PHONE_SEQ_BUF];
+ int bChiSym;
+ int bSelect;
+ int bFirstKey;
+ int bFullShape;
+ char symbolKeyBuf[MAX_PHONE_SEQ_LEN];
+ struct UserPhraseData userphraseData;
+ struct ChewingStaticData staticData;
+ void (*logger)(void *data, int level, const char *fmt);
+ void *loggerData;
+ const struct LayeredDictionary *dict;
+ struct ChewingConversionEngine *ce;
+ struct UserphraseDbAndEstimate *ue;
+ void *phraseIter;
+} ChewingData;
+
+typedef struct Phrase {
+ char phrase[MAX_PHONE_SEQ_BUF];
+ int freq;
+} Phrase;
+
+typedef struct ChewingOutput {
+ /**
+ * The content of edit buffer
+ */
+ char preeditBuf[MAX_PHONE_SEQ_UTF8_BUF];
+ /**
+ * The length of edit buffer
+ */
+ int chiSymbolBufLen;
+ /**
+ * The current position of the cursor
+ */
+ long chiSymbolCursor;
+ long pointStart;
+ long pointEnd;
+ char bopomofoBuf[MAX_BOPOMOFO_UTF8_BUF];
+ IntervalType dispInterval[MAX_INTERVAL];
+ int nDispInterval;
+ int dispBrkpt[MAX_PHONE_SEQ_BUF];
+ char commitBuf[MAX_PHONE_SEQ_UTF8_BUF];
+ int commitBufLen;
+ struct ChoiceInfo *pci;
+ int bChiSym;
+ int selKey[MAX_SELKEY];
+ int keystrokeRtn;
+} ChewingOutput;
+
+typedef struct ChewingContext {
+ struct ChewingData *data;
+ struct ChewingOutput *output;
+ int cand_no;
+ int it_no;
+ int kb_no;
+} ChewingContext;

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

+extern int toPreeditBufIndex(struct ChewingData *pgdata, int pos);
+
+extern int HaninSymbolInput(struct ChewingData *pgdata);
+
+struct SyllableEditorWithKeymap *NewPhoneticEditor(enum KeyboardLayoutCompat kb_type);
+
+void FreePhoneticEditor(struct SyllableEditorWithKeymap *editor_keymap);
+
+enum KeyBehavior BopomofoPhoInput(struct ChewingData *pgdata, int32_t key);
+
+void BopomofoPhoInx(const struct BopomofoData *bopomofo_data, int32_t *pho_inx);
+
+void BopomofoPhoInxAlt(const struct BopomofoData *bopomofo_data, int32_t *pho_inx);
+
+void BopomofoKeyseq(const struct BopomofoData *bopomofo_data, char *key_seq);
+
+uint16_t BopomofoSyllableIndex(const struct BopomofoData *bopomofo_data);
+
+uint16_t BopomofoSyllableIndexAlt(const struct BopomofoData *bopomofo_data);
+
+uint16_t BopomofoRemoveLast(struct BopomofoData *bopomofo_data);
+
+uint16_t BopomofoRemoveAll(struct BopomofoData *bopomofo_data);
+
+int BopomofoKbType(const struct BopomofoData *bopomofo_data);
+
+uint16_t BopomofoIsEntering(const struct BopomofoData *bopomofo_data);
+
+bool InitPinyin(struct ChewingData *_pgdata, char *_path);
+
+void TerminatePinyin(struct ChewingData *_pgdata);
+
+int InitTree(struct ChewingData *pgdata, const char *_prefix);
+
+void TerminateTree(struct ChewingData *pgdata);
+
+void Phrasing(struct ChewingData *pgdata, bool _all_phrasing);
+
+bool IsIntersect(IntervalType in1, IntervalType in2);
+
+int InitDict(struct ChewingData *pgdata, const char *prefix);
+
+void TerminateDict(struct ChewingData *pgdata);
+
+bool GetCharFirst(struct ChewingData *pgdata, struct Phrase *phrase, uint16_t syllable_u16);
+
+void GetPhraseFirst(struct ChewingData *pgdata,
+ struct Phrase *phrase,
+ const struct TreeType *tree_type);
+
+struct TreeType *TreeFindPhrase(struct ChewingData *pgdata,
+ int begin,
+ int end,
+ uint16_t *syllables_u16);
+
+void FreeTreePhrase(struct TreeType *tree_type);
+
+bool GetVocabNext(struct ChewingData *pgdata, struct Phrase *phrase);
+
uint16_t UintFromPhone(const char *phone);

uint16_t UintFromPhoneInx(const int *ph_inx);
@@ -33,6 +444,67 @@ ptrdiff_t UintArrayFromBopomofo(uint16_t *phone_seq, size_t phone_len, const cha

int GetPhoneLenFromUint(uint16_t phone_num);

+int get_search_path(char *path, size_t path_len);
+
+int find_path_by_files(const char *search_path,
+ const char *const *files,
+ uint8_t *output,
+ size_t output_len);
+
+char *GetDefaultUserPhrasePath(void *_data);
+
+void FreeDefaultUserPhrasePath(char *path);
+
+int InitUserphrase(struct ChewingData *pgdata, char *path);
+
+void TerminateUserphrase(struct ChewingData *pgdata);
+
+const struct UserPhraseData *UserGetPhraseFirst(struct ChewingData *pgdata,
+ uint16_t *syllables_u16_ptr);
+
+const struct UserPhraseData *UserGetPhraseNext(struct ChewingData *pgdata,
+ uint16_t *_syllables_u16_ptr);
+
+void UserGetPhraseEnd(struct ChewingData *pgdata, uint16_t *_syllables_u16_ptr);
+
+uint8_t UserUpdatePhrase(struct ChewingData *pgdata,
+ uint16_t *syllables_u16_ptr,
+ char *phrase_str_ptr);
+
+bool UserRemovePhrase(struct ChewingData *pgdata,
+ uint16_t *syllables_u16_ptr,
+ char *phrase_str_ptr);
+
+void IncreaseLifeTime(struct ChewingData *pgdata);
+
+void UserUpdatePhraseBegin(struct ChewingData *_pgdata);
+
+void UserUpdatePhraseEnd(struct ChewingData *_pgdata);
+
+void *UserEnumeratePhrase(const struct UserphraseDbAndEstimate *ue);
+
+bool UserEnumerateHasNext(void *iter_ptr, unsigned int *phrase_len_ptr, unsigned int *bopomofo_len);
+
+int UserEnumerateGet(void *iter_ptr,
+ char *phrase_buf,
+ const unsigned int *_phrase_len_ptr,
+ char *bopomofo_buf,
+ const unsigned int *_bopomofo_len);
+
+int ueStrLen(const char *str);
+
+int ueBytesFromChar(unsigned char b);
+
+int ueStrNBytes(const char *str, int n);
+
+int ueStrNCpy(char *dest, const char *src, size_t n, int end);
+
+char *ueStrSeek(char *src, size_t n);
+
+const char *ueConstStrSeek(const char *src, size_t n);
+
+const char *ueStrStr(const char *str, size_t _lstr, const char *substr, size_t _lsub);
+
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
diff --git a/capi/chewing-internal/src/binding.rs b/capi/chewing-internal/src/binding.rs
new file mode 100644
index 0000000..7cc475b
--- /dev/null
+++ b/capi/chewing-internal/src/binding.rs
@@ -0,0 +1,13 @@
+use std::ffi::c_int;
+
+use ffi_opaque::opaque;
+
+opaque! {
+ pub struct ChewingData;
+ pub struct ChewingContext;
+}
+
+extern "C" {
+ pub fn toPreeditBufIndex(pgdata: *mut ChewingData, pos: c_int) -> c_int;
+ pub fn HaninSymbolInput(pgdata: *mut ChewingData) -> c_int;
+}
\ No newline at end of file
diff --git a/capi/chewing-internal/src/bopomofo.rs b/capi/chewing-internal/src/bopomofo.rs
new file mode 100644
index 0000000..70596f6
--- /dev/null
+++ b/capi/chewing-internal/src/bopomofo.rs
@@ -0,0 +1,242 @@
+use std::{
+ ffi::{c_int, CString},
+ os::raw::c_char,
+ slice,
+};
+
+use chewing::editor::{
+ keymap::{
+ IdentityKeymap, KeyCode, KeyCodeFromQwerty, Keymap, RemappingKeymap, CARPALX, DVORAK,
+ QWERTY,
+ },
+ layout::{
+ DaiChien26, Et, Et26, GinYieh, Hsu, Ibm, KeyBehavior, KeyboardLayoutCompat, Pinyin,
+ Standard,
+ },
+ SyllableEditor,
+};
+
+use super::{
+ binding::HaninSymbolInput,
+ types::{BopomofoData, ChewingData},
+};
+
+#[repr(C)]
+pub struct SyllableEditorWithKeymap {
+ kb_type: KeyboardLayoutCompat,
+ keymap: Box<dyn Keymap>,
+ editor: Box<dyn SyllableEditor>,
+}
+
+#[no_mangle]
+pub extern "C" fn NewPhoneticEditor(
+ kb_type: KeyboardLayoutCompat,
+) -> Box<SyllableEditorWithKeymap> {
+ use KeyboardLayoutCompat as KB;
+ match kb_type {
+ KB::Default => Box::new(SyllableEditorWithKeymap {
+ kb_type,
+ keymap: Box::new(IdentityKeymap::new(QWERTY)),
+ editor: Box::new(Standard::new()),
+ }),
+ KB::Hsu => Box::new(SyllableEditorWithKeymap {
+ kb_type,
+ keymap: Box::new(IdentityKeymap::new(QWERTY)),
+ editor: Box::new(Hsu::new()),
+ }),
+ KB::Ibm => Box::new(SyllableEditorWithKeymap {
+ kb_type,
+ keymap: Box::new(IdentityKeymap::new(QWERTY)),
+ editor: Box::new(Ibm::new()),
+ }),
+ KB::GinYieh => Box::new(SyllableEditorWithKeymap {
+ kb_type,
+ keymap: Box::new(IdentityKeymap::new(QWERTY)),
+ editor: Box::new(GinYieh::new()),
+ }),
+ KB::Et => Box::new(SyllableEditorWithKeymap {
+ kb_type,
+ keymap: Box::new(IdentityKeymap::new(QWERTY)),
+ editor: Box::new(Et::new()),
+ }),
+ KB::Et26 => Box::new(SyllableEditorWithKeymap {
+ kb_type,
+ keymap: Box::new(IdentityKeymap::new(QWERTY)),
+ editor: Box::new(Et26::new()),
+ }),
+ KB::Dvorak => Box::new(SyllableEditorWithKeymap {
+ kb_type,
+ keymap: Box::new(RemappingKeymap::new(DVORAK, QWERTY)),
+ editor: Box::new(Standard::new()),
+ }),
+ KB::DvorakHsu => Box::new(SyllableEditorWithKeymap {
+ kb_type,
+ keymap: Box::new(RemappingKeymap::new(DVORAK, QWERTY)),
+ editor: Box::new(Hsu::new()),
+ }),
+ KB::DachenCp26 => Box::new(SyllableEditorWithKeymap {
+ kb_type,
+ keymap: Box::new(IdentityKeymap::new(QWERTY)),
+ editor: Box::new(DaiChien26::new()),
+ }),
+ KB::HanyuPinyin => Box::new(SyllableEditorWithKeymap {
+ kb_type,
+ keymap: Box::new(IdentityKeymap::new(QWERTY)),
+ editor: Box::new(Pinyin::hanyu()),
+ }),
+ KB::ThlPinyin => Box::new(SyllableEditorWithKeymap {
+ kb_type,
+ keymap: Box::new(IdentityKeymap::new(QWERTY)),
+ editor: Box::new(Pinyin::thl()),
+ }),
+ KB::Mps2Pinyin => Box::new(SyllableEditorWithKeymap {
+ kb_type,
+ keymap: Box::new(IdentityKeymap::new(QWERTY)),
+ editor: Box::new(Pinyin::mps2()),
+ }),
+ KB::Carpalx => Box::new(SyllableEditorWithKeymap {
+ kb_type,
+ keymap: Box::new(RemappingKeymap::new(CARPALX, QWERTY)),
+ editor: Box::new(Standard::new()),
+ }),
+ }
+}
+
+#[no_mangle]
+pub extern "C" fn FreePhoneticEditor(editor_keymap: Option<Box<SyllableEditorWithKeymap>>) {
+ drop(editor_keymap);
+}
+
+#[no_mangle]
+pub extern "C" fn BopomofoPhoInput(pgdata: &mut ChewingData, key: i32) -> KeyBehavior {
+ if key == b'`' as i32 {
+ pgdata.b_select = 1;
+ pgdata.choice_info.old_chi_symbol_cursor = pgdata.chi_symbol_cursor;
+ unsafe { HaninSymbolInput((pgdata as *mut ChewingData).cast()) };
+ return KeyBehavior::OpenSymbolTable;
+ }
+
+ let editor_keymap = pgdata.bopomofo_data.editor_with_keymap.as_mut();
+ let key_code = match (key as u8).as_key_code() {
+ Some(key_code) => key_code,
+ None => return KeyBehavior::KeyError,
+ };
+ let key_event = editor_keymap.keymap.map_key(key_code);
+ let result = editor_keymap.editor.key_press(key_event);
+ let key_buf = editor_keymap.editor.read();
+
+ if result == KeyBehavior::Commit {
+ if key_buf.is_empty() {
+ return if key_code == KeyCode::Space {
+ KeyBehavior::KeyError
+ } else {
+ KeyBehavior::NoWord
+ };
+ }
+ // FIXME make sure editors fills the tone
+ // FIXME if dictionary doesn't have a word, return NO_WORD
+ }
+
+ result
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn BopomofoPhoInx(bopomofo_data: &BopomofoData, pho_inx: *mut i32) {
+ let editor_keymap = bopomofo_data.editor_with_keymap.as_ref();
+ let pho_inx = unsafe { slice::from_raw_parts_mut(pho_inx, 4) };
+ let syllable = editor_keymap.editor.read();
+
+ pho_inx[0] = match syllable.initial() {
+ Some(b) => b.initial_index() as i32,
+ None => 0,
+ };
+ pho_inx[1] = match syllable.medial() {
+ Some(b) => b.medial_index() as i32,
+ None => 0,
+ };
+ pho_inx[2] = match syllable.rime() {
+ Some(b) => b.rime_index() as i32,
+ None => 0,
+ };
+ pho_inx[3] = match syllable.tone() {
+ Some(b) => b.tone_index() as i32,
+ None => 0,
+ };
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn BopomofoPhoInxAlt(bopomofo_data: &BopomofoData, pho_inx: *mut i32) {
+ let editor_keymap = bopomofo_data.editor_with_keymap.as_ref();
+ let pho_inx = unsafe { slice::from_raw_parts_mut(pho_inx, 4) };
+ // FIXME
+ let syllable = editor_keymap.editor.read();
+
+ pho_inx[0] = match syllable.initial() {
+ Some(b) => b.initial_index() as i32,
+ None => 0,
+ };
+ pho_inx[1] = match syllable.medial() {
+ Some(b) => b.medial_index() as i32,
+ None => 0,
+ };
+ pho_inx[2] = match syllable.rime() {
+ Some(b) => b.rime_index() as i32,
+ None => 0,
+ };
+ pho_inx[3] = match syllable.tone() {
+ Some(b) => b.tone_index() as i32,
+ None => 0,
+ };
+}
+
+#[no_mangle]
+pub extern "C" fn BopomofoKeyseq(bopomofo_data: &BopomofoData, key_seq: *mut c_char) {
+ let editor_keymap = bopomofo_data.editor_with_keymap.as_ref();
+ let key_seq = unsafe { slice::from_raw_parts_mut(key_seq as *mut u8, 10) };
+ if let Some(key_seq_str) = editor_keymap.editor.key_seq() {
+ let key_seq_cstr = CString::new(key_seq_str).unwrap();
+ let key_seq_bytes = key_seq_cstr.as_bytes_with_nul();
+ key_seq[..key_seq_bytes.len()].copy_from_slice(key_seq_bytes);
+ }
+}
+
+#[no_mangle]
+pub extern "C" fn BopomofoSyllableIndex(bopomofo_data: &BopomofoData) -> u16 {
+ let editor_keymap = bopomofo_data.editor_with_keymap.as_ref();
+ let syllable = editor_keymap.editor.read();
+ syllable.to_u16()
+}
+
+#[no_mangle]
+pub extern "C" fn BopomofoSyllableIndexAlt(bopomofo_data: &BopomofoData) -> u16 {
+ let editor_keymap = bopomofo_data.editor_with_keymap.as_ref();
+ // FIXME
+ let syllable = editor_keymap.editor.read();
+ syllable.to_u16()
+}
+
+#[no_mangle]
+pub extern "C" fn BopomofoRemoveLast(bopomofo_data: &mut BopomofoData) -> u16 {
+ let editor_keymap = bopomofo_data.editor_with_keymap.as_mut();
+ editor_keymap.editor.remove_last();
+ 0
+}
+
+#[no_mangle]
+pub extern "C" fn BopomofoRemoveAll(bopomofo_data: &mut BopomofoData) -> u16 {
+ let editor_keymap = bopomofo_data.editor_with_keymap.as_mut();
+ editor_keymap.editor.clear();
+ 0
+}
+
+#[no_mangle]
+pub extern "C" fn BopomofoKbType(bopomofo_data: &BopomofoData) -> c_int {
+ let editor_keymap = bopomofo_data.editor_with_keymap.as_ref();
+ editor_keymap.kb_type as c_int
+}
+
+#[no_mangle]
+pub extern "C" fn BopomofoIsEntering(bopomofo_data: &BopomofoData) -> u16 {
+ let editor_keymap = bopomofo_data.editor_with_keymap.as_ref();
+ u16::from(!editor_keymap.editor.is_empty())
+}
diff --git a/capi/chewing-internal/src/compat.rs b/capi/chewing-internal/src/compat.rs
new file mode 100644
index 0000000..484b9f6
--- /dev/null
+++ b/capi/chewing-internal/src/compat.rs
@@ -0,0 +1,11 @@
+use std::ffi::c_char;
+
+use crate::types::ChewingData;
+
+#[no_mangle]
+pub extern "C" fn InitPinyin(_pgdata: &mut ChewingData, _path: *mut c_char) -> bool {
+ true
+}
+
+#[no_mangle]
+pub extern "C" fn TerminatePinyin(_pgdata: &mut ChewingData) {}
diff --git a/capi/chewing-internal/src/conversion.rs b/capi/chewing-internal/src/conversion.rs
new file mode 100644
index 0000000..2106777
--- /dev/null
+++ b/capi/chewing-internal/src/conversion.rs
@@ -0,0 +1,94 @@
+use std::{
+ ffi::{c_char, c_int, CStr},
+ rc::Rc,
+};
+
+use chewing::conversion::{
+ Break, ChewingConversionEngine, ChineseSequence, ConversionEngine, Interval,
+};
+use chewing_public::types::IntervalType;
+
+use super::{binding::toPreeditBufIndex, types::ChewingData};
+
+#[no_mangle]
+pub extern "C" fn InitTree(pgdata: &mut ChewingData, _prefix: *const c_char) -> c_int {
+ let dict = unsafe {
+ Rc::increment_strong_count(pgdata.dict);
+ Rc::from_raw(pgdata.dict)
+ };
+ pgdata.ce = Some(Box::new(ChewingConversionEngine::new(dict)));
+ 0
+}
+
+#[no_mangle]
+pub extern "C" fn TerminateTree(pgdata: &mut ChewingData) {
+ pgdata.ce = None;
+}
+
+#[no_mangle]
+pub extern "C" fn Phrasing(pgdata: &mut ChewingData, _all_phrasing: bool) {
+ let ce = pgdata.ce.as_ref().expect("nonnull pointer");
+ let syllables_u16 = &pgdata.phone_seq[..pgdata.n_phone_seq as usize];
+ let select_strs = pgdata
+ .select_str
+ .iter()
+ .take(pgdata.n_select as usize)
+ .map(|it| unsafe { CStr::from_ptr(it.as_ptr()) });
+ let select_intervals = pgdata.select_interval.iter().take(pgdata.n_select as usize);
+ let breaks = pgdata
+ .b_arr_brkpt
+ .iter()
+ .enumerate()
+ .filter(|it| *it.1 == 1)
+ .map(|it| Break(it.0))
+ .collect();
+ let syllables = syllables_u16
+ .iter()
+ .map(|&syl_u16| syl_u16.try_into().expect("convert u16 to syllable"))
+ .collect();
+
+ let selections = select_intervals
+ .zip(select_strs)
+ .map(|(interval, str)| Interval {
+ start: interval.from as usize,
+ end: interval.to as usize,
+ phrase: str.to_string_lossy().to_string(),
+ })
+ .collect();
+
+ let sequence = ChineseSequence {
+ syllables,
+ selections,
+ breaks,
+ };
+ let intervals = match pgdata.phr_out.n_num_cut {
+ 0 => ce.convert(&sequence),
+ _ => ce.convert_next(&sequence, pgdata.phr_out.n_num_cut as usize),
+ };
+
+ pgdata.phr_out.n_disp_interval = intervals.len() as c_int;
+ for (i, interval) in intervals.into_iter().enumerate() {
+ let from = interval.start as c_int;
+ let to = interval.end as c_int;
+ fill_preedit_buf(pgdata, &interval.phrase, from, to);
+ let display_intervals = &mut pgdata.phr_out.disp_interval;
+ display_intervals[i].from = from;
+ display_intervals[i].to = to;
+ }
+}
+
+fn fill_preedit_buf(pgdata: &mut ChewingData, phrase: &str, from: c_int, to: c_int) {
+ let start = unsafe { toPreeditBufIndex((pgdata as *mut ChewingData).cast(), from) } as usize;
+ for i in 0..(to - from) as usize {
+ phrase
+ .chars()
+ .nth(i)
+ .unwrap()
+ .encode_utf8(&mut pgdata.preedit_buf[start + i].char_);
+ }
+}
+
+#[no_mangle]
+pub extern "C" fn IsIntersect(in1: IntervalType, in2: IntervalType) -> bool {
+ in1.from.max(in2.from) < in1.to.min(in2.to)
+}
diff --git a/capi/chewing-internal/src/dict.rs b/capi/chewing-internal/src/dict.rs
new file mode 100644
index 0000000..5b06c75
--- /dev/null
+++ b/capi/chewing-internal/src/dict.rs
@@ -0,0 +1,165 @@
+use std::{
+ ffi::{CStr, CString},
+ os::raw::{c_char, c_int},
+ path::Path,
+ rc::Rc,
+ slice,
+};
+
+use chewing::dictionary::{
+ Dictionary, LayeredDictionary, Phrases, SqliteDictionary, TrieDictionary,
+};
+
+use crate::types::ChewingData;
+
+use super::types::Phrase;
+
+pub struct TreeType<'a> {
+ phrases: Vec<chewing::dictionary::Phrase<'a>>,
+}
+
+pub struct TreeIter<'a> {
+ iter: Phrases<'a, 'a>,
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn InitDict(pgdata: &mut ChewingData, prefix: *const c_char) -> c_int {
+ let prefix = unsafe { CStr::from_ptr(prefix) }
+ .to_str()
+ .expect("Invalid prefix string");
+ let path: &Path = prefix.as_ref();
+
+ let mut tsi_db_path = path.to_path_buf();
+ tsi_db_path.push("tsi.dat");
+ let tsi_db = if let Ok(db) = SqliteDictionary::open_read_only(&tsi_db_path) {
+ Box::new(db) as Box<dyn Dictionary>
+ } else if let Ok(db) = TrieDictionary::open(&tsi_db_path) {
+ Box::new(db) as Box<dyn Dictionary>
+ } else {
+ panic!(
+ "Unsupported db format for {}",
+ tsi_db_path.to_string_lossy()
+ );
+ };
+
+ let mut word_db_path = path.to_path_buf();
+ word_db_path.push("word.dat");
+ let word_db = if let Ok(db) = SqliteDictionary::open_read_only(&word_db_path) {
+ Box::new(db) as Box<dyn Dictionary>
+ } else if let Ok(db) = TrieDictionary::open(&word_db_path) {
+ Box::new(db) as Box<dyn Dictionary>
+ } else {
+ panic!(
+ "Unsupported db format for {}",
+ word_db_path.to_string_lossy()
+ );
+ };
+
+ let dict = Rc::new(LayeredDictionary::new(vec![word_db, tsi_db], vec![]));
+ pgdata.dict = Rc::into_raw(dict);
+ 0
+}
+
+#[no_mangle]
+pub extern "C" fn TerminateDict(pgdata: &mut ChewingData) {
+ unsafe {
+ if !pgdata.dict.is_null() {
+ Rc::decrement_strong_count(pgdata.dict);
+ }
+ }
+ pgdata.dict = std::ptr::null();
+}
+
+#[no_mangle]
+pub extern "C" fn GetCharFirst(
+ pgdata: &mut ChewingData,
+ phrase: &mut Phrase,
+ syllable_u16: u16,
+) -> bool {
+ let dict = unsafe { pgdata.dict.as_ref().expect("nonnull dict") };
+ let syllable = syllable_u16
+ .try_into()
+ .expect("Unable to convert u16 to syllable");
+ let mut iter = dict.lookup_word(syllable);
+ if let Some(p) = iter.next() {
+ let phrase_str = CString::new(p.as_str()).expect("Unable to convert to CString");
+ let phrase_bytes = phrase_str.as_bytes_with_nul();
+ phrase.freq = p.freq() as c_int;
+ phrase.phrase[0..phrase_bytes.len()].copy_from_slice(unsafe {
+ slice::from_raw_parts(phrase_bytes.as_ptr().cast(), phrase_bytes.len())
+ });
+ pgdata.phrase_iter = Box::into_raw(Box::new(TreeIter { iter })).cast();
+ return true;
+ }
+ pgdata.phrase_iter = std::ptr::null_mut();
+ false
+}
+
+#[no_mangle]
+pub extern "C" fn GetPhraseFirst(
+ pgdata: &mut ChewingData,
+ phrase: &mut Phrase,
+ tree_type: &TreeType,
+) {
+ let mut iter = Box::new(tree_type.phrases.clone().into_iter());
+ pgdata.phrase_iter = std::ptr::null_mut();
+ if let Some(p) = iter.next() {
+ let phrase_str = CString::new(p.as_str()).expect("Unable to convert to CString");
+ let phrase_bytes = phrase_str.as_bytes_with_nul();
+ phrase.freq = p.freq() as c_int;
+ phrase.phrase[0..phrase_bytes.len()].copy_from_slice(unsafe {
+ slice::from_raw_parts(phrase_bytes.as_ptr().cast(), phrase_bytes.len())
+ });
+ pgdata.phrase_iter = Box::into_raw(Box::new(TreeIter { iter })).cast();
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn TreeFindPhrase(
+ pgdata: &mut ChewingData,
+ begin: c_int,
+ end: c_int,
+ syllables_u16: *mut u16,
+) -> Option<Box<TreeType>> {
+ let dict = unsafe { pgdata.dict.as_ref().expect("nonnull dict") };
+ let syllables_u16 = unsafe { slice::from_raw_parts(syllables_u16, 50) };
+ let begin = begin as usize;
+ let end = end as usize;
+ let syllables = syllables_u16[begin..=end]
+ .iter()
+ .map(|&syl_u16| {
+ syl_u16
+ .try_into()
+ .expect("Unable to convert u16 to syllable")
+ })
+ .collect::<Vec<_>>();
+ let phrases = dict.lookup_phrase(syllables.as_slice()).collect::<Vec<_>>();
+ if !phrases.is_empty() {
+ let ptr = Some(Box::new(TreeType { phrases }));
+ return ptr;
+ }
+ None
+}
+
+#[no_mangle]
+pub extern "C" fn FreeTreePhrase(tree_type: Option<Box<TreeType>>) {
+ drop(tree_type)
+}
+
+#[no_mangle]
+pub extern "C" fn GetVocabNext(pgdata: &mut ChewingData, phrase: &mut Phrase) -> bool {
+ let tree_iter_ptr: *mut TreeIter = pgdata.phrase_iter.cast();
+ let tree_iter: &mut TreeIter = unsafe { tree_iter_ptr.as_mut().expect("nonnull iter") };
+ if let Some(p) = tree_iter.iter.next() {
+ let phrase_str = CString::new(p.as_str()).expect("Unable to convert to CString");
+ let phrase_bytes = phrase_str.as_bytes_with_nul();
+ phrase.freq = p.freq() as c_int;
+ phrase.phrase[0..phrase_bytes.len()].copy_from_slice(unsafe {
+ slice::from_raw_parts(phrase_bytes.as_ptr().cast(), phrase_bytes.len())
+ });
+ return true;
+ }
+ unsafe { Box::from_raw(tree_iter_ptr) };
+ pgdata.phrase_iter = std::ptr::null_mut();
+ false
+}
diff --git a/capi/chewing-internal/src/ffi.rs b/capi/chewing-internal/src/ffi.rs
new file mode 100644
index 0000000..7ec6245
--- /dev/null
+++ b/capi/chewing-internal/src/ffi.rs
@@ -0,0 +1,21 @@
+use std::{
+ ffi::{c_char, CString},
+ slice,
+};
+
+use chewing::dictionary::Phrase;
+
+pub trait CopyToCString {
+ fn copy_to(&self, buf: &mut [c_char]);
+}
+
+impl CopyToCString for Phrase<'_> {
+ fn copy_to(&self, buf: &mut [c_char]) {
+ let phrase_str = CString::new(self.as_str()).expect("Unable to convert to CString");
+ let phrase_bytes = phrase_str.as_bytes_with_nul();
+ let phrase_bytes = unsafe {
+ slice::from_raw_parts(phrase_bytes.as_ptr() as *const i8, phrase_bytes.len())
+ };
+ buf[0..phrase_bytes.len()].copy_from_slice(phrase_bytes);
+ }
+}
diff --git a/capi/chewing-internal/src/key2pho.rs b/capi/chewing-internal/src/key2pho.rs
index 270bb65..41b8a17 100644
--- a/capi/chewing-internal/src/key2pho.rs
+++ b/capi/chewing-internal/src/key2pho.rs
@@ -6,7 +6,7 @@ use std::{
use chewing::zhuyin::{Bopomofo, Syllable};

#[no_mangle]
-pub extern "C" fn UintFromPhone(phone: *const c_char) -> u16 {
+pub unsafe extern "C" fn UintFromPhone(phone: *const c_char) -> u16 {
let cstr = unsafe { CStr::from_ptr(phone) };
let rstr = match cstr.to_str() {
Ok(rstr) => rstr,
@@ -20,7 +20,7 @@ pub extern "C" fn UintFromPhone(phone: *const c_char) -> u16 {
}

#[no_mangle]
-pub extern "C" fn UintFromPhoneInx(ph_inx: *const c_int) -> u16 {
+pub unsafe extern "C" fn UintFromPhoneInx(ph_inx: *const c_int) -> u16 {
let ph_inx = unsafe { slice::from_raw_parts(ph_inx, 4) };
let mut builder = Syllable::builder();
if ph_inx[0] > 0 {
@@ -71,7 +71,11 @@ pub extern "C" fn UintFromPhoneInx(ph_inx: *const c_int) -> u16 {
}

#[no_mangle]
-pub extern "C" fn PhoneFromUint(phone: *mut c_char, phone_len: usize, phone_num: u16) -> c_int {
+pub unsafe extern "C" fn PhoneFromUint(
+ phone: *mut c_char,
+ phone_len: usize,
+ phone_num: u16,
+) -> c_int {
let syl = match Syllable::try_from(phone_num) {
Ok(syl) => syl,
Err(_) => return 1,
@@ -82,13 +86,13 @@ pub extern "C" fn PhoneFromUint(phone: *mut c_char, phone_len: usize, phone_num:
}
unsafe {
phone.copy_from(str.as_ptr() as *const c_char, str.len());
- ptr::write(phone.offset(str.len() as isize), 0);
+ ptr::write(phone.add(str.len()), 0);
}
0
}

#[no_mangle]
-pub extern "C" fn UintArrayFromBopomofo(
+pub unsafe extern "C" fn UintArrayFromBopomofo(
phone_seq: *mut u16,
phone_len: usize,
bopomofo_buf: *const c_char,
@@ -110,7 +114,7 @@ pub extern "C" fn UintArrayFromBopomofo(
}
for (i, syl) in syllables.into_iter().enumerate() {
let syl_u16 = syl.unwrap();
- unsafe { ptr::write(phone_seq.offset(i as isize), syl_u16) };
+ unsafe { ptr::write(phone_seq.add(i), syl_u16) };
}
len as isize
}
diff --git a/capi/chewing-internal/src/lib.rs b/capi/chewing-internal/src/lib.rs
index e9c322e..8eec535 100644
--- a/capi/chewing-internal/src/lib.rs
+++ b/capi/chewing-internal/src/lib.rs
@@ -1 +1,11 @@
-pub mod key2pho;
\ No newline at end of file
+pub mod binding;
+pub mod bopomofo;
+pub mod compat;
+pub mod conversion;
+pub mod dict;
+pub mod ffi;
+pub mod key2pho;
+pub mod path;
+pub mod types;
+pub mod userphrase;
+pub mod utf8;
diff --git a/capi/chewing-internal/src/path.rs b/capi/chewing-internal/src/path.rs
new file mode 100644
index 0000000..b6ec897
--- /dev/null
+++ b/capi/chewing-internal/src/path.rs
@@ -0,0 +1,86 @@
+use core::slice;
+use std::{
+ borrow::Cow,
+ env,
+ ffi::{c_char, c_int, CStr, CString},
+ path::Path,
+};
+
+#[no_mangle]
+pub extern "C" fn get_search_path(path: *mut c_char, path_len: usize) -> c_int {
+ let chewing_path = env::var("CHEWING_PATH");
+ if let Ok(chewing_path) = chewing_path {
+ let path_cstring = CString::new(chewing_path).expect("string should not have internal nul");
+ let bytes = path_cstring.as_bytes_with_nul();
+ if bytes.len() > path_len {
+ return 1;
+ }
+ let out = unsafe { slice::from_raw_parts_mut(path as *mut u8, bytes.len()) };
+ out.copy_from_slice(bytes);
+ } else {
+ let user_datadir = chewing::path::data_dir();
+ if let Some(datadir) = user_datadir.as_ref().and_then(|p| p.to_str()) {
+ let path_cstring = CString::new(format!("{}:/usr/share/libchewing", datadir)).unwrap();
+ let bytes = path_cstring.as_bytes_with_nul();
+ if bytes.len() > path_len {
+ return 1;
+ }
+ let out = unsafe { slice::from_raw_parts_mut(path as *mut u8, bytes.len()) };
+ out.copy_from_slice(bytes);
+ }
+ }
+ 0
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn find_path_by_files(
+ search_path: *const c_char,
+ files: *const *const c_char,
+ output: *mut u8,
+ output_len: usize,
+) -> c_int {
+ let search_path = unsafe { CStr::from_ptr(search_path) };
+ let search_path = search_path.to_str();
+ let files = files_ptr_to_slice(files);
+ if let Ok(search_path) = search_path {
+ for path in search_path.split(':') {
+ let prefix = Path::new(path).to_path_buf();
+ if files
+ .iter()
+ .map(|it| {
+ let mut path = prefix.clone();
+ path.push(it.as_ref());
+ path
+ })
+ .all(|it| it.exists())
+ {
+ let path = CString::new(path).expect("no internal null");
+ let path = path.as_bytes_with_nul();
+ if path.len() > output_len {
+ return -1;
+ }
+ let output = unsafe { slice::from_raw_parts_mut(output, path.len()) };
+ output.copy_from_slice(path);
+
+ return 0;
+ }
+ }
+ }
+ -1
+}
+
+fn files_ptr_to_slice(files: *const *const i8) -> Vec<Cow<'static, str>> {
+ let len = {
+ let mut i = 0;
+ while unsafe { !files.add(i).read().is_null() } {
+ i += 1;
+ }
+ i
+ };
+ let files = unsafe { slice::from_raw_parts(files, len) };
+ files
+ .iter()
+ .map(|&it| unsafe { CStr::from_ptr(it) })
+ .map(|it| it.to_string_lossy())
+ .collect()
+}
diff --git a/capi/chewing-internal/src/types.rs b/capi/chewing-internal/src/types.rs
new file mode 100644
index 0000000..221dcf6
--- /dev/null
+++ b/capi/chewing-internal/src/types.rs
@@ -0,0 +1,256 @@
+use std::ffi::{c_char, c_int, c_long, c_uint, c_void};
+
+use chewing::{conversion::ChewingConversionEngine, dictionary::LayeredDictionary};
+use chewing_public::types::{ChewingConfigData, IntervalType, MAX_SELKEY};
+
+use crate::userphrase::UserphraseDbAndEstimate;
+
+use super::bopomofo::SyllableEditorWithKeymap;
+
+pub const MAX_UTF8_SIZE: usize = 4;
+pub const MAX_UTF8_BUF: usize = MAX_UTF8_SIZE + 1;
+pub const BOPOMOFO_SIZE: usize = 4;
+pub const MAX_BOPOMOFO_UTF8_BUF: usize = BOPOMOFO_SIZE * MAX_UTF8_SIZE + 1;
+pub const PINYIN_SIZE: usize = 10;
+pub const MAX_PHRASE_LEN: usize = 11;
+pub const MAX_PHRASE_UTF8_BUF: usize = MAX_PHRASE_LEN * MAX_UTF8_SIZE + 1;
+pub const MAX_PHONE_SEQ_LEN: usize = 50;
+pub const MAX_PHONE_SEQ_BUF: usize = MAX_PHONE_SEQ_LEN + 1;
+pub const MAX_PHONE_SEQ_UTF8_BUF: usize = MAX_PHONE_SEQ_LEN * MAX_UTF8_SIZE + 1;
+pub const MIN_CHI_SYMBOL_LEN: usize = 0;
+pub const MAX_CHI_SYMBOL_LEN: usize = MAX_PHONE_SEQ_LEN - MAX_PHRASE_LEN;
+pub const MAX_INTERVAL: usize = (MAX_PHONE_SEQ_LEN + 1) * MAX_PHONE_SEQ_LEN / 2;
+pub const MAX_CHOICE: usize = 567;
+pub const MAX_CHOICE_BUF: usize = 50;
+pub const EASY_SYMBOL_KEY_TAB_LEN: usize = 36;
+pub const AUX_PREFIX_LEN: usize = 3;
+pub const MAX_SHOW_MSG_BUF: usize = MAX_UTF8_SIZE * (MAX_PHRASE_LEN + AUX_PREFIX_LEN) + 1;
+
+pub const N_HASH_BIT: usize = 14;
+pub const HASH_TABLE_SIZE: usize = 1 << N_HASH_BIT;
+
+pub const WORD_CHOICE: usize = 0;
+pub const SYMBOL_CATEGORY_CHOICE: usize = 1;
+pub const SYMBOL_CHOICE_INSERT: usize = 2;
+pub const SYMBOL_CHOICE_UPDATE: usize = 3;
+
+/// cbindgen:prefix-with-name
+/// cbindgen:enum-trailing-values=[TypeNum]
+#[derive(Clone, Copy, Debug, PartialEq)]
+#[repr(C)]
+pub enum KB {
+ Default,
+ Hsu,
+ Ibm,
+ GinYieh,
+ Et,
+ Et26,
+ Dvorak,
+ DvorakHsu,
+ DachenCp26,
+ HanyuPinyin,
+ ThlPinyin,
+ Mps2Pinyin,
+ Carpalx,
+}
+
+/// cbindgen:prefix-with-name
+#[repr(C)]
+pub enum BOPOMOFO {
+ Ignore,
+ Absorb,
+ Commit,
+ KeyError,
+ Error,
+ NoWord,
+ OpenSymbolTable,
+}
+
+/// cbindgen:prefix-with-name
+#[repr(u8)]
+pub enum UserUpdate {
+ Insert = 1,
+ Modify = 2,
+ Fail = 4,
+}
+
+#[repr(C)]
+pub struct PhrasingOutput {
+ pub disp_interval: [IntervalType; MAX_INTERVAL],
+ pub n_disp_interval: c_int,
+ pub n_num_cut: c_int,
+}
+
+#[repr(C)]
+pub struct BopomofoData {
+ pub editor_with_keymap: Box<SyllableEditorWithKeymap>,
+}
+
+#[repr(C)]
+pub struct PinYinData {
+ pub r#type: c_int,
+ pub key_seq: [c_char; PINYIN_SIZE],
+}
+
+/// Information of available phrase or character choices.
+#[repr(C)]
+pub struct AvailInfo {
+ /// All kinds of lengths of available phrases.
+ pub avail: [AvailInfoAvail; MAX_PHRASE_LEN],
+ /// Total number of available lengths.
+ pub n_avail: c_int,
+ /// The current choosing available length.
+ pub current_avail: c_int,
+}
+
+#[repr(C)]
+pub struct AvailInfoAvail {
+ pub len: c_int,
+ pub id: *const c_void,
+}
+
+#[repr(C)]
+pub struct ChoiceInfo {
+ /// Total page number.
+ pub n_page: c_int,
+ /// Current page number.
+ pub page_no: c_int,
+ /// Number of choices per page.
+ pub n_choice_per_page: c_int,
+ /// Store possible phrases for being chosen.
+ pub total_choice_str: [[c_char; MAX_PHRASE_UTF8_BUF]; MAX_CHOICE],
+ /// Number of phrases to choose.
+ pub n_total_choice: c_int,
+ pub old_chi_symbol_cursor: c_int,
+ pub is_symbol: c_int,
+}
+
+#[repr(C)]
+pub struct SymbolEntry {
+ /// Total number of symbols in the category.
+ ///
+ /// If n_symbols = 0, the category is treat as a symbol,
+ /// which is a zero-terminated utf-8 string.
+ ///
+ /// In that case, `symbols` is unused and isn't allocated at all.
+ pub n_symbols: c_int,
+ /// Category name of the symbols.
+ pub category: [c_char; MAX_PHRASE_UTF8_BUF],
+ pub symbols: [[c_char; MAX_UTF8_BUF]; 0],
+}
+
+#[repr(C)]
+pub struct ChewingStaticData {
+ pub n_symbol_entry: c_uint,
+ pub symbol_table: *mut *mut SymbolEntry,
+ pub g_easy_symbol_value: [*mut c_char; EASY_SYMBOL_KEY_TAB_LEN],
+ pub g_easy_symbol_num: [c_int; EASY_SYMBOL_KEY_TAB_LEN],
+}
+
+#[derive(Debug)]
+#[repr(C)]
+pub enum Category {
+ ChewingNone,
+ ChewingChinese,
+ ChewingSymbol,
+}
+
+#[derive(Debug)]
+#[repr(C)]
+pub struct PreeditBuf {
+ pub category: Category,
+ pub char_: [u8; MAX_UTF8_BUF],
+}
+
+#[repr(C)]
+pub struct UserPhraseData {
+ pub phone_seq: [u16; MAX_PHONE_SEQ_LEN],
+ pub word_seq: [c_char; MAX_PHRASE_UTF8_BUF],
+ pub userfreq: c_int,
+ pub recent_time: c_int,
+ pub origfreq: c_int,
+ pub maxfreq: c_int,
+}
+
+#[repr(C)]
+pub struct ChewingData {
+ pub avail_info: AvailInfo,
+ pub choice_info: ChoiceInfo,
+ pub phr_out: PhrasingOutput,
+ pub bopomofo_data: BopomofoData,
+ pub config: ChewingConfigData,
+ /// Current input buffer, content == 0 means Chinese code
+ pub preedit_buf: [PreeditBuf; MAX_PHONE_SEQ_LEN],
+ pub chi_symbol_cursor: c_int,
+ pub chi_symbol_buf_len: c_int,
+ pub point_start: c_int,
+ pub point_end: c_int,
+ pub b_show_msg: c_int,
+ pub show_msg: [c_char; MAX_SHOW_MSG_BUF],
+ pub show_msg_len: c_int,
+ pub phone_seq: [u16; MAX_PHONE_SEQ_LEN],
+ pub phone_seq_alt: [u16; MAX_PHONE_SEQ_LEN],
+ pub n_phone_seq: c_int,
+ pub select_str: [[c_char; MAX_PHRASE_UTF8_BUF]; MAX_PHONE_SEQ_LEN],
+ pub select_interval: [IntervalType; MAX_PHONE_SEQ_LEN],
+ pub n_select: c_int,
+ pub prefer_interval: [IntervalType; MAX_INTERVAL],
+ pub n_prefer: c_int,
+ pub b_user_arr_cnnct: [c_int; MAX_PHONE_SEQ_BUF],
+ pub b_user_arr_brkpt: [c_int; MAX_PHONE_SEQ_BUF],
+ pub b_arr_brkpt: [c_int; MAX_PHONE_SEQ_BUF],
+ pub b_symbol_arr_brkpt: [c_int; MAX_PHONE_SEQ_BUF],
+ pub b_chi_sym: c_int,
+ pub b_select: c_int,
+ pub b_first_key: c_int,
+ pub b_full_shape: c_int,
+ pub symbol_key_buf: [c_char; MAX_PHONE_SEQ_LEN],
+ pub userphrase_data: UserPhraseData,
+ pub static_data: ChewingStaticData,
+
+ pub logger: extern "C" fn(data: *mut c_void, level: c_int, fmt: *const c_char, ...),
+ pub logger_data: *mut c_void,
+
+ pub dict: *const LayeredDictionary,
+ pub ce: Option<Box<ChewingConversionEngine>>,
+ pub ue: Option<Box<UserphraseDbAndEstimate>>,
+ pub phrase_iter: *mut c_void,
+}
+
+#[repr(C)]
+pub struct ChewingOutput {
+ /// The content of edit buffer
+ pub preedit_buf: [c_char; MAX_PHONE_SEQ_UTF8_BUF],
+ /// The length of edit buffer
+ pub chi_symbol_buf_len: c_int,
+ /// The current position of the cursor
+ pub chi_symbol_cursor: c_long,
+ pub point_start: c_long,
+ pub point_end: c_long,
+ pub bopomofo_buf: [c_char; MAX_BOPOMOFO_UTF8_BUF],
+ pub disp_interval: [IntervalType; MAX_INTERVAL],
+ pub n_disp_interval: c_int,
+ pub disp_brkpt: [c_int; MAX_PHONE_SEQ_BUF],
+ pub commit_buf: [c_char; MAX_PHONE_SEQ_UTF8_BUF],
+ pub commit_buf_len: c_int,
+ pub pci: *mut ChoiceInfo,
+ pub b_chi_sym: c_int,
+ pub sel_key: [c_int; MAX_SELKEY],
+ pub keystroke_rtn: c_int,
+}
+
+/// cbindgen:rename-all=None
+#[repr(C)]
+pub struct ChewingContext {
+ pub data: *mut ChewingData,
+ pub output: *mut ChewingOutput,
+ pub cand_no: c_int,
+ pub it_no: c_int,
+ pub kb_no: c_int,
+}
+
+#[repr(C)]
+pub struct Phrase {
+ pub phrase: [c_char; MAX_PHONE_SEQ_BUF],
+ pub freq: c_int,
+}
diff --git a/capi/chewing-internal/src/userphrase.rs b/capi/chewing-internal/src/userphrase.rs
new file mode 100644
index 0000000..d6775c4
--- /dev/null
+++ b/capi/chewing-internal/src/userphrase.rs
@@ -0,0 +1,299 @@
+use std::{
+ ffi::{c_void, CStr, CString},
+ iter::Peekable,
+ os::raw::{c_char, c_int, c_uint},
+ path::Path,
+ slice,
+};
+
+use chewing::{
+ dictionary::{DictEntries, Dictionary, SqliteDictionary},
+ editor::{SqliteUserFreqEstimate, UserFreqEstimate},
+ path::userphrase_path,
+ zhuyin::Syllable,
+};
+
+use crate::{
+ ffi::CopyToCString,
+ types::{ChewingData, UserPhraseData, UserUpdate},
+};
+
+pub struct UserphraseDbAndEstimate {
+ db: SqliteDictionary,
+ estimate: SqliteUserFreqEstimate,
+}
+
+#[no_mangle]
+pub extern "C" fn GetDefaultUserPhrasePath(_data: *mut c_void) -> *mut c_char {
+ match userphrase_path() {
+ Some(path) => CString::new(
+ path.as_os_str()
+ .to_str()
+ .expect("path should be valid utf-8"),
+ )
+ .expect("path should be vaild C string")
+ .into_raw(),
+ None => std::ptr::null_mut(),
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn FreeDefaultUserPhrasePath(path: *mut c_char) {
+ unsafe { CString::from_raw(path) };
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn InitUserphrase(pgdata: &mut ChewingData, path: *mut c_char) -> c_int {
+ let path = unsafe { CStr::from_ptr(path) }
+ .to_str()
+ .expect("Invalid prefix string");
+ let path: &Path = path.as_ref();
+
+ let chewing_db = match SqliteDictionary::open(path) {
+ Ok(db) => db,
+ Err(_) => return -1,
+ };
+
+ let estimate = match SqliteUserFreqEstimate::open(path) {
+ Ok(db) => db,
+ Err(_) => return -1,
+ };
+
+ pgdata.ue = Some(Box::new(UserphraseDbAndEstimate {
+ db: chewing_db,
+ estimate,
+ }));
+ 0
+}
+
+#[no_mangle]
+pub extern "C" fn TerminateUserphrase(pgdata: &mut ChewingData) {
+ pgdata.ue = None;
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn UserGetPhraseFirst<'a>(
+ pgdata: &'a mut ChewingData,
+ syllables_u16_ptr: *mut u16,
+) -> Option<&'a UserPhraseData> {
+ let ue = pgdata.ue.as_ref().expect("nonnull ue");
+ let syllables_u16 = unsafe { slice::from_raw_parts(syllables_u16_ptr, 50) };
+ let syllables = syllables_u16
+ .iter()
+ .take_while(|&&syl_u16| syl_u16 != 0)
+ .map(|&syl_u16| Syllable::try_from(syl_u16).unwrap())
+ .collect::<Vec<_>>();
+ let iter = Box::new(
+ ue.db
+ .lookup_phrase(syllables.as_slice())
+ .collect::<Vec<_>>()
+ .into_iter(),
+ ) as Box<dyn Iterator<Item = chewing::dictionary::Phrase>>;
+ let mut iter = Box::new(iter);
+
+ if let Some(phrase) = iter.next() {
+ pgdata.phrase_iter = Box::into_raw(iter).cast();
+ pgdata.userphrase_data.userfreq = phrase.freq() as c_int;
+ phrase.copy_to(&mut pgdata.userphrase_data.word_seq);
+ return Some(&pgdata.userphrase_data);
+ }
+
+ pgdata.phrase_iter = std::ptr::null_mut();
+ None
+}
+
+#[no_mangle]
+pub extern "C" fn UserGetPhraseNext<'a>(
+ pgdata: &'a mut ChewingData,
+ _syllables_u16_ptr: *mut u16,
+) -> Option<&'a UserPhraseData> {
+ let iter_ptr: *mut Box<dyn Iterator<Item = chewing::dictionary::Phrase>> =
+ pgdata.phrase_iter.cast();
+ let iter = unsafe { iter_ptr.as_mut().expect("nonnull iter") };
+ if let Some(phrase) = iter.next() {
+ pgdata.userphrase_data.userfreq = phrase.freq() as c_int;
+ phrase.copy_to(&mut pgdata.userphrase_data.word_seq);
+ return Some(&pgdata.userphrase_data);
+ }
+ None
+}
+
+#[no_mangle]
+pub extern "C" fn UserGetPhraseEnd(pgdata: &mut ChewingData, _syllables_u16_ptr: *mut u16) {
+ if !pgdata.phrase_iter.is_null() {
+ let iter_ptr: *mut Box<dyn Iterator<Item = chewing::dictionary::Phrase>> =
+ pgdata.phrase_iter.cast();
+ let _ = unsafe { Box::from_raw(iter_ptr) };
+ pgdata.phrase_iter = std::ptr::null_mut();
+ }
+}
+
+const C_API_MAX_USER_PHRASE_LEN: usize = 11;
+
+#[no_mangle]
+pub unsafe extern "C" fn UserUpdatePhrase(
+ pgdata: &mut ChewingData,
+ syllables_u16_ptr: *mut u16,
+ phrase_str_ptr: *mut c_char,
+) -> u8 {
+ let ue = pgdata.ue.as_mut().expect("nonnull ue");
+ let syllables_u16 = unsafe { slice::from_raw_parts(syllables_u16_ptr, 50) };
+ let syllables = syllables_u16
+ .iter()
+ .take_while(|&&syl_u16| syl_u16 != 0)
+ .map(|&syl_u16| Syllable::try_from(syl_u16).unwrap())
+ .collect::<Vec<_>>();
+ let phrase_str = unsafe { CStr::from_ptr(phrase_str_ptr) }
+ .to_str()
+ .expect("Invalid UTF-8 str");
+ if syllables.len() > C_API_MAX_USER_PHRASE_LEN {
+ return UserUpdate::Fail as u8;
+ }
+ let phrases = ue.db.lookup_phrase(&syllables).collect::<Vec<_>>();
+ if phrases.is_empty() {
+ // FIXME provide max_freq, orig_freq
+ ue.db
+ .as_mut_dict()
+ .unwrap()
+ .insert(&syllables, (phrase_str, 1).into())
+ .expect("SQL error");
+ return UserUpdate::Insert as u8;
+ }
+ let phrase_freq = phrases
+ .iter()
+ .find(|p| p.as_str() == phrase_str)
+ .map(|p| p.freq())
+ .unwrap_or(1);
+ let phrase = (phrase_str, phrase_freq).into();
+ let max_freq = phrases.iter().map(|p| p.freq()).max().unwrap();
+ let user_freq = ue.estimate.estimate(&phrase, phrase.freq(), max_freq);
+ let time = ue.estimate.now().unwrap();
+ ue.db
+ .as_mut_dict()
+ .unwrap()
+ .update(&syllables, phrase, user_freq, time)
+ .expect("SQL error");
+ UserUpdate::Modify as u8
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn UserRemovePhrase(
+ pgdata: &mut ChewingData,
+ syllables_u16_ptr: *mut u16,
+ phrase_str_ptr: *mut c_char,
+) -> bool {
+ let ue = pgdata.ue.as_mut().expect("nonnull ue");
+ let syllables_u16 = unsafe { slice::from_raw_parts(syllables_u16_ptr, 50) };
+ let syllables = syllables_u16
+ .iter()
+ .take_while(|&&syl_u16| syl_u16 != 0)
+ .map(|&syl_u16| Syllable::try_from(syl_u16).unwrap())
+ .collect::<Vec<_>>();
+ let phrase_str = unsafe { CStr::from_ptr(phrase_str_ptr) }
+ .to_str()
+ .expect("Invalid UTF-8 str");
+ let has_phrase = ue
+ .db
+ .lookup_phrase(&syllables)
+ .any(|p| p.as_str() == phrase_str);
+ ue.db
+ .as_mut_dict()
+ .unwrap()
+ .remove(&syllables, phrase_str)
+ .expect("SQL error");
+ has_phrase
+}
+
+#[no_mangle]
+pub extern "C" fn IncreaseLifeTime(pgdata: &mut ChewingData) {
+ pgdata
+ .ue
+ .as_mut()
+ .expect("nonnull ue")
+ .estimate
+ .tick()
+ .expect("SQL error");
+}
+
+#[no_mangle]
+pub extern "C" fn UserUpdatePhraseBegin(_pgdata: &mut ChewingData) {}
+
+#[no_mangle]
+pub extern "C" fn UserUpdatePhraseEnd(_pgdata: &mut ChewingData) {}
+
+#[no_mangle]
+pub extern "C" fn UserEnumeratePhrase(ue: &UserphraseDbAndEstimate) -> *mut c_void {
+ Box::into_raw(Box::new(ue.db.entries().peekable()) as Box<Peekable<DictEntries>>).cast()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn UserEnumerateHasNext(
+ iter_ptr: *mut c_void,
+ phrase_len_ptr: *mut c_uint,
+ bopomofo_len: *mut c_uint,
+) -> bool {
+ let iter_ptr: *mut Peekable<DictEntries> = iter_ptr.cast();
+ let iter = unsafe { iter_ptr.as_mut() }.expect("Null ptr");
+ match iter.peek() {
+ Some(entry) => {
+ unsafe {
+ phrase_len_ptr.write((entry.1.as_str().len() + 1) as u32);
+ bopomofo_len.write(
+ (entry
+ .0
+ .iter()
+ .map(|syl| syl.to_string().len() + 1)
+ .sum::<usize>()
+ + 1) as u32,
+ );
+ }
+ true
+ }
+ None => false,
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn UserEnumerateGet(
+ iter_ptr: *mut c_void,
+ phrase_buf: *mut c_char,
+ _phrase_len_ptr: *const c_uint,
+ bopomofo_buf: *mut c_char,
+ _bopomofo_len: *const c_uint,
+) -> c_int {
+ let iter_ptr: *mut Peekable<DictEntries> = iter_ptr.cast();
+ let iter = unsafe { iter_ptr.as_mut() }.expect("Null ptr");
+ match iter.next() {
+ Some(entry) => {
+ unsafe {
+ let phrase_str = CString::new(entry.1.as_str()).unwrap();
+ let phrase_str_bytes = phrase_str.as_bytes_with_nul();
+ phrase_buf.copy_from(
+ phrase_str_bytes.as_ptr() as *const i8,
+ phrase_str_bytes.len(),
+ );
+ // phrase_len_ptr.write((entry.1.as_str().len() + 1) as u32);
+ let bopomofo_str = CString::new(
+ entry
+ .0
+ .iter()
+ .map(|syl| syl.to_string())
+ .collect::<Vec<_>>()
+ .join(" "),
+ )
+ .unwrap();
+ let bopomofo_str_bytes = bopomofo_str.as_bytes_with_nul();
+ bopomofo_buf.copy_from(
+ bopomofo_str_bytes.as_ptr() as *const i8,
+ bopomofo_str_bytes.len(),
+ );
+ // bopomofo_len.write(bopomofo_str_bytes.len() as u32);
+ }
+ 0
+ }
+ None => {
+ let _ = unsafe { Box::from_raw(iter_ptr) };
+ 1
+ }
+ }
+}
diff --git a/capi/chewing-internal/src/utf8.rs b/capi/chewing-internal/src/utf8.rs
new file mode 100644
index 0000000..18788c6
--- /dev/null
+++ b/capi/chewing-internal/src/utf8.rs
@@ -0,0 +1,94 @@
+use std::{
+ ffi::{c_char, c_int, c_uchar, CStr},
+ ptr::{self, null},
+ str,
+};
+
+#[no_mangle]
+pub unsafe extern "C" fn ueStrLen(str: *const c_char) -> c_int {
+ let cstr = unsafe { CStr::from_ptr(str) };
+ cstr.to_str().unwrap_or("").chars().count() as c_int
+}
+
+#[no_mangle]
+pub extern "C" fn ueBytesFromChar(b: c_uchar) -> c_int {
+ const UTF8LEN_TAB: [c_int; 256] = [
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*bogus */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, /*bogus */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,
+ 6, 6, 1, 1,
+ ];
+ UTF8LEN_TAB[b as usize]
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn ueStrNBytes(str: *const c_char, n: c_int) -> c_int {
+ let cstr = unsafe { CStr::from_ptr(str) };
+ let rstr = match cstr.to_str() {
+ Ok(rstr) => rstr,
+ Err(err) => str::from_utf8(&cstr.to_bytes()[..err.valid_up_to()]).unwrap(),
+ };
+ rstr.chars()
+ .take(n as usize)
+ .map(|it| it.len_utf8())
+ .sum::<usize>() as c_int
+}
+
+#[repr(C)]
+pub enum StrNCpyClose {
+ StrncpyClose = 1,
+ StrncpyNotClose = 0,
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn ueStrNCpy(
+ dest: *mut c_char,
+ src: *const c_char,
+ n: usize,
+ end: c_int,
+) -> c_int {
+ let bytes = ueStrNBytes(src, n as c_int) as usize;
+ unsafe { src.copy_to(dest, bytes) };
+ if end == StrNCpyClose::StrncpyClose as i32 {
+ unsafe { ptr::write(dest.add(bytes), 0) };
+ }
+ bytes as c_int
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn ueStrSeek(src: *mut c_char, n: usize) -> *mut c_char {
+ let bytes = ueStrNBytes(src, n as c_int);
+ unsafe { src.offset(bytes as isize) }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn ueConstStrSeek(src: *const c_char, n: usize) -> *const c_char {
+ let bytes = ueStrNBytes(src, n as c_int);
+ unsafe { src.offset(bytes as isize) }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn ueStrStr(
+ str: *const c_char,
+ _lstr: usize,
+ substr: *const c_char,
+ _lsub: usize,
+) -> *const c_char {
+ let cstr = unsafe { CStr::from_ptr(str) }
+ .to_str()
+ .expect("should be valid utf8");
+ let sub = unsafe { CStr::from_ptr(substr) }
+ .to_str()
+ .expect("should be valid utf8");
+ match cstr.find(sub) {
+ Some(count) => unsafe { str.add(count) },
+ None => null(),
+ }
+}
diff --git a/capi/chewing-public/Cargo.toml b/capi/chewing-public/Cargo.toml
index 69c32f9..846870b 100644
--- a/capi/chewing-public/Cargo.toml
+++ b/capi/chewing-public/Cargo.toml
@@ -9,7 +9,7 @@ edition = "2021"
chewing = { version = "0.5.1-alpha.1", path = "../.." }

[lib]
-crate-type = ["staticlib"]
+crate-type = ["rlib", "staticlib"]

[build-dependencies]
cbindgen = "0.24.3"
\ No newline at end of file
diff --git a/capi/chewing-public/src/lib.rs b/capi/chewing-public/src/lib.rs
index dd198c6..cd40856 100644
--- a/capi/chewing-public/src/lib.rs
+++ b/capi/chewing-public/src/lib.rs
@@ -1 +1 @@
-pub mod types;
\ No newline at end of file
+pub mod types;
diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt
index aefc78a..7e45582 100644
--- a/data/CMakeLists.txt
+++ b/data/CMakeLists.txt
@@ -20,13 +20,12 @@ add_custom_target(all_static_data

# tools
set(ALL_TOOLS init_database)
-add_executable(init_database ${TOOLS_SRC_DIR}/init_database.c $<TARGET_OBJECTS:common>)
if (WITH_RUST)
-target_link_libraries(init_database chewing-internal)
endif()

if (NOT WITH_RUST)
list(APPEND ALL_TOOLS dump_database)
+add_executable(init_database ${TOOLS_SRC_DIR}/init_database.c $<TARGET_OBJECTS:common>)
add_executable(dump_database
${TOOLS_SRC_DIR}/dump_database.c
${SRC_DIR}/porting_layer/src/plat_mmap_posix.c
@@ -44,6 +43,24 @@ set_target_properties(${ALL_TOOLS} PROPERTIES
)

# tools command
+if (WITH_RUST)
+set(DATA_COPYRIGHT "Copyright \\(c\\) 2022 libchewing Core Team")
+set(DATA_LICENSE "LGPL-2.1-or-later")
+set(DATA_VERSION ${LIBCHEWING_VERSION})
+add_custom_target(build_database
+ COMMAND init_database -c ${DATA_COPYRIGHT} -l ${DATA_LICENSE} -r ${DATA_VERSION} -t trie -n 內建詞庫 ${DATA_SRC_DIR}/tsi.src ${DATA_BIN_DIR}/tsi.dat
+ COMMAND init_database -c ${DATA_COPYRIGHT} -l ${DATA_LICENSE} -r ${DATA_VERSION} -t trie -n 內建字庫 ${DATA_SRC_DIR}/word.src ${DATA_BIN_DIR}/word.dat
+)
+add_custom_command(
+ OUTPUT
+ ${ALL_DATA}
+ DEPENDS
+ ${ALL_TOOLS}
+ build_database
+ ${DATA_SRC_DIR}/word.src
+ ${DATA_SRC_DIR}/tsi.src
+)
+else()
add_custom_command(
OUTPUT
${ALL_DATA}
@@ -53,4 +70,5 @@ add_custom_command(
${ALL_TOOLS}
${DATA_SRC_DIR}/phone.cin
${DATA_SRC_DIR}/tsi.src
-)
\ No newline at end of file
+)
+endif()
\ No newline at end of file
diff --git a/data/word.src b/data/word.src
new file mode 100644
index 0000000..073e6cc
--- /dev/null
+++ b/data/word.src
@@ -0,0 +1,26096 @@
+ㄦ 0 ㄦ
+兒 0 ㄦ
+児 0 ㄦ
+ㄝ 0 ㄝ
+誒 0 ㄝˋ
+歐 0 ㄡ
+甌 0 ㄡ
+毆 0 ㄡ
+嘔 0 ㄡ
+謳 0 ㄡ
+鷗 0 ㄡ
+ㄡ 0 ㄡ
+慪 0 ㄡ
+區 0 ㄡ
+熰 0 ㄡ
+蓲 0 ㄡ
+櫙 0 ㄡ
+漚 0 ㄡ
+敺 0 ㄡ
+藲 0 ㄡ
+鏂 0 ㄡ
+区 0 ㄡ
+欧 0 ㄡ
+瓯 0 ㄡ
+塸 0 ㄡ
+膒 0 ㄡ
+瞘 0 ㄡ
+䥲 0 ㄡ
+偶 0 ㄡˇ
+藕 0 ㄡˇ
+嘔 0 ㄡˇ
+耦 0 ㄡˇ
+吘 0 ㄡˇ
+湡 0 ㄡˇ
+腢 0 ㄡˇ
+蕅 0 ㄡˇ
+隅 0 ㄡˇ
+歐 0 ㄡˇ
+藒 0 ㄡˇ
+饇 0 ㄡˇ
+㒖 0 ㄡˇ
+髃 0 ㄡˇ
+㸸 0 ㄡˇ
+嘔 0 ㄡˋ
+漚 0 ㄡˋ
+噢 0 ㄡˋ
+慪 0 ㄡˋ
+醧 0 ㄡˋ
+吽 0 ㄡˊ
+齵 0 ㄡˊ
+鞥 0 ㄥ
+ㄥ 0 ㄥ
+骯 0 ㄤ
+腌 0 ㄤ
+ㄤ 0 ㄤ
+軮 0 ㄤˇ
+雵 0 ㄤˇ
+䇦 0 ㄤˇ
+盎 0 ㄤˋ
+醠 0 ㄤˋ
+枊 0 ㄤˋ
+㼜 0 ㄤˋ
+昂 0 ㄤˊ
+卬 0 ㄤˊ
+䒢 0 ㄤˊ
+昻 0 ㄤˊ
+岇 0 ㄤˊ
+安 0 ㄢ
+鞍 0 ㄢ
+鮟 0 ㄢ
+庵 0 ㄢ
+諳 0 ㄢ
+氨 0 ㄢ
+銨 0 ㄢ
+胺 0 ㄢ
+ㄢ 0 ㄢ
+鵪 0 ㄢ
+媕 0 ㄢ
+侒 0 ㄢ
+盦 0 ㄢ
+峖 0 ㄢ
+痷 0 ㄢ
+腤 0 ㄢ
+萻 0 ㄢ
+垵 0 ㄢ
+陰 0 ㄢ
+菴 0 ㄢ
+厂 0 ㄢ
+闇 0 ㄢ
+鴳 0 ㄢ
+阴 0 ㄢ
+侌 0 ㄢ
+隂 0 ㄢ
+葊 0 ㄢ
+誝 0 ㄢ
+蓭 0 ㄢ
+鞌 0 ㄢ
+嬜 0 ㄢ
+盫 0 ㄢ
+鶕 0 ㄢ
+厈 0 ㄢ
+阥 0 ㄢ
+俺 0 ㄢˇ
+唵 0 ㄢˇ
+晻 0 ㄢˇ
+堷 0 ㄢˇ
+匼 0 ㄢˇ
+噾 0 ㄢˇ
+馣 0 ㄢˇ
+黤 0 ㄢˇ
+黭 0 ㄢˇ
+埯 0 ㄢˇ
+揞 0 ㄢˇ
+隌 0 ㄢˇ
+罯 0 ㄢˇ
+暗 0 ㄢˋ
+案 0 ㄢˋ
+岸 0 ㄢˋ
+按 0 ㄢˋ
+黯 0 ㄢˋ
+菴 0 ㄢˋ
+闇 0 ㄢˋ
+犴 0 ㄢˋ
+豻 0 ㄢˋ
+匼 0 ㄢˋ
+桉 0 ㄢˋ
+洝 0 ㄢˋ
+荌 0 ㄢˋ
+錌 0 ㄢˋ
+匎 0 ㄢˋ
+婩 0 ㄢˋ
+儑 0 ㄢˋ
+矸 0 ㄢˋ
+晻 0 ㄢˋ
+湆 0 ㄢˋ
+噾 0 ㄢˋ
+韽 0 ㄢˋ
+垾 0 ㄢˋ
+隌 0 ㄢˋ
+遃 0 ㄢˋ
+貋 0 ㄢˋ
+䮗 0 ㄢˋ
+鮟 0 ㄢˋ
+雸 0 ㄢˊ
+玵 0 ㄢˊ
+啽 0 ㄢˊ
+ㄅ 0 ㄅ
+崩 0 ㄅㄥ
+繃 0 ㄅㄥ
+伻 0 ㄅㄥ
+弸 0 ㄅㄥ
+祊 0 ㄅㄥ
+閍 0 ㄅㄥ
+塴 0 ㄅㄥ
+絣 0 ㄅㄥ
+痭 0 ㄅㄥ
+嵭 0 ㄅㄥ
+綳 0 ㄅㄥ
+奟 0 ㄅㄥ
+菶 0 ㄅㄥˇ
+玤 0 ㄅㄥˇ
+琫 0 ㄅㄥˇ
+埲 0 ㄅㄥˇ
+誁 0 ㄅㄥˇ
+繃 0 ㄅㄥˇ
+琣 0 ㄅㄥˇ
+浲 0 ㄅㄥˇ
+漨 0 ㄅㄥˇ
+綳 0 ㄅㄥˇ
+鞛 0 ㄅㄥˇ
+䭰 0 ㄅㄥˇ
+蹦 0 ㄅㄥˋ
+搒 0 ㄅㄥˋ
+洴 0 ㄅㄥˋ
+迸 0 ㄅㄥˋ
+跰 0 ㄅㄥˋ
+泵 0 ㄅㄥˋ
+蚌 0 ㄅㄥˋ
+榜 0 ㄅㄥˋ
+磅 0 ㄅㄥˋ
+繃 0 ㄅㄥˋ
+堋 0 ㄅㄥˋ
+埲 0 ㄅㄥˋ
+塴 0 ㄅㄥˋ
+㧍 0 ㄅㄥˋ
+沯 0 ㄅㄥˋ
+埄 0 ㄅㄥˋ
+挷 0 ㄅㄥˋ
+逬 0 ㄅㄥˋ
+綳 0 ㄅㄥˋ
+蜯 0 ㄅㄥˋ
+甭 0 ㄅㄥˊ
+甮 0 ㄅㄥˊ
+幫 0 ㄅㄤ
+邦 0 ㄅㄤ
+傍 0 ㄅㄤ
+梆 0 ㄅㄤ
+鞤 0 ㄅㄤ
+縍 0 ㄅㄤ
+垹 0 ㄅㄤ
+沯 0 ㄅㄤ
+帮 0 ㄅㄤ
+邫 0 ㄅㄤ
+幇 0 ㄅㄤ
+幚 0 ㄅㄤ
+峀 0 ㄅㄤ
+榜 0 ㄅㄤˇ
+綁 0 ㄅㄤˇ
+牓 0 ㄅㄤˇ
+膀 0 ㄅㄤˇ
+螃 0 ㄅㄤˇ
+搒 0 ㄅㄤˇ
+㧍 0 ㄅㄤˇ
+挷 0 ㄅㄤˇ
+騯 0 ㄅㄤˇ
+髈 0 ㄅㄤˇ
+棒 0 ㄅㄤˋ
+磅 0 ㄅㄤˋ
+謗 0 ㄅㄤˋ
+蚌 0 ㄅㄤˋ
+傍 0 ㄅㄤˋ
+鎊 0 ㄅㄤˋ
+旁 0 ㄅㄤˋ
+甏 0 ㄅㄤˋ
+塝 0 ㄅㄤˋ
+艕 0 ㄅㄤˋ
+徬 0 ㄅㄤˋ
+膀 0 ㄅㄤˋ
+玤 0 ㄅㄤˋ
+棓 0 ㄅㄤˋ
+蒡 0 ㄅㄤˋ
+蚄 0 ㄅㄤˋ
+嫎 0 ㄅㄤˋ
+髈 0 ㄅㄤˋ
+稖 0 ㄅㄤˋ
+蜯 0 ㄅㄤˋ
+班 0 ㄅㄢ
+般 0 ㄅㄢ
+搬 0 ㄅㄢ
+斑 0 ㄅㄢ
+頒 0 ㄅㄢ
+扳 0 ㄅㄢ
+瘢 0 ㄅㄢ
+虨 0 ㄅㄢ
+斒 0 ㄅㄢ
+攽 0 ㄅㄢ
+褩 0 ㄅㄢ
+朌 0 ㄅㄢ
+肦 0 ㄅㄢ
+㻞 0 ㄅㄢ
+辬 0 ㄅㄢ
+螌 0 ㄅㄢ
+板 0 ㄅㄢˇ
+版 0 ㄅㄢˇ
+闆 0 ㄅㄢˇ
+阪 0 ㄅㄢˇ
+舨 0 ㄅㄢˇ
+昄 0 ㄅㄢˇ
+鈑 0 ㄅㄢˇ
+粄 0 ㄅㄢˇ
+蝂 0 ㄅㄢˇ
+魬 0 ㄅㄢˇ
+坂 0 ㄅㄢˇ
+瓪 0 ㄅㄢˇ
+半 0 ㄅㄢˋ
+辦 0 ㄅㄢˋ
+伴 0 ㄅㄢˋ
+扮 0 ㄅㄢˋ
+拌 0 ㄅㄢˋ
+絆 0 ㄅㄢˋ
+姅 0 ㄅㄢˋ
+瓣 0 ㄅㄢˋ
+爿 0 ㄅㄢˋ
+怑 0 ㄅㄢˋ
+湴 0 ㄅㄢˋ
+鉡 0 ㄅㄢˋ
+靽 0 ㄅㄢˋ
+畔 0 ㄅㄢˋ
+办 0 ㄅㄢˋ
+㫠 0 ㄅㄢˋ
+秚 0 ㄅㄢˋ
+八 0 ㄅㄚ
+捌 0 ㄅㄚ
+巴 0 ㄅㄚ
+吧 0 ㄅㄚ
+疤 0 ㄅㄚ
+芭 0 ㄅㄚ
+笆 0 ㄅㄚ
+粑 0 ㄅㄚ
+叭 0 ㄅㄚ
+扒 0 ㄅㄚ
+豝 0 ㄅㄚ
+仈 0 ㄅㄚ
+朳 0 ㄅㄚ
+葩 0 ㄅㄚ
+岊 0 ㄅㄚ
+峇 0 ㄅㄚ
+舥 0 ㄅㄚ
+蚆 0 ㄅㄚ
+玌 0 ㄅㄚ
+岜 0 ㄅㄚ
+哵 0 ㄅㄚ
+羓 0 ㄅㄚ
+釟 0 ㄅㄚ
+㺩 0 ㄅㄚ
+䰾 0 ㄅㄚ
+䶕 0 ㄅㄚ
+把 0 ㄅㄚˇ
+靶 0 ㄅㄚˇ
+鈀 0 ㄅㄚˇ
+罷 0 ㄅㄚˋ
+爸 0 ㄅㄚˋ
+霸 0 ㄅㄚˋ
+壩 0 ㄅㄚˋ
+耙 0 ㄅㄚˋ
+弝 0 ㄅㄚˋ
+灞 0 ㄅㄚˋ
+伯 0 ㄅㄚˋ
+猈 0 ㄅㄚˋ
+把 0 ㄅㄚˋ
+跁 0 ㄅㄚˋ
+矲 0 ㄅㄚˋ
+垻 0 ㄅㄚˋ
+罢 0 ㄅㄚˋ
+覇 0 ㄅㄚˋ
+皅 0 ㄅㄚˋ
+䎱 0 ㄅㄚˋ
+拔 0 ㄅㄚˊ
+跋 0 ㄅㄚˊ
+鈸 0 ㄅㄚˊ
+魃 0 ㄅㄚˊ
+茇 0 ㄅㄚˊ
+鼥 0 ㄅㄚˊ
+軷 0 ㄅㄚˊ
+犮 0 ㄅㄚˊ
+菝 0 ㄅㄚˊ
+胈 0 ㄅㄚˊ
+詙 0 ㄅㄚˊ
+帗 0 ㄅㄚˊ
+柭 0 ㄅㄚˊ
+祓 0 ㄅㄚˊ
+袚 0 ㄅㄚˊ
+抜 0 ㄅㄚˊ
+秡 0 ㄅㄚˊ
+墢 0 ㄅㄚˊ
+坺 0 ㄅㄚˊ
+炦 0 ㄅㄚˊ
+颰 0 ㄅㄚˊ
+鮁 0 ㄅㄚˊ
+吧 0 ㄅㄚ˙
+罷 0 ㄅㄚ˙
+琶 0 ㄅㄚ˙
+杷 0 ㄅㄚ˙
+罢 0 ㄅㄚ˙
+欛 0 ㄅㄚ˙
+爸 0 ㄅㄚ˙
+掰 0 ㄅㄞ
+搿 0 ㄅㄞ
+百 0 ㄅㄞˇ
+擺 0 ㄅㄞˇ
+佰 0 ㄅㄞˇ
+襬 0 ㄅㄞˇ
+粨 0 ㄅㄞˇ
+捭 0 ㄅㄞˇ
+絔 0 ㄅㄞˇ
+伯 0 ㄅㄞˇ
+把 0 ㄅㄞˇ
+柏 0 ㄅㄞˇ
+陌 0 ㄅㄞˇ
+栢 0 ㄅㄞˇ
+摆 0 ㄅㄞˇ
+敗 0 ㄅㄞˋ
+拜 0 ㄅㄞˋ
+唄 0 ㄅㄞˋ
+粺 0 ㄅㄞˋ
+稗 0 ㄅㄞˋ
+庍 0 ㄅㄞˋ
+湃 0 ㄅㄞˋ
+拝 0 ㄅㄞˋ
+贁 0 ㄅㄞˋ
+白 0 ㄅㄞˊ
+玻 0 ㄅㄛ
+撥 0 ㄅㄛ
+剝 0 ㄅㄛ
+菠 0 ㄅㄛ
+缽 0 ㄅㄛ
+嶓 0 ㄅㄛ
+砵 0 ㄅㄛ
+播 0 ㄅㄛ
+般 0 ㄅㄛ
+碆 0 ㄅㄛ
+袚 0 ㄅㄛ
+襏 0 ㄅㄛ
+鱍 0 ㄅㄛ
+啵 0 ㄅㄛ
+柭 0 ㄅㄛ
+蹳 0 ㄅㄛ
+岥 0 ㄅㄛ
+波 0 ㄅㄛ
+餑 0 ㄅㄛ
+癶 0 ㄅㄛ
+肑 0 ㄅㄛ
+剥 0 ㄅㄛ
+盋 0 ㄅㄛ
+紴 0 ㄅㄛ
+鉢 0 ㄅㄛ
+鮁 0 ㄅㄛ
+㿺 0 ㄅㄛ
+驋 0 ㄅㄛ
+跛 0 ㄅㄛˇ
+簸 0 ㄅㄛˇ
+蚾 0 ㄅㄛˇ
+播 0 ㄅㄛˋ
+擘 0 ㄅㄛˋ
+簸 0 ㄅㄛˋ
+亳 0 ㄅㄛˋ
+薜 0 ㄅㄛˋ
+譒 0 ㄅㄛˋ
+薄 0 ㄅㄛˋ
+檗 0 ㄅㄛˋ
+蘗 0 ㄅㄛˋ
+挀 0 ㄅㄛˋ
+北 0 ㄅㄛˋ
+畚 0 ㄅㄛˋ
+鄱 0 ㄅㄛˋ
+孹 0 ㄅㄛˋ
+檘 0 ㄅㄛˋ
+襎 0 ㄅㄛˋ
+奙 0 ㄅㄛˋ
+蔢 0 ㄅㄛˋ
+捭 0 ㄅㄛˋ
+伯 0 ㄅㄛˊ
+博 0 ㄅㄛˊ
+柏 0 ㄅㄛˊ
+泊 0 ㄅㄛˊ
+勃 0 ㄅㄛˊ
+搏 0 ㄅㄛˊ
+渤 0 ㄅㄛˊ
+駁 0 ㄅㄛˊ
+白 0 ㄅㄛˊ
+薄 0 ㄅㄛˊ
+脖 0 ㄅㄛˊ
+帛 0 ㄅㄛˊ
+舶 0 ㄅㄛˊ
+箔 0 ㄅㄛˊ
+荸 0 ㄅㄛˊ
+蔔 0 ㄅㄛˊ
+膊 0 ㄅㄛˊ
+鈸 0 ㄅㄛˊ
+餑 0 ㄅㄛˊ
+鉑 0 ㄅㄛˊ
+欂 0 ㄅㄛˊ
+鵓 0 ㄅㄛˊ
+踣 0 ㄅㄛˊ
+浡 0 ㄅㄛˊ
+襮 0 ㄅㄛˊ
+踄 0 ㄅㄛˊ
+鎛 0 ㄅㄛˊ
+駮 0 ㄅㄛˊ
+僰 0 ㄅㄛˊ
+餺 0 ㄅㄛˊ
+髆 0 ㄅㄛˊ
+桲 0 ㄅㄛˊ
+謈 0 ㄅㄛˊ
+馞 0 ㄅㄛˊ
+胉 0 ㄅㄛˊ
+挬 0 ㄅㄛˊ
+猼 0 ㄅㄛˊ
+葧 0 ㄅㄛˊ
+鋍 0 ㄅㄛˊ
+懪 0 ㄅㄛˊ
+簙 0 ㄅㄛˊ
+礡 0 ㄅㄛˊ
+鑮 0 ㄅㄛˊ
+郣 0 ㄅㄛˊ
+鸔 0 ㄅㄛˊ
+糪 0 ㄅㄛˊ
+百 0 ㄅㄛˊ
+孛 0 ㄅㄛˊ
+佰 0 ㄅㄛˊ
+洎 0 ㄅㄛˊ
+悖 0 ㄅㄛˊ
+缽 0 ㄅㄛˊ
+菠 0 ㄅㄛˊ
+菔 0 ㄅㄛˊ
+貊 0 ㄅㄛˊ
+雹 0 ㄅㄛˊ
+爆 0 ㄅㄛˊ
+簿 0 ㄅㄛˊ
+犮 0 ㄅㄛˊ
+瓝 0 ㄅㄛˊ
+菝 0 ㄅㄛˊ
+軷 0 ㄅㄛˊ
+摶 0 ㄅㄛˊ
+濼 0 ㄅㄛˊ
+襏 0 ㄅㄛˊ
+叐 0 ㄅㄛˊ
+犻 0 ㄅㄛˊ
+妭 0 ㄅㄛˊ
+敀 0 ㄅㄛˊ
+洦 0 ㄅㄛˊ
+苩 0 ㄅㄛˊ
+栢 0 ㄅㄛˊ
+盋 0 ㄅㄛˊ
+湐 0 ㄅㄛˊ
+貃 0 ㄅㄛˊ
+愽 0 ㄅㄛˊ
+鉢 0 ㄅㄛˊ
+煿 0 ㄅㄛˊ
+艊 0 ㄅㄛˊ
+髉 0 ㄅㄛˊ
+侼 0 ㄅㄛˊ
+㫲 0 ㄅㄛˊ
+㶿 0 ㄅㄛˊ
+㼎 0 ㄅㄛˊ
+愂 0 ㄅㄛˊ
+牔 0 ㄅㄛˊ
+䭯 0 ㄅㄛˊ
+䗚 0 ㄅㄛˊ
+鮊 0 ㄅㄛˊ
+㩧 0 ㄅㄛˊ
+馛 0 ㄅㄛˊ
+伯 0 ㄅㄛ˙
+菔 0 ㄅㄛ˙
+蔔 0 ㄅㄛ˙
+啵 0 ㄅㄛ˙
+膊 0 ㄅㄛ˙
+餑 0 ㄅㄛ˙
+逋 0 ㄅㄨ
+晡 0 ㄅㄨ
+餔 0 ㄅㄨ
+峬 0 ㄅㄨ
+鵏 0 ㄅㄨ
+不 0 ㄅㄨ
+鯆 0 ㄅㄨ
+庯 0 ㄅㄨ
+陠 0 ㄅㄨ
+補 0 ㄅㄨˇ
+捕 0 ㄅㄨˇ
+埔 0 ㄅㄨˇ
+哺 0 ㄅㄨˇ
+卜 0 ㄅㄨˇ
+鳪 0 ㄅㄨˇ
+獛 0 ㄅㄨˇ
+訃 0 ㄅㄨˇ
+轐 0 ㄅㄨˇ
+不 0 ㄅㄨˋ
+部 0 ㄅㄨˋ
+布 0 ㄅㄨˋ
+步 0 ㄅㄨˋ
+怖 0 ㄅㄨˋ
+佈 0 ㄅㄨˋ
+簿 0 ㄅㄨˋ
+埠 0 ㄅㄨˋ
+鈽 0 ㄅㄨˋ
+蔀 0 ㄅㄨˋ
+篰 0 ㄅㄨˋ
+捗 0 ㄅㄨˋ
+咘 0 ㄅㄨˋ
+阜 0 ㄅㄨˋ
+哺 0 ㄅㄨˋ
+捕 0 ㄅㄨˋ
+抪 0 ㄅㄨˋ
+陟 0 ㄅㄨˋ
+餔 0 ㄅㄨˋ
+歨 0 ㄅㄨˋ
+歩 0 ㄅㄨˋ
+㳍 0 ㄅㄨˋ
+柨 0 ㄅㄨˋ
+徏 0 ㄅㄨˋ
+陠 0 ㄅㄨˋ
+荹 0 ㄅㄨˋ
+餢 0 ㄅㄨˋ
+廍 0 ㄅㄨˋ
+悑 0 ㄅㄨˋ
+郶 0 ㄅㄨˋ
+不 0 ㄅㄨˊ
+醭 0 ㄅㄨˊ
+不 0 ㄅㄨ˙
+包 0 ㄅㄠ
+胞 0 ㄅㄠ
+苞 0 ㄅㄠ
+褒 0 ㄅㄠ
+枹 0 ㄅㄠ
+笣 0 ㄅㄠ
+蕔 0 ㄅㄠ
+孢 0 ㄅㄠ
+炮 0 ㄅㄠ
+剝 0 ㄅㄠ
+皰 0 ㄅㄠ
+煲 0 ㄅㄠ
+褻 0 ㄅㄠ
+鞄 0 ㄅㄠ
+褎 0 ㄅㄠ
+齙 0 ㄅㄠ
+剥 0 ㄅㄠ
+靤 0 ㄅㄠ
+裦 0 ㄅㄠ
+闁 0 ㄅㄠ
+襃 0 ㄅㄠ
+礮 0 ㄅㄠ
+礟 0 ㄅㄠ
+保 0 ㄅㄠˇ
+寶 0 ㄅㄠˇ
+飽 0 ㄅㄠˇ
+堡 0 ㄅㄠˇ
+褓 0 ㄅㄠˇ
+葆 0 ㄅㄠˇ
+鴇 0 ㄅㄠˇ
+怉 0 ㄅㄠˇ
+駂 0 ㄅㄠˇ
+鳵 0 ㄅㄠˇ
+媬 0 ㄅㄠˇ
+褒 0 ㄅㄠˇ
+煲 0 ㄅㄠˇ
+宝 0 ㄅㄠˇ
+珤 0 ㄅㄠˇ
+堢 0 ㄅㄠˇ
+寚 0 ㄅㄠˇ
+緥 0 ㄅㄠˇ
+裦 0 ㄅㄠˇ
+賲 0 ㄅㄠˇ
+闁 0 ㄅㄠˇ
+襃 0 ㄅㄠˇ
+寳 0 ㄅㄠˇ
+䴐 0 ㄅㄠˇ
+宲 0 ㄅㄠˇ
+報 0 ㄅㄠˋ
+抱 0 ㄅㄠˋ
+暴 0 ㄅㄠˋ
+爆 0 ㄅㄠˋ
+豹 0 ㄅㄠˋ
+鮑 0 ㄅㄠˋ
+刨 0 ㄅㄠˋ
+趵 0 ㄅㄠˋ
+鉋 0 ㄅㄠˋ
+虣 0 ㄅㄠˋ
+鑤 0 ㄅㄠˋ
+儤 0 ㄅㄠˋ
+菢 0 ㄅㄠˋ
+煲 0 ㄅㄠˋ
+袌 0 ㄅㄠˋ
+嚗 0 ㄅㄠˋ
+犦 0 ㄅㄠˋ
+忁 0 ㄅㄠˋ
+匏 0 ㄅㄠˋ
+雹 0 ㄅㄠˋ
+瀑 0 ㄅㄠˋ
+謈 0 ㄅㄠˋ
+勽 0 ㄅㄠˋ
+报 0 ㄅㄠˋ
+煿 0 ㄅㄠˋ
+骲 0 ㄅㄠˋ
+曓 0 ㄅㄠˋ
+雹 0 ㄅㄠˊ
+薄 0 ㄅㄠˊ
+窇 0 ㄅㄠˊ
+瓝 0 ㄅㄠˊ
+箔 0 ㄅㄠˊ
+瓟 0 ㄅㄠˊ
+背 0 ㄅㄟ
+杯 0 ㄅㄟ
+悲 0 ㄅㄟ
+卑 0 ㄅㄟ
+碑 0 ㄅㄟ
+俾 0 ㄅㄟ
+揹 0 ㄅㄟ
+偝 0 ㄅㄟ
+盃 0 ㄅㄟ
+裨 0 ㄅㄟ
+萆 0 ㄅㄟ
+桮 0 ㄅㄟ
+椑 0 ㄅㄟ
+伓 0 ㄅㄟ
+綼 0 ㄅㄟ
+鵯 0 ㄅㄟ
+藣 0 ㄅㄟ
+埤 0 ㄅㄟ
+坏 0 ㄅㄟ
+婢 0 ㄅㄟ
+庳 0 ㄅㄟ
+捭 0 ㄅㄟ
+錍 0 ㄅㄟ
+阫 0 ㄅㄟ
+錃 0 ㄅㄟ
+䎱 0 ㄅㄟ
+北 0 ㄅㄟˇ
+邶 0 ㄅㄟˇ
+被 0 ㄅㄟˋ
+備 0 ㄅㄟˋ
+背 0 ㄅㄟˋ
+貝 0 ㄅㄟˋ
+輩 0 ㄅㄟˋ
+倍 0 ㄅㄟˋ
+臂 0 ㄅㄟˋ
+狽 0 ㄅㄟˋ
+憊 0 ㄅㄟˋ
+悖 0 ㄅㄟˋ
+孛 0 ㄅㄟˋ
+焙 0 ㄅㄟˋ
+蓓 0 ㄅㄟˋ
+褙 0 ㄅㄟˋ
+邶 0 ㄅㄟˋ
+琲 0 ㄅㄟˋ
+誖 0 ㄅㄟˋ
+鋇 0 ㄅㄟˋ
+哱 0 ㄅㄟˋ
+糒 0 ㄅㄟˋ
+梖 0 ㄅㄟˋ
+珼 0 ㄅㄟˋ
+鄁 0 ㄅㄟˋ
+牬 0 ㄅㄟˋ
+郥 0 ㄅㄟˋ
+犕 0 ㄅㄟˋ
+奰 0 ㄅㄟˋ
+北 0 ㄅㄟˋ
+婢 0 ㄅㄟˋ
+僻 0 ㄅㄟˋ
+避 0 ㄅㄟˋ
+昢 0 ㄅㄟˋ
+唄 0 ㄅㄟˋ
+偝 0 ㄅㄟˋ
+碚 0 ㄅㄟˋ
+鞁 0 ㄅㄟˋ
+鼰 0 ㄅㄟˋ
+俻 0 ㄅㄟˋ
+㛝 0 ㄅㄟˋ
+偹 0 ㄅㄟˋ
+旇 0 ㄅㄟˋ
+僃 0 ㄅㄟˋ
+㻗 0 ㄅㄟˋ
+蛽 0 ㄅㄟˋ
+㫲 0 ㄅㄟˋ
+軰 0 ㄅㄟˋ
+愂 0 ㄅㄟˋ
+唄 0 ㄅㄟ˙
+奔 0 ㄅㄣ
+賁 0 ㄅㄣ
+錛 0 ㄅㄣ
+泍 0 ㄅㄣ
+渀 0 ㄅㄣ
+卉 0 ㄅㄣ
+犇 0 ㄅㄣ
+倴 0 ㄅㄣ
+𩣺 0 ㄅㄣ
+本 0 ㄅㄣˇ
+畚 0 ㄅㄣˇ
+苯 0 ㄅㄣˇ
+泍 0 ㄅㄣˇ
+夲 0 ㄅㄣˇ
+楍 0 ㄅㄣˇ
+奙 0 ㄅㄣˇ
+笨 0 ㄅㄣˋ
+体 0 ㄅㄣˋ
+坌 0 ㄅㄣˋ
+奔 0 ㄅㄣˋ
+泍 0 ㄅㄣˋ
+捹 0 ㄅㄣˋ
+桳 0 ㄅㄣˋ
+犇 0 ㄅㄣˋ
+逩 0 ㄅㄣˋ
+撪 0 ㄅㄣˋ
+𦯀 0 ㄅㄣˋ
+獖 0 ㄅㄣˋ
+逼 0 ㄅㄧ
+屄 0 ㄅㄧ
+偪 0 ㄅㄧ
+稫 0 ㄅㄧ
+豍 0 ㄅㄧ
+皀 0 ㄅㄧ
+毴 0 ㄅㄧ
+悂 0 ㄅㄧ
+螕 0 ㄅㄧ
+憋 0 ㄅㄧㄝ
+鱉 0 ㄅㄧㄝ
+虌 0 ㄅㄧㄝ
+癟 0 ㄅㄧㄝ
+鷩 0 ㄅㄧㄝ
+鼈 0 ㄅㄧㄝ
+㿜 0 ㄅㄧㄝ
+龞 0 ㄅㄧㄝ
+癟 0 ㄅㄧㄝˇ
+蛂 0 ㄅㄧㄝˇ
+㿜 0 ㄅㄧㄝˇ
+彆 0 ㄅㄧㄝˋ
+縪 0 ㄅㄧㄝˋ
+蹩 0 ㄅㄧㄝˋ
+別 0 ㄅㄧㄝˊ
+蹩 0 ㄅㄧㄝˊ
+咇 0 ㄅㄧㄝˊ
+徶 0 ㄅㄧㄝˊ
+襒 0 ㄅㄧㄝˊ
+蟞 0 ㄅㄧㄝˊ
+彆 0 ㄅㄧㄝˊ
+蛂 0 ㄅㄧㄝˊ
+别 0 ㄅㄧㄝˊ
+吡 0 ㄅㄧㄝˊ
+㧙 0 ㄅㄧㄝˊ
+莂 0 ㄅㄧㄝˊ
+兵 0 ㄅㄧㄥ
+冰 0 ㄅㄧㄥ
+掤 0 ㄅㄧㄥ
+栟 0 ㄅㄧㄥ
+并 0 ㄅㄧㄥ
+屏 0 ㄅㄧㄥ
+檳 0 ㄅㄧㄥ
+仌 0 ㄅㄧㄥ
+氷 0 ㄅㄧㄥ
+幷 0 ㄅㄧㄥ
+屛 0 ㄅㄧㄥ
+梹 0 ㄅㄧㄥ
+幈 0 ㄅㄧㄥ
+餅 0 ㄅㄧㄥˇ
+丙 0 ㄅㄧㄥˇ
+稟 0 ㄅㄧㄥˇ
+柄 0 ㄅㄧㄥˇ
+秉 0 ㄅㄧㄥˇ
+炳 0 ㄅㄧㄥˇ
+昺 0 ㄅㄧㄥˇ
+邴 0 ㄅㄧㄥˇ
+怲 0 ㄅㄧㄥˇ
+鞞 0 ㄅㄧㄥˇ
+鉼 0 ㄅㄧㄥˇ
+蛃 0 ㄅㄧㄥˇ
+陃 0 ㄅㄧㄥˇ
+苪 0 ㄅㄧㄥˇ
+窉 0 ㄅㄧㄥˇ
+屏 0 ㄅㄧㄥˇ
+庰 0 ㄅㄧㄥˇ
+迸 0 ㄅㄧㄥˇ
+芮 0 ㄅㄧㄥˇ
+抦 0 ㄅㄧㄥˇ
+昞 0 ㄅㄧㄥˇ
+眪 0 ㄅㄧㄥˇ
+屛 0 ㄅㄧㄥˇ
+幈 0 ㄅㄧㄥˇ
+棅 0 ㄅㄧㄥˇ
+逬 0 ㄅㄧㄥˇ
+禀 0 ㄅㄧㄥˇ
+餠 0 ㄅㄧㄥˇ
+餜 0 ㄅㄧㄥˇ
+並 0 ㄅㄧㄥˋ
+病 0 ㄅㄧㄥˋ
+併 0 ㄅㄧㄥˋ
+并 0 ㄅㄧㄥˋ
+摒 0 ㄅㄧㄥˋ
+寎 0 ㄅㄧㄥˋ
+鵧 0 ㄅㄧㄥˋ
+偋 0 ㄅㄧㄥˋ
+柄 0 ㄅㄧㄥˋ
+幵 0 ㄅㄧㄥˋ
+庰 0 ㄅㄧㄥˋ
+窉 0 ㄅㄧㄥˋ
+㓈 0 ㄅㄧㄥˋ
+幷 0 ㄅㄧㄥˋ
+抦 0 ㄅㄧㄥˋ
+倂 0 ㄅㄧㄥˋ
+栤 0 ㄅㄧㄥˋ
+竝 0 ㄅㄧㄥˋ
+棅 0 ㄅㄧㄥˋ
+逬 0 ㄅㄧㄥˋ
+鈵 0 ㄅㄧㄥˋ
+靐 0 ㄅㄧㄥˋ
+开 0 ㄅㄧㄥˋ
+傡 0 ㄅㄧㄥˋ
+鮩 0 ㄅㄧㄥˋ
+𢔧 0 ㄅㄧㄥˋ
+邊 0 ㄅㄧㄢ
+編 0 ㄅㄧㄢ
+鞭 0 ㄅㄧㄢ
+蝙 0 ㄅㄧㄢ
+砭 0 ㄅㄧㄢ
+籩 0 ㄅㄧㄢ
+箯 0 ㄅㄧㄢ
+稨 0 ㄅㄧㄢ
+猵 0 ㄅㄧㄢ
+甂 0 ㄅㄧㄢ
+柉 0 ㄅㄧㄢ
+楄 0 ㄅㄧㄢ
+煸 0 ㄅㄧㄢ
+揙 0 ㄅㄧㄢ
+边 0 ㄅㄧㄢ
+牑 0 ㄅㄧㄢ
+獱 0 ㄅㄧㄢ
+鍽 0 ㄅㄧㄢ
+邉 0 ㄅㄧㄢ
+鯾 0 ㄅㄧㄢ
+鯿 0 ㄅㄧㄢ
+扁 0 ㄅㄧㄢˇ
+貶 0 ㄅㄧㄢˇ
+匾 0 ㄅㄧㄢˇ
+褊 0 ㄅㄧㄢˇ
+窆 0 ㄅㄧㄢˇ
+萹 0 ㄅㄧㄢˇ
+惼 0 ㄅㄧㄢˇ
+碥 0 ㄅㄧㄢˇ
+砭 0 ㄅㄧㄢˇ
+蝙 0 ㄅㄧㄢˇ
+揙 0 ㄅㄧㄢˇ
+稨 0 ㄅㄧㄢˇ
+鴘 0 ㄅㄧㄢˇ
+糄 0 ㄅㄧㄢˇ
+藊 0 ㄅㄧㄢˇ
+便 0 ㄅㄧㄢˋ
+變 0 ㄅㄧㄢˋ
+遍 0 ㄅㄧㄢˋ
+辨 0 ㄅㄧㄢˋ
+辯 0 ㄅㄧㄢˋ
+汴 0 ㄅㄧㄢˋ
+辮 0 ㄅㄧㄢˋ
+忭 0 ㄅㄧㄢˋ
+弁 0 ㄅㄧㄢˋ
+釆 0 ㄅㄧㄢˋ
+抃 0 ㄅㄧㄢˋ
+緶 0 ㄅㄧㄢˋ
+艑 0 ㄅㄧㄢˋ
+卞 0 ㄅㄧㄢˋ
+揙 0 ㄅㄧㄢˋ
+汳 0 ㄅㄧㄢˋ
+鴘 0 ㄅㄧㄢˋ
+閞 0 ㄅㄧㄢˋ
+犿 0 ㄅㄧㄢˋ
+玣 0 ㄅㄧㄢˋ
+苄 0 ㄅㄧㄢˋ
+変 0 ㄅㄧㄢˋ
+徧 0 ㄅㄧㄢˋ
+辡 0 ㄅㄧㄢˋ
+辧 0 ㄅㄧㄢˋ
+昪 0 ㄅㄧㄢˋ
+覍 0 ㄅㄧㄢˋ
+比 0 ㄅㄧˇ
+筆 0 ㄅㄧˇ
+彼 0 ㄅㄧˇ
+鄙 0 ㄅㄧˇ
+鈵 0 ㄅㄧㄥˇ
+匕 0 ㄅㄧˇ
+沘 0 ㄅㄧˇ
+秕 0 ㄅㄧˇ
+屄 0 ㄅㄧˇ
+蚍 0 ㄅㄧˇ
+妣 0 ㄅㄧˇ
+疕 0 ㄅㄧˇ
+潷 0 ㄅㄧˇ
+柀 0 ㄅㄧˇ
+朼 0 ㄅㄧˇ
+貏 0 ㄅㄧˇ
+仳 0 ㄅㄧˇ
+毗 0 ㄅㄧˇ
+媲 0 ㄅㄧˇ
+壁 0 ㄅㄧˇ
+貔 0 ㄅㄧˇ
+夶 0 ㄅㄧˇ
+佊 0 ㄅㄧˇ
+㚰 0 ㄅㄧˇ
+笔 0 ㄅㄧˇ
+粃 0 ㄅㄧˇ
+舭 0 ㄅㄧˇ
+啚 0 ㄅㄧˇ
+袐 0 ㄅㄧˇ
+豼 0 ㄅㄧˇ
+魮 0 ㄅㄧˇ
+滗 0 ㄅㄧˇ
+必 0 ㄅㄧˋ
+敝 0 ㄅㄧˋ
+畢 0 ㄅㄧˋ
+壁 0 ㄅㄧˋ
+避 0 ㄅㄧˋ
+璧 0 ㄅㄧˋ
+閉 0 ㄅㄧˋ
+鄙 0 ㄅㄧˋ
+臂 0 ㄅㄧˋ
+幣 0 ㄅㄧˋ
+弊 0 ㄅㄧˋ
+婢 0 ㄅㄧˋ
+斃 0 ㄅㄧˋ
+碧 0 ㄅㄧˋ
+泌 0 ㄅㄧˋ
+祕 0 ㄅㄧˋ
+俾 0 ㄅㄧˋ
+蔽 0 ㄅㄧˋ
+庇 0 ㄅㄧˋ
+嗶 0 ㄅㄧˋ
+愎 0 ㄅㄧˋ
+辟 0 ㄅㄧˋ
+弼 0 ㄅㄧˋ
+裨 0 ㄅㄧˋ
+陛 0 ㄅㄧˋ
+埤 0 ㄅㄧˋ
+箄 0 ㄅㄧˋ
+篦 0 ㄅㄧˋ
+畀 0 ㄅㄧˋ
+比 0 ㄅㄧˋ
+嬖 0 ㄅㄧˋ
+睥 0 ㄅㄧˋ
+賁 0 ㄅㄧˋ
+贔 0 ㄅㄧˋ
+襞 0 ㄅㄧˋ
+毖 0 ㄅㄧˋ
+蓽 0 ㄅㄧˋ
+蹕 0 ㄅㄧˋ
+髀 0 ㄅㄧˋ
+怭 0 ㄅㄧˋ
+庳 0 ㄅㄧˋ
+愊 0 ㄅㄧˋ
+楅 0 ㄅㄧˋ
+湢 0 ㄅㄧˋ
+狴 0 ㄅㄧˋ
+獘 0 ㄅㄧˋ
+篳 0 ㄅㄧˋ
+苾 0 ㄅㄧˋ
+薜 0 ㄅㄧˋ
+觱 0 ㄅㄧˋ
+詖 0 ㄅㄧˋ
+躄 0 ㄅㄧˋ
+邲 0 ㄅㄧˋ
+閟 0 ㄅㄧˋ
+柲 0 ㄅㄧˋ
+梐 0 ㄅㄧˋ
+珌 0 ㄅㄧˋ
+痺 0 ㄅㄧˋ
+飶 0 ㄅㄧˋ
+馝 0 ㄅㄧˋ
+駜 0 ㄅㄧˋ
+鎞 0 ㄅㄧˋ
+鷩 0 ㄅㄧˋ
+皕 0 ㄅㄧˋ
+堛 0 ㄅㄧˋ
+鉍 0 ㄅㄧˋ
+痹 0 ㄅㄧˋ
+腷 0 ㄅㄧˋ
+骳 0 ㄅㄧˋ
+坒 0 ㄅㄧˋ
+滭 0 ㄅㄧˋ
+熚 0 ㄅㄧˋ
+疪 0 ㄅㄧˋ
+妼 0 ㄅㄧˋ
+鏎 0 ㄅㄧˋ
+鷝 0 ㄅㄧˋ
+柫 0 ㄅㄧˋ
+佖 0 ㄅㄧˋ
+蜌 0 ㄅㄧˋ
+彃 0 ㄅㄧˋ
+箅 0 ㄅㄧˋ
+蓖 0 ㄅㄧˋ
+鄪 0 ㄅㄧˋ
+罼 0 ㄅㄧˋ
+鮅 0 ㄅㄧˋ
+襒 0 ㄅㄧˋ
+鵖 0 ㄅㄧˋ
+襣 0 ㄅㄧˋ
+驆 0 ㄅㄧˋ
+鼊 0 ㄅㄧˋ
+芘 0 ㄅㄧˋ
+粊 0 ㄅㄧˋ
+稗 0 ㄅㄧˋ
+嫳 0 ㄅㄧˋ
+獙 0 ㄅㄧˋ
+廦 0 ㄅㄧˋ
+鄨 0 ㄅㄧˋ
+縪 0 ㄅㄧˋ
+佛 0 ㄅㄧˋ
+拂 0 ㄅㄧˋ
+秘 0 ㄅㄧˋ
+費 0 ㄅㄧˋ
+跛 0 ㄅㄧˋ
+逼 0 ㄅㄧˋ
+擘 0 ㄅㄧˋ
+謐 0 ㄅㄧˋ
+咇 0 ㄅㄧˋ
+毘 0 ㄅㄧˋ
+胇 0 ㄅㄧˋ
+萆 0 ㄅㄧˋ
+稫 0 ㄅㄧˋ
+綼 0 ㄅㄧˋ
+髲 0 ㄅㄧˋ
+踾 0 ㄅㄧˋ
+貔 0 ㄅㄧˋ
+繴 0 ㄅㄧˋ
+仏 0 ㄅㄧˋ
+夶 0 ㄅㄧˋ
+吡 0 ㄅㄧˋ
+怶 0 ㄅㄧˋ
+畁 0 ㄅㄧˋ
+啚 0 ㄅㄧˋ
+豼 0 ㄅㄧˋ
+閇 0 ㄅㄧˋ
+弻 0 ㄅㄧˋ
+貱 0 ㄅㄧˋ
+煏 0 ㄅㄧˋ
+睤 0 ㄅㄧˋ
+箆 0 ㄅㄧˋ
+聛 0 ㄅㄧˋ
+壀 0 ㄅㄧˋ
+孹 0 ㄅㄧˋ
+嚊 0 ㄅㄧˋ
+躃 0 ㄅㄧˋ
+鞸 0 ㄅㄧˋ
+魓 0 ㄅㄧˋ
+㧙 0 ㄅㄧˋ
+枈 0 ㄅㄧˋ
+䏟 0 ㄅㄧˋ
+虑 0 ㄅㄧˋ
+㻫 0 ㄅㄧˋ
+䠋 0 ㄅㄧˋ
+饆 0 ㄅㄧˋ
+韠 0 ㄅㄧˋ
+鰏 0 ㄅㄧˋ
+鐴 0 ㄅㄧˋ
+鐾 0 ㄅㄧˋ
+𢕾 0 ㄅㄧˋ
+朇 0 ㄅㄧˋ
+鼻 0 ㄅㄧˊ
+荸 0 ㄅㄧˊ
+鼽 0 ㄅㄧˊ
+標 0 ㄅㄧㄠ
+彪 0 ㄅㄧㄠ
+鑣 0 ㄅㄧㄠ
+鏢 0 ㄅㄧㄠ
+飆 0 ㄅㄧㄠ
+膘 0 ㄅㄧㄠ
+熛 0 ㄅㄧㄠ
+麃 0 ㄅㄧㄠ
+嘌 0 ㄅㄧㄠ
+杓 0 ㄅㄧㄠ
+滮 0 ㄅㄧㄠ
+瀌 0 ㄅㄧㄠ
+猋 0 ㄅㄧㄠ
+瘭 0 ㄅㄧㄠ
+穮 0 ㄅㄧㄠ
+颮 0 ㄅㄧㄠ
+驫 0 ㄅㄧㄠ
+摽 0 ㄅㄧㄠ
+儦 0 ㄅㄧㄠ
+臕 0 ㄅㄧㄠ
+颩 0 ㄅㄧㄠ
+髟 0 ㄅㄧㄠ
+謤 0 ㄅㄧㄠ
+墂 0 ㄅㄧㄠ
+贆 0 ㄅㄧㄠ
+蔈 0 ㄅㄧㄠ
+爂 0 ㄅㄧㄠ
+藨 0 ㄅㄧㄠ
+僄 0 ㄅㄧㄠ
+虨 0 ㄅㄧㄠ
+颷 0 ㄅㄧㄠ
+飈 0 ㄅㄧㄠ
+飊 0 ㄅㄧㄠ
+飇 0 ㄅㄧㄠ
+䮽 0 ㄅㄧㄠ
+飍 0 ㄅㄧㄠ
+脿 0 ㄅㄧㄠ
+幖 0 ㄅㄧㄠ
+徱 0 ㄅㄧㄠ
+磦 0 ㄅㄧㄠ
+𢖐 0 ㄅㄧㄠ
+表 0 ㄅㄧㄠˇ
+錶 0 ㄅㄧㄠˇ
+婊 0 ㄅㄧㄠˇ
+裱 0 ㄅㄧㄠˇ
+俵 0 ㄅㄧㄠˇ
+褾 0 ㄅㄧㄠˇ
+檦 0 ㄅㄧㄠˇ
+諘 0 ㄅㄧㄠˇ
+鰾 0 ㄅㄧㄠˋ
+摽 0 ㄅㄧㄠˋ
+賓 0 ㄅㄧㄣ
+濱 0 ㄅㄧㄣ
+彬 0 ㄅㄧㄣ
+檳 0 ㄅㄧㄣ
+儐 0 ㄅㄧㄣ
+斌 0 ㄅㄧㄣ
+繽 0 ㄅㄧㄣ
+豳 0 ㄅㄧㄣ
+瀕 0 ㄅㄧㄣ
+邠 0 ㄅㄧㄣ
+璸 0 ㄅㄧㄣ
+蠙 0 ㄅㄧㄣ
+鑌 0 ㄅㄧㄣ
+豩 0 ㄅㄧㄣ
+汃 0 ㄅㄧㄣ
+椕 0 ㄅㄧㄣ
+霦 0 ㄅㄧㄣ
+驞 0 ㄅㄧㄣ
+份 0 ㄅㄧㄣ
+稟 0 ㄅㄧㄣ
+嬪 0 ㄅㄧㄣ
+殯 0 ㄅㄧㄣ
+鬢 0 ㄅㄧㄣ
+攽 0 ㄅㄧㄣ
+玢 0 ㄅㄧㄣ
+砏 0 ㄅㄧㄣ
+郴 0 ㄅㄧㄣ
+虨 0 ㄅㄧㄣ
+娦 0 ㄅㄧㄣ
+浜 0 ㄅㄧㄣ
+梹 0 ㄅㄧㄣ
+滨 0 ㄅㄧㄣ
+㻞 0 ㄅㄧㄣ
+禀 0 ㄅㄧㄣ
+殡 0 ㄅㄧㄣ
+賔 0 ㄅㄧㄣ
+髩 0 ㄅㄧㄣ
+濵 0 ㄅㄧㄣ
+鬂 0 ㄅㄧㄣ
+穦 0 ㄅㄧㄣ
+顮 0 ㄅㄧㄣ
+馪 0 ㄅㄧㄣ
+𠚼 0 ㄅㄧㄣ
+稟 0 ㄅㄧㄣˇ
+禀 0 ㄅㄧㄣˇ
+癛 0 ㄅㄧㄣˇ
+殯 0 ㄅㄧㄣˋ
+鬢 0 ㄅㄧㄣˋ
+儐 0 ㄅㄧㄣˋ
+擯 0 ㄅㄧㄣˋ
+臏 0 ㄅㄧㄣˋ
+髕 0 ㄅㄧㄣˋ
+鶣 0 ㄅㄧㄣˋ
+賓 0 ㄅㄧㄣˋ
+殡 0 ㄅㄧㄣˋ
+賔 0 ㄅㄧㄣˋ
+髩 0 ㄅㄧㄣˋ
+鬂 0 ㄅㄧㄣˋ
+ㄉ 0 ㄉ
+都 0 ㄉㄡ
+兜 0 ㄉㄡ
+郖 0 ㄉㄡ
+唗 0 ㄉㄡ
+吺 0 ㄉㄡ
+侸 0 ㄉㄡ
+剅 0 ㄉㄡ
+兠 0 ㄉㄡ
+篼 0 ㄉㄡ
+㨮 0 ㄉㄡ
+蔸 0 ㄉㄡ
+斗 0 ㄉㄡˇ
+抖 0 ㄉㄡˇ
+陡 0 ㄉㄡˇ
+蚪 0 ㄉㄡˇ
+枓 0 ㄉㄡˇ
+唗 0 ㄉㄡˇ
+敨 0 ㄉㄡˇ
+阧 0 ㄉㄡˇ
+鬥 0 ㄉㄡˋ
+豆 0 ㄉㄡˋ
+逗 0 ㄉㄡˋ
+痘 0 ㄉㄡˋ
+竇 0 ㄉㄡˋ
+荳 0 ㄉㄡˋ
+脰 0 ㄉㄡˋ
+餖 0 ㄉㄡˋ
+鋀 0 ㄉㄡˋ
+梪 0 ㄉㄡˋ
+浢 0 ㄉㄡˋ
+讀 0 ㄉㄡˋ
+郖 0 ㄉㄡˋ
+裋 0 ㄉㄡˋ
+鬩 0 ㄉㄡˋ
+狵 0 ㄉㄡˋ
+毭 0 ㄉㄡˋ
+鬦 0 ㄉㄡˋ
+䦧 0 ㄉㄡˋ
+闘 0 ㄉㄡˋ
+鬪 0 ㄉㄡˋ
+鬬 0 ㄉㄡˋ
+𢭃 0 ㄉㄡˋ
+𥥷 0 ㄉㄡˋ
+斣 0 ㄉㄡˋ
+鬭 0 ㄉㄡˋ
+登 0 ㄉㄥ
+燈 0 ㄉㄥ
+鐙 0 ㄉㄥ
+簦 0 ㄉㄥ
+豋 0 ㄉㄥ
+璒 0 ㄉㄥ
+嬁 0 ㄉㄥ
+墱 0 ㄉㄥ
+撜 0 ㄉㄥ
+灯 0 ㄉㄥ
+噔 0 ㄉㄥ
+竳 0 ㄉㄥ
+等 0 ㄉㄥˇ
+戥 0 ㄉㄥˇ
+鄧 0 ㄉㄥˋ
+瞪 0 ㄉㄥˋ
+蹬 0 ㄉㄥˋ
+凳 0 ㄉㄥˋ
+嶝 0 ㄉㄥˋ
+磴 0 ㄉㄥˋ
+墱 0 ㄉㄥˋ
+邆 0 ㄉㄥˋ
+霯 0 ㄉㄥˋ
+澄 0 ㄉㄥˋ
+鐙 0 ㄉㄥˋ
+邓 0 ㄉㄥˋ
+僜 0 ㄉㄥˋ
+憕 0 ㄉㄥˋ
+隥 0 ㄉㄥˋ
+櫈 0 ㄉㄥˋ
+覴 0 ㄉㄥˋ
+當 0 ㄉㄤ
+噹 0 ㄉㄤ
+噹 0 ㄉㄤ˙
+鐺 0 ㄉㄤ
+襠 0 ㄉㄤ
+璫 0 ㄉㄤ
+簹 0 ㄉㄤ
+儅 0 ㄉㄤ
+澢 0 ㄉㄤ
+艡 0 ㄉㄤ
+嵣 0 ㄉㄤ
+当 0 ㄉㄤ
+檔 0 ㄉㄤˇ
+黨 0 ㄉㄤˇ
+擋 0 ㄉㄤˇ
+讜 0 ㄉㄤˇ
+攩 0 ㄉㄤˇ
+欓 0 ㄉㄤˇ
+党 0 ㄉㄤˇ
+當 0 ㄉㄤˇ
+襠 0 ㄉㄤˇ
+儻 0 ㄉㄤˇ
+当 0 ㄉㄤˇ
+挡 0 ㄉㄤˇ
+譡 0 ㄉㄤˇ
+灙 0 ㄉㄤˇ
+當 0 ㄉㄤˋ
+蕩 0 ㄉㄤˋ
+擋 0 ㄉㄤˋ
+盪 0 ㄉㄤˋ
+碭 0 ㄉㄤˋ
+宕 0 ㄉㄤˋ
+菪 0 ㄉㄤˋ
+逿 0 ㄉㄤˋ
+璗 0 ㄉㄤˋ
+愓 0 ㄉㄤˋ
+瓽 0 ㄉㄤˋ
+礑 0 ㄉㄤˋ
+簜 0 ㄉㄤˋ
+闣 0 ㄉㄤˋ
+檔 0 ㄉㄤˋ
+蟷 0 ㄉㄤˋ
+婸 0 ㄉㄤˋ
+崵 0 ㄉㄤˋ
+嵣 0 ㄉㄤˋ
+氹 0 ㄉㄤˋ
+圵 0 ㄉㄤˋ
+当 0 ㄉㄤˋ
+挡 0 ㄉㄤˋ
+偒 0 ㄉㄤˋ
+雼 0 ㄉㄤˋ
+瞊 0 ㄉㄤˋ
+趤 0 ㄉㄤˋ
+蘯 0 ㄉㄤˋ
+單 0 ㄉㄢ
+擔 0 ㄉㄢ
+丹 0 ㄉㄢ
+耽 0 ㄉㄢ
+簞 0 ㄉㄢ
+鄲 0 ㄉㄢ
+眈 0 ㄉㄢ
+聃 0 ㄉㄢ
+酖 0 ㄉㄢ
+砃 0 ㄉㄢ
+甔 0 ㄉㄢ
+襌 0 ㄉㄢ
+匰 0 ㄉㄢ
+聸 0 ㄉㄢ
+勯 0 ㄉㄢ
+嚪 0 ㄉㄢ
+湛 0 ㄉㄢ
+憚 0 ㄉㄢ
+旃 0 ㄉㄢ
+栴 0 ㄉㄢ
+儋 0 ㄉㄢ
+鴅 0 ㄉㄢ
+殫 0 ㄉㄢ
+癉 0 ㄉㄢ
+鄿 0 ㄉㄢ
+鷤 0 ㄉㄢ
+妉 0 ㄉㄢ
+单 0 ㄉㄢ
+担 0 ㄉㄢ
+䒟 0 ㄉㄢ
+単 0 ㄉㄢ
+耼 0 ㄉㄢ
+惮 0 ㄉㄢ
+躭 0 ㄉㄢ
+媅 0 ㄉㄢ
+頕 0 ㄉㄢ
+旜 0 ㄉㄢ
+㴷 0 ㄉㄢ
+㐤 0 ㄉㄢ
+膽 0 ㄉㄢˇ
+疸 0 ㄉㄢˇ
+撢 0 ㄉㄢˇ
+亶 0 ㄉㄢˇ
+紞 0 ㄉㄢˇ
+刐 0 ㄉㄢˇ
+撣 0 ㄉㄢˇ
+玬 0 ㄉㄢˇ
+衴 0 ㄉㄢˇ
+黵 0 ㄉㄢˇ
+丼 0 ㄉㄢˇ
+澸 0 ㄉㄢˇ
+黕 0 ㄉㄢˇ
+瓭 0 ㄉㄢˇ
+胆 0 ㄉㄢˇ
+馾 0 ㄉㄢˇ
+䪴 0 ㄉㄢˇ
+㔊 0 ㄉㄢˇ
+但 0 ㄉㄢˋ
+旦 0 ㄉㄢˋ
+淡 0 ㄉㄢˋ
+蛋 0 ㄉㄢˋ
+誕 0 ㄉㄢˋ
+擔 0 ㄉㄢˋ
+彈 0 ㄉㄢˋ
+憚 0 ㄉㄢˋ
+氮 0 ㄉㄢˋ
+啖 0 ㄉㄢˋ
+澹 0 ㄉㄢˋ
+憺 0 ㄉㄢˋ
+儋 0 ㄉㄢˋ
+啗 0 ㄉㄢˋ
+噉 0 ㄉㄢˋ
+石 0 ㄉㄢˋ
+癉 0 ㄉㄢˋ
+窞 0 ㄉㄢˋ
+僤 0 ㄉㄢˋ
+贉 0 ㄉㄢˋ
+幨 0 ㄉㄢˋ
+霮 0 ㄉㄢˋ
+髧 0 ㄉㄢˋ
+萏 0 ㄉㄢˋ
+鉭 0 ㄉㄢˋ
+暺 0 ㄉㄢˋ
+柦 0 ㄉㄢˋ
+帎 0 ㄉㄢˋ
+潬 0 ㄉㄢˋ
+沊 0 ㄉㄢˋ
+狚 0 ㄉㄢˋ
+觛 0 ㄉㄢˋ
+啿 0 ㄉㄢˋ
+舕 0 ㄉㄢˋ
+蜑 0 ㄉㄢˋ
+嘾 0 ㄉㄢˋ
+鴠 0 ㄉㄢˋ
+癚 0 ㄉㄢˋ
+殫 0 ㄉㄢˋ
+灗 0 ㄉㄢˋ
+泹 0 ㄉㄢˋ
+怛 0 ㄉㄢˋ
+靼 0 ㄉㄢˋ
+妲 0 ㄉㄢˋ
+欻 0 ㄉㄢˋ
+嘽 0 ㄉㄢˋ
+餤 0 ㄉㄢˋ
+膻 0 ㄉㄢˋ
+嚪 0 ㄉㄢˋ
+繵 0 ㄉㄢˋ
+担 0 ㄉㄢˋ
+弹 0 ㄉㄢˋ
+惮 0 ㄉㄢˋ
+弾 0 ㄉㄢˋ
+腅 0 ㄉㄢˋ
+㗖 0 ㄉㄢˋ
+馾 0 ㄉㄢˋ
+醈 0 ㄉㄢˋ
+歘 0 ㄉㄢˋ
+駳 0 ㄉㄢˋ
+䨵 0 ㄉㄢˋ
+臽 0 ㄉㄢˋ
+䪴 0 ㄉㄢˋ
+搭 0 ㄉㄚ
+褡 0 ㄉㄚ
+答 0 ㄉㄚ
+撘 0 ㄉㄚ
+瘩 0 ㄉㄚ
+躂 0 ㄉㄚ
+咑 0 ㄉㄚ
+耷 0 ㄉㄚ
+荅 0 ㄉㄚ
+畣 0 ㄉㄚ
+溚 0 ㄉㄚ
+噠 0 ㄉㄚ
+打 0 ㄉㄚˇ
+大 0 ㄉㄚˋ
+亣 0 ㄉㄚˋ
+答 0 ㄉㄚˊ
+達 0 ㄉㄚˊ
+韃 0 ㄉㄚˊ
+靼 0 ㄉㄚˊ
+瘩 0 ㄉㄚˊ
+怛 0 ㄉㄚˊ
+繨 0 ㄉㄚˊ
+噠 0 ㄉㄚˊ
+妲 0 ㄉㄚˊ
+笪 0 ㄉㄚˊ
+荅 0 ㄉㄚˊ
+薘 0 ㄉㄚˊ
+褟 0 ㄉㄚˊ
+鐽 0 ㄉㄚˊ
+匒 0 ㄉㄚˊ
+呾 0 ㄉㄚˊ
+畣 0 ㄉㄚˊ
+炟 0 ㄉㄚˊ
+鎝 0 ㄉㄚˊ
+打 0 ㄉㄚˊ
+撻 0 ㄉㄚˊ
+躂 0 ㄉㄚˊ
+疊 0 ㄉㄚˊ
+榙 0 ㄉㄚˊ
+劄 0 ㄉㄚˊ
+譗 0 ㄉㄚˊ
+达 0 ㄉㄚˊ
+迏 0 ㄉㄚˊ
+剳 0 ㄉㄚˊ
+詚 0 ㄉㄚˊ
+叠 0 ㄉㄚˊ
+曡 0 ㄉㄚˊ
+蟽 0 ㄉㄚˊ
+疉 0 ㄉㄚˊ
+𦖿 0 ㄉㄚˊ
+疸 0 ㄉㄚ˙
+瘩 0 ㄉㄚ˙
+咑 0 ㄉㄚ˙
+打 0 ㄉㄚ˙
+繨 0 ㄉㄚ˙
+呆 0 ㄉㄞ
+待 0 ㄉㄞ
+獃 0 ㄉㄞ
+鮘 0 ㄉㄞ
+懛 0 ㄉㄞ
+歹 0 ㄉㄞˇ
+逮 0 ㄉㄞˇ
+得 0 ㄉㄞˇ
+炱 0 ㄉㄞˇ
+傣 0 ㄉㄞˇ
+歺 0 ㄉㄞˇ
+炲 0 ㄉㄞˇ
+代 0 ㄉㄞˋ
+帶 0 ㄉㄞˋ
+待 0 ㄉㄞˋ
+袋 0 ㄉㄞˋ
+戴 0 ㄉㄞˋ
+怠 0 ㄉㄞˋ
+殆 0 ㄉㄞˋ
+黛 0 ㄉㄞˋ
+貸 0 ㄉㄞˋ
+迨 0 ㄉㄞˋ
+大 0 ㄉㄞˋ
+玳 0 ㄉㄞˋ
+岱 0 ㄉㄞˋ
+逮 0 ㄉㄞˋ
+襶 0 ㄉㄞˋ
+埭 0 ㄉㄞˋ
+靆 0 ㄉㄞˋ
+紿 0 ㄉㄞˋ
+廗 0 ㄉㄞˋ
+汏 0 ㄉㄞˋ
+忕 0 ㄉㄞˋ
+瀻 0 ㄉㄞˋ
+軩 0 ㄉㄞˋ
+跢 0 ㄉㄞˋ
+艜 0 ㄉㄞˋ
+蹛 0 ㄉㄞˋ
+柋 0 ㄉㄞˋ
+酨 0 ㄉㄞˋ
+軑 0 ㄉㄞˋ
+釱 0 ㄉㄞˋ
+駘 0 ㄉㄞˋ
+亣 0 ㄉㄞˋ
+㐲 0 ㄉㄞˋ
+侢 0 ㄉㄞˋ
+帒 0 ㄉㄞˋ
+隶 0 ㄉㄞˋ
+帯 0 ㄉㄞˋ
+㻖 0 ㄉㄞˋ
+瑇 0 ㄉㄞˋ
+鉪 0 ㄉㄞˋ
+㯂 0 ㄉㄞˋ
+緿 0 ㄉㄞˋ
+鴏 0 ㄉㄞˋ
+簤 0 ㄉㄞˋ
+霴 0 ㄉㄞˋ
+黱 0 ㄉㄞˋ
+軚 0 ㄉㄞˋ
+都 0 ㄉㄨ
+督 0 ㄉㄨ
+嘟 0 ㄉㄨ
+闍 0 ㄉㄨ
+醏 0 ㄉㄨ
+裻 0 ㄉㄨ
+錖 0 ㄉㄨ
+東 0 ㄉㄨㄥ
+冬 0 ㄉㄨㄥ
+咚 0 ㄉㄨㄥ
+鼕 0 ㄉㄨㄥ
+苳 0 ㄉㄨㄥ
+蝀 0 ㄉㄨㄥ
+埬 0 ㄉㄨㄥ
+崠 0 ㄉㄨㄥ
+氡 0 ㄉㄨㄥ
+炵 0 ㄉㄨㄥ
+涷 0 ㄉㄨㄥ
+菄 0 ㄉㄨㄥ
+鶇 0 ㄉㄨㄥ
+㚵 0 ㄉㄨㄥ
+昸 0 ㄉㄨㄥ
+倲 0 ㄉㄨㄥ
+娻 0 ㄉㄨㄥ
+崬 0 ㄉㄨㄥ
+笗 0 ㄉㄨㄥ
+氭 0 ㄉㄨㄥ
+鯟 0 ㄉㄨㄥ
+𤷆 0 ㄉㄨㄥ
+𩂓 0 ㄉㄨㄥ
+懂 0 ㄉㄨㄥˇ
+董 0 ㄉㄨㄥˇ
+嬞 0 ㄉㄨㄥˇ
+墥 0 ㄉㄨㄥˇ
+蕫 0 ㄉㄨㄥˇ
+諌 0 ㄉㄨㄥˇ
+箽 0 ㄉㄨㄥˇ
+𣿅 0 ㄉㄨㄥˇ
+𢤦 0 ㄉㄨㄥˇ
+動 0 ㄉㄨㄥˋ
+洞 0 ㄉㄨㄥˋ
+凍 0 ㄉㄨㄥˋ
+棟 0 ㄉㄨㄥˋ
+恫 0 ㄉㄨㄥˋ
+胴 0 ㄉㄨㄥˋ
+挏 0 ㄉㄨㄥˋ
+戙 0 ㄉㄨㄥˋ
+駧 0 ㄉㄨㄥˋ
+霘 0 ㄉㄨㄥˋ
+峒 0 ㄉㄨㄥˋ
+湩 0 ㄉㄨㄥˋ
+慟 0 ㄉㄨㄥˋ
+姛 0 ㄉㄨㄥˋ
+迵 0 ㄉㄨㄥˋ
+詷 0 ㄉㄨㄥˋ
+蝀 0 ㄉㄨㄥˋ
+动 0 ㄉㄨㄥˋ
+峝 0 ㄉㄨㄥˋ
+働 0 ㄉㄨㄥˋ
+勭 0 ㄉㄨㄥˋ
+憅 0 ㄉㄨㄥˋ
+端 0 ㄉㄨㄢ
+耑 0 ㄉㄨㄢ
+偳 0 ㄉㄨㄢ
+剬 0 ㄉㄨㄢ
+媏 0 ㄉㄨㄢ
+鍴 0 ㄉㄨㄢ
+褍 0 ㄉㄨㄢ
+短 0 ㄉㄨㄢˇ
+段 0 ㄉㄨㄢˋ
+斷 0 ㄉㄨㄢˋ
+緞 0 ㄉㄨㄢˋ
+鍛 0 ㄉㄨㄢˋ
+毈 0 ㄉㄨㄢˋ
+腶 0 ㄉㄨㄢˋ
+籪 0 ㄉㄨㄢˋ
+椴 0 ㄉㄨㄢˋ
+葮 0 ㄉㄨㄢˋ
+碫 0 ㄉㄨㄢˋ
+躖 0 ㄉㄨㄢˋ
+断 0 ㄉㄨㄢˋ
+煅 0 ㄉㄨㄢˋ
+瑖 0 ㄉㄨㄢˋ
+塅 0 ㄉㄨㄢˋ
+賭 0 ㄉㄨˇ
+堵 0 ㄉㄨˇ
+睹 0 ㄉㄨˇ
+篤 0 ㄉㄨˇ
+肚 0 ㄉㄨˇ
+錖 0 ㄉㄨˇ
+裻 0 ㄉㄨˇ
+帾 0 ㄉㄨˇ
+蠹 0 ㄉㄨˇ
+媎 0 ㄉㄨˇ
+覿 0 ㄉㄨˇ
+琽 0 ㄉㄨˇ
+覩 0 ㄉㄨˇ
+螙 0 ㄉㄨˇ
+蠧 0 ㄉㄨˇ
+度 0 ㄉㄨˋ
+渡 0 ㄉㄨˋ
+肚 0 ㄉㄨˋ
+妒 0 ㄉㄨˋ
+鍍 0 ㄉㄨˋ
+杜 0 ㄉㄨˋ
+蠹 0 ㄉㄨˋ
+秺 0 ㄉㄨˋ
+喥 0 ㄉㄨˋ
+踱 0 ㄉㄨˋ
+斁 0 ㄉㄨˋ
+妬 0 ㄉㄨˋ
+靯 0 ㄉㄨˋ
+螙 0 ㄉㄨˋ
+歝 0 ㄉㄨˋ
+蠧 0 ㄉㄨˋ
+簬 0 ㄉㄨˋ
+荰 0 ㄉㄨˋ
+𪐞 0 ㄉㄨˋ
+殬 0 ㄉㄨˋ
+讀 0 ㄉㄨˊ
+獨 0 ㄉㄨˊ
+毒 0 ㄉㄨˊ
+牘 0 ㄉㄨˊ
+纛 0 ㄉㄨˊ
+瀆 0 ㄉㄨˊ
+犢 0 ㄉㄨˊ
+髑 0 ㄉㄨˊ
+讟 0 ㄉㄨˊ
+黷 0 ㄉㄨˊ
+櫝 0 ㄉㄨˊ
+儥 0 ㄉㄨˊ
+碡 0 ㄉㄨˊ
+殰 0 ㄉㄨˊ
+蝳 0 ㄉㄨˊ
+贕 0 ㄉㄨˊ
+韇 0 ㄉㄨˊ
+韥 0 ㄉㄨˊ
+皾 0 ㄉㄨˊ
+督 0 ㄉㄨˊ
+頓 0 ㄉㄨˊ
+篤 0 ㄉㄨˊ
+蠹 0 ㄉㄨˊ
+豰 0 ㄉㄨˊ
+襩 0 ㄉㄨˊ
+韣 0 ㄉㄨˊ
+独 0 ㄉㄨˊ
+螙 0 ㄉㄨˊ
+凟 0 ㄉㄨˊ
+匵 0 ㄉㄨˊ
+嬻 0 ㄉㄨˊ
+瓄 0 ㄉㄨˊ
+蠧 0 ㄉㄨˊ
+鑟 0 ㄉㄨˊ
+𧰵 0 ㄉㄨˊ
+𡂝 0 ㄉㄨˊ
+騳 0 ㄉㄨˊ
+𡱰 0 ㄉㄨˊ
+多 0 ㄉㄨㄛ
+朵 0 ㄉㄨㄛ
+哆 0 ㄉㄨㄛ
+柁 0 ㄉㄨㄛ
+茤 0 ㄉㄨㄛ
+跢 0 ㄉㄨㄛ
+崜 0 ㄉㄨㄛ
+夛 0 ㄉㄨㄛ
+掇 0 ㄉㄨㄛ
+躲 0 ㄉㄨㄛˇ
+朵 0 ㄉㄨㄛˇ
+埵 0 ㄉㄨㄛˇ
+垛 0 ㄉㄨㄛˇ
+嚲 0 ㄉㄨㄛˇ
+鬌 0 ㄉㄨㄛˇ
+痑 0 ㄉㄨㄛˇ
+趓 0 ㄉㄨㄛˇ
+綞 0 ㄉㄨㄛˇ
+朶 0 ㄉㄨㄛˇ
+哚 0 ㄉㄨㄛˇ
+垜 0 ㄉㄨㄛˇ
+挅 0 ㄉㄨㄛˇ
+躱 0 ㄉㄨㄛˇ
+軃 0 ㄉㄨㄛˇ
+袳 0 ㄉㄨㄛˇ
+䤪 0 ㄉㄨㄛˇ
+挆 0 ㄉㄨㄛˇ
+𧊶 0 ㄉㄨㄛˇ
+惰 0 ㄉㄨㄛˋ
+墮 0 ㄉㄨㄛˋ
+舵 0 ㄉㄨㄛˋ
+跺 0 ㄉㄨㄛˋ
+剁 0 ㄉㄨㄛˋ
+咄 0 ㄉㄨㄛˋ
+踱 0 ㄉㄨㄛˋ
+馱 0 ㄉㄨㄛˋ
+垛 0 ㄉㄨㄛˋ
+墯 0 ㄉㄨㄛˋ
+嶞 0 ㄉㄨㄛˋ
+柮 0 ㄉㄨㄛˋ
+陏 0 ㄉㄨㄛˋ
+陊 0 ㄉㄨㄛˋ
+度 0 ㄉㄨㄛˋ
+袉 0 ㄉㄨㄛˋ
+貀 0 ㄉㄨㄛˋ
+鵽 0 ㄉㄨㄛˋ
+灺 0 ㄉㄨㄛˋ
+柁 0 ㄉㄨㄛˋ
+痑 0 ㄉㄨㄛˋ
+刴 0 ㄉㄨㄛˋ
+垜 0 ㄉㄨㄛˋ
+炨 0 ㄉㄨㄛˋ
+炧 0 ㄉㄨㄛˋ
+笜 0 ㄉㄨㄛˋ
+飿 0 ㄉㄨㄛˋ
+㻧 0 ㄉㄨㄛˋ
+䭾 0 ㄉㄨㄛˋ
+駄 0 ㄉㄨㄛˋ
+憜 0 ㄉㄨㄛˋ
+嚉 0 ㄉㄨㄛˋ
+㨊 0 ㄉㄨㄛˋ
+奪 0 ㄉㄨㄛˊ
+鐸 0 ㄉㄨㄛˊ
+多 0 ㄉㄨㄛˊ
+掇 0 ㄉㄨㄛˊ
+裰 0 ㄉㄨㄛˊ
+剟 0 ㄉㄨㄛˊ
+敪 0 ㄉㄨㄛˊ
+椯 0 ㄉㄨㄛˊ
+剫 0 ㄉㄨㄛˊ
+敓 0 ㄉㄨㄛˊ
+莌 0 ㄉㄨㄛˊ
+毲 0 ㄉㄨㄛˊ
+腏 0 ㄉㄨㄛˊ
+鮵 0 ㄉㄨㄛˊ
+襗 0 ㄉㄨㄛˊ
+喥 0 ㄉㄨㄛˊ
+檡 0 ㄉㄨㄛˊ
+鵽 0 ㄉㄨㄛˊ
+敚 0 ㄉㄨㄛˊ
+敠 0 ㄉㄨㄛˊ
+痥 0 ㄉㄨㄛˊ
+凙 0 ㄉㄨㄛˊ
+夛 0 ㄉㄨㄛˊ
+掇 0 ㄉㄨㄛ˙
+堆 0 ㄉㄨㄟ
+頧 0 ㄉㄨㄟ
+痽 0 ㄉㄨㄟ
+追 0 ㄉㄨㄟ
+敦 0 ㄉㄨㄟ
+鐓 0 ㄉㄨㄟ
+垖 0 ㄉㄨㄟ
+塠 0 ㄉㄨㄟ
+磓 0 ㄉㄨㄟ
+鐜 0 ㄉㄨㄟ
+嵟 0 ㄉㄨㄟ
+䔻 0 ㄉㄨㄟ
+䭔 0 ㄉㄨㄟ
+謉 0 ㄉㄨㄟˇ
+㨃 0 ㄉㄨㄟˇ
+䇏 0 ㄉㄨㄟˇ
+𦞙 0 ㄉㄨㄟˇ
+對 0 ㄉㄨㄟˋ
+隊 0 ㄉㄨㄟˋ
+兌 0 ㄉㄨㄟˋ
+碓 0 ㄉㄨㄟˋ
+懟 0 ㄉㄨㄟˋ
+譈 0 ㄉㄨㄟˋ
+濧 0 ㄉㄨㄟˋ
+薱 0 ㄉㄨㄟˋ
+轛 0 ㄉㄨㄟˋ
+濻 0 ㄉㄨㄟˋ
+瀩 0 ㄉㄨㄟˋ
+憝 0 ㄉㄨㄟˋ
+敦 0 ㄉㄨㄟˋ
+祋 0 ㄉㄨㄟˋ
+莌 0 ㄉㄨㄟˋ
+錞 0 ㄉㄨㄟˋ
+鐓 0 ㄉㄨㄟˋ
+对 0 ㄉㄨㄟˋ
+兊 0 ㄉㄨㄟˋ
+兑 0 ㄉㄨㄟˋ
+対 0 ㄉㄨㄟˋ
+陮 0 ㄉㄨㄟˋ
+綐 0 ㄉㄨㄟˋ
+憞 0 ㄉㄨㄟˋ
+鐜 0 ㄉㄨㄟˋ
+譵 0 ㄉㄨㄟˋ
+敦 0 ㄉㄨㄣ
+蹲 0 ㄉㄨㄣ
+墩 0 ㄉㄨㄣ
+惇 0 ㄉㄨㄣ
+礅 0 ㄉㄨㄣ
+驐 0 ㄉㄨㄣ
+蜳 0 ㄉㄨㄣ
+撉 0 ㄉㄨㄣ
+鐓 0 ㄉㄨㄣ
+噸 0 ㄉㄨㄣ
+憝 0 ㄉㄨㄣ
+橔 0 ㄉㄨㄣ
+弴 0 ㄉㄨㄣ
+墪 0 ㄉㄨㄣ
+憞 0 ㄉㄨㄣ
+撴 0 ㄉㄨㄣ
+䃦 0 ㄉㄨㄣ
+鐜 0 ㄉㄨㄣ
+犜 0 ㄉㄨㄣ
+盹 0 ㄉㄨㄣˇ
+躉 0 ㄉㄨㄣˇ
+𣎴 0 ㄉㄨㄣˇ
+頓 0 ㄉㄨㄣˋ
+噸 0 ㄉㄨㄣˋ
+盾 0 ㄉㄨㄣˋ
+鈍 0 ㄉㄨㄣˋ
+遁 0 ㄉㄨㄣˋ
+盹 0 ㄉㄨㄣˋ
+燉 0 ㄉㄨㄣˋ
+沌 0 ㄉㄨㄣˋ
+囤 0 ㄉㄨㄣˋ
+遯 0 ㄉㄨㄣˋ
+炖 0 ㄉㄨㄣˋ
+坉 0 ㄉㄨㄣˋ
+扽 0 ㄉㄨㄣˋ
+伅 0 ㄉㄨㄣˋ
+庉 0 ㄉㄨㄣˋ
+潡 0 ㄉㄨㄣˋ
+崸 0 ㄉㄨㄣˋ
+鶨 0 ㄉㄨㄣˋ
+腞 0 ㄉㄨㄣˋ
+敦 0 ㄉㄨㄣˋ
+飩 0 ㄉㄨㄣˋ
+扥 0 ㄉㄨㄣˋ
+楯 0 ㄉㄨㄣˋ
+瞃 0 ㄉㄨㄣˋ
+輴 0 ㄉㄨㄣˋ
+鐓 0 ㄉㄨㄣˋ
+踲 0 ㄉㄨㄣˋ
+鐜 0 ㄉㄨㄣˋ
+逇 0 ㄉㄨㄣˋ
+得 0 ㄉㄜˊ
+德 0 ㄉㄜˊ
+淂 0 ㄉㄜˊ
+恴 0 ㄉㄜˊ
+惪 0 ㄉㄜˊ
+悳 0 ㄉㄜˊ
+徳 0 ㄉㄜˊ
+𢔨 0 ㄉㄜˊ
+𢔶 0 ㄉㄜˊ
+的 0 ㄉㄜ˙
+得 0 ㄉㄜ˙
+地 0 ㄉㄜ˙
+底 0 ㄉㄜ˙
+襶 0 ㄉㄜ˙
+坔 0 ㄉㄜ˙
+埊 0 ㄉㄜ˙
+嶳 0 ㄉㄜ˙
+𢔨 0 ㄉㄜ˙
+𢔶 0 ㄉㄜ˙
+刀 0 ㄉㄠ
+叨 0 ㄉㄠ
+忉 0 ㄉㄠ
+舠 0 ㄉㄠ
+氘 0 ㄉㄠ
+幍 0 ㄉㄠ
+魛 0 ㄉㄠ
+灱 0 ㄉㄠ
+朷 0 ㄉㄠ
+灲 0 ㄉㄠ
+釖 0 ㄉㄠ
+刂 0 ㄉㄠ
+倒 0 ㄉㄠˇ
+島 0 ㄉㄠˇ
+導 0 ㄉㄠˇ
+禱 0 ㄉㄠˇ
+搗 0 ㄉㄠˇ
+擣 0 ㄉㄠˇ
+壔 0 ㄉㄠˇ
+禂 0 ㄉㄠˇ
+蹈 0 ㄉㄠˇ
+嶋 0 ㄉㄠˇ
+嶌 0 ㄉㄠˇ
+隝 0 ㄉㄠˇ
+嶹 0 ㄉㄠˇ
+隯 0 ㄉㄠˇ
+祷 0 ㄉㄠˇ
+到 0 ㄉㄠˋ
+道 0 ㄉㄠˋ
+倒 0 ㄉㄠˋ
+稻 0 ㄉㄠˋ
+盜 0 ㄉㄠˋ
+蹈 0 ㄉㄠˋ
+悼 0 ㄉㄠˋ
+導 0 ㄉㄠˋ
+纛 0 ㄉㄠˋ
+翿 0 ㄉㄠˋ
+檤 0 ㄉㄠˋ
+菿 0 ㄉㄠˋ
+瓙 0 ㄉㄠˋ
+燾 0 ㄉㄠˋ
+韜 0 ㄉㄠˋ
+箌 0 ㄉㄠˋ
+幬 0 ㄉㄠˋ
+盗 0 ㄉㄠˋ
+稲 0 ㄉㄠˋ
+衜 0 ㄉㄠˋ
+衟 0 ㄉㄠˋ
+轁 0 ㄉㄠˋ
+鞱 0 ㄉㄠˋ
+噵 0 ㄉㄠˋ
+軇 0 ㄉㄠˋ
+捯 0 ㄉㄠˊ
+得 0 ㄉㄟˇ
+𢔶 0 ㄉㄟˇ
+㩐 0 ㄉㄣˋ
+低 0 ㄉㄧ
+滴 0 ㄉㄧ
+氐 0 ㄉㄧ
+羝 0 ㄉㄧ
+鞮 0 ㄉㄧ
+彽 0 ㄉㄧ
+磾 0 ㄉㄧ
+鍉 0 ㄉㄧ
+袛 0 ㄉㄧ
+菂 0 ㄉㄧ
+墑 0 ㄉㄧ
+熵 0 ㄉㄧ
+堤 0 ㄉㄧ
+提 0 ㄉㄧ
+隄 0 ㄉㄧ
+嫡 0 ㄉㄧ
+埞 0 ㄉㄧ
+趆 0 ㄉㄧ
+仾 0 ㄉㄧ
+奃 0 ㄉㄧ
+𩑾 0 ㄉㄧ
+爹 0 ㄉㄧㄝ
+嗲 0 ㄉㄧㄝ
+𠅗 0 ㄉㄧㄝˋ
+跌 0 ㄉㄧㄝˊ
+蝶 0 ㄉㄧㄝˊ
+諜 0 ㄉㄧㄝˊ
+碟 0 ㄉㄧㄝˊ
+疊 0 ㄉㄧㄝˊ
+迭 0 ㄉㄧㄝˊ
+牒 0 ㄉㄧㄝˊ
+喋 0 ㄉㄧㄝˊ
+瓞 0 ㄉㄧㄝˊ
+耋 0 ㄉㄧㄝˊ
+絰 0 ㄉㄧㄝˊ
+咥 0 ㄉㄧㄝˊ
+垤 0 ㄉㄧㄝˊ
+堞 0 ㄉㄧㄝˊ
+蜨 0 ㄉㄧㄝˊ
+蹀 0 ㄉㄧㄝˊ
+鰈 0 ㄉㄧㄝˊ
+跕 0 ㄉㄧㄝˊ
+昳 0 ㄉㄧㄝˊ
+峌 0 ㄉㄧㄝˊ
+挕 0 ㄉㄧㄝˊ
+胅 0 ㄉㄧㄝˊ
+苵 0 ㄉㄧㄝˊ
+眣 0 ㄉㄧㄝˊ
+聑 0 ㄉㄧㄝˊ
+臷 0 ㄉㄧㄝˊ
+詄 0 ㄉㄧㄝˊ
+镻 0 ㄉㄧㄝˊ
+艓 0 ㄉㄧㄝˊ
+褋 0 ㄉㄧㄝˊ
+惵 0 ㄉㄧㄝˊ
+楪 0 ㄉㄧㄝˊ
+嶀 0 ㄉㄧㄝˊ
+凸 0 ㄉㄧㄝˊ
+趺 0 ㄉㄧㄝˊ
+褶 0 ㄉㄧㄝˊ
+柣 0 ㄉㄧㄝˊ
+媟 0 ㄉㄧㄝˊ
+揲 0 ㄉㄧㄝˊ
+渫 0 ㄉㄧㄝˊ
+墆 0 ㄉㄧㄝˊ
+嵽 0 ㄉㄧㄝˊ
+屧 0 ㄉㄧㄝˊ
+螲 0 ㄉㄧㄝˊ
+鞢 0 ㄉㄧㄝˊ
+呋 0 ㄉㄧㄝˊ
+恎 0 ㄉㄧㄝˊ
+耊 0 ㄉㄧㄝˊ
+眰 0 ㄉㄧㄝˊ
+䏲 0 ㄉㄧㄝˊ
+屟 0 ㄉㄧㄝˊ
+趃 0 ㄉㄧㄝˊ
+叠 0 ㄉㄧㄝˊ
+殜 0 ㄉㄧㄝˊ
+㻡 0 ㄉㄧㄝˊ
+曡 0 ㄉㄧㄝˊ
+疉 0 ㄉㄧㄝˊ
+戜 0 ㄉㄧㄝˊ
+𣶏 0 ㄉㄧㄝˊ
+褺 0 ㄉㄧㄝˊ
+爹 0 ㄉㄧㄝ˙
+丟 0 ㄉㄧㄡ
+銩 0 ㄉㄧㄡ
+丢 0 ㄉㄧㄡ
+厾 0 ㄉㄧㄡ
+丁 0 ㄉㄧㄥ
+釘 0 ㄉㄧㄥ
+叮 0 ㄉㄧㄥ
+疔 0 ㄉㄧㄥ
+酊 0 ㄉㄧㄥ
+盯 0 ㄉㄧㄥ
+仃 0 ㄉㄧㄥ
+玎 0 ㄉㄧㄥ
+帄 0 ㄉㄧㄥ
+靪 0 ㄉㄧㄥ
+虰 0 ㄉㄧㄥ
+汀 0 ㄉㄧㄥ
+町 0 ㄉㄧㄥ
+糽 0 ㄉㄧㄥ
+飣 0 ㄉㄧㄥ
+𠆤 0 ㄉㄧㄥ
+頂 0 ㄉㄧㄥˇ
+鼎 0 ㄉㄧㄥˇ
+酊 0 ㄉㄧㄥˇ
+嵿 0 ㄉㄧㄥˇ
+濎 0 ㄉㄧㄥˇ
+薡 0 ㄉㄧㄥˇ
+鼏 0 ㄉㄧㄥˇ
+奵 0 ㄉㄧㄥˇ
+檙 0 ㄉㄧㄥˇ
+鼑 0 ㄉㄧㄥˇ
+定 0 ㄉㄧㄥˋ
+訂 0 ㄉㄧㄥˋ
+釘 0 ㄉㄧㄥˋ
+錠 0 ㄉㄧㄥˋ
+碇 0 ㄉㄧㄥˋ
+飣 0 ㄉㄧㄥˋ
+娗 0 ㄉㄧㄥˋ
+椗 0 ㄉㄧㄥˋ
+掟 0 ㄉㄧㄥˋ
+碠 0 ㄉㄧㄥˋ
+顁 0 ㄉㄧㄥˋ
+萣 0 ㄉㄧㄥˋ
+啶 0 ㄉㄧㄥˋ
+綻 0 ㄉㄧㄥˋ
+靛 0 ㄉㄧㄥˋ
+鋌 0 ㄉㄧㄥˋ
+忊 0 ㄉㄧㄥˋ
+矴 0 ㄉㄧㄥˋ
+䋎 0 ㄉㄧㄥˋ
+磸 0 ㄉㄧㄥˋ
+顛 0 ㄉㄧㄢ
+巔 0 ㄉㄧㄢ
+癲 0 ㄉㄧㄢ
+滇 0 ㄉㄧㄢ
+拈 0 ㄉㄧㄢ
+掂 0 ㄉㄧㄢ
+傎 0 ㄉㄧㄢ
+瘨 0 ㄉㄧㄢ
+敁 0 ㄉㄧㄢ
+蹎 0 ㄉㄧㄢ
+槙 0 ㄉㄧㄢ
+齻 0 ㄉㄧㄢ
+厧 0 ㄉㄧㄢ
+闐 0 ㄉㄧㄢ
+嵮 0 ㄉㄧㄢ
+巓 0 ㄉㄧㄢ
+攧 0 ㄉㄧㄢ
+槇 0 ㄉㄧㄢ
+顚 0 ㄉㄧㄢ
+點 0 ㄉㄧㄢˇ
+典 0 ㄉㄧㄢˇ
+碘 0 ㄉㄧㄢˇ
+錪 0 ㄉㄧㄢˇ
+婰 0 ㄉㄧㄢˇ
+琠 0 ㄉㄧㄢˇ
+蕇 0 ㄉㄧㄢˇ
+腆 0 ㄉㄧㄢˇ
+痶 0 ㄉㄧㄢˇ
+奌 0 ㄉㄧㄢˇ
+点 0 ㄉㄧㄢˇ
+㙉 0 ㄉㄧㄢˇ
+敟 0 ㄉㄧㄢˇ
+電 0 ㄉㄧㄢˋ
+店 0 ㄉㄧㄢˋ
+殿 0 ㄉㄧㄢˋ
+甸 0 ㄉㄧㄢˋ
+奠 0 ㄉㄧㄢˋ
+墊 0 ㄉㄧㄢˋ
+澱 0 ㄉㄧㄢˋ
+惦 0 ㄉㄧㄢˋ
+靛 0 ㄉㄧㄢˋ
+佃 0 ㄉㄧㄢˋ
+淀 0 ㄉㄧㄢˋ
+玷 0 ㄉㄧㄢˋ
+鈿 0 ㄉㄧㄢˋ
+簟 0 ㄉㄧㄢˋ
+坫 0 ㄉㄧㄢˋ
+痁 0 ㄉㄧㄢˋ
+癜 0 ㄉㄧㄢˋ
+磹 0 ㄉㄧㄢˋ
+阽 0 ㄉㄧㄢˋ
+扂 0 ㄉㄧㄢˋ
+婝 0 ㄉㄧㄢˋ
+踮 0 ㄉㄧㄢˋ
+壂 0 ㄉㄧㄢˋ
+唸 0 ㄉㄧㄢˋ
+臀 0 ㄉㄧㄢˋ
+掂 0 ㄉㄧㄢˋ
+驔 0 ㄉㄧㄢˋ
+埝 0 ㄉㄧㄢˋ
+琔 0 ㄉㄧㄢˋ
+頕 0 ㄉㄧㄢˋ
+橂 0 ㄉㄧㄢˋ
+𤩱 0 ㄉㄧㄢˋ
+𠶧 0 ㄉㄧㄢˋ
+𢕯 0 ㄉㄧㄢˋ
+蜔 0 ㄉㄧㄢˋ
+底 0 ㄉㄧˇ
+抵 0 ㄉㄧˇ
+邸 0 ㄉㄧˇ
+詆 0 ㄉㄧˇ
+牴 0 ㄉㄧˇ
+砥 0 ㄉㄧˇ
+氐 0 ㄉㄧˇ
+坻 0 ㄉㄧˇ
+柢 0 ㄉㄧˇ
+弤 0 ㄉㄧˇ
+觝 0 ㄉㄧˇ
+呧 0 ㄉㄧˇ
+阺 0 ㄉㄧˇ
+聜 0 ㄉㄧˇ
+菧 0 ㄉㄧˇ
+軧 0 ㄉㄧˇ
+扺 0 ㄉㄧˇ
+厎 0 ㄉㄧˇ
+汦 0 ㄉㄧˇ
+秖 0 ㄉㄧˇ
+蚔 0 ㄉㄧˇ
+蚳 0 ㄉㄧˇ
+貾 0 ㄉㄧˇ
+坘 0 ㄉㄧˇ
+拞 0 ㄉㄧˇ
+茋 0 ㄉㄧˇ
+掋 0 ㄉㄧˇ
+地 0 ㄉㄧˋ
+第 0 ㄉㄧˋ
+弟 0 ㄉㄧˋ
+帝 0 ㄉㄧˋ
+遞 0 ㄉㄧˋ
+蒂 0 ㄉㄧˋ
+的 0 ㄉㄧˋ
+締 0 ㄉㄧˋ
+諦 0 ㄉㄧˋ
+娣 0 ㄉㄧˋ
+睇 0 ㄉㄧˋ
+棣 0 ㄉㄧˋ
+杕 0 ㄉㄧˋ
+玓 0 ㄉㄧˋ
+禘 0 ㄉㄧˋ
+蔕 0 ㄉㄧˋ
+螮 0 ㄉㄧˋ
+踶 0 ㄉㄧˋ
+楴 0 ㄉㄧˋ
+渧 0 ㄉㄧˋ
+碲 0 ㄉㄧˋ
+虳 0 ㄉㄧˋ
+釱 0 ㄉㄧˋ
+樀 0 ㄉㄧˋ
+旳 0 ㄉㄧˋ
+軑 0 ㄉㄧˋ
+梊 0 ㄉㄧˋ
+焍 0 ㄉㄧˋ
+馰 0 ㄉㄧˋ
+墆 0 ㄉㄧˋ
+嵽 0 ㄉㄧˋ
+珶 0 ㄉㄧˋ
+甋 0 ㄉㄧˋ
+悌 0 ㄉㄧˋ
+啻 0 ㄉㄧˋ
+逮 0 ㄉㄧˋ
+晜 0 ㄉㄧˋ
+搋 0 ㄉㄧˋ
+蝃 0 ㄉㄧˋ
+墬 0 ㄉㄧˋ
+遰 0 ㄉㄧˋ
+篪 0 ㄉㄧˋ
+坔 0 ㄉㄧˋ
+竾 0 ㄉㄧˋ
+苐 0 ㄉㄧˋ
+埊 0 ㄉㄧˋ
+偙 0 ㄉㄧˋ
+递 0 ㄉㄧˋ
+逓 0 ㄉㄧˋ
+媂 0 ㄉㄧˋ
+祶 0 ㄉㄧˋ
+筂 0 ㄉㄧˋ
+腣 0 ㄉㄧˋ
+摕 0 ㄉㄧˋ
+裭 0 ㄉㄧˋ
+骶 0 ㄉㄧˋ
+嶳 0 ㄉㄧˋ
+怟 0 ㄉㄧˋ
+啇 0 ㄉㄧˋ
+䟡 0 ㄉㄧˋ
+僀 0 ㄉㄧˋ
+䐭 0 ㄉㄧˋ
+𨮹 0 ㄉㄧˋ
+的 0 ㄉㄧˊ
+敵 0 ㄉㄧˊ
+迪 0 ㄉㄧˊ
+狄 0 ㄉㄧˊ
+笛 0 ㄉㄧˊ
+滌 0 ㄉㄧˊ
+翟 0 ㄉㄧˊ
+荻 0 ㄉㄧˊ
+嫡 0 ㄉㄧˊ
+嘀 0 ㄉㄧˊ
+鏑 0 ㄉㄧˊ
+蹢 0 ㄉㄧˊ
+糴 0 ㄉㄧˊ
+覿 0 ㄉㄧˊ
+篴 0 ㄉㄧˊ
+蔋 0 ㄉㄧˊ
+靮 0 ㄉㄧˊ
+梑 0 ㄉㄧˊ
+潪 0 ㄉㄧˊ
+苖 0 ㄉㄧˊ
+嚁 0 ㄉㄧˊ
+鸐 0 ㄉㄧˊ
+藋 0 ㄉㄧˊ
+藡 0 ㄉㄧˊ
+岫 0 ㄉㄧˊ
+抵 0 ㄉㄧˊ
+條 0 ㄉㄧˊ
+逖 0 ㄉㄧˊ
+適 0 ㄉㄧˊ
+濯 0 ㄉㄧˊ
+櫂 0 ㄉㄧˊ
+謫 0 ㄉㄧˊ
+扺 0 ㄉㄧˊ
+魡 0 ㄉㄧˊ
+樀 0 ㄉㄧˊ
+甋 0 ㄉㄧˊ
+鍉 0 ㄉㄧˊ
+蠗 0 ㄉㄧˊ
+条 0 ㄉㄧˊ
+廸 0 ㄉㄧˊ
+拞 0 ㄉㄧˊ
+籴 0 ㄉㄧˊ
+唙 0 ㄉㄧˊ
+逷 0 ㄉㄧˊ
+頔 0 ㄉㄧˊ
+樤 0 ㄉㄧˊ
+豴 0 ㄉㄧˊ
+讁 0 ㄉㄧˊ
+䑲 0 ㄉㄧˊ
+蔐 0 ㄉㄧˊ
+䨤 0 ㄉㄧˊ
+𢕚 0 ㄉㄧˊ
+弟 0 ㄉㄧ˙
+雕 0 ㄉㄧㄠ
+凋 0 ㄉㄧㄠ
+刁 0 ㄉㄧㄠ
+貂 0 ㄉㄧㄠ
+鵰 0 ㄉㄧㄠ
+碉 0 ㄉㄧㄠ
+叼 0 ㄉㄧㄠ
+彫 0 ㄉㄧㄠ
+瞗 0 ㄉㄧㄠ
+琱 0 ㄉㄧㄠ
+鯛 0 ㄉㄧㄠ
+扚 0 ㄉㄧㄠ
+蛁 0 ㄉㄧㄠ
+鳭 0 ㄉㄧㄠ
+虭 0 ㄉㄧㄠ
+殦 0 ㄉㄧㄠ
+蜩 0 ㄉㄧㄠ
+錭 0 ㄉㄧㄠ
+刟 0 ㄉㄧㄠ
+奝 0 ㄉㄧㄠ
+弴 0 ㄉㄧㄠ
+鮉 0 ㄉㄧㄠ
+鼦 0 ㄉㄧㄠ
+屌 0 ㄉㄧㄠˇ
+鳥 0 ㄉㄧㄠˇ
+扚 0 ㄉㄧㄠˇ
+調 0 ㄉㄧㄠˋ
+掉 0 ㄉㄧㄠˋ
+釣 0 ㄉㄧㄠˋ
+吊 0 ㄉㄧㄠˋ
+弔 0 ㄉㄧㄠˋ
+窵 0 ㄉㄧㄠˋ
+蓧 0 ㄉㄧㄠˋ
+誂 0 ㄉㄧㄠˋ
+伄 0 ㄉㄧㄠˋ
+魡 0 ㄉㄧㄠˋ
+悼 0 ㄉㄧㄠˋ
+帣 0 ㄉㄧㄠˋ
+淖 0 ㄉㄧㄠˋ
+銚 0 ㄉㄧㄠˋ
+藋 0 ㄉㄧㄠˋ
+訋 0 ㄉㄧㄠˋ
+莜 0 ㄉㄧㄠˋ
+銱 0 ㄉㄧㄠˋ
+鋽 0 ㄉㄧㄠˋ
+鑃 0 ㄉㄧㄠˋ
+㪕 0 ㄉㄧㄠˋ
+竨 0 ㄉㄧㄠˋ
+瘹 0 ㄉㄧㄠˋ
+鈟 0 ㄉㄧㄠˋ
+ˇ 0 ˇ
+爾 0 ㄦˇ
+耳 0 ㄦˇ
+洱 0 ㄦˇ
+餌 0 ㄦˇ
+邇 0 ㄦˇ
+珥 0 ㄦˇ
+駬 0 ㄦˇ
+薾 0 ㄦˇ
+鉺 0 ㄦˇ
+峏 0 ㄦˇ
+尒 0 ㄦˇ
+栮 0 ㄦˇ
+茸 0 ㄦˇ
+尔 0 ㄦˇ
+迩 0 ㄦˇ
+儞 0 ㄦˇ
+尓 0 ㄦˇ
+ˋ 0 ˋ
+二 0 ㄦˋ
+貳 0 ㄦˋ
+佴 0 ㄦˋ
+刵 0 ㄦˋ
+咡 0 ㄦˋ
+樲 0 ㄦˋ
+聏 0 ㄦˋ
+毦 0 ㄦˋ
+眲 0 ㄦˋ
+衈 0 ㄦˋ
+鉺 0 ㄦˋ
+弍 0 ㄦˋ
+㛅 0 ㄦˋ
+貮 0 ㄦˋ
+誀 0 ㄦˋ
+之 0 ㄓ
+知 0 ㄓ
+隻 0 ㄓ
+織 0 ㄓ
+支 0 ㄓ
+枝 0 ㄓ
+汁 0 ㄓ
+只 0 ㄓ
+吱 0 ㄓ
+芝 0 ㄓ
+脂 0 ㄓ
+肢 0 ㄓ
+蜘 0 ㄓ
+祇 0 ㄓ
+梔 0 ㄓ
+祗 0 ㄓ
+氏 0 ㄓ
+枳 0 ㄓ
+ㄓ 0 ㄓ
+胝 0 ㄓ
+鴟 0 ㄓ
+卮 0 ㄓ
+搘 0 ㄓ
+秖 0 ㄓ
+跖 0 ㄓ
+鳷 0 ㄓ
+汥 0 ㄓ
+秪 0 ㄓ
+榰 0 ㄓ
+胑 0 ㄓ
+衼 0 ㄓ
+椥 0 ㄓ
+氐 0 ㄓ
+芰 0 ㄓ
+衹 0 ㄓ
+庋 0 ㄓ
+疧 0 ㄓ
+栺 0 ㄓ
+鬾 0 ㄓ
+謢 0 ㄓ
+攵 0 ㄓ
+巵 0 ㄓ
+栀 0 ㄓ
+秓 0 ㄓ
+祬 0 ㄓ
+綕 0 ㄓ
+馶 0 ㄓ
+㯄 0 ㄓ
+鼅 0 ㄓ
+倁 0 ㄓ
+疷 0 ㄓ
+鴲 0 ㄓ
+周 0 ㄓㄡ
+週 0 ㄓㄡ
+州 0 ㄓㄡ
+洲 0 ㄓㄡ
+舟 0 ㄓㄡ
+粥 0 ㄓㄡ
+賙 0 ㄓㄡ
+啁 0 ㄓㄡ
+盩 0 ㄓㄡ
+譸 0 ㄓㄡ
+輈 0 ㄓㄡ
+喌 0 ㄓㄡ
+騆 0 ㄓㄡ
+鵃 0 ㄓㄡ
+洀 0 ㄓㄡ
+淍 0 ㄓㄡ
+銂 0 ㄓㄡ
+珘 0 ㄓㄡ
+徟 0 ㄓㄡ
+輖 0 ㄓㄡ
+侜 0 ㄓㄡ
+婤 0 ㄓㄡ
+倜 0 ㄓㄡ
+睭 0 ㄓㄡ
+詶 0 ㄓㄡ
+㖄 0 ㄓㄡ
+烐 0 ㄓㄡ
+郮 0 ㄓㄡ
+䓟 0 ㄓㄡ
+霌 0 ㄓㄡ
+矪 0 ㄓㄡ
+嚋 0 ㄓㄡ
+帚 0 ㄓㄡˇ
+肘 0 ㄓㄡˇ
+睭 0 ㄓㄡˇ
+鯞 0 ㄓㄡˇ
+疛 0 ㄓㄡˇ
+晭 0 ㄓㄡˇ
+箒 0 ㄓㄡˇ
+晝 0 ㄓㄡˋ
+皺 0 ㄓㄡˋ
+宙 0 ㄓㄡˋ
+紂 0 ㄓㄡˋ
+縐 0 ㄓㄡˋ
+冑 0 ㄓㄡˋ
+咒 0 ㄓㄡˋ
+繇 0 ㄓㄡˋ
+甃 0 ㄓㄡˋ
+籀 0 ㄓㄡˋ
+咮 0 ㄓㄡˋ
+酎 0 ㄓㄡˋ
+僽 0 ㄓㄡˋ
+怞 0 ㄓㄡˋ
+胄 0 ㄓㄡˋ
+噣 0 ㄓㄡˋ
+駎 0 ㄓㄡˋ
+軸 0 ㄓㄡˋ
+伷 0 ㄓㄡˋ
+呪 0 ㄓㄡˋ
+昼 0 ㄓㄡˋ
+詋 0 ㄓㄡˋ
+葤 0 ㄓㄡˋ
+籕 0 ㄓㄡˋ
+㑳 0 ㄓㄡˋ
+籒 0 ㄓㄡˋ
+軸 0 ㄓㄡˊ
+妯 0 ㄓㄡˊ
+岫 0 ㄓㄡˊ
+舳 0 ㄓㄡˊ
+爭 0 ㄓㄥ
+征 0 ㄓㄥ
+蒸 0 ㄓㄥ
+睜 0 ㄓㄥ
+徵 0 ㄓㄥ
+掙 0 ㄓㄥ
+箏 0 ㄓㄥ
+正 0 ㄓㄥ
+怔 0 ㄓㄥ
+猙 0 ㄓㄥ
+錚 0 ㄓㄥ
+崢 0 ㄓㄥ
+諍 0 ㄓㄥ
+癥 0 ㄓㄥ
+鉦 0 ㄓㄥ
+烝 0 ㄓㄥ
+篜 0 ㄓㄥ
+姃 0 ㄓㄥ
+炡 0 ㄓㄥ
+埩 0 ㄓㄥ
+聇 0 ㄓㄥ
+丁 0 ㄓㄥ
+眐 0 ㄓㄥ
+鯖 0 ㄓㄥ
+玎 0 ㄓㄥ
+糽 0 ㄓㄥ
+凈 0 ㄓㄥ
+脀 0 ㄓㄥ
+棦 0 ㄓㄥ
+琤 0 ㄓㄥ
+澂 0 ㄓㄥ
+㣔 0 ㄓㄥ
+争 0 ㄓㄥ
+佂 0 ㄓㄥ
+峥 0 ㄓㄥ
+䒱 0 ㄓㄥ
+䋊 0 ㄓㄥ
+徴 0 ㄓㄥ
+鴊 0 ㄓㄥ
+瀓 0 ㄓㄥ
+鬇 0 ㄓㄥ
+鏳 0 ㄓㄥ
+𡈼 0 ㄓㄥ
+挣 0 ㄓㄥ
+睁 0 ㄓㄥ
+㬹 0 ㄓㄥ
+𨜓 0 ㄓㄥ
+徰 0 ㄓㄥ
+整 0 ㄓㄥˇ
+拯 0 ㄓㄥˇ
+氶 0 ㄓㄥˇ
+撜 0 ㄓㄥˇ
+糽 0 ㄓㄥˇ
+掟 0 ㄓㄥˇ
+晸 0 ㄓㄥˇ
+抍 0 ㄓㄥˇ
+愸 0 ㄓㄥˇ
+鄭 0 ㄓㄥˋ
+正 0 ㄓㄥˋ
+證 0 ㄓㄥˋ
+政 0 ㄓㄥˋ
+証 0 ㄓㄥˋ
+症 0 ㄓㄥˋ
+掙 0 ㄓㄥˋ
+幀 0 ㄓㄥˋ
+諍 0 ㄓㄥˋ
+姃 0 ㄓㄥˋ
+炡 0 ㄓㄥˋ
+眐 0 ㄓㄥˋ
+罡 0 ㄓㄥˋ
+聇 0 ㄓㄥˋ
+晸 0 ㄓㄥˋ
+徎 0 ㄓㄥˋ
+憕 0 ㄓㄥˋ
+鋥 0 ㄓㄥˋ
+鴊 0 ㄓㄥˋ
+挣 0 ㄓㄥˋ
+䂻 0 ㄓㄥˋ
+䈣 0 ㄓㄥˋ
+㡧 0 ㄓㄥˋ
+𩏠 0 ㄓㄥˋ
+張 0 ㄓㄤ
+章 0 ㄓㄤ
+彰 0 ㄓㄤ
+漳 0 ㄓㄤ
+樟 0 ㄓㄤ
+璋 0 ㄓㄤ
+獐 0 ㄓㄤ
+嫜 0 ㄓㄤ
+暲 0 ㄓㄤ
+鄣 0 ㄓㄤ
+蟑 0 ㄓㄤ
+鱆 0 ㄓㄤ
+慞 0 ㄓㄤ
+傽 0 ㄓㄤ
+墇 0 ㄓㄤ
+騿 0 ㄓㄤ
+遧 0 ㄓㄤ
+粻 0 ㄓㄤ
+蔁 0 ㄓㄤ
+麞 0 ㄓㄤ
+𢕎 0 ㄓㄤ
+𢕔 0 ㄓㄤ
+餦 0 ㄓㄤ
+長 0 ㄓㄤˇ
+掌 0 ㄓㄤˇ
+漲 0 ㄓㄤˇ
+仉 0 ㄓㄤˇ
+鞝 0 ㄓㄤˇ
+仧 0 ㄓㄤˇ
+涱 0 ㄓㄤˇ
+兏 0 ㄓㄤˇ
+镸 0 ㄓㄤˇ
+丈 0 ㄓㄤˋ
+仗 0 ㄓㄤˋ
+帳 0 ㄓㄤˋ
+障 0 ㄓㄤˋ
+賬 0 ㄓㄤˋ
+脹 0 ㄓㄤˋ
+杖 0 ㄓㄤˋ
+漲 0 ㄓㄤˋ
+長 0 ㄓㄤˋ
+幛 0 ㄓㄤˋ
+瘴 0 ㄓㄤˋ
+嶂 0 ㄓㄤˋ
+扙 0 ㄓㄤˋ
+瞕 0 ㄓㄤˋ
+粀 0 ㄓㄤˋ
+張 0 ㄓㄤˋ
+悵 0 ㄓㄤˋ
+仧 0 ㄓㄤˋ
+涱 0 ㄓㄤˋ
+痮 0 ㄓㄤˋ
+瘬 0 ㄓㄤˋ
+兏 0 ㄓㄤˋ
+镸 0 ㄓㄤˋ
+𢕔 0 ㄓㄤˋ
+詹 0 ㄓㄢ
+沾 0 ㄓㄢ
+瞻 0 ㄓㄢ
+氈 0 ㄓㄢ
+霑 0 ㄓㄢ
+旃 0 ㄓㄢ
+譫 0 ㄓㄢ
+鱣 0 ㄓㄢ
+覘 0 ㄓㄢ
+邅 0 ㄓㄢ
+栴 0 ㄓㄢ
+鸇 0 ㄓㄢ
+驙 0 ㄓㄢ
+占 0 ㄓㄢ
+呫 0 ㄓㄢ
+饘 0 ㄓㄢ
+鉆 0 ㄓㄢ
+詀 0 ㄓㄢ
+薝 0 ㄓㄢ
+譠 0 ㄓㄢ
+佔 0 ㄓㄢ
+玷 0 ㄓㄢ
+贍 0 ㄓㄢ
+怗 0 ㄓㄢ
+枮 0 ㄓㄢ
+粘 0 ㄓㄢ
+蛅 0 ㄓㄢ
+惉 0 ㄓㄢ
+颭 0 ㄓㄢ
+幨 0 ㄓㄢ
+餰 0 ㄓㄢ
+襜 0 ㄓㄢ
+魙 0 ㄓㄢ
+毡 0 ㄓㄢ
+趈 0 ㄓㄢ
+閚 0 ㄓㄢ
+噡 0 ㄓㄢ
+嶦 0 ㄓㄢ
+氊 0 ㄓㄢ
+旜 0 ㄓㄢ
+讝 0 ㄓㄢ
+厃 0 ㄓㄢ
+展 0 ㄓㄢˇ
+斬 0 ㄓㄢˇ
+盞 0 ㄓㄢˇ
+輾 0 ㄓㄢˇ
+搌 0 ㄓㄢˇ
+嶄 0 ㄓㄢˇ
+琖 0 ㄓㄢˇ
+魙 0 ㄓㄢˇ
+醆 0 ㄓㄢˇ
+颭 0 ㄓㄢˇ
+樿 0 ㄓㄢˇ
+皽 0 ㄓㄢˇ
+蹍 0 ㄓㄢˇ
+嫸 0 ㄓㄢˇ
+榐 0 ㄓㄢˇ
+橏 0 ㄓㄢˇ
+獑 0 ㄓㄢˇ
+槧 0 ㄓㄢˇ
+㠭 0 ㄓㄢˇ
+㜊 0 ㄓㄢˇ
+㔊 0 ㄓㄢˇ
+𨃨 0 ㄓㄢˇ
+𧬆 0 ㄓㄢˇ
+佔 0 ㄓㄢˋ
+戰 0 ㄓㄢˋ
+站 0 ㄓㄢˋ
+暫 0 ㄓㄢˋ
+占 0 ㄓㄢˋ
+棧 0 ㄓㄢˋ
+顫 0 ㄓㄢˋ
+湛 0 ㄓㄢˋ
+綻 0 ㄓㄢˋ
+蹔 0 ㄓㄢˋ
+蘸 0 ㄓㄢˋ
+虥 0 ㄓㄢˋ
+轏 0 ㄓㄢˋ
+輚 0 ㄓㄢˋ
+偡 0 ㄓㄢˋ
+襢 0 ㄓㄢˋ
+枮 0 ㄓㄢˋ
+迠 0 ㄓㄢˋ
+蛅 0 ㄓㄢˋ
+鉆 0 ㄓㄢˋ
+辴 0 ㄓㄢˋ
+譧 0 ㄓㄢˋ
+驏 0 ㄓㄢˋ
+战 0 ㄓㄢˋ
+䋎 0 ㄓㄢˋ
+菚 0 ㄓㄢˋ
+椾 0 ㄓㄢˋ
+碊 0 ㄓㄢˋ
+嶘 0 ㄓㄢˋ
+覱 0 ㄓㄢˋ
+戦 0 ㄓㄢˋ
+𩥇 0 ㄓㄢˋ
+虦 0 ㄓㄢˋ
+只 0 ㄓˇ
+指 0 ㄓˇ
+紙 0 ㄓˇ
+止 0 ㄓˇ
+旨 0 ㄓˇ
+址 0 ㄓˇ
+徵 0 ㄓˇ
+祇 0 ㄓˇ
+趾 0 ㄓˇ
+祉 0 ㄓˇ
+咫 0 ㄓˇ
+枳 0 ㄓˇ
+酯 0 ㄓˇ
+恉 0 ㄓˇ
+沚 0 ㄓˇ
+阯 0 ㄓˇ
+芷 0 ㄓˇ
+黹 0 ㄓˇ
+軹 0 ㄓˇ
+疻 0 ㄓˇ
+晊 0 ㄓˇ
+厎 0 ㄓˇ
+坁 0 ㄓˇ
+藢 0 ㄓˇ
+栺 0 ㄓˇ
+淽 0 ㄓˇ
+滍 0 ㄓˇ
+抵 0 ㄓˇ
+砥 0 ㄓˇ
+詣 0 ㄓˇ
+忯 0 ㄓˇ
+扺 0 ㄓˇ
+汦 0 ㄓˇ
+秖 0 ㄓˇ
+蚚 0 ㄓˇ
+軝 0 ㄓˇ
+鮨 0 ㄓˇ
+夂 0 ㄓˇ
+帋 0 ㄓˇ
+抧 0 ㄓˇ
+拞 0 ㄓˇ
+杫 0 ㄓˇ
+砋 0 ㄓˇ
+䇛 0 ㄓˇ
+祬 0 ㄓˇ
+茝 0 ㄓˇ
+訨 0 ㄓˇ
+筫 0 ㄓˇ
+徴 0 ㄓˇ
+襧 0 ㄓˇ
+劧 0 ㄓˇ
+至 0 ㄓˋ
+制 0 ㄓˋ
+治 0 ㄓˋ
+志 0 ㄓˋ
+製 0 ㄓˋ
+致 0 ㄓˋ
+置 0 ㄓˋ
+智 0 ㄓˋ
+秩 0 ㄓˋ
+誌 0 ㄓˋ
+稚 0 ㄓˋ
+質 0 ㄓˋ
+峙 0 ㄓˋ
+緻 0 ㄓˋ
+幟 0 ㄓˋ
+滯 0 ㄓˋ
+摯 0 ㄓˋ
+窒 0 ㄓˋ
+炙 0 ㄓˋ
+痔 0 ㄓˋ
+雉 0 ㄓˋ
+識 0 ㄓˋ
+懥 0 ㄓˋ
+痣 0 ㄓˋ
+輊 0 ㄓˋ
+騭 0 ㄓˋ
+帙 0 ㄓˋ
+陟 0 ㄓˋ
+知 0 ㄓˋ
+寘 0 ㄓˋ
+忮 0 ㄓˋ
+桎 0 ㄓˋ
+躓 0 ㄓˋ
+蛭 0 ㄓˋ
+贄 0 ㄓˋ
+鷙 0 ㄓˋ
+厔 0 ㄓˋ
+鑕 0 ㄓˋ
+豸 0 ㄓˋ
+庤 0 ㄓˋ
+彘 0 ㄓˋ
+猘 0 ㄓˋ
+畤 0 ㄓˋ
+疐 0 ㄓˋ
+紩 0 ㄓˋ
+觶 0 ㄓˋ
+郅 0 ㄓˋ
+銍 0 ㄓˋ
+偫 0 ㄓˋ
+跱 0 ㄓˋ
+遰 0 ㄓˋ
+鋕 0 ㄓˋ
+櫍 0 ㄓˋ
+袟 0 ㄓˋ
+騺 0 ㄓˋ
+淛 0 ㄓˋ
+狾 0 ㄓˋ
+胵 0 ㄓˋ
+膣 0 ㄓˋ
+挃 0 ㄓˋ
+洷 0 ㄓˋ
+覟 0 ㄓˋ
+庢 0 ㄓˋ
+鴙 0 ㄓˋ
+迣 0 ㄓˋ
+翐 0 ㄓˋ
+臸 0 ㄓˋ
+駤 0 ㄓˋ
+祑 0 ㄓˋ
+觢 0 ㄓˋ
+鴩 0 ㄓˋ
+灸 0 ㄓˋ
+值 0 ㄓˋ
+掣 0 ㄓˋ
+絰 0 ㄓˋ
+耋 0 ㄓˋ
+熾 0 ㄓˋ
+遲 0 ㄓˋ
+伿 0 ㄓˋ
+咥 0 ㄓˋ
+垤 0 ㄓˋ
+晊 0 ㄓˋ
+罝 0 ㄓˋ
+荎 0 ㄓˋ
+秷 0 ㄓˋ
+窐 0 ㄓˋ
+廌 0 ㄓˋ
+滍 0 ㄓˋ
+瘈 0 ㄓˋ
+嬂 0 ㄓˋ
+潪 0 ㄓˋ
+薙 0 ㄓˋ
+懫 0 ㄓˋ
+垁 0 ㄓˋ
+斦 0 ㄓˋ
+洔 0 ㄓˋ
+値 0 ㄓˋ
+娡 0 ㄓˋ
+徏 0 ㄓˋ
+耊 0 ㄓˋ
+秲 0 ㄓˋ
+袠 0 ㄓˋ
+貭 0 ㄓˋ
+赿 0 ㄓˋ
+崻 0 ㄓˋ
+搱 0 ㄓˋ
+筫 0 ㄓˋ
+腟 0 ㄓˋ
+遅 0 ㄓˋ
+遟 0 ㄓˋ
+熫 0 ㄓˋ
+㻰 0 ㄓˋ
+稺 0 ㄓˋ
+儨 0 ㄓˋ
+穉 0 ㄓˋ
+隲 0 ㄓˋ
+豑 0 ㄓˋ
+芖 0 ㄓˋ
+徝 0 ㄓˋ
+㨁 0 ㄓˋ
+觗 0 ㄓˋ
+㨖 0 ㄓˋ
+䎺 0 ㄓˋ
+旘 0 ㄓˋ
+璏 0 ㄓˋ
+䭁 0 ㄓˋ
+劕 0 ㄓˋ
+𨑨 0 ㄓˋ
+𢙺 0 ㄓˋ
+𡍶 0 ㄓˋ
+𢕞 0 ㄓˋ
+憄 0 ㄓˋ
+𦤹 0 ㄓˋ
+驇 0 ㄓˋ
+直 0 ㄓˊ
+職 0 ㄓˊ
+質 0 ㄓˊ
+值 0 ㄓˊ
+植 0 ㄓˊ
+執 0 ㄓˊ
+殖 0 ㄓˊ
+擲 0 ㄓˊ
+姪 0 ㄓˊ
+侄 0 ㄓˊ
+蹠 0 ㄓˊ
+蟄 0 ㄓˊ
+躑 0 ㄓˊ
+埴 0 ㄓˊ
+稙 0 ㄓˊ
+摭 0 ㄓˊ
+縶 0 ㄓˊ
+柣 0 ㄓˊ
+犆 0 ㄓˊ
+秷 0 ㄓˊ
+擿 0 ㄓˊ
+馽 0 ㄓˊ
+慹 0 ㄓˊ
+樴 0 ㄓˊ
+膱 0 ㄓˊ
+懫 0 ㄓˊ
+蟙 0 ㄓˊ
+褁 0 ㄓˊ
+瓡 0 ㄓˊ
+嬂 0 ㄓˊ
+蘵 0 ㄓˊ
+拓 0 ㄓˊ
+蛭 0 ㄓˊ
+戢 0 ㄓˊ
+摯 0 ㄓˊ
+躓 0 ㄓˊ
+挃 0 ㄓˊ
+烢 0 ㄓˊ
+跖 0 ㄓˊ
+戠 0 ㄓˊ
+蓻 0 ㄓˊ
+謺 0 ㄓˊ
+贄 0 ㄓˊ
+蹢 0 ㄓˊ
+櫍 0 ㄓˊ
+礩 0 ㄓˊ
+騺 0 ㄓˊ
+鷙 0 ㄓˊ
+鑕 0 ㄓˊ
+执 0 ㄓˊ
+坧 0 ㄓˊ
+妷 0 ㄓˊ
+値 0 ㄓˊ
+聀 0 ㄓˊ
+釞 0 ㄓˊ
+貭 0 ㄓˊ
+禃 0 ㄓˊ
+綕 0 ㄓˊ
+墌 0 ㄓˊ
+漐 0 ㄓˊ
+𡸜 0 ㄓˊ
+㨁 0 ㄓˊ
+瓆 0 ㄓˊ
+軄 0 ㄓˊ
+豴 0 ㄓˊ
+渣 0 ㄓㄚ
+扎 0 ㄓㄚ
+喳 0 ㄓㄚ
+楂 0 ㄓㄚ
+查 0 ㄓㄚ
+齇 0 ㄓㄚ
+柤 0 ㄓㄚ
+皻 0 ㄓㄚ
+抯 0 ㄓㄚ
+挓 0 ㄓㄚ
+樝 0 ㄓㄚ
+謯 0 ㄓㄚ
+眨 0 ㄓㄚ
+奓 0 ㄓㄚ
+觰 0 ㄓㄚ
+譇 0 ㄓㄚ
+査 0 ㄓㄚ
+揸 0 ㄓㄚ
+偧 0 ㄓㄚ
+摣 0 ㄓㄚ
+齄 0 ㄓㄚ
+眨 0 ㄓㄚˇ
+渣 0 ㄓㄚˇ
+鮓 0 ㄓㄚˇ
+厏 0 ㄓㄚˇ
+苲 0 ㄓㄚˇ
+扎 0 ㄓㄚˇ
+砟 0 ㄓㄚˇ
+詐 0 ㄓㄚˇ
+扠 0 ㄓㄚˇ
+搩 0 ㄓㄚˇ
+䕢 0 ㄓㄚˇ
+㴙 0 ㄓㄚˇ
+䃎 0 ㄓㄚˇ
+踷 0 ㄓㄚˇ
+榨 0 ㄓㄚˋ
+柵 0 ㄓㄚˋ
+炸 0 ㄓㄚˋ
+詐 0 ㄓㄚˋ
+乍 0 ㄓㄚˋ
+搾 0 ㄓㄚˋ
+蚱 0 ㄓㄚˋ
+咋 0 ㄓㄚˋ
+蜡 0 ㄓㄚˋ
+吒 0 ㄓㄚˋ
+溠 0 ㄓㄚˋ
+砟 0 ㄓㄚˋ
+醡 0 ㄓㄚˋ
+鮓 0 ㄓㄚˋ
+痄 0 ㄓㄚˋ
+簎 0 ㄓㄚˋ
+笮 0 ㄓㄚˋ
+閘 0 ㄓㄚˋ
+酢 0 ㄓㄚˋ
+灹 0 ㄓㄚˋ
+咤 0 ㄓㄚˋ
+栅 0 ㄓㄚˋ
+䄍 0 ㄓㄚˋ
+齚 0 ㄓㄚˋ
+宱 0 ㄓㄚˋ
+䖳 0 ㄓㄚˋ
+𢕮 0 ㄓㄚˋ
+𧨊 0 ㄓㄚˋ
+扎 0 ㄓㄚˊ
+札 0 ㄓㄚˊ
+紮 0 ㄓㄚˊ
+閘 0 ㄓㄚˊ
+炸 0 ㄓㄚˊ
+霅 0 ㄓㄚˊ
+鍘 0 ㄓㄚˊ
+哳 0 ㄓㄚˊ
+劄 0 ㄓㄚˊ
+蚻 0 ㄓㄚˊ
+譗 0 ㄓㄚˊ
+蠿 0 ㄓㄚˊ
+癿 0 ㄓㄚˊ
+煠 0 ㄓㄚˊ
+紥 0 ㄓㄚˊ
+剳 0 ㄓㄚˊ
+牐 0 ㄓㄚˊ
+耫 0 ㄓㄚˊ
+𨰉 0 ㄓㄚˊ
+軋 0 ㄓㄚˊ
+蚱 0 ㄓㄚ˙
+摘 0 ㄓㄞ
+齋 0 ㄓㄞ
+齊 0 ㄓㄞ
+捚 0 ㄓㄞ
+霽 0 ㄓㄞ
+齐 0 ㄓㄞ
+亝 0 ㄓㄞ
+斉 0 ㄓㄞ
+夈 0 ㄓㄞ
+斋 0 ㄓㄞ
+斎 0 ㄓㄞ
+膪 0 ㄓㄞ
+䔝 0 ㄓㄞ
+斊 0 ㄓㄞ
+榸 0 ㄓㄞ
+𩱳 0 ㄓㄞ
+窄 0 ㄓㄞˇ
+岝 0 ㄓㄞˇ
+鉙 0 ㄓㄞˇ
+䍉 0 ㄓㄞˇ
+債 0 ㄓㄞˋ
+寨 0 ㄓㄞˋ
+祭 0 ㄓㄞˋ
+責 0 ㄓㄞˋ
+瘵 0 ㄓㄞˋ
+砦 0 ㄓㄞˋ
+柴 0 ㄓㄞˋ
+宅 0 ㄓㄞˊ
+翟 0 ㄓㄞˊ
+擇 0 ㄓㄞˊ
+垞 0 ㄓㄞˊ
+挓 0 ㄓㄞˊ
+烢 0 ㄓㄞˊ
+択 0 ㄓㄞˊ
+珠 0 ㄓㄨ
+朱 0 ㄓㄨ
+諸 0 ㄓㄨ
+株 0 ㄓㄨ
+豬 0 ㄓㄨ
+蛛 0 ㄓㄨ
+茱 0 ㄓㄨ
+硃 0 ㄓㄨ
+誅 0 ㄓㄨ
+銖 0 ㄓㄨ
+侏 0 ㄓㄨ
+洙 0 ㄓㄨ
+瀦 0 ㄓㄨ
+邾 0 ㄓㄨ
+櫫 0 ㄓㄨ
+櫧 0 ㄓㄨ
+祩 0 ㄓㄨ
+藷 0 ㄓㄨ
+絑 0 ㄓㄨ
+袾 0 ㄓㄨ
+觰 0 ㄓㄨ
+鴸 0 ㄓㄨ
+蠩 0 ㄓㄨ
+蝫 0 ㄓㄨ
+鮢 0 ㄓㄨ
+跦 0 ㄓㄨ
+姝 0 ㄓㄨ
+㧣 0 ㄓㄨ
+猪 0 ㄓㄨ
+敱 0 ㄓㄨ
+潴 0 ㄓㄨ
+駯 0 ㄓㄨ
+鼄 0 ㄓㄨ
+劯 0 ㄓㄨ
+橥 0 ㄓㄨ
+蕏 0 ㄓㄨ
+鯺 0 ㄓㄨ
+中 0 ㄓㄨㄥ
+鐘 0 ㄓㄨㄥ
+終 0 ㄓㄨㄥ
+忠 0 ㄓㄨㄥ
+鍾 0 ㄓㄨㄥ
+衷 0 ㄓㄨㄥ
+忪 0 ㄓㄨㄥ
+盅 0 ㄓㄨㄥ
+螽 0 ㄓㄨㄥ
+伀 0 ㄓㄨㄥ
+妐 0 ㄓㄨㄥ
+蔠 0 ㄓㄨㄥ
+柊 0 ㄓㄨㄥ
+煄 0 ㄓㄨㄥ
+彸 0 ㄓㄨㄥ
+舯 0 ㄓㄨㄥ
+炂 0 ㄓㄨㄥ
+籦 0 ㄓㄨㄥ
+鼨 0 ㄓㄨㄥ
+汷 0 ㄓㄨㄥ
+刣 0 ㄓㄨㄥ
+㕬 0 ㄓㄨㄥ
+泈 0 ㄓㄨㄥ
+衳 0 ㄓㄨㄥ
+幒 0 ㄓㄨㄥ
+徸 0 ㄓㄨㄥ
+銿 0 ㄓㄨㄥ
+鴤 0 ㄓㄨㄥ
+𦬕 0 ㄓㄨㄥ
+蹱 0 ㄓㄨㄥ
+𩅞 0 ㄓㄨㄥ
+種 0 ㄓㄨㄥˇ
+腫 0 ㄓㄨㄥˇ
+塚 0 ㄓㄨㄥˇ
+踵 0 ㄓㄨㄥˇ
+冢 0 ㄓㄨㄥˇ
+种 0 ㄓㄨㄥˇ
+喠 0 ㄓㄨㄥˇ
+歱 0 ㄓㄨㄥˇ
+中 0 ㄓㄨㄥˋ
+種 0 ㄓㄨㄥˋ
+重 0 ㄓㄨㄥˋ
+仲 0 ㄓㄨㄥˋ
+眾 0 ㄓㄨㄥˋ
+尰 0 ㄓㄨㄥˋ
+湩 0 ㄓㄨㄥˋ
+狆 0 ㄓㄨㄥˋ
+衶 0 ㄓㄨㄥˋ
+偅 0 ㄓㄨㄥˋ
+堹 0 ㄓㄨㄥˋ
+緟 0 ㄓㄨㄥˋ
+粽 0 ㄓㄨㄥˋ
+祌 0 ㄓㄨㄥˋ
+种 0 ㄓㄨㄥˋ
+潀 0 ㄓㄨㄥˋ
+众 0 ㄓㄨㄥˋ
+蚛 0 ㄓㄨㄥˋ
+媑 0 ㄓㄨㄥˋ
+筗 0 ㄓㄨㄥˋ
+衆 0 ㄓㄨㄥˋ
+糉 0 ㄓㄨㄥˋ
+諥 0 ㄓㄨㄥˋ
+灇 0 ㄓㄨㄥˋ
+乑 0 ㄓㄨㄥˋ
+妕 0 ㄓㄨㄥˋ
+茽 0 ㄓㄨㄥˋ
+潨 0 ㄓㄨㄥˋ
+褈 0 ㄓㄨㄥˋ
+裝 0 ㄓㄨㄤ
+莊 0 ㄓㄨㄤ
+樁 0 ㄓㄨㄤ
+妝 0 ㄓㄨㄤ
+粧 0 ㄓㄨㄤ
+庄 0 ㄓㄨㄤ
+梉 0 ㄓㄨㄤ
+妀 0 ㄓㄨㄤ
+籹 0 ㄓㄨㄤ
+妆 0 ㄓㄨㄤ
+庒 0 ㄓㄨㄤ
+疞 0 ㄓㄨㄤ
+娤 0 ㄓㄨㄤ
+荘 0 ㄓㄨㄤ
+糚 0 ㄓㄨㄤ
+奘 0 ㄓㄨㄤˇ
+狀 0 ㄓㄨㄤˋ
+壯 0 ㄓㄨㄤˋ
+撞 0 ㄓㄨㄤˋ
+戇 0 ㄓㄨㄤˋ
+焋 0 ㄓㄨㄤˋ
+獞 0 ㄓㄨㄤˋ
+壮 0 ㄓㄨㄤˋ
+状 0 ㄓㄨㄤˋ
+壵 0 ㄓㄨㄤˋ
+漴 0 ㄓㄨㄤˋ
+戅 0 ㄓㄨㄤˋ
+專 0 ㄓㄨㄢ
+磚 0 ㄓㄨㄢ
+耑 0 ㄓㄨㄢ
+顓 0 ㄓㄨㄢ
+塼 0 ㄓㄨㄢ
+鄟 0 ㄓㄨㄢ
+鱄 0 ㄓㄨㄢ
+剸 0 ㄓㄨㄢ
+嫥 0 ㄓㄨㄢ
+瑼 0 ㄓㄨㄢ
+篿 0 ㄓㄨㄢ
+鷒 0 ㄓㄨㄢ
+膞 0 ㄓㄨㄢ
+蟤 0 ㄓㄨㄢ
+蓴 0 ㄓㄨㄢ
+蒓 0 ㄓㄨㄢ
+甎 0 ㄓㄨㄢ
+叀 0 ㄓㄨㄢ
+轉 0 ㄓㄨㄢˇ
+囀 0 ㄓㄨㄢˇ
+竱 0 ㄓㄨㄢˇ
+孨 0 ㄓㄨㄢˇ
+傳 0 ㄓㄨㄢˋ
+賺 0 ㄓㄨㄢˋ
+篆 0 ㄓㄨㄢˋ
+撰 0 ㄓㄨㄢˋ
+譔 0 ㄓㄨㄢˋ
+饌 0 ㄓㄨㄢˋ
+轉 0 ㄓㄨㄢˋ
+僎 0 ㄓㄨㄢˋ
+瑑 0 ㄓㄨㄢˋ
+縳 0 ㄓㄨㄢˋ
+腞 0 ㄓㄨㄢˋ
+篹 0 ㄓㄨㄢˋ
+蟤 0 ㄓㄨㄢˋ
+鐉 0 ㄓㄨㄢˋ
+灷 0 ㄓㄨㄢˋ
+堟 0 ㄓㄨㄢˋ
+瑃 0 ㄓㄨㄢˋ
+蒃 0 ㄓㄨㄢˋ
+襈 0 ㄓㄨㄢˋ
+籑 0 ㄓㄨㄢˋ
+主 0 ㄓㄨˇ
+屬 0 ㄓㄨˇ
+煮 0 ㄓㄨˇ
+囑 0 ㄓㄨˇ
+貯 0 ㄓㄨˇ
+渚 0 ㄓㄨˇ
+矚 0 ㄓㄨˇ
+著 0 ㄓㄨˇ
+麈 0 ㄓㄨˇ
+拄 0 ㄓㄨˇ
+瘃 0 ㄓㄨˇ
+砫 0 ㄓㄨˇ
+陼 0 ㄓㄨˇ
+孎 0 ㄓㄨˇ
+壴 0 ㄓㄨˇ
+罜 0 ㄓㄨˇ
+欘 0 ㄓㄨˇ
+泞 0 ㄓㄨˇ
+眝 0 ㄓㄨˇ
+枓 0 ㄓㄨˇ
+鬻 0 ㄓㄨˇ
+灟 0 ㄓㄨˇ
+蠾 0 ㄓㄨˇ
+丶 0 ㄓㄨˇ
+宔 0 ㄓㄨˇ
+俼 0 ㄓㄨˇ
+属 0 ㄓㄨˇ
+詝 0 ㄓㄨˇ
+煑 0 ㄓㄨˇ
+嘱 0 ㄓㄨˇ
+濐 0 ㄓㄨˇ
+瞩 0 ㄓㄨˇ
+𠰍 0 ㄓㄨˇ
+𪐴 0 ㄓㄨˇ
+住 0 ㄓㄨˋ
+著 0 ㄓㄨˋ
+助 0 ㄓㄨˋ
+注 0 ㄓㄨˋ
+祝 0 ㄓㄨˋ
+駐 0 ㄓㄨˋ
+註 0 ㄓㄨˋ
+柱 0 ㄓㄨˋ
+蛀 0 ㄓㄨˋ
+鑄 0 ㄓㄨˋ
+炷 0 ㄓㄨˋ
+苧 0 ㄓㄨˋ
+佇 0 ㄓㄨˋ
+箸 0 ㄓㄨˋ
+杼 0 ㄓㄨˋ
+紵 0 ㄓㄨˋ
+翥 0 ㄓㄨˋ
+宁 0 ㄓㄨˋ
+柷 0 ㄓㄨˋ
+羜 0 ㄓㄨˋ
+馵 0 ㄓㄨˋ
+疰 0 ㄓㄨˋ
+莇 0 ㄓㄨˋ
+鉒 0 ㄓㄨˋ
+紸 0 ㄓㄨˋ
+嵀 0 ㄓㄨˋ
+跓 0 ㄓㄨˋ
+軴 0 ㄓㄨˋ
+樦 0 ㄓㄨˋ
+麆 0 ㄓㄨˋ
+櫡 0 ㄓㄨˋ
+殶 0 ㄓㄨˋ
+諔 0 ㄓㄨˋ
+粥 0 ㄓㄨˋ
+芧 0 ㄓㄨˋ
+壴 0 ㄓㄨˋ
+怷 0 ㄓㄨˋ
+炾 0 ㄓㄨˋ
+眝 0 ㄓㄨˋ
+砫 0 ㄓㄨˋ
+罜 0 ㄓㄨˋ
+謯 0 ㄓㄨˋ
+鬻 0 ㄓㄨˋ
+宔 0 ㄓㄨˋ
+拀 0 ㄓㄨˋ
+俼 0 ㄓㄨˋ
+竚 0 ㄓㄨˋ
+着 0 ㄓㄨˋ
+筯 0 ㄓㄨˋ
+飳 0 ㄓㄨˋ
+嗻 0 ㄓㄨˋ
+鋳 0 ㄓㄨˋ
+霔 0 ㄓㄨˋ
+坾 0 ㄓㄨˋ
+竹 0 ㄓㄨˊ
+築 0 ㄓㄨˊ
+逐 0 ㄓㄨˊ
+燭 0 ㄓㄨˊ
+蠋 0 ㄓㄨˊ
+筑 0 ㄓㄨˊ
+竺 0 ㄓㄨˊ
+朮 0 ㄓㄨˊ
+躅 0 ㄓㄨˊ
+舳 0 ㄓㄨˊ
+軸 0 ㄓㄨˊ
+窋 0 ㄓㄨˊ
+蓫 0 ㄓㄨˊ
+笁 0 ㄓㄨˊ
+趉 0 ㄓㄨˊ
+鱁 0 ㄓㄨˊ
+灟 0 ㄓㄨˊ
+蠾 0 ㄓㄨˊ
+茿 0 ㄓㄨˊ
+篫 0 ㄓㄨˊ
+妯 0 ㄓㄨˊ
+柚 0 ㄓㄨˊ
+泏 0 ㄓㄨˊ
+瓨 0 ㄓㄨˊ
+怷 0 ㄓㄨˊ
+瘃 0 ㄓㄨˊ
+蒆 0 ㄓㄨˊ
+孎 0 ㄓㄨˊ
+斸 0 ㄓㄨˊ
+欘 0 ㄓㄨˊ
+术 0 ㄓㄨˊ
+炢 0 ㄓㄨˊ
+烛 0 ㄓㄨˊ
+劚 0 ㄓㄨˊ
+曯 0 ㄓㄨˊ
+爥 0 ㄓㄨˊ
+薥 0 ㄓㄨˊ
+䟉 0 ㄓㄨˊ
+𦸇 0 ㄓㄨˊ
+抓 0 ㄓㄨㄚ
+撾 0 ㄓㄨㄚ
+髽 0 ㄓㄨㄚ
+檛 0 ㄓㄨㄚ
+膼 0 ㄓㄨㄚ
+簻 0 ㄓㄨㄚ
+爪 0 ㄓㄨㄚˇ
+爫 0 ㄓㄨㄚˇ
+拽 0 ㄓㄨㄞ
+跩 0 ㄓㄨㄞˇ
+拽 0 ㄓㄨㄞˋ
+顡 0 ㄓㄨㄞˋ
+捉 0 ㄓㄨㄛ
+桌 0 ㄓㄨㄛ
+涿 0 ㄓㄨㄛ
+棹 0 ㄓㄨㄛ
+穛 0 ㄓㄨㄛ
+卓 0 ㄓㄨㄛ
+槕 0 ㄓㄨㄛ
+𥼚 0 ㄓㄨㄛ
+㑁 0 ㄓㄨㄛ
+㧳 0 ㄓㄨㄛˋ
+卓 0 ㄓㄨㄛˊ
+茁 0 ㄓㄨㄛˊ
+濁 0 ㄓㄨㄛˊ
+拙 0 ㄓㄨㄛˊ
+濯 0 ㄓㄨㄛˊ
+酌 0 ㄓㄨㄛˊ
+灼 0 ㄓㄨㄛˊ
+著 0 ㄓㄨㄛˊ
+啄 0 ㄓㄨㄛˊ
+鐲 0 ㄓㄨㄛˊ
+擢 0 ㄓㄨㄛˊ
+琢 0 ㄓㄨㄛˊ
+諑 0 ㄓㄨㄛˊ
+倬 0 ㄓㄨㄛˊ
+斲 0 ㄓㄨㄛˊ
+斮 0 ㄓㄨㄛˊ
+梲 0 ㄓㄨㄛˊ
+椓 0 ㄓㄨㄛˊ
+焯 0 ㄓㄨㄛˊ
+蝃 0 ㄓㄨㄛˊ
+踔 0 ㄓㄨㄛˊ
+鷟 0 ㄓㄨㄛˊ
+彴 0 ㄓㄨㄛˊ
+汋 0 ㄓㄨㄛˊ
+斫 0 ㄓㄨㄛˊ
+禚 0 ㄓㄨㄛˊ
+篧 0 ㄓㄨㄛˊ
+浞 0 ㄓㄨㄛˊ
+棳 0 ㄓㄨㄛˊ
+謶 0 ㄓㄨㄛˊ
+錣 0 ㄓㄨㄛˊ
+啅 0 ㄓㄨㄛˊ
+罬 0 ㄓㄨㄛˊ
+斀 0 ㄓㄨㄛˊ
+蠗 0 ㄓㄨㄛˊ
+圴 0 ㄓㄨㄛˊ
+剢 0 ㄓㄨㄛˊ
+灂 0 ㄓㄨㄛˊ
+涿 0 ㄓㄨㄛˊ
+絀 0 ㄓㄨㄛˊ
+黜 0 ㄓㄨㄛˊ
+繳 0 ㄓㄨㄛˊ
+胐 0 ㄓㄨㄛˊ
+婥 0 ㄓㄨㄛˊ
+烼 0 ㄓㄨㄛˊ
+腏 0 ㄓㄨㄛˊ
+詘 0 ㄓㄨㄛˊ
+畷 0 ㄓㄨㄛˊ
+噣 0 ㄓㄨㄛˊ
+嬥 0 ㄓㄨㄛˊ
+穛 0 ㄓㄨㄛˊ
+櫡 0 ㄓㄨㄛˊ
+籗 0 ㄓㄨㄛˊ
+鸐 0 ㄓㄨㄛˊ
+蠿 0 ㄓㄨㄛˊ
+叕 0 ㄓㄨㄛˊ
+坧 0 ㄓㄨㄛˊ
+妰 0 ㄓㄨㄛˊ
+泎 0 ㄓㄨㄛˊ
+炪 0 ㄓㄨㄛˊ
+娺 0 ㄓㄨㄛˊ
+棁 0 ㄓㄨㄛˊ
+烵 0 ㄓㄨㄛˊ
+着 0 ㄓㄨㄛˊ
+聉 0 ㄓㄨㄛˊ
+晫 0 ㄓㄨㄛˊ
+琸 0 ㄓㄨㄛˊ
+硺 0 ㄓㄨㄛˊ
+窡 0 ㄓㄨㄛˊ
+墌 0 ㄓㄨㄛˊ
+擆 0 ㄓㄨㄛˊ
+撯 0 ㄓㄨㄛˊ
+誳 0 ㄓㄨㄛˊ
+斵 0 ㄓㄨㄛˊ
+仢 0 ㄓㄨㄛˊ
+犳 0 ㄓㄨㄛˊ
+丵 0 ㄓㄨㄛˊ
+㧻 0 ㄓㄨㄛˊ
+䖦 0 ㄓㄨㄛˊ
+𢽴 0 ㄓㄨㄛˊ
+斱 0 ㄓㄨㄛˊ
+鉵 0 ㄓㄨㄛˊ
+劅 0 ㄓㄨㄛˊ
+䮓 0 ㄓㄨㄛˊ
+鐯 0 ㄓㄨㄛˊ
+𥇍 0 ㄓㄨㄛˊ
+𤏸 0 ㄓㄨㄛˊ
+𨧧 0 ㄓㄨㄛˊ
+𢂚 0 ㄓㄨㄛˊ
+追 0 ㄓㄨㄟ
+錐 0 ㄓㄨㄟ
+椎 0 ㄓㄨㄟ
+隹 0 ㄓㄨㄟ
+騅 0 ㄓㄨㄟ
+鵻 0 ㄓㄨㄟ
+腄 0 ㄓㄨㄟ
+鴭 0 ㄓㄨㄟ
+碓 0 ㄓㄨㄟ
+娺 0 ㄓㄨㄟ
+䳡 0 ㄓㄨㄟ
+沝 0 ㄓㄨㄟˇ
+綴 0 ㄓㄨㄟˋ
+墜 0 ㄓㄨㄟˋ
+贅 0 ㄓㄨㄟˋ
+縋 0 ㄓㄨㄟˋ
+惴 0 ㄓㄨㄟˋ
+餟 0 ㄓㄨㄟˋ
+硾 0 ㄓㄨㄟˋ
+膇 0 ㄓㄨㄟˋ
+鑆 0 ㄓㄨㄟˋ
+掇 0 ㄓㄨㄟˋ
+甀 0 ㄓㄨㄟˋ
+裰 0 ㄓㄨㄟˋ
+錣 0 ㄓㄨㄟˋ
+笍 0 ㄓㄨㄟˋ
+礈 0 ㄓㄨㄟˋ
+𠄌 0 ㄓㄨㄟˋ
+諄 0 ㄓㄨㄣ
+屯 0 ㄓㄨㄣ
+肫 0 ㄓㄨㄣ
+窀 0 ㄓㄨㄣ
+迍 0 ㄓㄨㄣ
+宒 0 ㄓㄨㄣ
+訰 0 ㄓㄨㄣ
+炖 0 ㄓㄨㄣ
+衠 0 ㄓㄨㄣ
+準 0 ㄓㄨㄣˇ
+准 0 ㄓㄨㄣˇ
+隼 0 ㄓㄨㄣˇ
+埻 0 ㄓㄨㄣˇ
+綧 0 ㄓㄨㄣˇ
+純 0 ㄓㄨㄣˇ
+凖 0 ㄓㄨㄣˇ
+鶽 0 ㄓㄨㄣˇ
+稕 0 ㄓㄨㄣˋ
+訰 0 ㄓㄨㄣˋ
+遮 0 ㄓㄜ
+螫 0 ㄓㄜ
+晢 0 ㄓㄜ
+嫬 0 ㄓㄜ
+折 0 ㄓㄜ
+嗻 0 ㄓㄜ
+者 0 ㄓㄜˇ
+赭 0 ㄓㄜˇ
+鍺 0 ㄓㄜˇ
+摺 0 ㄓㄜˇ
+遮 0 ㄓㄜˇ
+這 0 ㄓㄜˋ
+浙 0 ㄓㄜˋ
+蔗 0 ㄓㄜˋ
+鷓 0 ㄓㄜˋ
+柘 0 ㄓㄜˋ
+宅 0 ㄓㄜˋ
+檡 0 ㄓㄜˋ
+烢 0 ㄓㄜˋ
+蟅 0 ㄓㄜˋ
+挓 0 ㄓㄜˋ
+跖 0 ㄓㄜˋ
+这 0 ㄓㄜˋ
+嗻 0 ㄓㄜˋ
+樜 0 ㄓㄜˋ
+䗪 0 ㄓㄜˋ
+折 0 ㄓㄜˊ
+哲 0 ㄓㄜˊ
+摺 0 ㄓㄜˊ
+懾 0 ㄓㄜˊ
+褶 0 ㄓㄜˊ
+謫 0 ㄓㄜˊ
+輒 0 ㄓㄜˊ
+摘 0 ㄓㄜˊ
+轍 0 ㄓㄜˊ
+慴 0 ㄓㄜˊ
+蜇 0 ㄓㄜˊ
+磔 0 ㄓㄜˊ
+乇 0 ㄓㄜˊ
+讋 0 ㄓㄜˊ
+晢 0 ㄓㄜˊ
+鮿 0 ㄓㄜˊ
+耴 0 ㄓㄜˊ
+悊 0 ㄓㄜˊ
+砓 0 ㄓㄜˊ
+謺 0 ㄓㄜˊ
+虴 0 ㄓㄜˊ
+鸅 0 ㄓㄜˊ
+讘 0 ㄓㄜˊ
+瓋 0 ㄓㄜˊ
+浙 0 ㄓㄜˊ
+翟 0 ㄓㄜˊ
+鏑 0 ㄓㄜˊ
+囁 0 ㄓㄜˊ
+焎 0 ㄓㄜˊ
+皙 0 ㄓㄜˊ
+裚 0 ㄓㄜˊ
+馲 0 ㄓㄜˊ
+蟄 0 ㄓㄜˊ
+扸 0 ㄓㄜˊ
+籷 0 ㄓㄜˊ
+埑 0 ㄓㄜˊ
+晣 0 ㄓㄜˊ
+烲 0 ㄓㄜˊ
+喆 0 ㄓㄜˊ
+棏 0 ㄓㄜˊ
+輙 0 ㄓㄜˊ
+銸 0 ㄓㄜˊ
+嚞 0 ㄓㄜˊ
+礋 0 ㄓㄜˊ
+䕪 0 ㄓㄜˊ
+讁 0 ㄓㄜˊ
+厇 0 ㄓㄜˊ
+歽 0 ㄓㄜˊ
+啠 0 ㄓㄜˊ
+襵 0 ㄓㄜˊ
+著 0 ㄓㄜ˙
+遮 0 ㄓㄜ˙
+晢 0 ㄓㄜ˙
+嫬 0 ㄓㄜ˙
+着 0 ㄓㄜ˙
+朝 0 ㄓㄠ
+招 0 ㄓㄠ
+昭 0 ㄓㄠ
+召 0 ㄓㄠ
+著 0 ㄓㄠ
+嘲 0 ㄓㄠ
+釗 0 ㄓㄠ
+駋 0 ㄓㄠ
+鉊 0 ㄓㄠ
+晁 0 ㄓㄠ
+盄 0 ㄓㄠ
+鍣 0 ㄓㄠ
+妱 0 ㄓㄠ
+抓 0 ㄓㄠ
+迢 0 ㄓㄠ
+弨 0 ㄓㄠ
+怊 0 ㄓㄠ
+佋 0 ㄓㄠ
+巶 0 ㄓㄠ
+着 0 ㄓㄠ
+謿 0 ㄓㄠ
+窼 0 ㄓㄠ
+找 0 ㄓㄠˇ
+沼 0 ㄓㄠˇ
+爪 0 ㄓㄠˇ
+菬 0 ㄓㄠˇ
+瑵 0 ㄓㄠˇ
+爫 0 ㄓㄠˇ
+照 0 ㄓㄠˋ
+趙 0 ㄓㄠˋ
+召 0 ㄓㄠˋ
+罩 0 ㄓㄠˋ
+兆 0 ㄓㄠˋ
+肇 0 ㄓㄠˋ
+詔 0 ㄓㄠˋ
+晁 0 ㄓㄠˋ
+笊 0 ㄓㄠˋ
+櫂 0 ㄓㄠˋ
+炤 0 ㄓㄠˋ
+雿 0 ㄓㄠˋ
+狣 0 ㄓㄠˋ
+棹 0 ㄓㄠˋ
+箌 0 ㄓㄠˋ
+鵫 0 ㄓㄠˋ
+垗 0 ㄓㄠˋ
+旐 0 ㄓㄠˋ
+曌 0 ㄓㄠˋ
+頫 0 ㄓㄠˋ
+妱 0 ㄓㄠˋ
+淖 0 ㄓㄠˋ
+鉊 0 ㄓㄠˋ
+銚 0 ㄓㄠˋ
+髫 0 ㄓㄠˋ
+繉 0 ㄓㄠˋ
+鮡 0 ㄓㄠˋ
+㨄 0 ㄓㄠˋ
+燳 0 ㄓㄠˋ
+瞾 0 ㄓㄠˋ
+鑃 0 ㄓㄠˋ
+籱 0 ㄓㄠˋ
+枛 0 ㄓㄠˋ
+䍮 0 ㄓㄠˋ
+䑲 0 ㄓㄠˋ
+羄 0 ㄓㄠˋ
+肁 0 ㄓㄠˋ
+肈 0 ㄓㄠˋ
+著 0 ㄓㄠˊ
+着 0 ㄓㄠˊ
+這 0 ㄓㄟˋ
+这 0 ㄓㄟˋ
+真 0 ㄓㄣ
+針 0 ㄓㄣ
+珍 0 ㄓㄣ
+貞 0 ㄓㄣ
+偵 0 ㄓㄣ
+禎 0 ㄓㄣ
+斟 0 ㄓㄣ
+箴 0 ㄓㄣ
+砧 0 ㄓㄣ
+甄 0 ㄓㄣ
+臻 0 ㄓㄣ
+楨 0 ㄓㄣ
+榛 0 ㄓㄣ
+診 0 ㄓㄣ
+蓁 0 ㄓㄣ
+獉 0 ㄓㄣ
+溱 0 ㄓㄣ
+碪 0 ㄓㄣ
+胗 0 ㄓㄣ
+鍼 0 ㄓㄣ
+鱵 0 ㄓㄣ
+媜 0 ㄓㄣ
+駗 0 ㄓㄣ
+薽 0 ㄓㄣ
+禛 0 ㄓㄣ
+樼 0 ㄓㄣ
+潧 0 ㄓㄣ
+瑊 0 ㄓㄣ
+遉 0 ㄓㄣ
+寊 0 ㄓㄣ
+蒧 0 ㄓㄣ
+轃 0 ㄓㄣ
+籈 0 ㄓㄣ
+鷏 0 ㄓㄣ
+堻 0 ㄓㄣ
+唇 0 ㄓㄣ
+振 0 ㄓㄣ
+疹 0 ㄓㄣ
+幀 0 ㄓㄣ
+殄 0 ㄓㄣ
+桭 0 ㄓㄣ
+紾 0 ㄓㄣ
+湞 0 ㄓㄣ
+軫 0 ㄓㄣ
+鄄 0 ㄓㄣ
+椹 0 ㄓㄣ
+葴 0 ㄓㄣ
+磡 0 ㄓㄣ
+赬 0 ㄓㄣ
+鍖 0 ㄓㄣ
+鍞 0 ㄓㄣ
+瀙 0 ㄓㄣ
+珎 0 ㄓㄣ
+帪 0 ㄓㄣ
+栕 0 ㄓㄣ
+眞 0 ㄓㄣ
+酙 0 ㄓㄣ
+嫃 0 ㄓㄣ
+搸 0 ㄓㄣ
+鉁 0 ㄓㄣ
+靕 0 ㄓㄣ
+蒖 0 ㄓㄣ
+緽 0 ㄓㄣ
+澵 0 ㄓㄣ
+錱 0 ㄓㄣ
+頳 0 ㄓㄣ
+殝 0 ㄓㄣ
+儬 0 ㄓㄣ
+㡧 0 ㄓㄣ
+㖘 0 ㄓㄣ
+診 0 ㄓㄣˇ
+枕 0 ㄓㄣˇ
+疹 0 ㄓㄣˇ
+軫 0 ㄓㄣˇ
+畛 0 ㄓㄣˇ
+袗 0 ㄓㄣˇ
+縝 0 ㄓㄣˇ
+稹 0 ㄓㄣˇ
+紾 0 ㄓㄣˇ
+鬒 0 ㄓㄣˇ
+眕 0 ㄓㄣˇ
+黰 0 ㄓㄣˇ
+辴 0 ㄓㄣˇ
+抮 0 ㄓㄣˇ
+抌 0 ㄓㄣˇ
+笉 0 ㄓㄣˇ
+絼 0 ㄓㄣˇ
+祳 0 ㄓㄣˇ
+晸 0 ㄓㄣˇ
+縥 0 ㄓㄣˇ
+黕 0 ㄓㄣˇ
+賑 0 ㄓㄣˇ
+餮 0 ㄓㄣˇ
+胗 0 ㄓㄣˇ
+裖 0 ㄓㄣˇ
+駗 0 ㄓㄣˇ
+姫 0 ㄓㄣˇ
+昣 0 ㄓㄣˇ
+屒 0 ㄓㄣˇ
+聄 0 ㄓㄣˇ
+弫 0 ㄓㄣˇ
+敐 0 ㄓㄣˇ
+䪴 0 ㄓㄣˇ
+飻 0 ㄓㄣˇ
+覙 0 ㄓㄣˇ
+鎮 0 ㄓㄣˋ
+陣 0 ㄓㄣˋ
+振 0 ㄓㄣˋ
+震 0 ㄓㄣˋ
+賑 0 ㄓㄣˋ
+朕 0 ㄓㄣˋ
+枕 0 ㄓㄣˋ
+鴆 0 ㄓㄣˋ
+揕 0 ㄓㄣˋ
+酖 0 ㄓㄣˋ
+眹 0 ㄓㄣˋ
+娠 0 ㄓㄣˋ
+侲 0 ㄓㄣˋ
+挋 0 ㄓㄣˋ
+栚 0 ㄓㄣˋ
+蜄 0 ㄓㄣˋ
+桭 0 ㄓㄣˋ
+誫 0 ㄓㄣˋ
+敶 0 ㄓㄣˋ
+陳 0 ㄓㄣˋ
+紖 0 ㄓㄣˋ
+瑱 0 ㄓㄣˋ
+迧 0 ㄓㄣˋ
+栕 0 ㄓㄣˋ
+軙 0 ㄓㄣˋ
+塦 0 ㄓㄣˋ
+鎭 0 ㄓㄣˋ
+䟴 0 ㄓㄣˋ
+𨦸 0 ㄓㄣˋ
+圳 0 ㄓㄣˋ
+ˊ 0 ˊ
+兒 0 ㄦˊ
+而 0 ㄦˊ
+洏 0 ㄦˊ
+耏 0 ㄦˊ
+胹 0 ㄦˊ
+輀 0 ㄦˊ
+侕 0 ㄦˊ
+栭 0 ㄦˊ
+陑 0 ㄦˊ
+鮞 0 ㄦˊ
+檽 0 ㄦˊ
+聏 0 ㄦˊ
+荋 0 ㄦˊ
+唲 0 ㄦˊ
+鴯 0 ㄦˊ
+峏 0 ㄦˊ
+恧 0 ㄦˊ
+婼 0 ㄦˊ
+臑 0 ㄦˊ
+鬩 0 ㄦˊ
+児 0 ㄦˊ
+㖇 0 ㄦˊ
+袻 0 ㄦˊ
+腝 0 ㄦˊ
+䦧 0 ㄦˊ
+髵 0 ㄦˊ
+隭 0 ㄦˊ
+轜 0 ㄦˊ
+˙ 0 ˙
+阿 0 ㄚ
+啊 0 ㄚ
+ㄚ 0 ㄚ
+腌 0 ㄚ
+吖 0 ㄚ
+阿 0 ㄚˇ
+阿 0 ㄚˋ
+錒 0 ㄚˋ
+嗄 0 ㄚˊ
+啊 0 ㄚ˙
+挨 0 ㄞ
+哀 0 ㄞ
+埃 0 ㄞ
+唉 0 ㄞ
+哎 0 ㄞ
+ㄞ 0 ㄞ
+欸 0 ㄞ
+矮 0 ㄞˇ
+藹 0 ㄞˇ
+靄 0 ㄞˇ
+欸 0 ㄞˇ
+毐 0 ㄞˇ
+昹 0 ㄞˇ
+佁 0 ㄞˇ
+乃 0 ㄞˇ
+噯 0 ㄞˇ
+娾 0 ㄞˇ
+暟 0 ㄞˇ
+藒 0 ㄞˇ
+躷 0 ㄞˇ
+愛 0 ㄞˋ
+礙 0 ㄞˋ
+艾 0 ㄞˋ
+曖 0 ㄞˋ
+璦 0 ㄞˋ
+隘 0 ㄞˋ
+噯 0 ㄞˋ
+乂 0 ㄞˋ
+靉 0 ㄞˋ
+僾 0 ㄞˋ
+堨 0 ㄞˋ
+嬡 0 ㄞˋ
+鑀 0 ㄞˋ
+賹 0 ㄞˋ
+濭 0 ㄞˋ
+鴱 0 ㄞˋ
+譪 0 ㄞˋ
+薆 0 ㄞˋ
+阨 0 ㄞˋ
+砨 0 ㄞˋ
+嗌 0 ㄞˋ
+餀 0 ㄞˋ
+壒 0 ㄞˋ
+餲 0 ㄞˋ
+戹 0 ㄞˋ
+砈 0 ㄞˋ
+硋 0 ㄞˋ
+碍 0 ㄞˋ
+䔽 0 ㄞˋ
+懝 0 ㄞˋ
+瞹 0 ㄞˋ
+馤 0 ㄞˋ
+饚 0 ㄞˋ
+𣎴 0 ㄞˋ
+伌 0 ㄞˋ
+阸 0 ㄞˋ
+塧 0 ㄞˋ
+䅬 0 ㄞˋ
+皧 0 ㄞˋ
+捱 0 ㄞˊ
+皚 0 ㄞˊ
+騃 0 ㄞˊ
+敳 0 ㄞˊ
+呆 0 ㄞˊ
+挨 0 ㄞˊ
+崖 0 ㄞˊ
+癌 0 ㄞˊ
+啀 0 ㄞˊ
+堐 0 ㄞˊ
+隑 0 ㄞˊ
+獃 0 ㄞˊ
+磑 0 ㄞˊ
+厓 0 ㄞˊ
+崕 0 ㄞˊ
+凒 0 ㄞˊ
+敱 0 ㄞˊ
+嘊 0 ㄞˊ
+ㄇ 0 ㄇ
+哞 0 ㄇㄡ
+某 0 ㄇㄡˇ
+冇 0 ㄇㄡˇ
+踇 0 ㄇㄡˇ
+牡 0 ㄇㄡˇ
+畝 0 ㄇㄡˇ
+畂 0 ㄇㄡˇ
+畆 0 ㄇㄡˇ
+畞 0 ㄇㄡˇ
+畮 0 ㄇㄡˇ
+𦳑 0 ㄇㄡˇ
+茂 0 ㄇㄡˋ
+貿 0 ㄇㄡˋ
+懋 0 ㄇㄡˋ
+袤 0 ㄇㄡˋ
+楙 0 ㄇㄡˋ
+瞀 0 ㄇㄡˋ
+柕 0 ㄇㄡˋ
+愗 0 ㄇㄡˋ
+謀 0 ㄇㄡˊ
+眸 0 ㄇㄡˊ
+繆 0 ㄇㄡˊ
+牟 0 ㄇㄡˊ
+侔 0 ㄇㄡˊ
+蝥 0 ㄇㄡˊ
+鍪 0 ㄇㄡˊ
+蛑 0 ㄇㄡˊ
+麰 0 ㄇㄡˊ
+洠 0 ㄇㄡˊ
+鉾 0 ㄇㄡˊ
+鴾 0 ㄇㄡˊ
+譕 0 ㄇㄡˊ
+呣 0 ㄇㄡˊ
+哞 0 ㄇㄡˊ
+堥 0 ㄇㄡˊ
+鞪 0 ㄇㄡˊ
+劺 0 ㄇㄡˊ
+矇 0 ㄇㄥ
+猛 0 ㄇㄥˇ
+蜢 0 ㄇㄥˇ
+艋 0 ㄇㄥˇ
+錳 0 ㄇㄥˇ
+懵 0 ㄇㄥˇ
+鼆 0 ㄇㄥˇ
+蠓 0 ㄇㄥˇ
+懞 0 ㄇㄥˇ
+瓾 0 ㄇㄥˇ
+幪 0 ㄇㄥˇ
+勐 0 ㄇㄥˇ
+顭 0 ㄇㄥˇ
+鯭 0 ㄇㄥˇ
+𢕙 0 ㄇㄥˇ
+鸏 0 ㄇㄥˇ
+夢 0 ㄇㄥˋ
+孟 0 ㄇㄥˋ
+霥 0 ㄇㄥˋ
+艋 0 ㄇㄥˋ
+梦 0 ㄇㄥˋ
+夣 0 ㄇㄥˋ
+懜 0 ㄇㄥˋ
+䓝 0 ㄇㄥˋ
+䁅 0 ㄇㄥˋ
+蒙 0 ㄇㄥˊ
+盟 0 ㄇㄥˊ
+萌 0 ㄇㄥˊ
+矇 0 ㄇㄥˊ
+朦 0 ㄇㄥˊ
+濛 0 ㄇㄥˊ
+檬 0 ㄇㄥˊ
+懵 0 ㄇㄥˊ
+幪 0 ㄇㄥˊ
+甍 0 ㄇㄥˊ
+瞢 0 ㄇㄥˊ
+艨 0 ㄇㄥˊ
+虻 0 ㄇㄥˊ
+曚 0 ㄇㄥˊ
+甿 0 ㄇㄥˊ
+礞 0 ㄇㄥˊ
+氋 0 ㄇㄥˊ
+雺 0 ㄇㄥˊ
+莔 0 ㄇㄥˊ
+儚 0 ㄇㄥˊ
+蕄 0 ㄇㄥˊ
+鄳 0 ㄇㄥˊ
+鄸 0 ㄇㄥˊ
+饛 0 ㄇㄥˊ
+鸏 0 ㄇㄥˊ
+氓 0 ㄇㄥˊ
+尨 0 ㄇㄥˊ
+罞 0 ㄇㄥˊ
+嫇 0 ㄇㄥˊ
+懞 0 ㄇㄥˊ
+霿 0 ㄇㄥˊ
+冡 0 ㄇㄥˊ
+䀄 0 ㄇㄥˊ
+蝱 0 ㄇㄥˊ
+橗 0 ㄇㄥˊ
+懜 0 ㄇㄥˊ
+㩚 0 ㄇㄥˊ
+鯍 0 ㄇㄥˊ
+靀 0 ㄇㄥˊ
+顭 0 ㄇㄥˊ
+溕 0 ㄇㄥˊ
+𡁏 0 ㄇㄥˊ
+獴 0 ㄇㄥˊ
+矒 0 ㄇㄥˊ
+莽 0 ㄇㄤˇ
+蟒 0 ㄇㄤˇ
+漭 0 ㄇㄤˇ
+汒 0 ㄇㄤˇ
+庬 0 ㄇㄤˇ
+硥 0 ㄇㄤˇ
+茻 0 ㄇㄤˇ
+壾 0 ㄇㄤˇ
+蠎 0 ㄇㄤˇ
+莾 0 ㄇㄤˇ
+忙 0 ㄇㄤˊ
+芒 0 ㄇㄤˊ
+茫 0 ㄇㄤˊ
+盲 0 ㄇㄤˊ
+氓 0 ㄇㄤˊ
+尨 0 ㄇㄤˊ
+硭 0 ㄇㄤˊ
+邙 0 ㄇㄤˊ
+哤 0 ㄇㄤˊ
+奀 0 ㄇㄤˊ
+杗 0 ㄇㄤˊ
+盳 0 ㄇㄤˊ
+鋩 0 ㄇㄤˊ
+娏 0 ㄇㄤˊ
+牻 0 ㄇㄤˊ
+痝 0 ㄇㄤˊ
+蛖 0 ㄇㄤˊ
+駹 0 ㄇㄤˊ
+蘉 0 ㄇㄤˊ
+笀 0 ㄇㄤˊ
+肓 0 ㄇㄤˊ
+汒 0 ㄇㄤˊ
+厖 0 ㄇㄤˊ
+庬 0 ㄇㄤˊ
+恾 0 ㄇㄤˊ
+浝 0 ㄇㄤˊ
+朚 0 ㄇㄤˊ
+吂 0 ㄇㄤˊ
+釯 0 ㄇㄤˊ
+鸏 0 ㄇㄤˊ
+滿 0 ㄇㄢˇ
+屘 0 ㄇㄢˇ
+矕 0 ㄇㄢˇ
+懣 0 ㄇㄢˇ
+蹣 0 ㄇㄢˇ
+顢 0 ㄇㄢˇ
+満 0 ㄇㄢˇ
+鏋 0 ㄇㄢˇ
+𨃟 0 ㄇㄢˇ
+慢 0 ㄇㄢˋ
+漫 0 ㄇㄢˋ
+曼 0 ㄇㄢˋ
+蔓 0 ㄇㄢˋ
+幔 0 ㄇㄢˋ
+嫚 0 ㄇㄢˋ
+鏝 0 ㄇㄢˋ
+縵 0 ㄇㄢˋ
+墁 0 ㄇㄢˋ
+熳 0 ㄇㄢˋ
+澫 0 ㄇㄢˋ
+僈 0 ㄇㄢˋ
+獌 0 ㄇㄢˋ
+屘 0 ㄇㄢˋ
+饅 0 ㄇㄢˋ
+鰻 0 ㄇㄢˋ
+鄤 0 ㄇㄢˋ
+槾 0 ㄇㄢˋ
+蟃 0 ㄇㄢˋ
+謾 0 ㄇㄢˋ
+摱 0 ㄇㄢˋ
+蔄 0 ㄇㄢˋ
+澷 0 ㄇㄢˋ
+䕕 0 ㄇㄢˋ
+𤅎 0 ㄇㄢˋ
+蠻 0 ㄇㄢˊ
+饅 0 ㄇㄢˊ
+瞞 0 ㄇㄢˊ
+蹣 0 ㄇㄢˊ
+漫 0 ㄇㄢˊ
+顢 0 ㄇㄢˊ
+謾 0 ㄇㄢˊ
+鰻 0 ㄇㄢˊ
+璊 0 ㄇㄢˊ
+悗 0 ㄇㄢˊ
+慲 0 ㄇㄢˊ
+槾 0 ㄇㄢˊ
+鬘 0 ㄇㄢˊ
+鬗 0 ㄇㄢˊ
+埋 0 ㄇㄢˊ
+蔓 0 ㄇㄢˊ
+姏 0 ㄇㄢˊ
+樠 0 ㄇㄢˊ
+鞔 0 ㄇㄢˊ
+蛮 0 ㄇㄢˊ
+摱 0 ㄇㄢˊ
+澷 0 ㄇㄢˊ
+蟎 0 ㄇㄢˊ
+䕕 0 ㄇㄢˊ
+䅼 0 ㄇㄢˊ
+𨃟 0 ㄇㄢˊ
+㒼 0 ㄇㄢˊ
+𥲑 0 ㄇㄢˊ
+𧜞 0 ㄇㄢˊ
+媽 0 ㄇㄚ
+嗎 0 ㄇㄚ
+嬤 0 ㄇㄚ
+摩 0 ㄇㄚ
+螞 0 ㄇㄚ
+嬷 0 ㄇㄚ
+㕰 0 ㄇㄚ
+馬 0 ㄇㄚˇ
+螞 0 ㄇㄚˇ
+碼 0 ㄇㄚˇ
+瑪 0 ㄇㄚˇ
+溤 0 ㄇㄚˇ
+嗎 0 ㄇㄚˇ
+鎷 0 ㄇㄚˇ
+鷌 0 ㄇㄚˇ
+嘜 0 ㄇㄚˇ
+鰢 0 ㄇㄚˇ
+罵 0 ㄇㄚˋ
+禡 0 ㄇㄚˋ
+傌 0 ㄇㄚˋ
+榪 0 ㄇㄚˋ
+螞 0 ㄇㄚˋ
+鬕 0 ㄇㄚˋ
+閁 0 ㄇㄚˋ
+獁 0 ㄇㄚˋ
+駡 0 ㄇㄚˋ
+睰 0 ㄇㄚˋ
+麻 0 ㄇㄚˊ
+痲 0 ㄇㄚˊ
+嘛 0 ㄇㄚˊ
+麼 0 ㄇㄚˊ
+蟆 0 ㄇㄚˊ
+犘 0 ㄇㄚˊ
+尛 0 ㄇㄚˊ
+麽 0 ㄇㄚˊ
+蔴 0 ㄇㄚˊ
+蟇 0 ㄇㄚˊ
+嘛 0 ㄇㄚ˙
+嗎 0 ㄇㄚ˙
+媽 0 ㄇㄚ˙
+嬤 0 ㄇㄚ˙
+蟆 0 ㄇㄚ˙
+麼 0 ㄇㄚ˙
+尛 0 ㄇㄚ˙
+麽 0 ㄇㄚ˙
+蟇 0 ㄇㄚ˙
+買 0 ㄇㄞˇ
+嘪 0 ㄇㄞˇ
+鷶 0 ㄇㄞˇ
+蕒 0 ㄇㄞˇ
+賣 0 ㄇㄞˋ
+麥 0 ㄇㄞˋ
+邁 0 ㄇㄞˋ
+脈 0 ㄇㄞˋ
+勱 0 ㄇㄞˋ
+蝐 0 ㄇㄞˋ
+眽 0 ㄇㄞˋ
+佅 0 ㄇㄞˋ
+売 0 ㄇㄞˋ
+麦 0 ㄇㄞˋ
+脉 0 ㄇㄞˋ
+眿 0 ㄇㄞˋ
+衇 0 ㄇㄞˋ
+𪄳 0 ㄇㄞˋ
+埋 0 ㄇㄞˊ
+霾 0 ㄇㄞˊ
+薶 0 ㄇㄞˊ
+㜥 0 ㄇㄞˊ
+摸 0 ㄇㄛ
+抹 0 ㄇㄛˇ
+秣 0 ㄇㄛˇ
+懡 0 ㄇㄛˇ
+末 0 ㄇㄛˋ
+莫 0 ㄇㄛˋ
+默 0 ㄇㄛˋ
+漠 0 ㄇㄛˋ
+沒 0 ㄇㄛˋ
+膜 0 ㄇㄛˋ
+寞 0 ㄇㄛˋ
+陌 0 ㄇㄛˋ
+歿 0 ㄇㄛˋ
+脈 0 ㄇㄛˋ
+沫 0 ㄇㄛˋ
+秣 0 ㄇㄛˋ
+茉 0 ㄇㄛˋ
+驀 0 ㄇㄛˋ
+墨 0 ㄇㄛˋ
+貊 0 ㄇㄛˋ
+磨 0 ㄇㄛˋ
+嘿 0 ㄇㄛˋ
+瘼 0 ㄇㄛˋ
+靺 0 ㄇㄛˋ
+歾 0 ㄇㄛˋ
+鄚 0 ㄇㄛˋ
+纆 0 ㄇㄛˋ
+霢 0 ㄇㄛˋ
+嚜 0 ㄇㄛˋ
+眽 0 ㄇㄛˋ
+瞙 0 ㄇㄛˋ
+藦 0 ㄇㄛˋ
+暯 0 ㄇㄛˋ
+枺 0 ㄇㄛˋ
+爅 0 ㄇㄛˋ
+妺 0 ㄇㄛˋ
+万 0 ㄇㄛˋ
+銆 0 ㄇㄛˋ
+鏌 0 ㄇㄛˋ
+貘 0 ㄇㄛˋ
+粖 0 ㄇㄛˋ
+蛨 0 ㄇㄛˋ
+袹 0 ㄇㄛˋ
+嗼 0 ㄇㄛˋ
+塻 0 ㄇㄛˋ
+慔 0 ㄇㄛˋ
+蟔 0 ㄇㄛˋ
+鬕 0 ㄇㄛˋ
+莈 0 ㄇㄛˋ
+覛 0 ㄇㄛˋ
+縸 0 ㄇㄛˋ
+嘜 0 ㄇㄛˋ
+佰 0 ㄇㄛˋ
+抹 0 ㄇㄛˋ
+沬 0 ㄇㄛˋ
+冒 0 ㄇㄛˋ
+苜 0 ㄇㄛˋ
+麥 0 ㄇㄛˋ
+貉 0 ㄇㄛˋ
+幕 0 ㄇㄛˋ
+蟆 0 ㄇㄛˋ
+砓 0 ㄇㄛˋ
+塺 0 ㄇㄛˋ
+圽 0 ㄇㄛˋ
+麦 0 ㄇㄛˋ
+没 0 ㄇㄛˋ
+冐 0 ㄇㄛˋ
+帓 0 ㄇㄛˋ
+殁 0 ㄇㄛˋ
+昩 0 ㄇㄛˋ
+狢 0 ㄇㄛˋ
+脉 0 ㄇㄛˋ
+眿 0 ㄇㄛˋ
+袜 0 ㄇㄛˋ
+衇 0 ㄇㄛˋ
+貃 0 ㄇㄛˋ
+貈 0 ㄇㄛˋ
+獏 0 ㄇㄛˋ
+嫼 0 ㄇㄛˋ
+瞐 0 ㄇㄛˋ
+魩 0 ㄇㄛˋ
+頮 0 ㄇㄛˋ
+蟇 0 ㄇㄛˋ
+䃺 0 ㄇㄛˋ
+𤣻 0 ㄇㄛˋ
+皌 0 ㄇㄛˋ
+㱄 0 ㄇㄛˋ
+黙 0 ㄇㄛˋ
+霡 0 ㄇㄛˋ
+䘃 0 ㄇㄛˋ
+耱 0 ㄇㄛˋ
+模 0 ㄇㄛˊ
+磨 0 ㄇㄛˊ
+摩 0 ㄇㄛˊ
+膜 0 ㄇㄛˊ
+糢 0 ㄇㄛˊ
+魔 0 ㄇㄛˊ
+摹 0 ㄇㄛˊ
+謨 0 ㄇㄛˊ
+蘑 0 ㄇㄛˊ
+劘 0 ㄇㄛˊ
+嫫 0 ㄇㄛˊ
+藦 0 ㄇㄛˊ
+髍 0 ㄇㄛˊ
+無 0 ㄇㄛˊ
+摸 0 ㄇㄛˊ
+麼 0 ㄇㄛˊ
+嬤 0 ㄇㄛˊ
+饃 0 ㄇㄛˊ
+无 0 ㄇㄛˊ
+尛 0 ㄇㄛˊ
+麽 0 ㄇㄛˊ
+橅 0 ㄇㄛˊ
+嬷 0 ㄇㄛˊ
+謩 0 ㄇㄛˊ
+戂 0 ㄇㄛˊ
+䃺 0 ㄇㄛˊ
+饝 0 ㄇㄛˊ
+嚩 0 ㄇㄛˊ
+擵 0 ㄇㄛˊ
+譕 0 ㄇㄛˊ
+母 0 ㄇㄨˇ
+畝 0 ㄇㄨˇ
+牡 0 ㄇㄨˇ
+姆 0 ㄇㄨˇ
+拇 0 ㄇㄨˇ
+牳 0 ㄇㄨˇ
+鉧 0 ㄇㄨˇ
+姥 0 ㄇㄨˇ
+峔 0 ㄇㄨˇ
+砪 0 ㄇㄨˇ
+踇 0 ㄇㄨˇ
+畂 0 ㄇㄨˇ
+畆 0 ㄇㄨˇ
+胟 0 ㄇㄨˇ
+娒 0 ㄇㄨˇ
+畞 0 ㄇㄨˇ
+畮 0 ㄇㄨˇ
+𧿹 0 ㄇㄨˇ
+木 0 ㄇㄨˋ
+目 0 ㄇㄨˋ
+幕 0 ㄇㄨˋ
+牧 0 ㄇㄨˋ
+慕 0 ㄇㄨˋ
+墓 0 ㄇㄨˋ
+募 0 ㄇㄨˋ
+穆 0 ㄇㄨˋ
+睦 0 ㄇㄨˋ
+暮 0 ㄇㄨˋ
+沐 0 ㄇㄨˋ
+苜 0 ㄇㄨˋ
+鶩 0 ㄇㄨˋ
+楘 0 ㄇㄨˋ
+霂 0 ㄇㄨˋ
+鉬 0 ㄇㄨˋ
+炑 0 ㄇㄨˋ
+坶 0 ㄇㄨˋ
+毣 0 ㄇㄨˋ
+蚞 0 ㄇㄨˋ
+幙 0 ㄇㄨˋ
+莯 0 ㄇㄨˋ
+莫 0 ㄇㄨˋ
+冪 0 ㄇㄨˋ
+繆 0 ㄇㄨˋ
+驀 0 ㄇㄨˋ
+慔 0 ㄇㄨˋ
+冖 0 ㄇㄨˋ
+朷 0 ㄇㄨˋ
+狇 0 ㄇㄨˋ
+幂 0 ㄇㄨˋ
+雮 0 ㄇㄨˋ
+㜈 0 ㄇㄨˋ
+樢 0 ㄇㄨˋ
+模 0 ㄇㄨˊ
+氁 0 ㄇㄨˊ
+毪 0 ㄇㄨˊ
+墲 0 ㄇㄨˊ
+橅 0 ㄇㄨˊ
+恈 0 ㄇㄨˊ
+麼 0 ㄇㄜ˙
+嚜 0 ㄇㄜ˙
+尛 0 ㄇㄜ˙
+麽 0 ㄇㄜ˙
+貓 0 ㄇㄠ
+摸 0 ㄇㄠ
+猫 0 ㄇㄠ
+卯 0 ㄇㄠˇ
+昴 0 ㄇㄠˇ
+泖 0 ㄇㄠˇ
+茆 0 ㄇㄠˇ
+鉚 0 ㄇㄠˇ
+窌 0 ㄇㄠˇ
+戼 0 ㄇㄠˇ
+峁 0 ㄇㄠˇ
+帽 0 ㄇㄠˋ
+冒 0 ㄇㄠˋ
+貌 0 ㄇㄠˋ
+貿 0 ㄇㄠˋ
+茂 0 ㄇㄠˋ
+瑁 0 ㄇㄠˋ
+懋 0 ㄇㄠˋ
+旄 0 ㄇㄠˋ
+耄 0 ㄇㄠˋ
+媢 0 ㄇㄠˋ
+楙 0 ㄇㄠˋ
+眊 0 ㄇㄠˋ
+瞀 0 ㄇㄠˋ
+芼 0 ㄇㄠˋ
+袤 0 ㄇㄠˋ
+毷 0 ㄇㄠˋ
+艒 0 ㄇㄠˋ
+萺 0 ㄇㄠˋ
+鄮 0 ㄇㄠˋ
+毣 0 ㄇㄠˋ
+蓩 0 ㄇㄠˋ
+皃 0 ㄇㄠˋ
+冐 0 ㄇㄠˋ
+柕 0 ㄇㄠˋ
+覒 0 ㄇㄠˋ
+暓 0 ㄇㄠˋ
+冃 0 ㄇㄠˋ
+毛 0 ㄇㄠˊ
+茅 0 ㄇㄠˊ
+矛 0 ㄇㄠˊ
+髦 0 ㄇㄠˊ
+錨 0 ㄇㄠˊ
+旄 0 ㄇㄠˊ
+蟊 0 ㄇㄠˊ
+芼 0 ㄇㄠˊ
+蝥 0 ㄇㄠˊ
+髳 0 ㄇㄠˊ
+媌 0 ㄇㄠˊ
+堥 0 ㄇㄠˊ
+罞 0 ㄇㄠˊ
+酕 0 ㄇㄠˊ
+嫹 0 ㄇㄠˊ
+鶜 0 ㄇㄠˊ
+枆 0 ㄇㄠˊ
+軞 0 ㄇㄠˊ
+渵 0 ㄇㄠˊ
+耄 0 ㄇㄠˊ
+犛 0 ㄇㄠˊ
+麾 0 ㄇㄠˊ
+乇 0 ㄇㄠˊ
+毠 0 ㄇㄠˊ
+毼 0 ㄇㄠˊ
+雺 0 ㄇㄠˊ
+氂 0 ㄇㄠˊ
+牦 0 ㄇㄠˊ
+嵍 0 ㄇㄠˊ
+緢 0 ㄇㄠˊ
+𨥨 0 ㄇㄠˊ
+美 0 ㄇㄟˇ
+每 0 ㄇㄟˇ
+鎂 0 ㄇㄟˇ
+浼 0 ㄇㄟˇ
+媺 0 ㄇㄟˇ
+渼 0 ㄇㄟˇ
+媄 0 ㄇㄟˇ
+挴 0 ㄇㄟˇ
+燘 0 ㄇㄟˇ
+毎 0 ㄇㄟˇ
+凂 0 ㄇㄟˇ
+羙 0 ㄇㄟˇ
+嵄 0 ㄇㄟˇ
+嬍 0 ㄇㄟˇ
+黣 0 ㄇㄟˇ
+䆀 0 ㄇㄟˇ
+妹 0 ㄇㄟˋ
+媚 0 ㄇㄟˋ
+寐 0 ㄇㄟˋ
+昧 0 ㄇㄟˋ
+眛 0 ㄇㄟˋ
+魅 0 ㄇㄟˋ
+瑁 0 ㄇㄟˋ
+沬 0 ㄇㄟˋ
+袂 0 ㄇㄟˋ
+痗 0 ㄇㄟˋ
+韎 0 ㄇㄟˋ
+煝 0 ㄇㄟˋ
+蝞 0 ㄇㄟˋ
+謎 0 ㄇㄟˋ
+蝐 0 ㄇㄟˋ
+抺 0 ㄇㄟˋ
+祙 0 ㄇㄟˋ
+跊 0 ㄇㄟˋ
+詸 0 ㄇㄟˋ
+鬽 0 ㄇㄟˋ
+睸 0 ㄇㄟˋ
+篃 0 ㄇㄟˋ
+沒 0 ㄇㄟˊ
+煤 0 ㄇㄟˊ
+眉 0 ㄇㄟˊ
+枚 0 ㄇㄟˊ
+梅 0 ㄇㄟˊ
+媒 0 ㄇㄟˊ
+莓 0 ㄇㄟˊ
+霉 0 ㄇㄟˊ
+玫 0 ㄇㄟˊ
+黴 0 ㄇㄟˊ
+酶 0 ㄇㄟˊ
+楣 0 ㄇㄟˊ
+湄 0 ㄇㄟˊ
+嵋 0 ㄇㄟˊ
+苺 0 ㄇㄟˊ
+禖 0 ㄇㄟˊ
+郿 0 ㄇㄟˊ
+堳 0 ㄇㄟˊ
+瑂 0 ㄇㄟˊ
+脢 0 ㄇㄟˊ
+鋂 0 ㄇㄟˊ
+呅 0 ㄇㄟˊ
+腜 0 ㄇㄟˊ
+塺 0 ㄇㄟˊ
+徾 0 ㄇㄟˊ
+攗 0 ㄇㄟˊ
+糜 0 ㄇㄟˊ
+没 0 ㄇㄟˊ
+脄 0 ㄇㄟˊ
+珻 0 ㄇㄟˊ
+湈 0 ㄇㄟˊ
+猸 0 ㄇㄟˊ
+睂 0 ㄇㄟˊ
+楳 0 ㄇㄟˊ
+葿 0 ㄇㄟˊ
+槑 0 ㄇㄟˊ
+䉠 0 ㄇㄟˊ
+鶥 0 ㄇㄟˊ
+𪑛 0 ㄇㄟˊ
+妹 0 ㄇㄟ˙
+悶 0 ㄇㄣ
+燜 0 ㄇㄣ
+暪 0 ㄇㄣˇ
+悶 0 ㄇㄣˋ
+燜 0 ㄇㄣˋ
+懣 0 ㄇㄣˋ
+門 0 ㄇㄣˊ
+們 0 ㄇㄣˊ
+捫 0 ㄇㄣˊ
+樠 0 ㄇㄣˊ
+鍆 0 ㄇㄣˊ
+穈 0 ㄇㄣˊ
+菛 0 ㄇㄣˊ
+亹 0 ㄇㄣˊ
+虋 0 ㄇㄣˊ
+璊 0 ㄇㄣˊ
+斖 0 ㄇㄣˊ
+玧 0 ㄇㄣˊ
+閅 0 ㄇㄣˊ
+㻊 0 ㄇㄣˊ
+們 0 ㄇㄣ˙
+咪 0 ㄇㄧ
+瞇 0 ㄇㄧ
+咩 0 ㄇㄧㄝ
+乜 0 ㄇㄧㄝ
+羋 0 ㄇㄧㄝ
+滅 0 ㄇㄧㄝˋ
+蔑 0 ㄇㄧㄝˋ
+衊 0 ㄇㄧㄝˋ
+篾 0 ㄇㄧㄝˋ
+蠛 0 ㄇㄧㄝˋ
+幭 0 ㄇㄧㄝˋ
+覕 0 ㄇㄧㄝˋ
+搣 0 ㄇㄧㄝˋ
+薎 0 ㄇㄧㄝˋ
+懱 0 ㄇㄧㄝˋ
+瀎 0 ㄇㄧㄝˋ
+礣 0 ㄇㄧㄝˋ
+鱴 0 ㄇㄧㄝˋ
+烕 0 ㄇㄧㄝˋ
+鴓 0 ㄇㄧㄝˋ
+櫗 0 ㄇㄧㄝˋ
+鑖 0 ㄇㄧㄝˋ
+眜 0 ㄇㄧㄝˋ
+唒 0 ㄇㄧㄡ
+謬 0 ㄇㄧㄡˋ
+繆 0 ㄇㄧㄡˋ
+摎 0 ㄇㄧㄡˋ
+眳 0 ㄇㄧㄥˇ
+姳 0 ㄇㄧㄥˇ
+慏 0 ㄇㄧㄥˇ
+皿 0 ㄇㄧㄥˇ
+茗 0 ㄇㄧㄥˇ
+酩 0 ㄇㄧㄥˇ
+瞑 0 ㄇㄧㄥˇ
+佲 0 ㄇㄧㄥˇ
+凕 0 ㄇㄧㄥˇ
+命 0 ㄇㄧㄥˋ
+暝 0 ㄇㄧㄥˋ
+詺 0 ㄇㄧㄥˋ
+明 0 ㄇㄧㄥˊ
+名 0 ㄇㄧㄥˊ
+鳴 0 ㄇㄧㄥˊ
+銘 0 ㄇㄧㄥˊ
+螟 0 ㄇㄧㄥˊ
+冥 0 ㄇㄧㄥˊ
+瞑 0 ㄇㄧㄥˊ
+暝 0 ㄇㄧㄥˊ
+茗 0 ㄇㄧㄥˊ
+酩 0 ㄇㄧㄥˊ
+溟 0 ㄇㄧㄥˊ
+蓂 0 ㄇㄧㄥˊ
+鄍 0 ㄇㄧㄥˊ
+洺 0 ㄇㄧㄥˊ
+榠 0 ㄇㄧㄥˊ
+嫇 0 ㄇㄧㄥˊ
+覭 0 ㄇㄧㄥˊ
+詺 0 ㄇㄧㄥˊ
+熐 0 ㄇㄧㄥˊ
+萌 0 ㄇㄧㄥˊ
+盟 0 ㄇㄧㄥˊ
+眳 0 ㄇㄧㄥˊ
+佲 0 ㄇㄧㄥˊ
+朙 0 ㄇㄧㄥˊ
+眀 0 ㄇㄧㄥˊ
+䫤 0 ㄇㄧㄥˊ
+猽 0 ㄇㄧㄥˊ
+免 0 ㄇㄧㄢˇ
+勉 0 ㄇㄧㄢˇ
+緬 0 ㄇㄧㄢˇ
+冕 0 ㄇㄧㄢˇ
+娩 0 ㄇㄧㄢˇ
+靦 0 ㄇㄧㄢˇ
+湎 0 ㄇㄧㄢˇ
+沔 0 ㄇㄧㄢˇ
+偭 0 ㄇㄧㄢˇ
+眄 0 ㄇㄧㄢˇ
+絻 0 ㄇㄧㄢˇ
+丏 0 ㄇㄧㄢˇ
+俛 0 ㄇㄧㄢˇ
+愐 0 ㄇㄧㄢˇ
+喕 0 ㄇㄧㄢˇ
+鮸 0 ㄇㄧㄢˇ
+浼 0 ㄇㄧㄢˇ
+脕 0 ㄇㄧㄢˇ
+媔 0 ㄇㄧㄢˇ
+葂 0 ㄇㄧㄢˇ
+汅 0 ㄇㄧㄢˇ
+凂 0 ㄇㄧㄢˇ
+㝃 0 ㄇㄧㄢˇ
+勔 0 ㄇㄧㄢˇ
+覥 0 ㄇㄧㄢˇ
+鰵 0 ㄇㄧㄢˇ
+厸 0 ㄇㄧㄢˇ
+莬 0 ㄇㄧㄢˇ
+㨠 0 ㄇㄧㄢˇ
+矊 0 ㄇㄧㄢˇ
+面 0 ㄇㄧㄢˋ
+麵 0 ㄇㄧㄢˋ
+瞑 0 ㄇㄧㄢˋ
+靣 0 ㄇㄧㄢˋ
+牑 0 ㄇㄧㄢˋ
+糆 0 ㄇㄧㄢˋ
+麫 0 ㄇㄧㄢˋ
+麪 0 ㄇㄧㄢˋ
+棉 0 ㄇㄧㄢˊ
+綿 0 ㄇㄧㄢˊ
+眠 0 ㄇㄧㄢˊ
+媔 0 ㄇㄧㄢˊ
+婂 0 ㄇㄧㄢˊ
+蝒 0 ㄇㄧㄢˊ
+櫋 0 ㄇㄧㄢˊ
+矊 0 ㄇㄧㄢˊ
+矏 0 ㄇㄧㄢˊ
+宀 0 ㄇㄧㄢˊ
+緜 0 ㄇㄧㄢˊ
+嬵 0 ㄇㄧㄢˊ
+檰 0 ㄇㄧㄢˊ
+芇 0 ㄇㄧㄢˊ
+臱 0 ㄇㄧㄢˊ
+米 0 ㄇㄧˇ
+靡 0 ㄇㄧˇ
+弭 0 ㄇㄧˇ
+敉 0 ㄇㄧˇ
+眯 0 ㄇㄧˇ
+銤 0 ㄇㄧˇ
+渳 0 ㄇㄧˇ
+葞 0 ㄇㄧˇ
+蔝 0 ㄇㄧˇ
+濔 0 ㄇㄧˇ
+灖 0 ㄇㄧˇ
+羋 0 ㄇㄧˇ
+彌 0 ㄇㄧˇ
+糜 0 ㄇㄧˇ
+麋 0 ㄇㄧˇ
+瀰 0 ㄇㄧˇ
+蝆 0 ㄇㄧˇ
+縻 0 ㄇㄧˇ
+獼 0 ㄇㄧˇ
+蘼 0 ㄇㄧˇ
+侎 0 ㄇㄧˇ
+弥 0 ㄇㄧˇ
+洣 0 ㄇㄧˇ
+眫 0 ㄇㄧˇ
+孊 0 ㄇㄧˇ
+猕 0 ㄇㄧˇ
+㝥 0 ㄇㄧˇ
+密 0 ㄇㄧˋ
+蜜 0 ㄇㄧˋ
+秘 0 ㄇㄧˋ
+祕 0 ㄇㄧˋ
+覓 0 ㄇㄧˋ
+泌 0 ㄇㄧˋ
+汨 0 ㄇㄧˋ
+謐 0 ㄇㄧˋ
+宓 0 ㄇㄧˋ
+冪 0 ㄇㄧˋ
+塓 0 ㄇㄧˋ
+幦 0 ㄇㄧˋ
+鼏 0 ㄇㄧˋ
+羃 0 ㄇㄧˋ
+幎 0 ㄇㄧˋ
+漞 0 ㄇㄧˋ
+糸 0 ㄇㄧˋ
+峚 0 ㄇㄧˋ
+榓 0 ㄇㄧˋ
+滵 0 ㄇㄧˋ
+蔤 0 ㄇㄧˋ
+蠠 0 ㄇㄧˋ
+嘧 0 ㄇㄧˋ
+日 0 ㄇㄧˋ
+謎 0 ㄇㄧˋ
+冖 0 ㄇㄧˋ
+囸 0 ㄇㄧˋ
+宻 0 ㄇㄧˋ
+淧 0 ㄇㄧˋ
+覔 0 ㄇㄧˋ
+幂 0 ㄇㄧˋ
+詸 0 ㄇㄧˋ
+樒 0 ㄇㄧˋ
+濗 0 ㄇㄧˋ
+櫁 0 ㄇㄧˋ
+藌 0 ㄇㄧˋ
+鑖 0 ㄇㄧˋ
+迷 0 ㄇㄧˊ
+彌 0 ㄇㄧˊ
+謎 0 ㄇㄧˊ
+瀰 0 ㄇㄧˊ
+靡 0 ㄇㄧˊ
+糜 0 ㄇㄧˊ
+麋 0 ㄇㄧˊ
+縻 0 ㄇㄧˊ
+獼 0 ㄇㄧˊ
+蘼 0 ㄇㄧˊ
+冞 0 ㄇㄧˊ
+麛 0 ㄇㄧˊ
+醚 0 ㄇㄧˊ
+醾 0 ㄇㄧˊ
+檷 0 ㄇㄧˊ
+蘪 0 ㄇㄧˊ
+攠 0 ㄇㄧˊ
+瓕 0 ㄇㄧˊ
+爢 0 ㄇㄧˊ
+麊 0 ㄇㄧˊ
+鸍 0 ㄇㄧˊ
+獮 0 ㄇㄧˊ
+禰 0 ㄇㄧˊ
+弥 0 ㄇㄧˊ
+怽 0 ㄇㄧˊ
+罙 0 ㄇㄧˊ
+祢 0 ㄇㄧˊ
+詸 0 ㄇㄧˊ
+擟 0 ㄇㄧˊ
+籋 0 ㄇㄧˊ
+戂 0 ㄇㄧˊ
+醿 0 ㄇㄧˊ
+釄 0 ㄇㄧˊ
+猕 0 ㄇㄧˊ
+蒾 0 ㄇㄧˊ
+镾 0 ㄇㄧˊ
+狝 0 ㄇㄧˊ
+喵 0 ㄇㄧㄠ
+秒 0 ㄇㄧㄠˇ
+渺 0 ㄇㄧㄠˇ
+藐 0 ㄇㄧㄠˇ
+邈 0 ㄇㄧㄠˇ
+緲 0 ㄇㄧㄠˇ
+杳 0 ㄇㄧㄠˇ
+眇 0 ㄇㄧㄠˇ
+淼 0 ㄇㄧㄠˇ
+杪 0 ㄇㄧㄠˇ
+篎 0 ㄇㄧㄠˇ
+沓 0 ㄇㄧㄠˇ
+仦 0 ㄇㄧㄠˇ
+仯 0 ㄇㄧㄠˇ
+劰 0 ㄇㄧㄠˇ
+妙 0 ㄇㄧㄠˋ
+廟 0 ㄇㄧㄠˋ
+繆 0 ㄇㄧㄠˋ
+玅 0 ㄇㄧㄠˋ
+謬 0 ㄇㄧㄠˋ
+庙 0 ㄇㄧㄠˋ
+庿 0 ㄇㄧㄠˋ
+苗 0 ㄇㄧㄠˊ
+描 0 ㄇㄧㄠˊ
+瞄 0 ㄇㄧㄠˊ
+鱙 0 ㄇㄧㄠˊ
+錨 0 ㄇㄧㄠˊ
+媌 0 ㄇㄧㄠˊ
+㑤 0 ㄇㄧㄠˊ
+㚹 0 ㄇㄧㄠˊ
+鶓 0 ㄇㄧㄠˊ
+敏 0 ㄇㄧㄣˇ
+憫 0 ㄇㄧㄣˇ
+閔 0 ㄇㄧㄣˇ
+閩 0 ㄇㄧㄣˇ
+抿 0 ㄇㄧㄣˇ
+泯 0 ㄇㄧㄣˇ
+皿 0 ㄇㄧㄣˇ
+湣 0 ㄇㄧㄣˇ
+愍 0 ㄇㄧㄣˇ
+黽 0 ㄇㄧㄣˇ
+澠 0 ㄇㄧㄣˇ
+笢 0 ㄇㄧㄣˇ
+敃 0 ㄇㄧㄣˇ
+刡 0 ㄇㄧㄣˇ
+僶 0 ㄇㄧㄣˇ
+簢 0 ㄇㄧㄣˇ
+敯 0 ㄇㄧㄣˇ
+潣 0 ㄇㄧㄣˇ
+怋 0 ㄇㄧㄣˇ
+暋 0 ㄇㄧㄣˇ
+黾 0 ㄇㄧㄣˇ
+勄 0 ㄇㄧㄣˇ
+慜 0 ㄇㄧㄣˇ
+冺 0 ㄇㄧㄣˇ
+㥸 0 ㄇㄧㄣˇ
+𧁋 0 ㄇㄧㄣˇ
+民 0 ㄇㄧㄣˊ
+岷 0 ㄇㄧㄣˊ
+玟 0 ㄇㄧㄣˊ
+緡 0 ㄇㄧㄣˊ
+痻 0 ㄇㄧㄣˊ
+苠 0 ㄇㄧㄣˊ
+忞 0 ㄇㄧㄣˊ
+旻 0 ㄇㄧㄣˊ
+鈱 0 ㄇㄧㄣˊ
+旼 0 ㄇㄧㄣˊ
+錉 0 ㄇㄧㄣˊ
+罠 0 ㄇㄧㄣˊ
+閺 0 ㄇㄧㄣˊ
+怋 0 ㄇㄧㄣˊ
+崏 0 ㄇㄧㄣˊ
+暋 0 ㄇㄧㄣˊ
+泯 0 ㄇㄧㄣˊ
+閔 0 ㄇㄧㄣˊ
+閩 0 ㄇㄧㄣˊ
+呡 0 ㄇㄧㄣˊ
+睯 0 ㄇㄧㄣˊ
+忟 0 ㄇㄧㄣˊ
+姄 0 ㄇㄧㄣˊ
+珉 0 ㄇㄧㄣˊ
+盿 0 ㄇㄧㄣˊ
+砇 0 ㄇㄧㄣˊ
+捪 0 ㄇㄧㄣˊ
+琘 0 ㄇㄧㄣˊ
+瑉 0 ㄇㄧㄣˊ
+碈 0 ㄇㄧㄣˊ
+緍 0 ㄇㄧㄣˊ
+䪸 0 ㄇㄧㄣˊ
+賯 0 ㄇㄧㄣˊ
+鍲 0 ㄇㄧㄣˊ
+冺 0 ㄇㄧㄣˊ
+ㄖ 0 ㄖ
+糅 0 ㄖㄡˇ
+鍕 0 ㄖㄡˇ
+粈 0 ㄖㄡˇ
+煣 0 ㄖㄡˇ
+韖 0 ㄖㄡˇ
+肉 0 ㄖㄡˋ
+月 0 ㄖㄡˋ
+宍 0 ㄖㄡˋ
+柔 0 ㄖㄡˊ
+揉 0 ㄖㄡˊ
+韖 0 ㄖㄡˊ
+蹂 0 ㄖㄡˊ
+輮 0 ㄖㄡˊ
+楺 0 ㄖㄡˊ
+禸 0 ㄖㄡˊ
+葇 0 ㄖㄡˊ
+鍒 0 ㄖㄡˊ
+鞣 0 ㄖㄡˊ
+鶔 0 ㄖㄡˊ
+媃 0 ㄖㄡˊ
+蝚 0 ㄖㄡˊ
+鰇 0 ㄖㄡˊ
+厹 0 ㄖㄡˊ
+煣 0 ㄖㄡˊ
+糅 0 ㄖㄡˊ
+㕤 0 ㄖㄡˊ
+叴 0 ㄖㄡˊ
+渘 0 ㄖㄡˊ
+瑈 0 ㄖㄡˊ
+腬 0 ㄖㄡˊ
+䐓 0 ㄖㄡˊ
+瓇 0 ㄖㄡˊ
+脜 0 ㄖㄡˊ
+扔 0 ㄖㄥ
+仍 0 ㄖㄥ
+扔 0 ㄖㄥˇ
+扔 0 ㄖㄥˋ
+芿 0 ㄖㄥˋ
+仍 0 ㄖㄥˊ
+礽 0 ㄖㄥˊ
+陾 0 ㄖㄥˊ
+扔 0 ㄖㄥˊ
+艿 0 ㄖㄥˊ
+㺱 0 ㄖㄥˊ
+辸 0 ㄖㄥˊ
+嚷 0 ㄖㄤ
+嚷 0 ㄖㄤˇ
+壤 0 ㄖㄤˇ
+攘 0 ㄖㄤˇ
+爙 0 ㄖㄤˇ
+穰 0 ㄖㄤˇ
+蠰 0 ㄖㄤˇ
+躟 0 ㄖㄤˇ
+讓 0 ㄖㄤˋ
+懹 0 ㄖㄤˋ
+誏 0 ㄖㄤˋ
+瀼 0 ㄖㄤˋ
+攘 0 ㄖㄤˊ
+禳 0 ㄖㄤˊ
+穰 0 ㄖㄤˊ
+勷 0 ㄖㄤˊ
+瀼 0 ㄖㄤˊ
+瓤 0 ㄖㄤˊ
+儴 0 ㄖㄤˊ
+獽 0 ㄖㄤˊ
+蘘 0 ㄖㄤˊ
+鬤 0 ㄖㄤˊ
+染 0 ㄖㄢˇ
+冉 0 ㄖㄢˇ
+髯 0 ㄖㄢˇ
+苒 0 ㄖㄢˇ
+珃 0 ㄖㄢˇ
+橪 0 ㄖㄢˇ
+呥 0 ㄖㄢˇ
+姌 0 ㄖㄢˇ
+嫨 0 ㄖㄢˇ
+聃 0 ㄖㄢˇ
+冄 0 ㄖㄢˇ
+耼 0 ㄖㄢˇ
+媣 0 ㄖㄢˇ
+蹨 0 ㄖㄢˇ
+然 0 ㄖㄢˊ
+燃 0 ㄖㄢˊ
+髯 0 ㄖㄢˊ
+蛅 0 ㄖㄢˊ
+蚺 0 ㄖㄢˊ
+袡 0 ㄖㄢˊ
+呥 0 ㄖㄢˊ
+舑 0 ㄖㄢˊ
+肰 0 ㄖㄢˊ
+蚦 0 ㄖㄢˊ
+衻 0 ㄖㄢˊ
+髥 0 ㄖㄢˊ
+嘫 0 ㄖㄢˊ
+䔳 0 ㄖㄢˊ
+繎 0 ㄖㄢˊ
+日 0 ㄖˋ
+衵 0 ㄖˋ
+馹 0 ㄖˋ
+鈤 0 ㄖˋ
+入 0 ㄖˋ
+囸 0 ㄖˋ
+釰 0 ㄖˋ
+冗 0 ㄖㄨㄥˇ
+茸 0 ㄖㄨㄥˇ
+氄 0 ㄖㄨㄥˇ
+傇 0 ㄖㄨㄥˇ
+軵 0 ㄖㄨㄥˇ
+宂 0 ㄖㄨㄥˇ
+坈 0 ㄖㄨㄥˇ
+搑 0 ㄖㄨㄥˇ
+縙 0 ㄖㄨㄥˇ
+𢫨 0 ㄖㄨㄥˇ
+縙 0 ㄖㄨㄥˋ
+容 0 ㄖㄨㄥˊ
+榮 0 ㄖㄨㄥˊ
+融 0 ㄖㄨㄥˊ
+溶 0 ㄖㄨㄥˊ
+絨 0 ㄖㄨㄥˊ
+熔 0 ㄖㄨㄥˊ
+戎 0 ㄖㄨㄥˊ
+蓉 0 ㄖㄨㄥˊ
+鎔 0 ㄖㄨㄥˊ
+茸 0 ㄖㄨㄥˊ
+榕 0 ㄖㄨㄥˊ
+羢 0 ㄖㄨㄥˊ
+嶸 0 ㄖㄨㄥˊ
+瑢 0 ㄖㄨㄥˊ
+肜 0 ㄖㄨㄥˊ
+毧 0 ㄖㄨㄥˊ
+狨 0 ㄖㄨㄥˊ
+瀜 0 ㄖㄨㄥˊ
+茙 0 ㄖㄨㄥˊ
+烿 0 ㄖㄨㄥˊ
+蠑 0 ㄖㄨㄥˊ
+爃 0 ㄖㄨㄥˊ
+媶 0 ㄖㄨㄥˊ
+榵 0 ㄖㄨㄥˊ
+褣 0 ㄖㄨㄥˊ
+駥 0 ㄖㄨㄥˊ
+髶 0 ㄖㄨㄥˊ
+鰫 0 ㄖㄨㄥˊ
+鷛 0 ㄖㄨㄥˊ
+頌 0 ㄖㄨㄥˊ
+娀 0 ㄖㄨㄥˊ
+傛 0 ㄖㄨㄥˊ
+軵 0 ㄖㄨㄥˊ
+嵱 0 ㄖㄨㄥˊ
+葺 0 ㄖㄨㄥˊ
+濴 0 ㄖㄨㄥˊ
+鑅 0 ㄖㄨㄥˊ
+荣 0 ㄖㄨㄥˊ
+峵 0 ㄖㄨㄥˊ
+䇯 0 ㄖㄨㄥˊ
+搑 0 ㄖㄨㄥˊ
+穁 0 ㄖㄨㄥˊ
+縙 0 ㄖㄨㄥˊ
+螎 0 ㄖㄨㄥˊ
+嬫 0 ㄖㄨㄥˊ
+濚 0 ㄖㄨㄥˊ
+曧 0 ㄖㄨㄥˊ
+鱅 0 ㄖㄨㄥˊ
+𪃾 0 ㄖㄨㄥˊ
+栄 0 ㄖㄨㄥˊ
+軟 0 ㄖㄨㄢˇ
+阮 0 ㄖㄨㄢˇ
+蠕 0 ㄖㄨㄢˇ
+耎 0 ㄖㄨㄢˇ
+蝡 0 ㄖㄨㄢˇ
+瓀 0 ㄖㄨㄢˇ
+緛 0 ㄖㄨㄢˇ
+礝 0 ㄖㄨㄢˇ
+朊 0 ㄖㄨㄢˇ
+卵 0 ㄖㄨㄢˇ
+需 0 ㄖㄨㄢˇ
+堧 0 ㄖㄨㄢˇ
+偄 0 ㄖㄨㄢˇ
+媆 0 ㄖㄨㄢˇ
+瑌 0 ㄖㄨㄢˇ
+腝 0 ㄖㄨㄢˇ
+輭 0 ㄖㄨㄢˇ
+㮕 0 ㄖㄨㄢˇ
+䓴 0 ㄖㄨㄢˇ
+碝 0 ㄖㄨㄢˇ
+堧 0 ㄖㄨㄢˊ
+壖 0 ㄖㄨㄢˊ
+撋 0 ㄖㄨㄢˊ
+乳 0 ㄖㄨˇ
+汝 0 ㄖㄨˇ
+辱 0 ㄖㄨˇ
+擩 0 ㄖㄨˇ
+女 0 ㄖㄨˇ
+侞 0 ㄖㄨˇ
+入 0 ㄖㄨˇ
+儒 0 ㄖㄨˇ
+肗 0 ㄖㄨˇ
+㨎 0 ㄖㄨˇ
+入 0 ㄖㄨˋ
+辱 0 ㄖㄨˋ
+褥 0 ㄖㄨˋ
+孺 0 ㄖㄨˋ
+茹 0 ㄖㄨˋ
+洳 0 ㄖㄨˋ
+縟 0 ㄖㄨˋ
+蓐 0 ㄖㄨˋ
+溽 0 ㄖㄨˋ
+鄏 0 ㄖㄨˋ
+媷 0 ㄖㄨˋ
+嗕 0 ㄖㄨˋ
+肉 0 ㄖㄨˋ
+耨 0 ㄖㄨˋ
+銣 0 ㄖㄨˋ
+擩 0 ㄖㄨˋ
+宍 0 ㄖㄨˋ
+傉 0 ㄖㄨˋ
+如 0 ㄖㄨˊ
+儒 0 ㄖㄨˊ
+孺 0 ㄖㄨˊ
+茹 0 ㄖㄨˊ
+蠕 0 ㄖㄨˊ
+嚅 0 ㄖㄨˊ
+濡 0 ㄖㄨˊ
+袽 0 ㄖㄨˊ
+襦 0 ㄖㄨˊ
+鴽 0 ㄖㄨˊ
+筎 0 ㄖㄨˊ
+臑 0 ㄖㄨˊ
+醹 0 ㄖㄨˊ
+挐 0 ㄖㄨˊ
+薷 0 ㄖㄨˊ
+銣 0 ㄖㄨˊ
+曘 0 ㄖㄨˊ
+燸 0 ㄖㄨˊ
+帤 0 ㄖㄨˊ
+蕠 0 ㄖㄨˊ
+需 0 ㄖㄨˊ
+懦 0 ㄖㄨˊ
+侞 0 ㄖㄨˊ
+洳 0 ㄖㄨˊ
+蒘 0 ㄖㄨˊ
+蝡 0 ㄖㄨˊ
+壖 0 ㄖㄨˊ
+嬬 0 ㄖㄨˊ
+擩 0 ㄖㄨˊ
+檽 0 ㄖㄨˊ
+瓀 0 ㄖㄨˊ
+繻 0 ㄖㄨˊ
+邚 0 ㄖㄨˊ
+桇 0 ㄖㄨˊ
+偄 0 ㄖㄨˊ
+愞 0 ㄖㄨˊ
+渪 0 ㄖㄨˊ
+瑌 0 ㄖㄨˊ
+顬 0 ㄖㄨˊ
+鱬 0 ㄖㄨˊ
+鴑 0 ㄖㄨˊ
+鑐 0 ㄖㄨˊ
+若 0 ㄖㄨㄛˋ
+弱 0 ㄖㄨㄛˋ
+箬 0 ㄖㄨㄛˋ
+偌 0 ㄖㄨㄛˋ
+爇 0 ㄖㄨㄛˋ
+鄀 0 ㄖㄨㄛˋ
+篛 0 ㄖㄨㄛˋ
+蒻 0 ㄖㄨㄛˋ
+楉 0 ㄖㄨㄛˋ
+鶸 0 ㄖㄨㄛˋ
+婼 0 ㄖㄨㄛˋ
+渃 0 ㄖㄨㄛˋ
+搦 0 ㄖㄨㄛˋ
+叒 0 ㄖㄨㄛˋ
+掿 0 ㄖㄨㄛˋ
+焫 0 ㄖㄨㄛˋ
+搻 0 ㄖㄨㄛˋ
+蕊 0 ㄖㄨㄟˇ
+橤 0 ㄖㄨㄟˇ
+繠 0 ㄖㄨㄟˇ
+惢 0 ㄖㄨㄟˇ
+桵 0 ㄖㄨㄟˇ
+蕋 0 ㄖㄨㄟˇ
+蘂 0 ㄖㄨㄟˇ
+蘃 0 ㄖㄨㄟˇ
+瑞 0 ㄖㄨㄟˋ
+銳 0 ㄖㄨㄟˋ
+芮 0 ㄖㄨㄟˋ
+睿 0 ㄖㄨㄟˋ
+蚋 0 ㄖㄨㄟˋ
+叡 0 ㄖㄨㄟˋ
+枘 0 ㄖㄨㄟˋ
+汭 0 ㄖㄨㄟˋ
+壑 0 ㄖㄨㄟˋ
+濬 0 ㄖㄨㄟˋ
+㕡 0 ㄖㄨㄟˋ
+蜹 0 ㄖㄨㄟˋ
+鋭 0 ㄖㄨㄟˋ
+𤀹 0 ㄖㄨㄟˋ
+㪫 0 ㄖㄨㄟˋ
+䄲 0 ㄖㄨㄟˋ
+𨧨 0 ㄖㄨㄟˋ
+壡 0 ㄖㄨㄟˋ
+蕤 0 ㄖㄨㄟˊ
+緌 0 ㄖㄨㄟˊ
+婑 0 ㄖㄨㄟˊ
+甤 0 ㄖㄨㄟˊ
+䬐 0 ㄖㄨㄟˊ
+犉 0 ㄖㄨㄣ
+潤 0 ㄖㄨㄣˋ
+閏 0 ㄖㄨㄣˋ
+橍 0 ㄖㄨㄣˋ
+撋 0 ㄖㄨㄣˋ
+犉 0 ㄖㄨㄣˊ
+惹 0 ㄖㄜˇ
+喏 0 ㄖㄜˇ
+若 0 ㄖㄜˇ
+叒 0 ㄖㄜˇ
+熱 0 ㄖㄜˋ
+渃 0 ㄖㄜˋ
+爇 0 ㄖㄜˋ
+焫 0 ㄖㄜˋ
+擾 0 ㄖㄠˇ
+嬈 0 ㄖㄠˇ
+撓 0 ㄖㄠˇ
+遶 0 ㄖㄠˇ
+繞 0 ㄖㄠˋ
+遶 0 ㄖㄠˋ
+隢 0 ㄖㄠˋ
+饒 0 ㄖㄠˊ
+蕘 0 ㄖㄠˊ
+嬈 0 ㄖㄠˊ
+橈 0 ㄖㄠˊ
+蟯 0 ㄖㄠˊ
+襓 0 ㄖㄠˊ
+撓 0 ㄖㄠˊ
+鐃 0 ㄖㄠˊ
+驍 0 ㄖㄠˊ
+忍 0 ㄖㄣˇ
+稔 0 ㄖㄣˇ
+荏 0 ㄖㄣˇ
+腍 0 ㄖㄣˇ
+棯 0 ㄖㄣˇ
+栠 0 ㄖㄣˇ
+荵 0 ㄖㄣˇ
+栣 0 ㄖㄣˇ
+秹 0 ㄖㄣˇ
+菍 0 ㄖㄣˇ
+䏰 0 ㄖㄣˇ
+任 0 ㄖㄣˋ
+認 0 ㄖㄣˋ
+刃 0 ㄖㄣˋ
+飪 0 ㄖㄣˋ
+賃 0 ㄖㄣˋ
+軔 0 ㄖㄣˋ
+衽 0 ㄖㄣˋ
+紉 0 ㄖㄣˋ
+妊 0 ㄖㄣˋ
+恁 0 ㄖㄣˋ
+仞 0 ㄖㄣˋ
+訒 0 ㄖㄣˋ
+韌 0 ㄖㄣˋ
+牣 0 ㄖㄣˋ
+鵀 0 ㄖㄣˋ
+屻 0 ㄖㄣˋ
+肕 0 ㄖㄣˋ
+軠 0 ㄖㄣˋ
+壬 0 ㄖㄣˋ
+紝 0 ㄖㄣˋ
+葚 0 ㄖㄣˋ
+銋 0 ㄖㄣˋ
+刄 0 ㄖㄣˋ
+忹 0 ㄖㄣˋ
+杒 0 ㄖㄣˋ
+姙 0 ㄖㄣˋ
+梕 0 ㄖㄣˋ
+絍 0 ㄖㄣˋ
+袵 0 ㄖㄣˋ
+鈓 0 ㄖㄣˋ
+靭 0 ㄖㄣˋ
+餁 0 ㄖㄣˋ
+人 0 ㄖㄣˊ
+任 0 ㄖㄣˊ
+仁 0 ㄖㄣˊ
+壬 0 ㄖㄣˊ
+紝 0 ㄖㄣˊ
+儿 0 ㄖㄣˊ
+芢 0 ㄖㄣˊ
+銋 0 ㄖㄣˊ
+妊 0 ㄖㄣˊ
+軠 0 ㄖㄣˊ
+鵀 0 ㄖㄣˊ
+朲 0 ㄖㄣˊ
+忎 0 ㄖㄣˊ
+姙 0 ㄖㄣˊ
+絍 0 ㄖㄣˊ
+鈓 0 ㄖㄣˊ
+忈 0 ㄖㄣˊ
+秂 0 ㄖㄣˊ
+魜 0 ㄖㄣˊ
+ㄏ 0 ㄏ
+齁 0 ㄏㄡ
+呴 0 ㄏㄡ
+吼 0 ㄏㄡˇ
+呍 0 ㄏㄡˇ
+犼 0 ㄏㄡˇ
+㸸 0 ㄏㄡˇ
+後 0 ㄏㄡˋ
+候 0 ㄏㄡˋ
+厚 0 ㄏㄡˋ
+后 0 ㄏㄡˋ
+逅 0 ㄏㄡˋ
+鱟 0 ㄏㄡˋ
+垕 0 ㄏㄡˋ
+堠 0 ㄏㄡˋ
+郈 0 ㄏㄡˋ
+鄇 0 ㄏㄡˋ
+缿 0 ㄏㄡˋ
+洉 0 ㄏㄡˋ
+姤 0 ㄏㄡˋ
+葔 0 ㄏㄡˋ
+銗 0 ㄏㄡˋ
+緱 0 ㄏㄡˋ
+翭 0 ㄏㄡˋ
+鯸 0 ㄏㄡˋ
+豞 0 ㄏㄡˋ
+睺 0 ㄏㄡˋ
+𢔏 0 ㄏㄡˋ
+鮜 0 ㄏㄡˋ
+猴 0 ㄏㄡˊ
+侯 0 ㄏㄡˊ
+喉 0 ㄏㄡˊ
+篌 0 ㄏㄡˊ
+鍭 0 ㄏㄡˊ
+餱 0 ㄏㄡˊ
+瘊 0 ㄏㄡˊ
+銗 0 ㄏㄡˊ
+翭 0 ㄏㄡˊ
+鯸 0 ㄏㄡˊ
+葔 0 ㄏㄡˊ
+堠 0 ㄏㄡˊ
+鄇 0 ㄏㄡˊ
+緱 0 ㄏㄡˊ
+翵 0 ㄏㄡˊ
+矦 0 ㄏㄡˊ
+睺 0 ㄏㄡˊ
+糇 0 ㄏㄡˊ
+㤧 0 ㄏㄡˊ
+骺 0 ㄏㄡˊ
+帿 0 ㄏㄡˊ
+候 0 ㄏㄡ˙
+亨 0 ㄏㄥ
+哼 0 ㄏㄥ
+脝 0 ㄏㄥ
+諻 0 ㄏㄥ
+悙 0 ㄏㄥ
+橫 0 ㄏㄥˋ
+啈 0 ㄏㄥˋ
+澋 0 ㄏㄥˋ
+絎 0 ㄏㄥˋ
+撔 0 ㄏㄥˋ
+横 0 ㄏㄥˋ
+橫 0 ㄏㄥˊ
+恆 0 ㄏㄥˊ
+衡 0 ㄏㄥˊ
+恒 0 ㄏㄥˊ
+珩 0 ㄏㄥˊ
+蘅 0 ㄏㄥˊ
+桁 0 ㄏㄥˊ
+鴴 0 ㄏㄥˊ
+姮 0 ㄏㄥˊ
+鑅 0 ㄏㄥˊ
+楻 0 ㄏㄥˊ
+誙 0 ㄏㄥˊ
+諻 0 ㄏㄥˊ
+揘 0 ㄏㄥˊ
+佷 0 ㄏㄥˊ
+亨 0 ㄏㄥˊ
+韹 0 ㄏㄥˊ
+堩 0 ㄏㄥˊ
+揯 0 ㄏㄥˊ
+彉 0 ㄏㄥˊ
+緪 0 ㄏㄥˊ
+絚 0 ㄏㄥˊ
+横 0 ㄏㄥˊ
+彍 0 ㄏㄥˊ
+慌 0 ㄏㄥ˙
+夯 0 ㄏㄤ
+酐 0 ㄏㄤˇ
+行 0 ㄏㄤˋ
+沆 0 ㄏㄤˋ
+桁 0 ㄏㄤˋ
+苀 0 ㄏㄤˋ
+行 0 ㄏㄤˊ
+航 0 ㄏㄤˊ
+杭 0 ㄏㄤˊ
+吭 0 ㄏㄤˊ
+頏 0 ㄏㄤˊ
+桁 0 ㄏㄤˊ
+迒 0 ㄏㄤˊ
+苀 0 ㄏㄤˊ
+肮 0 ㄏㄤˊ
+蚢 0 ㄏㄤˊ
+斻 0 ㄏㄤˊ
+貥 0 ㄏㄤˊ
+雽 0 ㄏㄤˊ
+魧 0 ㄏㄤˊ
+沆 0 ㄏㄤˊ
+胻 0 ㄏㄤˊ
+絎 0 ㄏㄤˊ
+筕 0 ㄏㄤˊ
+䘕 0 ㄏㄤˊ
+𨁈 0 ㄏㄤˊ
+酣 0 ㄏㄢ
+鼾 0 ㄏㄢ
+蚶 0 ㄏㄢ
+憨 0 ㄏㄢ
+頇 0 ㄏㄢ
+魽 0 ㄏㄢ
+唅 0 ㄏㄢ
+甝 0 ㄏㄢ
+谽 0 ㄏㄢ
+嫨 0 ㄏㄢ
+姏 0 ㄏㄢ
+酐 0 ㄏㄢ
+佄 0 ㄏㄢ
+馠 0 ㄏㄢ
+喊 0 ㄏㄢˇ
+罕 0 ㄏㄢˇ
+厂 0 ㄏㄢˇ
+蔊 0 ㄏㄢˇ
+豃 0 ㄏㄢˇ
+嚂 0 ㄏㄢˇ
+闞 0 ㄏㄢˇ
+鬫 0 ㄏㄢˇ
+欦 0 ㄏㄢˇ
+浫 0 ㄏㄢˇ
+㙳 0 ㄏㄢˇ
+㘚 0 ㄏㄢˇ
+厈 0 ㄏㄢˇ
+𣛴 0 ㄏㄢˇ
+和 0 ㄏㄢˋ
+漢 0 ㄏㄢˋ
+汗 0 ㄏㄢˋ
+旱 0 ㄏㄢˋ
+焊 0 ㄏㄢˋ
+憾 0 ㄏㄢˋ
+翰 0 ㄏㄢˋ
+撼 0 ㄏㄢˋ
+悍 0 ㄏㄢˋ
+頷 0 ㄏㄢˋ
+扞 0 ㄏㄢˋ
+瀚 0 ㄏㄢˋ
+閈 0 ㄏㄢˋ
+捍 0 ㄏㄢˋ
+暵 0 ㄏㄢˋ
+熯 0 ㄏㄢˋ
+晥 0 ㄏㄢˋ
+犴 0 ㄏㄢˋ
+睅 0 ㄏㄢˋ
+菡 0 ㄏㄢˋ
+豻 0 ㄏㄢˋ
+銲 0 ㄏㄢˋ
+釬 0 ㄏㄢˋ
+駻 0 ㄏㄢˋ
+哻 0 ㄏㄢˋ
+涆 0 ㄏㄢˋ
+淊 0 ㄏㄢˋ
+馯 0 ㄏㄢˋ
+蜭 0 ㄏㄢˋ
+頜 0 ㄏㄢˋ
+螒 0 ㄏㄢˋ
+顄 0 ㄏㄢˋ
+雗 0 ㄏㄢˋ
+攌 0 ㄏㄢˋ
+譀 0 ㄏㄢˋ
+鋎 0 ㄏㄢˋ
+鶾 0 ㄏㄢˋ
+含 0 ㄏㄢˋ
+感 0 ㄏㄢˋ
+琀 0 ㄏㄢˋ
+筸 0 ㄏㄢˋ
+嫨 0 ㄏㄢˋ
+咊 0 ㄏㄢˋ
+浛 0 ㄏㄢˋ
+猂 0 ㄏㄢˋ
+莟 0 ㄏㄢˋ
+惒 0 ㄏㄢˋ
+皔 0 ㄏㄢˋ
+傼 0 ㄏㄢˋ
+蛿 0 ㄏㄢˋ
+睻 0 ㄏㄢˋ
+澏 0 ㄏㄢˋ
+蘫 0 ㄏㄢˋ
+屽 0 ㄏㄢˋ
+㢨 0 ㄏㄢˋ
+娨 0 ㄏㄢˋ
+晘 0 ㄏㄢˋ
+貋 0 ㄏㄢˋ
+㺖 0 ㄏㄢˋ
+𤳉 0 ㄏㄢˋ
+𦜆 0 ㄏㄢˋ
+寒 0 ㄏㄢˊ
+含 0 ㄏㄢˊ
+函 0 ㄏㄢˊ
+涵 0 ㄏㄢˊ
+韓 0 ㄏㄢˊ
+邯 0 ㄏㄢˊ
+汗 0 ㄏㄢˊ
+邗 0 ㄏㄢˊ
+榦 0 ㄏㄢˊ
+琀 0 ㄏㄢˊ
+梒 0 ㄏㄢˊ
+鋡 0 ㄏㄢˊ
+焓 0 ㄏㄢˊ
+幹 0 ㄏㄢˊ
+箴 0 ㄏㄢˊ
+肣 0 ㄏㄢˊ
+虷 0 ㄏㄢˊ
+唅 0 ㄏㄢˊ
+菡 0 ㄏㄢˊ
+蜬 0 ㄏㄢˊ
+谽 0 ㄏㄢˊ
+顄 0 ㄏㄢˊ
+汵 0 ㄏㄢˊ
+凾 0 ㄏㄢˊ
+圅 0 ㄏㄢˊ
+娢 0 ㄏㄢˊ
+㖤 0 ㄏㄢˊ
+崡 0 ㄏㄢˊ
+晗 0 ㄏㄢˊ
+㮀 0 ㄏㄢˊ
+𢔈 0 ㄏㄢˊ
+哈 0 ㄏㄚ
+鉿 0 ㄏㄚ
+𨉣 0 ㄏㄚ
+哈 0 ㄏㄚˇ
+蛤 0 ㄏㄚˊ
+蝦 0 ㄏㄚˊ
+鰕 0 ㄏㄚˊ
+咳 0 ㄏㄞ
+嗨 0 ㄏㄞ
+咍 0 ㄏㄞ
+欬 0 ㄏㄞ
+海 0 ㄏㄞˇ
+醢 0 ㄏㄞˇ
+烸 0 ㄏㄞˇ
+嗨 0 ㄏㄞˇ
+醯 0 ㄏㄞˇ
+酼 0 ㄏㄞˇ
+害 0 ㄏㄞˋ
+亥 0 ㄏㄞˋ
+駭 0 ㄏㄞˋ
+嗨 0 ㄏㄞˋ
+氦 0 ㄏㄞˋ
+嗐 0 ㄏㄞˋ
+絯 0 ㄏㄞˋ
+餀 0 ㄏㄞˋ
+劾 0 ㄏㄞˋ
+咳 0 ㄏㄞˋ
+賅 0 ㄏㄞˋ
+痎 0 ㄏㄞˋ
+搳 0 ㄏㄞˋ
+犗 0 ㄏㄞˋ
+磍 0 ㄏㄞˋ
+縖 0 ㄏㄞˋ
+螛 0 ㄏㄞˋ
+鶷 0 ㄏㄞˋ
+饚 0 ㄏㄞˋ
+㧡 0 ㄏㄞˋ
+還 0 ㄏㄞˊ
+孩 0 ㄏㄞˊ
+骸 0 ㄏㄞˊ
+頦 0 ㄏㄞˊ
+咳 0 ㄏㄞˊ
+鞋 0 ㄏㄞˊ
+陔 0 ㄏㄞˊ
+豥 0 ㄏㄞˊ
+还 0 ㄏㄞˊ
+畡 0 ㄏㄞˊ
+鞵 0 ㄏㄞˊ
+忽 0 ㄏㄨ
+呼 0 ㄏㄨ
+乎 0 ㄏㄨ
+惚 0 ㄏㄨ
+滹 0 ㄏㄨ
+戲 0 ㄏㄨ
+猢 0 ㄏㄨ
+欻 0 ㄏㄨ
+膴 0 ㄏㄨ
+虖 0 ㄏㄨ
+吰 0 ㄏㄨ
+虍 0 ㄏㄨ
+幠 0 ㄏㄨ
+寣 0 ㄏㄨ
+昒 0 ㄏㄨ
+歑 0 ㄏㄨ
+烼 0 ㄏㄨ
+垀 0 ㄏㄨ
+曶 0 ㄏㄨ
+啒 0 ㄏㄨ
+峘 0 ㄏㄨ
+淴 0 ㄏㄨ
+謼 0 ㄏㄨ
+匢 0 ㄏㄨ
+淲 0 ㄏㄨ
+糊 0 ㄏㄨ
+芴 0 ㄏㄨ
+雽 0 ㄏㄨ
+罅 0 ㄏㄨ
+鏬 0 ㄏㄨ
+戏 0 ㄏㄨ
+泘 0 ㄏㄨ
+苸 0 ㄏㄨ
+唿 0 ㄏㄨ
+軤 0 ㄏㄨ
+嘑 0 ㄏㄨ
+雐 0 ㄏㄨ
+戯 0 ㄏㄨ
+戱 0 ㄏㄨ
+歘 0 ㄏㄨ
+恗 0 ㄏㄨ
+烀 0 ㄏㄨ
+匫 0 ㄏㄨ
+䓤 0 ㄏㄨ
+鍃 0 ㄏㄨ
+虎 0 ㄏㄨ
+轟 0 ㄏㄨㄥ
+哄 0 ㄏㄨㄥ
+烘 0 ㄏㄨㄥ
+薨 0 ㄏㄨㄥ
+訇 0 ㄏㄨㄥ
+吽 0 ㄏㄨㄥ
+揈 0 ㄏㄨㄥ
+渹 0 ㄏㄨㄥ
+哅 0 ㄏㄨㄥ
+輷 0 ㄏㄨㄥ
+谾 0 ㄏㄨㄥ
+鍧 0 ㄏㄨㄥ
+焢 0 ㄏㄨㄥ
+魟 0 ㄏㄨㄥ
+薧 0 ㄏㄨㄥ
+叿 0 ㄏㄨㄥ
+𧥺 0 ㄏㄨㄥ
+𩐠 0 ㄏㄨㄥ
+哄 0 ㄏㄨㄥˇ
+嗊 0 ㄏㄨㄥˇ
+晎 0 ㄏㄨㄥˇ
+鬨 0 ㄏㄨㄥˋ
+汞 0 ㄏㄨㄥˋ
+澒 0 ㄏㄨㄥˋ
+蕻 0 ㄏㄨㄥˋ
+鍙 0 ㄏㄨㄥˋ
+訌 0 ㄏㄨㄥˋ
+澋 0 ㄏㄨㄥˋ
+閧 0 ㄏㄨㄥˋ
+闂 0 ㄏㄨㄥˋ
+紅 0 ㄏㄨㄥˊ
+洪 0 ㄏㄨㄥˊ
+宏 0 ㄏㄨㄥˊ
+鴻 0 ㄏㄨㄥˊ
+虹 0 ㄏㄨㄥˊ
+弘 0 ㄏㄨㄥˊ
+泓 0 ㄏㄨㄥˊ
+訌 0 ㄏㄨㄥˊ
+鋐 0 ㄏㄨㄥˊ
+閎 0 ㄏㄨㄥˊ
+黌 0 ㄏㄨㄥˊ
+竑 0 ㄏㄨㄥˊ
+紘 0 ㄏㄨㄥˊ
+翃 0 ㄏㄨㄥˊ
+浤 0 ㄏㄨㄥˊ
+鞃 0 ㄏㄨㄥˊ
+灴 0 ㄏㄨㄥˊ
+葒 0 ㄏㄨㄥˊ
+耾 0 ㄏㄨㄥˊ
+仜 0 ㄏㄨㄥˊ
+汯 0 ㄏㄨㄥˊ
+竤 0 ㄏㄨㄥˊ
+鈜 0 ㄏㄨㄥˊ
+霟 0 ㄏㄨㄥˊ
+妅 0 ㄏㄨㄥˊ
+玒 0 ㄏㄨㄥˊ
+谹 0 ㄏㄨㄥˊ
+渱 0 ㄏㄨㄥˊ
+舼 0 ㄏㄨㄥˊ
+触 0 ㄏㄨㄥˊ
+谼 0 ㄏㄨㄥˊ
+篊 0 ㄏㄨㄥˊ
+彋 0 ㄏㄨㄥˊ
+瓨 0 ㄏㄨㄥˊ
+苰 0 ㄏㄨㄥˊ
+肱 0 ㄏㄨㄥˊ
+嶸 0 ㄏㄨㄥˊ
+吰 0 ㄏㄨㄥˊ
+羾 0 ㄏㄨㄥˊ
+魟 0 ㄏㄨㄥˊ
+霐 0 ㄏㄨㄥˊ
+鍙 0 ㄏㄨㄥˊ
+㢬 0 ㄏㄨㄥˊ
+宖 0 ㄏㄨㄥˊ
+垬 0 ㄏㄨㄥˊ
+娂 0 ㄏㄨㄥˊ
+峵 0 ㄏㄨㄥˊ
+紭 0 ㄏㄨㄥˊ
+粠 0 ㄏㄨㄥˊ
+嵤 0 ㄏㄨㄥˊ
+綋 0 ㄏㄨㄥˊ
+翝 0 ㄏㄨㄥˊ
+葓 0 ㄏㄨㄥˊ
+潂 0 ㄏㄨㄥˊ
+䉺 0 ㄏㄨㄥˊ
+硡 0 ㄏㄨㄥˊ
+𨌆 0 ㄏㄨㄥˊ
+荒 0 ㄏㄨㄤ
+慌 0 ㄏㄨㄤ
+肓 0 ㄏㄨㄤ
+衁 0 ㄏㄨㄤ
+巟 0 ㄏㄨㄤ
+嚝 0 ㄏㄨㄤ
+塃 0 ㄏㄨㄤ
+謊 0 ㄏㄨㄤˇ
+恍 0 ㄏㄨㄤˇ
+晃 0 ㄏㄨㄤˇ
+幌 0 ㄏㄨㄤˇ
+洸 0 ㄏㄨㄤˇ
+怳 0 ㄏㄨㄤˇ
+榥 0 ㄏㄨㄤˇ
+熀 0 ㄏㄨㄤˇ
+鎤 0 ㄏㄨㄤˇ
+滉 0 ㄏㄨㄤˇ
+皝 0 ㄏㄨㄤˇ
+晄 0 ㄏㄨㄤˇ
+奛 0 ㄏㄨㄤˇ
+詤 0 ㄏㄨㄤˇ
+皩 0 ㄏㄨㄤˇ
+宺 0 ㄏㄨㄤˇ
+晃 0 ㄏㄨㄤˋ
+軦 0 ㄏㄨㄤˋ
+幌 0 ㄏㄨㄤˋ
+榥 0 ㄏㄨㄤˋ
+熀 0 ㄏㄨㄤˋ
+鎤 0 ㄏㄨㄤˋ
+晄 0 ㄏㄨㄤˋ
+愰 0 ㄏㄨㄤˋ
+㨪 0 ㄏㄨㄤˋ
+櫎 0 ㄏㄨㄤˋ
+岲 0 ㄏㄨㄤˋ
+曂 0 ㄏㄨㄤˋ
+黃 0 ㄏㄨㄤˊ
+徨 0 ㄏㄨㄤˊ
+惶 0 ㄏㄨㄤˊ
+簧 0 ㄏㄨㄤˊ
+璜 0 ㄏㄨㄤˊ
+磺 0 ㄏㄨㄤˊ
+蝗 0 ㄏㄨㄤˊ
+煌 0 ㄏㄨㄤˊ
+皇 0 ㄏㄨㄤˊ
+凰 0 ㄏㄨㄤˊ
+湟 0 ㄏㄨㄤˊ
+遑 0 ㄏㄨㄤˊ
+隍 0 ㄏㄨㄤˊ
+潢 0 ㄏㄨㄤˊ
+篁 0 ㄏㄨㄤˊ
+喤 0 ㄏㄨㄤˊ
+艎 0 ㄏㄨㄤˊ
+鍠 0 ㄏㄨㄤˊ
+熿 0 ㄏㄨㄤˊ
+韹 0 ㄏㄨㄤˊ
+鰉 0 ㄏㄨㄤˊ
+堭 0 ㄏㄨㄤˊ
+蟥 0 ㄏㄨㄤˊ
+偟 0 ㄏㄨㄤˊ
+穔 0 ㄏㄨㄤˊ
+鷬 0 ㄏㄨㄤˊ
+媓 0 ㄏㄨㄤˊ
+騜 0 ㄏㄨㄤˊ
+崲 0 ㄏㄨㄤˊ
+葟 0 ㄏㄨㄤˊ
+餭 0 ㄏㄨㄤˊ
+撗 0 ㄏㄨㄤˊ
+獚 0 ㄏㄨㄤˊ
+趪 0 ㄏㄨㄤˊ
+揘 0 ㄏㄨㄤˊ
+楻 0 ㄏㄨㄤˊ
+彉 0 ㄏㄨㄤˊ
+諻 0 ㄏㄨㄤˊ
+黄 0 ㄏㄨㄤˊ
+瑝 0 ㄏㄨㄤˊ
+墴 0 ㄏㄨㄤˊ
+彍 0 ㄏㄨㄤˊ
+鐄 0 ㄏㄨㄤˊ
+鱑 0 ㄏㄨㄤˊ
+癀 0 ㄏㄨㄤˊ
+慌 0 ㄏㄨㄤ˙
+歡 0 ㄏㄨㄢ
+驩 0 ㄏㄨㄢ
+讙 0 ㄏㄨㄢ
+獾 0 ㄏㄨㄢ
+犿 0 ㄏㄨㄢ
+懽 0 ㄏㄨㄢ
+酄 0 ㄏㄨㄢ
+鴅 0 ㄏㄨㄢ
+豲 0 ㄏㄨㄢ
+嚾 0 ㄏㄨㄢ
+虇 0 ㄏㄨㄢ
+鱹 0 ㄏㄨㄢ
+欢 0 ㄏㄨㄢ
+覌 0 ㄏㄨㄢ
+歓 0 ㄏㄨㄢ
+㹕 0 ㄏㄨㄢ
+鵍 0 ㄏㄨㄢ
+貛 0 ㄏㄨㄢ
+緩 0 ㄏㄨㄢˇ
+皖 0 ㄏㄨㄢˇ
+澣 0 ㄏㄨㄢˇ
+睆 0 ㄏㄨㄢˇ
+輐 0 ㄏㄨㄢˇ
+諼 0 ㄏㄨㄢˇ
+鍰 0 ㄏㄨㄢˇ
+浣 0 ㄏㄨㄢˇ
+愋 0 ㄏㄨㄢˇ
+換 0 ㄏㄨㄢˋ
+喚 0 ㄏㄨㄢˋ
+宦 0 ㄏㄨㄢˋ
+患 0 ㄏㄨㄢˋ
+幻 0 ㄏㄨㄢˋ
+煥 0 ㄏㄨㄢˋ
+奐 0 ㄏㄨㄢˋ
+渙 0 ㄏㄨㄢˋ
+瘓 0 ㄏㄨㄢˋ
+豢 0 ㄏㄨㄢˋ
+梡 0 ㄏㄨㄢˋ
+逭 0 ㄏㄨㄢˋ
+擐 0 ㄏㄨㄢˋ
+漶 0 ㄏㄨㄢˋ
+垸 0 ㄏㄨㄢˋ
+轘 0 ㄏㄨㄢˋ
+瑍 0 ㄏㄨㄢˋ
+觨 0 ㄏㄨㄢˋ
+瞣 0 ㄏㄨㄢˋ
+肒 0 ㄏㄨㄢˋ
+圂 0 ㄏㄨㄢˋ
+鋎 0 ㄏㄨㄢˋ
+澣 0 ㄏㄨㄢˋ
+鯇 0 ㄏㄨㄢˋ
+攌 0 ㄏㄨㄢˋ
+繯 0 ㄏㄨㄢˋ
+梙 0 ㄏㄨㄢˋ
+喛 0 ㄏㄨㄢˋ
+愌 0 ㄏㄨㄢˋ
+藧 0 ㄏㄨㄢˋ
+鯶 0 ㄏㄨㄢˋ
+鰀 0 ㄏㄨㄢˋ
+烉 0 ㄏㄨㄢˋ
+槵 0 ㄏㄨㄢˋ
+𠈄 0 ㄏㄨㄢˋ
+𤃬 0 ㄏㄨㄢˋ
+還 0 ㄏㄨㄢˊ
+環 0 ㄏㄨㄢˊ
+桓 0 ㄏㄨㄢˊ
+圜 0 ㄏㄨㄢˊ
+繯 0 ㄏㄨㄢˊ
+鬟 0 ㄏㄨㄢˊ
+鍰 0 ㄏㄨㄢˊ
+鐶 0 ㄏㄨㄢˊ
+寰 0 ㄏㄨㄢˊ
+闤 0 ㄏㄨㄢˊ
+梡 0 ㄏㄨㄢˊ
+洹 0 ㄏㄨㄢˊ
+瓛 0 ㄏㄨㄢˊ
+貆 0 ㄏㄨㄢˊ
+澴 0 ㄏㄨㄢˊ
+荁 0 ㄏㄨㄢˊ
+萑 0 ㄏㄨㄢˊ
+肒 0 ㄏㄨㄢˊ
+捖 0 ㄏㄨㄢˊ
+羦 0 ㄏㄨㄢˊ
+懁 0 ㄏㄨㄢˊ
+豲 0 ㄏㄨㄢˊ
+嬛 0 ㄏㄨㄢˊ
+狟 0 ㄏㄨㄢˊ
+雈 0 ㄏㄨㄢˊ
+垣 0 ㄏㄨㄢˊ
+峘 0 ㄏㄨㄢˊ
+垸 0 ㄏㄨㄢˊ
+烜 0 ㄏㄨㄢˊ
+楥 0 ㄏㄨㄢˊ
+儇 0 ㄏㄨㄢˊ
+噮 0 ㄏㄨㄢˊ
+彋 0 ㄏㄨㄢˊ
+擐 0 ㄏㄨㄢˊ
+獧 0 ㄏㄨㄢˊ
+雚 0 ㄏㄨㄢˊ
+攌 0 ㄏㄨㄢˊ
+翾 0 ㄏㄨㄢˊ
+蠉 0 ㄏㄨㄢˊ
+鱞 0 ㄏㄨㄢˊ
+环 0 ㄏㄨㄢˊ
+还 0 ㄏㄨㄢˊ
+絙 0 ㄏㄨㄢˊ
+萈 0 ㄏㄨㄢˊ
+寏 0 ㄏㄨㄢˊ
+䦡 0 ㄏㄨㄢˊ
+糫 0 ㄏㄨㄢˊ
+𢕼 0 ㄏㄨㄢˊ
+虎 0 ㄏㄨˇ
+琥 0 ㄏㄨˇ
+滸 0 ㄏㄨˇ
+唬 0 ㄏㄨˇ
+許 0 ㄏㄨˇ
+汻 0 ㄏㄨˇ
+虍 0 ㄏㄨˇ
+虓 0 ㄏㄨˇ
+箎 0 ㄏㄨˇ
+覤 0 ㄏㄨˇ
+諕 0 ㄏㄨˇ
+篪 0 ㄏㄨˇ
+竾 0 ㄏㄨˇ
+筂 0 ㄏㄨˇ
+萀 0 ㄏㄨˇ
+虝 0 ㄏㄨˇ
+護 0 ㄏㄨˋ
+戶 0 ㄏㄨˋ
+互 0 ㄏㄨˋ
+滬 0 ㄏㄨˋ
+扈 0 ㄏㄨˋ
+瓠 0 ㄏㄨˋ
+怙 0 ㄏㄨˋ
+祜 0 ㄏㄨˋ
+笏 0 ㄏㄨˋ
+冱 0 ㄏㄨˋ
+戽 0 ㄏㄨˋ
+楛 0 ㄏㄨˋ
+沍 0 ㄏㄨˋ
+岵 0 ㄏㄨˋ
+鄠 0 ㄏㄨˋ
+頀 0 ㄏㄨˋ
+枑 0 ㄏㄨˋ
+槴 0 ㄏㄨˋ
+昈 0 ㄏㄨˋ
+嫭 0 ㄏㄨˋ
+婟 0 ㄏㄨˋ
+嫮 0 ㄏㄨˋ
+熩 0 ㄏㄨˋ
+豰 0 ㄏㄨˋ
+綔 0 ㄏㄨˋ
+謢 0 ㄏㄨˋ
+蔰 0 ㄏㄨˋ
+亙 0 ㄏㄨˋ
+斛 0 ㄏㄨˋ
+糊 0 ㄏㄨˋ
+穫 0 ㄏㄨˋ
+芐 0 ㄏㄨˋ
+嘝 0 ㄏㄨˋ
+寣 0 ㄏㄨˋ
+摦 0 ㄏㄨˋ
+熇 0 ㄏㄨˋ
+麧 0 ㄏㄨˋ
+槬 0 ㄏㄨˋ
+槲 0 ㄏㄨˋ
+魱 0 ㄏㄨˋ
+瓁 0 ㄏㄨˋ
+臒 0 ㄏㄨˋ
+韄 0 ㄏㄨˋ
+户 0 ㄏㄨˋ
+戸 0 ㄏㄨˋ
+亘 0 ㄏㄨˋ
+冴 0 ㄏㄨˋ
+沪 0 ㄏㄨˋ
+摢 0 ㄏㄨˋ
+嚛 0 ㄏㄨˋ
+燺 0 ㄏㄨˋ
+耯 0 ㄏㄨˋ
+鱯 0 ㄏㄨˋ
+帍 0 ㄏㄨˋ
+簄 0 ㄏㄨˋ
+胡 0 ㄏㄨˊ
+湖 0 ㄏㄨˊ
+壺 0 ㄏㄨˊ
+蝴 0 ㄏㄨˊ
+糊 0 ㄏㄨˊ
+狐 0 ㄏㄨˊ
+弧 0 ㄏㄨˊ
+葫 0 ㄏㄨˊ
+鬍 0 ㄏㄨˊ
+瑚 0 ㄏㄨˊ
+餬 0 ㄏㄨˊ
+斛 0 ㄏㄨˊ
+鵠 0 ㄏㄨˊ
+囫 0 ㄏㄨˊ
+縠 0 ㄏㄨˊ
+衚 0 ㄏㄨˊ
+觳 0 ㄏㄨˊ
+醐 0 ㄏㄨˊ
+猢 0 ㄏㄨˊ
+搰 0 ㄏㄨˊ
+鶘 0 ㄏㄨˊ
+槲 0 ㄏㄨˊ
+媩 0 ㄏㄨˊ
+抇 0 ㄏㄨˊ
+鰗 0 ㄏㄨˊ
+焀 0 ㄏㄨˊ
+魱 0 ㄏㄨˊ
+螜 0 ㄏㄨˊ
+瀫 0 ㄏㄨˊ
+楜 0 ㄏㄨˊ
+嘝 0 ㄏㄨˊ
+鶦 0 ㄏㄨˊ
+乎 0 ㄏㄨˊ
+和 0 ㄏㄨˊ
+核 0 ㄏㄨˊ
+泒 0 ㄏㄨˊ
+胍 0 ㄏㄨˊ
+壼 0 ㄏㄨˊ
+鈲 0 ㄏㄨˊ
+鶻 0 ㄏㄨˊ
+咊 0 ㄏㄨˊ
+瓳 0 ㄏㄨˊ
+壷 0 ㄏㄨˊ
+喖 0 ㄏㄨˊ
+惒 0 ㄏㄨˊ
+絗 0 ㄏㄨˊ
+蔛 0 ㄏㄨˊ
+頶 0 ㄏㄨˊ
+鍸 0 ㄏㄨˊ
+鱯 0 ㄏㄨˊ
+隺 0 ㄏㄨˊ
+𠴱 0 ㄏㄨˊ
+𤌍 0 ㄏㄨˊ
+箶 0 ㄏㄨˊ
+䁫 0 ㄏㄨˊ
+㗅 0 ㄏㄨˊ
+㿥 0 ㄏㄨˊ
+花 0 ㄏㄨㄚ
+華 0 ㄏㄨㄚ
+嘩 0 ㄏㄨㄚ
+鷨 0 ㄏㄨㄚ
+錵 0 ㄏㄨㄚ
+化 0 ㄏㄨㄚ
+荂 0 ㄏㄨㄚ
+蘤 0 ㄏㄨㄚ
+芲 0 ㄏㄨㄚ
+蕐 0 ㄏㄨㄚ
+話 0 ㄏㄨㄚˋ
+化 0 ㄏㄨㄚˋ
+畫 0 ㄏㄨㄚˋ
+劃 0 ㄏㄨㄚˋ
+樺 0 ㄏㄨㄚˋ
+華 0 ㄏㄨㄚˋ
+嫿 0 ㄏㄨㄚˋ
+摦 0 ㄏㄨㄚˋ
+崋 0 ㄏㄨㄚˋ
+嬅 0 ㄏㄨㄚˋ
+杹 0 ㄏㄨㄚˋ
+觟 0 ㄏㄨㄚˋ
+槬 0 ㄏㄨㄚˋ
+繣 0 ㄏㄨㄚˋ
+澅 0 ㄏㄨㄚˋ
+踝 0 ㄏㄨㄚˋ
+沎 0 ㄏㄨㄚˋ
+罫 0 ㄏㄨㄚˋ
+蘳 0 ㄏㄨㄚˋ
+驊 0 ㄏㄨㄚˋ
+画 0 ㄏㄨㄚˋ
+婳 0 ㄏㄨㄚˋ
+諣 0 ㄏㄨㄚˋ
+舙 0 ㄏㄨㄚˋ
+黊 0 ㄏㄨㄚˋ
+譮 0 ㄏㄨㄚˋ
+畵 0 ㄏㄨㄚˋ
+蕐 0 ㄏㄨㄚˋ
+華 0 ㄏㄨㄚˊ
+滑 0 ㄏㄨㄚˊ
+划 0 ㄏㄨㄚˊ
+猾 0 ㄏㄨㄚˊ
+譁 0 ㄏㄨㄚˊ
+嘩 0 ㄏㄨㄚˊ
+驊 0 ㄏㄨㄚˊ
+鏵 0 ㄏㄨㄚˊ
+豁 0 ㄏㄨㄚˊ
+劃 0 ㄏㄨㄚˊ
+崋 0 ㄏㄨㄚˊ
+釫 0 ㄏㄨㄚˊ
+螖 0 ㄏㄨㄚˊ
+曄 0 ㄏㄨㄚˊ
+姡 0 ㄏㄨㄚˊ
+尳 0 ㄏㄨㄚˊ
+搳 0 ㄏㄨㄚˊ
+嬅 0 ㄏㄨㄚˊ
+澕 0 ㄏㄨㄚˊ
+燁 0 ㄏㄨㄚˊ
+縎 0 ㄏㄨㄚˊ
+骹 0 ㄏㄨㄚˊ
+鷨 0 ㄏㄨㄚˊ
+㕲 0 ㄏㄨㄚˊ
+秳 0 ㄏㄨㄚˊ
+㠏 0 ㄏㄨㄚˊ
+㦊 0 ㄏㄨㄚˊ
+磆 0 ㄏㄨㄚˊ
+劐 0 ㄏㄨㄚˊ
+曅 0 ㄏㄨㄚˊ
+曗 0 ㄏㄨㄚˊ
+䅿 0 ㄏㄨㄚˊ
+㒯 0 ㄏㄨㄚˊ
+爗 0 ㄏㄨㄚˊ
+敌 0 ㄏㄨㄚˊ
+蕐 0 ㄏㄨㄚˊ
+䱻 0 ㄏㄨㄚˊ
+壞 0 ㄏㄨㄞˋ
+坏 0 ㄏㄨㄞˋ
+諙 0 ㄏㄨㄞˋ
+孬 0 ㄏㄨㄞˋ
+咶 0 ㄏㄨㄞˋ
+蘾 0 ㄏㄨㄞˋ
+褱 0 ㄏㄨㄞˋ
+瀤 0 ㄏㄨㄞˋ
+壊 0 ㄏㄨㄞˋ
+懷 0 ㄏㄨㄞˊ
+淮 0 ㄏㄨㄞˊ
+徊 0 ㄏㄨㄞˊ
+槐 0 ㄏㄨㄞˊ
+踝 0 ㄏㄨㄞˊ
+佪 0 ㄏㄨㄞˊ
+怀 0 ㄏㄨㄞˊ
+褢 0 ㄏㄨㄞˊ
+褱 0 ㄏㄨㄞˊ
+櫰 0 ㄏㄨㄞˊ
+瀤 0 ㄏㄨㄞˊ
+獲 0 ㄏㄨㄞˊ
+倠 0 ㄏㄨㄞˊ
+蘹 0 ㄏㄨㄞˊ
+获 0 ㄏㄨㄞˊ
+懐 0 ㄏㄨㄞˊ
+耲 0 ㄏㄨㄞˊ
+㜳 0 ㄏㄨㄞˊ
+豁 0 ㄏㄨㄛ
+火 0 ㄏㄨㄛˇ
+伙 0 ㄏㄨㄛˇ
+夥 0 ㄏㄨㄛˇ
+鈥 0 ㄏㄨㄛˇ
+吙 0 ㄏㄨㄛˇ
+炚 0 ㄏㄨㄛˇ
+邩 0 ㄏㄨㄛˇ
+灬 0 ㄏㄨㄛˇ
+炛 0 ㄏㄨㄛˇ
+或 0 ㄏㄨㄛˋ
+穫 0 ㄏㄨㄛˋ
+獲 0 ㄏㄨㄛˋ
+和 0 ㄏㄨㄛˋ
+惑 0 ㄏㄨㄛˋ
+禍 0 ㄏㄨㄛˋ
+霍 0 ㄏㄨㄛˋ
+貨 0 ㄏㄨㄛˋ
+豁 0 ㄏㄨㄛˋ
+壑 0 ㄏㄨㄛˋ
+蠖 0 ㄏㄨㄛˋ
+嚄 0 ㄏㄨㄛˋ
+藿 0 ㄏㄨㄛˋ
+鑊 0 ㄏㄨㄛˋ
+矱 0 ㄏㄨㄛˋ
+檴 0 ㄏㄨㄛˋ
+濩 0 ㄏㄨㄛˋ
+砉 0 ㄏㄨㄛˋ
+雘 0 ㄏㄨㄛˋ
+擭 0 ㄏㄨㄛˋ
+湱 0 ㄏㄨㄛˋ
+騞 0 ㄏㄨㄛˋ
+謋 0 ㄏㄨㄛˋ
+捇 0 ㄏㄨㄛˋ
+沎 0 ㄏㄨㄛˋ
+眓 0 ㄏㄨㄛˋ
+掝 0 ㄏㄨㄛˋ
+嗀 0 ㄏㄨㄛˋ
+嗀 0 ㄏㄨㄛˋ
+瓁 0 ㄏㄨㄛˋ
+臒 0 ㄏㄨㄛˋ
+攉 0 ㄏㄨㄛˋ
+瀖 0 ㄏㄨㄛˋ
+曤 0 ㄏㄨㄛˋ
+矐 0 ㄏㄨㄛˋ
+靃 0 ㄏㄨㄛˋ
+笏 0 ㄏㄨㄛˋ
+窢 0 ㄏㄨㄛˋ
+聝 0 ㄏㄨㄛˋ
+彉 0 ㄏㄨㄛˋ
+濊 0 ㄏㄨㄛˋ
+馘 0 ㄏㄨㄛˋ
+霩 0 ㄏㄨㄛˋ
+臛 0 ㄏㄨㄛˋ
+礭 0 ㄏㄨㄛˋ
+咊 0 ㄏㄨㄛˋ
+㕷 0 ㄏㄨㄛˋ
+咟 0 ㄏㄨㄛˋ
+俰 0 ㄏㄨㄛˋ
+剨 0 ㄏㄨㄛˋ
+获 0 ㄏㄨㄛˋ
+惒 0 ㄏㄨㄛˋ
+旤 0 ㄏㄨㄛˋ
+㕡 0 ㄏㄨㄛˋ
+劐 0 ㄏㄨㄛˋ
+彍 0 ㄏㄨㄛˋ
+礊 0 ㄏㄨㄛˋ
+矆 0 ㄏㄨㄛˋ
+耯 0 ㄏㄨㄛˋ
+癨 0 ㄏㄨㄛˋ
+彠 0 ㄏㄨㄛˋ
+閄 0 ㄏㄨㄛˋ
+蒦 0 ㄏㄨㄛˋ
+㗲 0 ㄏㄨㄛˋ
+奯 0 ㄏㄨㄛˋ
+艧 0 ㄏㄨㄛˋ
+嚿 0 ㄏㄨㄛˋ
+鸌 0 ㄏㄨㄛˋ
+𦑌 0 ㄏㄨㄛˋ
+活 0 ㄏㄨㄛˊ
+佸 0 ㄏㄨㄛˊ
+鈥 0 ㄏㄨㄛˊ
+萿 0 ㄏㄨㄛˊ
+秮 0 ㄏㄨㄛˊ
+和 0 ㄏㄨㄛ˙
+午 0 ㄏㄨㄛ˙
+咊 0 ㄏㄨㄛ˙
+惒 0 ㄏㄨㄛ˙
+灰 0 ㄏㄨㄟ
+揮 0 ㄏㄨㄟ
+輝 0 ㄏㄨㄟ
+恢 0 ㄏㄨㄟ
+詼 0 ㄏㄨㄟ
+暉 0 ㄏㄨㄟ
+麾 0 ㄏㄨㄟ
+徽 0 ㄏㄨㄟ
+墮 0 ㄏㄨㄟ
+褌 0 ㄏㄨㄟ
+撝 0 ㄏㄨㄟ
+隳 0 ㄏㄨㄟ
+挼 0 ㄏㄨㄟ
+煇 0 ㄏㄨㄟ
+翬 0 ㄏㄨㄟ
+豗 0 ㄏㄨㄟ
+褘 0 ㄏㄨㄟ
+洃 0 ㄏㄨㄟ
+隓 0 ㄏㄨㄟ
+顪 0 ㄏㄨㄟ
+鰴 0 ㄏㄨㄟ
+拻 0 ㄏㄨㄟ
+噅 0 ㄏㄨㄟ
+禈 0 ㄏㄨㄟ
+虺 0 ㄏㄨㄟ
+盔 0 ㄏㄨㄟ
+戲 0 ㄏㄨㄟ
+黴 0 ㄏㄨㄟ
+倠 0 ㄏㄨㄟ
+楎 0 ㄏㄨㄟ
+諢 0 ㄏㄨㄟ
+鍕 0 ㄏㄨㄟ
+戏 0 ㄏㄨㄟ
+灳 0 ㄏㄨㄟ
+咴 0 ㄏㄨㄟ
+烣 0 ㄏㄨㄟ
+婎 0 ㄏㄨㄟ
+媈 0 ㄏㄨㄟ
+㡓 0 ㄏㄨㄟ
+裩 0 ㄏㄨㄟ
+戯 0 ㄏㄨㄟ
+䘗 0 ㄏㄨㄟ
+戱 0 ㄏㄨㄟ
+瀈 0 ㄏㄨㄟ
+㿗 0 ㄏㄨㄟ
+㷇 0 ㄏㄨㄟ
+幑 0 ㄏㄨㄟ
+睳 0 ㄏㄨㄟ
+𦑩 0 ㄏㄨㄟ
+噕 0 ㄏㄨㄟ
+會 0 ㄏㄨㄟˇ
+悔 0 ㄏㄨㄟˇ
+誨 0 ㄏㄨㄟˇ
+毀 0 ㄏㄨㄟˇ
+燬 0 ㄏㄨㄟˇ
+賄 0 ㄏㄨㄟˇ
+虺 0 ㄏㄨㄟˇ
+虫 0 ㄏㄨㄟˇ
+烠 0 ㄏㄨㄟˇ
+毇 0 ㄏㄨㄟˇ
+檓 0 ㄏㄨㄟˇ
+譭 0 ㄏㄨㄟˇ
+珛 0 ㄏㄨㄟˇ
+烸 0 ㄏㄨㄟˇ
+会 0 ㄏㄨㄟˇ
+毁 0 ㄏㄨㄟˇ
+泋 0 ㄏㄨㄟˇ
+會 0 ㄏㄨㄟˋ
+惠 0 ㄏㄨㄟˋ
+匯 0 ㄏㄨㄟˋ
+繪 0 ㄏㄨㄟˋ
+慧 0 ㄏㄨㄟˋ
+彙 0 ㄏㄨㄟˋ
+穢 0 ㄏㄨㄟˋ
+誨 0 ㄏㄨㄟˋ
+賄 0 ㄏㄨㄟˋ
+晦 0 ㄏㄨㄟˋ
+彗 0 ㄏㄨㄟˋ
+諱 0 ㄏㄨㄟˋ
+潰 0 ㄏㄨㄟˋ
+卉 0 ㄏㄨㄟˋ
+蕙 0 ㄏㄨㄟˋ
+濊 0 ㄏㄨㄟˋ
+燴 0 ㄏㄨㄟˋ
+喙 0 ㄏㄨㄟˋ
+恚 0 ㄏㄨㄟˋ
+薈 0 ㄏㄨㄟˋ
+沬 0 ㄏㄨㄟˋ
+翽 0 ㄏㄨㄟˋ
+闠 0 ㄏㄨㄟˋ
+嘒 0 ㄏㄨㄟˋ
+槥 0 ㄏㄨㄟˋ
+篲 0 ㄏㄨㄟˋ
+繢 0 ㄏㄨㄟˋ
+繐 0 ㄏㄨㄟˋ
+蟪 0 ㄏㄨㄟˋ
+璯 0 ㄏㄨㄟˋ
+嬇 0 ㄏㄨㄟˋ
+憓 0 ㄏㄨㄟˋ
+潓 0 ㄏㄨㄟˋ
+瞺 0 ㄏㄨㄟˋ
+譓 0 ㄏㄨㄟˋ
+譿 0 ㄏㄨㄟˋ
+鏸 0 ㄏㄨㄟˋ
+橞 0 ㄏㄨㄟˋ
+廆 0 ㄏㄨㄟˋ
+詴 0 ㄏㄨㄟˋ
+圚 0 ㄏㄨㄟˋ
+蔧 0 ㄏㄨㄟˋ
+獩 0 ㄏㄨㄟˋ
+餯 0 ㄏㄨㄟˋ
+鐬 0 ㄏㄨㄟˋ
+饖 0 ㄏㄨㄟˋ
+芔 0 ㄏㄨㄟˋ
+禬 0 ㄏㄨㄟˋ
+膾 0 ㄏㄨㄟˋ
+彖 0 ㄏㄨㄟˋ
+烠 0 ㄏㄨㄟˋ
+瘣 0 ㄏㄨㄟˋ
+噦 0 ㄏㄨㄟˋ
+噲 0 ㄏㄨㄟˋ
+廥 0 ㄏㄨㄟˋ
+澮 0 ㄏㄨㄟˋ
+獪 0 ㄏㄨㄟˋ
+螝 0 ㄏㄨㄟˋ
+鄶 0 ㄏㄨㄟˋ
+薉 0 ㄏㄨㄟˋ
+繣 0 ㄏㄨㄟˋ
+鏏 0 ㄏㄨㄟˋ
+顪 0 ㄏㄨㄟˋ
+鱠 0 ㄏㄨㄟˋ
+会 0 ㄏㄨㄟˋ
+恵 0 ㄏㄨㄟˋ
+湏 0 ㄏㄨㄟˋ
+絵 0 ㄏㄨㄟˋ
+彚 0 ㄏㄨㄟˋ
+滙 0 ㄏㄨㄟˋ
+詯 0 ㄏㄨㄟˋ
+僡 0 ㄏㄨㄟˋ
+暳 0 ㄏㄨㄟˋ
+䧥 0 ㄏㄨㄟˋ
+膭 0 ㄏㄨㄟˋ
+嚖 0 ㄏㄨㄟˋ
+懳 0 ㄏㄨㄟˋ
+櫘 0 ㄏㄨㄟˋ
+儶 0 ㄏㄨㄟˋ
+譮 0 ㄏㄨㄟˋ
+靧 0 ㄏㄨㄟˋ
+𠱥 0 ㄏㄨㄟˋ
+𡜦 0 ㄏㄨㄟˋ
+寭 0 ㄏㄨㄟˋ
+殨 0 ㄏㄨㄟˋ
+䙡 0 ㄏㄨㄟˋ
+䎚 0 ㄏㄨㄟˋ
+鞼 0 ㄏㄨㄟˋ
+㥣 0 ㄏㄨㄟˋ
+𢕺 0 ㄏㄨㄟˋ
+𦒄 0 ㄏㄨㄟˋ
+回 0 ㄏㄨㄟˊ
+迴 0 ㄏㄨㄟˊ
+蛔 0 ㄏㄨㄟˊ
+茴 0 ㄏㄨㄟˊ
+蚘 0 ㄏㄨㄟˊ
+洄 0 ㄏㄨㄟˊ
+痐 0 ㄏㄨㄟˊ
+恛 0 ㄏㄨㄟˊ
+藱 0 ㄏㄨㄟˊ
+徊 0 ㄏㄨㄟˊ
+佪 0 ㄏㄨㄟˊ
+烠 0 ㄏㄨㄟˊ
+囘 0 ㄏㄨㄟˊ
+冋 0 ㄏㄨㄟˊ
+囬 0 ㄏㄨㄟˊ
+㢠 0 ㄏㄨㄟˊ
+廻 0 ㄏㄨㄟˊ
+廽 0 ㄏㄨㄟˊ
+逥 0 ㄏㄨㄟˊ
+蛕 0 ㄏㄨㄟˊ
+蜖 0 ㄏㄨㄟˊ
+鮰 0 ㄏㄨㄟˊ
+婚 0 ㄏㄨㄣ
+昏 0 ㄏㄨㄣ
+葷 0 ㄏㄨㄣ
+閽 0 ㄏㄨㄣ
+惛 0 ㄏㄨㄣ
+睯 0 ㄏㄨㄣ
+殙 0 ㄏㄨㄣ
+棔 0 ㄏㄨㄣ
+涽 0 ㄏㄨㄣ
+敯 0 ㄏㄨㄣ
+睧 0 ㄏㄨㄣ
+諙 0 ㄏㄨㄣ
+昬 0 ㄏㄨㄣ
+惽 0 ㄏㄨㄣ
+混 0 ㄏㄨㄣˇ
+睔 0 ㄏㄨㄣˇ
+掍 0 ㄏㄨㄣˇ
+混 0 ㄏㄨㄣˋ
+渾 0 ㄏㄨㄣˋ
+溷 0 ㄏㄨㄣˋ
+諢 0 ㄏㄨㄣˋ
+圂 0 ㄏㄨㄣˋ
+慁 0 ㄏㄨㄣˋ
+倱 0 ㄏㄨㄣˋ
+梡 0 ㄏㄨㄣˋ
+觨 0 ㄏㄨㄣˋ
+緷 0 ㄏㄨㄣˋ
+俒 0 ㄏㄨㄣˋ
+焝 0 ㄏㄨㄣˋ
+魂 0 ㄏㄨㄣˊ
+渾 0 ㄏㄨㄣˊ
+餛 0 ㄏㄨㄣˊ
+混 0 ㄏㄨㄣˊ
+琿 0 ㄏㄨㄣˊ
+楎 0 ㄏㄨㄣˊ
+餫 0 ㄏㄨㄣˊ
+棞 0 ㄏㄨㄣˊ
+顐 0 ㄏㄨㄣˊ
+鼲 0 ㄏㄨㄣˊ
+繉 0 ㄏㄨㄣˊ
+轋 0 ㄏㄨㄣˊ
+忶 0 ㄏㄨㄣˊ
+俒 0 ㄏㄨㄣˊ
+堚 0 ㄏㄨㄣˊ
+䮝 0 ㄏㄨㄣˊ
+喝 0 ㄏㄜ
+呵 0 ㄏㄜ
+訶 0 ㄏㄜ
+嗬 0 ㄏㄜ
+峆 0 ㄏㄜ
+堨 0 ㄏㄜ
+嵑 0 ㄏㄜ
+毼 0 ㄏㄜ
+鍻 0 ㄏㄜ
+騔 0 ㄏㄜ
+抲 0 ㄏㄜ
+㰰 0 ㄏㄜ
+賀 0 ㄏㄜˋ
+和 0 ㄏㄜˋ
+鶴 0 ㄏㄜˋ
+喝 0 ㄏㄜˋ
+荷 0 ㄏㄜˋ
+嚇 0 ㄏㄜˋ
+赫 0 ㄏㄜˋ
+郝 0 ㄏㄜˋ
+暍 0 ㄏㄜˋ
+嗃 0 ㄏㄜˋ
+熇 0 ㄏㄜˋ
+猲 0 ㄏㄜˋ
+翯 0 ㄏㄜˋ
+佫 0 ㄏㄜˋ
+煂 0 ㄏㄜˋ
+愒 0 ㄏㄜˋ
+黑 0 ㄏㄜˋ
+豁 0 ㄏㄜˋ
+吓 0 ㄏㄜˋ
+咊 0 ㄏㄜˋ
+垎 0 ㄏㄜˋ
+焃 0 ㄏㄜˋ
+袔 0 ㄏㄜˋ
+黒 0 ㄏㄜˋ
+惒 0 ㄏㄜˋ
+碋 0 ㄏㄜˋ
+㵑 0 ㄏㄜˋ
+燺 0 ㄏㄜˋ
+爀 0 ㄏㄜˋ
+蠚 0 ㄏㄜˋ
+鸖 0 ㄏㄜˋ
+隺 0 ㄏㄜˋ
+癋 0 ㄏㄜˋ
+何 0 ㄏㄜˊ
+合 0 ㄏㄜˊ
+和 0 ㄏㄜˊ
+河 0 ㄏㄜˊ
+荷 0 ㄏㄜˊ
+核 0 ㄏㄜˊ
+盒 0 ㄏㄜˊ
+禾 0 ㄏㄜˊ
+褐 0 ㄏㄜˊ
+劾 0 ㄏㄜˊ
+闔 0 ㄏㄜˊ
+閤 0 ㄏㄜˊ
+曷 0 ㄏㄜˊ
+龢 0 ㄏㄜˊ
+涸 0 ㄏㄜˊ
+盍 0 ㄏㄜˊ
+覈 0 ㄏㄜˊ
+蓋 0 ㄏㄜˊ
+貉 0 ㄏㄜˊ
+閡 0 ㄏㄜˊ
+紇 0 ㄏㄜˊ
+滆 0 ㄏㄜˊ
+翮 0 ㄏㄜˊ
+蝎 0 ㄏㄜˊ
+嗑 0 ㄏㄜˊ
+齕 0 ㄏㄜˊ
+郃 0 ㄏㄜˊ
+餲 0 ㄏㄜˊ
+鶡 0 ㄏㄜˊ
+鉌 0 ㄏㄜˊ
+魺 0 ㄏㄜˊ
+鞨 0 ㄏㄜˊ
+菏 0 ㄏㄜˊ
+姀 0 ㄏㄜˊ
+毼 0 ㄏㄜˊ
+熆 0 ㄏㄜˊ
+蒚 0 ㄏㄜˊ
+篕 0 ㄏㄜˊ
+螛 0 ㄏㄜˊ
+礉 0 ㄏㄜˊ
+盉 0 ㄏㄜˊ
+廅 0 ㄏㄜˊ
+楁 0 ㄏㄜˊ
+澕 0 ㄏㄜˊ
+趷 0 ㄏㄜˊ
+匣 0 ㄏㄜˊ
+苛 0 ㄏㄜˊ
+害 0 ㄏㄜˊ
+蚵 0 ㄏㄜˊ
+渴 0 ㄏㄜˊ
+翕 0 ㄏㄜˊ
+赫 0 ㄏㄜˊ
+佮 0 ㄏㄜˊ
+峇 0 ㄏㄜˊ
+峆 0 ㄏㄜˊ
+敆 0 ㄏㄜˊ
+渮 0 ㄏㄜˊ
+袷 0 ㄏㄜˊ
+酠 0 ㄏㄜˊ
+圔 0 ㄏㄜˊ
+滒 0 ㄏㄜˊ
+鞂 0 ㄏㄜˊ
+樖 0 ㄏㄜˊ
+鞈 0 ㄏㄜˊ
+韐 0 ㄏㄜˊ
+鮯 0 ㄏㄜˊ
+鶷 0 ㄏㄜˊ
+齃 0 ㄏㄜˊ
+乢 0 ㄏㄜˊ
+咊 0 ㄏㄜˊ
+柇 0 ㄏㄜˊ
+狢 0 ㄏㄜˊ
+盇 0 ㄏㄜˊ
+釛 0 ㄏㄜˊ
+啝 0 ㄏㄜˊ
+㭱 0 ㄏㄜˊ
+渇 0 ㄏㄜˊ
+盖 0 ㄏㄜˊ
+惒 0 ㄏㄜˊ
+翖 0 ㄏㄜˊ
+萂 0 ㄏㄜˊ
+訸 0 ㄏㄜˊ
+葢 0 ㄏㄜˊ
+詥 0 ㄏㄜˊ
+貈 0 ㄏㄜˊ
+爀 0 ㄏㄜˊ
+鶮 0 ㄏㄜˊ
+哬 0 ㄏㄜˊ
+耠 0 ㄏㄜˊ
+䞦 0 ㄏㄜˊ
+蒿 0 ㄏㄠ
+嚆 0 ㄏㄠ
+薅 0 ㄏㄠ
+好 0 ㄏㄠˇ
+郝 0 ㄏㄠˇ
+㚼 0 ㄏㄠˇ
+㝀 0 ㄏㄠˇ
+號 0 ㄏㄠˋ
+耗 0 ㄏㄠˋ
+浩 0 ㄏㄠˋ
+皓 0 ㄏㄠˋ
+鎬 0 ㄏㄠˋ
+涸 0 ㄏㄠˋ
+昊 0 ㄏㄠˋ
+好 0 ㄏㄠˋ
+灝 0 ㄏㄠˋ
+澔 0 ㄏㄠˋ
+皜 0 ㄏㄠˋ
+顥 0 ㄏㄠˋ
+鄗 0 ㄏㄠˋ
+秏 0 ㄏㄠˋ
+淏 0 ㄏㄠˋ
+滈 0 ㄏㄠˋ
+皞 0 ㄏㄠˋ
+哠 0 ㄏㄠˋ
+悎 0 ㄏㄠˋ
+鰝 0 ㄏㄠˋ
+昦 0 ㄏㄠˋ
+薃 0 ㄏㄠˋ
+饕 0 ㄏㄠˋ
+狊 0 ㄏㄠˋ
+藃 0 ㄏㄠˋ
+号 0 ㄏㄠˋ
+㚪 0 ㄏㄠˋ
+㝀 0 ㄏㄠˋ
+侴 0 ㄏㄠˋ
+恏 0 ㄏㄠˋ
+晧 0 ㄏㄠˋ
+暤 0 ㄏㄠˋ
+飸 0 ㄏㄠˋ
+暭 0 ㄏㄠˋ
+曍 0 ㄏㄠˋ
+皡 0 ㄏㄠˋ
+皥 0 ㄏㄠˋ
+瀥 0 ㄏㄠˋ
+峼 0 ㄏㄠˋ
+傐 0 ㄏㄠˋ
+聕 0 ㄏㄠˋ
+㵆 0 ㄏㄠˋ
+號 0 ㄏㄠˊ
+毫 0 ㄏㄠˊ
+豪 0 ㄏㄠˊ
+壕 0 ㄏㄠˊ
+濠 0 ㄏㄠˊ
+蠔 0 ㄏㄠˊ
+貉 0 ㄏㄠˊ
+嚎 0 ㄏㄠˊ
+鶴 0 ㄏㄠˊ
+蚵 0 ㄏㄠˊ
+嗥 0 ㄏㄠˊ
+籇 0 ㄏㄠˊ
+諕 0 ㄏㄠˊ
+勂 0 ㄏㄠˊ
+譹 0 ㄏㄠˊ
+麾 0 ㄏㄠˊ
+呺 0 ㄏㄠˊ
+蚝 0 ㄏㄠˊ
+檺 0 ㄏㄠˊ
+号 0 ㄏㄠˊ
+狢 0 ㄏㄠˊ
+椃 0 ㄏㄠˊ
+獆 0 ㄏㄠˊ
+貈 0 ㄏㄠˊ
+噑 0 ㄏㄠˊ
+獔 0 ㄏㄠˊ
+嘷 0 ㄏㄠˊ
+獋 0 ㄏㄠˊ
+儫 0 ㄏㄠˊ
+㩝 0 ㄏㄠˊ
+鸖 0 ㄏㄠˊ
+黑 0 ㄏㄟ
+嘿 0 ㄏㄟ
+潶 0 ㄏㄟ
+黒 0 ㄏㄟ
+㱄 0 ㄏㄟ
+黑 0 ㄏㄟˇ
+黒 0 ㄏㄟˇ
+很 0 ㄏㄣˇ
+狠 0 ㄏㄣˇ
+佷 0 ㄏㄣˇ
+拫 0 ㄏㄣˇ
+硍 0 ㄏㄣˇ
+蛝 0 ㄏㄣˇ
+豤 0 ㄏㄣˇ
+鞎 0 ㄏㄣˇ
+詪 0 ㄏㄣˇ
+恨 0 ㄏㄣˋ
+拫 0 ㄏㄣˋ
+痕 0 ㄏㄣˊ
+拫 0 ㄏㄣˊ
+鞎 0 ㄏㄣˊ
+含 0 ㄏㄣˊ
+噙 0 ㄏㄣˊ
+ㄎ 0 ㄎ
+摳 0 ㄎㄡ
+彄 0 ㄎㄡ
+芤 0 ㄎㄡ
+袧 0 ㄎㄡ
+鏂 0 ㄎㄡ
+剾 0 ㄎㄡ
+眗 0 ㄎㄡ
+䁱 0 ㄎㄡ
+口 0 ㄎㄡˇ
+劶 0 ㄎㄡˇ
+㸸 0 ㄎㄡˇ
+扣 0 ㄎㄡˋ
+寇 0 ㄎㄡˋ
+叩 0 ㄎㄡˋ
+蔻 0 ㄎㄡˋ
+釦 0 ㄎㄡˋ
+鷇 0 ㄎㄡˋ
+筘 0 ㄎㄡˋ
+佝 0 ㄎㄡˋ
+怐 0 ㄎㄡˋ
+滱 0 ㄎㄡˋ
+瞉 0 ㄎㄡˋ
+簆 0 ㄎㄡˋ
+抇 0 ㄎㄡˋ
+傴 0 ㄎㄡˋ
+敂 0 ㄎㄡˋ
+冦 0 ㄎㄡˋ
+宼 0 ㄎㄡˋ
+伛 0 ㄎㄡˋ
+窛 0 ㄎㄡˋ
+蔲 0 ㄎㄡˋ
+坑 0 ㄎㄥ
+硜 0 ㄎㄥ
+鏗 0 ㄎㄥ
+牼 0 ㄎㄥ
+吭 0 ㄎㄥ
+阬 0 ㄎㄥ
+硻 0 ㄎㄥ
+銵 0 ㄎㄥ
+娙 0 ㄎㄥ
+挳 0 ㄎㄥ
+鍞 0 ㄎㄥ
+傾 0 ㄎㄥ
+囥 0 ㄎㄥ
+邟 0 ㄎㄥ
+笐 0 ㄎㄥ
+慳 0 ㄎㄥ
+誙 0 ㄎㄥ
+妔 0 ㄎㄥ
+砊 0 ㄎㄥ
+揁 0 ㄎㄥ
+摼 0 ㄎㄥ
+䃘 0 ㄎㄥ
+劥 0 ㄎㄥ
+殸 0 ㄎㄥ
+挳 0 ㄎㄥˇ
+肯 0 ㄎㄥˇ
+肎 0 ㄎㄥˇ
+康 0 ㄎㄤ
+慷 0 ㄎㄤ
+糠 0 ㄎㄤ
+鏮 0 ㄎㄤ
+漮 0 ㄎㄤ
+嫝 0 ㄎㄤ
+鱇 0 ㄎㄤ
+忼 0 ㄎㄤ
+粇 0 ㄎㄤ
+嵻 0 ㄎㄤ
+穅 0 ㄎㄤ
+躿 0 ㄎㄤ
+㝩 0 ㄎㄤ
+䆲 0 ㄎㄤ
+慷 0 ㄎㄤˇ
+骯 0 ㄎㄤˇ
+忼 0 ㄎㄤˇ
+亢 0 ㄎㄤˋ
+抗 0 ㄎㄤˋ
+炕 0 ㄎㄤˋ
+伉 0 ㄎㄤˋ
+匟 0 ㄎㄤˋ
+囥 0 ㄎㄤˋ
+犺 0 ㄎㄤˋ
+閌 0 ㄎㄤˋ
+邟 0 ㄎㄤˋ
+鈧 0 ㄎㄤˋ
+吭 0 ㄎㄤˋ
+沆 0 ㄎㄤˋ
+阬 0 ㄎㄤˋ
+斻 0 ㄎㄤˋ
+肮 0 ㄎㄤˋ
+苀 0 ㄎㄤˋ
+迒 0 ㄎㄤˋ
+笐 0 ㄎㄤˋ
+蚢 0 ㄎㄤˋ
+貥 0 ㄎㄤˋ
+魧 0 ㄎㄤˋ
+砊 0 ㄎㄤˋ
+扛 0 ㄎㄤˊ
+刊 0 ㄎㄢ
+堪 0 ㄎㄢ
+勘 0 ㄎㄢ
+戡 0 ㄎㄢ
+看 0 ㄎㄢ
+龕 0 ㄎㄢ
+嵁 0 ㄎㄢ
+嵌 0 ㄎㄢ
+歁 0 ㄎㄢ
+墈 0 ㄎㄢ
+磡 0 ㄎㄢ
+刋 0 ㄎㄢ
+栞 0 ㄎㄢ
+盫 0 ㄎㄢ
+砍 0 ㄎㄢˇ
+侃 0 ㄎㄢˇ
+坎 0 ㄎㄢˇ
+崁 0 ㄎㄢˇ
+嵌 0 ㄎㄢˇ
+莰 0 ㄎㄢˇ
+檻 0 ㄎㄢˇ
+欿 0 ㄎㄢˇ
+轗 0 ㄎㄢˇ
+歁 0 ㄎㄢˇ
+歞 0 ㄎㄢˇ
+埳 0 ㄎㄢˇ
+凵 0 ㄎㄢˇ
+顑 0 ㄎㄢˇ
+堿 0 ㄎㄢˇ
+竷 0 ㄎㄢˇ
+闞 0 ㄎㄢˇ
+偘 0 ㄎㄢˇ
+塪 0 ㄎㄢˇ
+㙳 0 ㄎㄢˇ
+惂 0 ㄎㄢˇ
+輡 0 ㄎㄢˇ
+看 0 ㄎㄢˋ
+瞰 0 ㄎㄢˋ
+勘 0 ㄎㄢˋ
+闞 0 ㄎㄢˋ
+矙 0 ㄎㄢˋ
+磡 0 ㄎㄢˋ
+衎 0 ㄎㄢˋ
+墈 0 ㄎㄢˋ
+碪 0 ㄎㄢˋ
+譀 0 ㄎㄢˋ
+咖 0 ㄎㄚ
+喀 0 ㄎㄚ
+哈 0 ㄎㄚ
+咔 0 ㄎㄚ
+鉲 0 ㄎㄚ
+刮 0 ㄎㄚ
+卡 0 ㄎㄚˇ
+咳 0 ㄎㄚˇ
+佧 0 ㄎㄚˇ
+咔 0 ㄎㄚˇ
+鉲 0 ㄎㄚˇ
+拤 0 ㄎㄚˇ
+咯 0 ㄎㄚˇ
+喀 0 ㄎㄚˋ
+髂 0 ㄎㄚˋ
+開 0 ㄎㄞ
+揩 0 ㄎㄞ
+痎 0 ㄎㄞ
+侅 0 ㄎㄞ
+奒 0 ㄎㄞ
+凱 0 ㄎㄞˇ
+慨 0 ㄎㄞˇ
+楷 0 ㄎㄞˇ
+愷 0 ㄎㄞˇ
+剴 0 ㄎㄞˇ
+豈 0 ㄎㄞˇ
+鎧 0 ㄎㄞˇ
+塏 0 ㄎㄞˇ
+闓 0 ㄎㄞˇ
+鍇 0 ㄎㄞˇ
+颽 0 ㄎㄞˇ
+暟 0 ㄎㄞˇ
+輆 0 ㄎㄞˇ
+覬 0 ㄎㄞˇ
+喈 0 ㄎㄞˇ
+湝 0 ㄎㄞˇ
+瑎 0 ㄎㄞˇ
+磑 0 ㄎㄞˇ
+蝔 0 ㄎㄞˇ
+顗 0 ㄎㄞˇ
+鶛 0 ㄎㄞˇ
+嵦 0 ㄎㄞˇ
+䁗 0 ㄎㄞˇ
+蒈 0 ㄎㄞˇ
+慨 0 ㄎㄞˋ
+愾 0 ㄎㄞˋ
+愒 0 ㄎㄞˋ
+咳 0 ㄎㄞˋ
+欬 0 ㄎㄞˋ
+烗 0 ㄎㄞˋ
+勓 0 ㄎㄞˋ
+壒 0 ㄎㄞˋ
+概 0 ㄎㄞˋ
+濭 0 ㄎㄞˋ
+忾 0 ㄎㄞˋ
+炌 0 ㄎㄞˋ
+幆 0 ㄎㄞˋ
+嘅 0 ㄎㄞˋ
+槪 0 ㄎㄞˋ
+槩 0 ㄎㄞˋ
+哭 0 ㄎㄨ
+枯 0 ㄎㄨ
+窟 0 ㄎㄨ
+骷 0 ㄎㄨ
+跍 0 ㄎㄨ
+挎 0 ㄎㄨ
+桍 0 ㄎㄨ
+刳 0 ㄎㄨ
+顝 0 ㄎㄨ
+胐 0 ㄎㄨ
+橭 0 ㄎㄨ
+窋 0 ㄎㄨ
+堀 0 ㄎㄨ
+箍 0 ㄎㄨ
+郀 0 ㄎㄨ
+笟 0 ㄎㄨ
+軲 0 ㄎㄨ
+圐 0 ㄎㄨ
+鮬 0 ㄎㄨ
+崫 0 ㄎㄨ
+圣 0 ㄎㄨ
+空 0 ㄎㄨㄥ
+崆 0 ㄎㄨㄥ
+倥 0 ㄎㄨㄥ
+箜 0 ㄎㄨㄥ
+悾 0 ㄎㄨㄥ
+硿 0 ㄎㄨㄥ
+涳 0 ㄎㄨㄥ
+錓 0 ㄎㄨㄥ
+焢 0 ㄎㄨㄥ
+谾 0 ㄎㄨㄥ
+曌 0 ㄎㄨㄥ
+鞚 0 ㄎㄨㄥ
+㚚 0 ㄎㄨㄥ
+埪 0 ㄎㄨㄥ
+鵼 0 ㄎㄨㄥ
+恐 0 ㄎㄨㄥˇ
+孔 0 ㄎㄨㄥˇ
+倥 0 ㄎㄨㄥˇ
+吼 0 ㄎㄨㄥˇ
+悾 0 ㄎㄨㄥˇ
+空 0 ㄎㄨㄥˋ
+控 0 ㄎㄨㄥˋ
+鞚 0 ㄎㄨㄥˋ
+羫 0 ㄎㄨㄥˋ
+匡 0 ㄎㄨㄤ
+框 0 ㄎㄨㄤ
+筐 0 ㄎㄨㄤ
+誆 0 ㄎㄨㄤ
+劻 0 ㄎㄨㄤ
+恇 0 ㄎㄨㄤ
+洭 0 ㄎㄨㄤ
+眶 0 ㄎㄨㄤ
+哐 0 ㄎㄨㄤ
+邼 0 ㄎㄨㄤ
+㑌 0 ㄎㄨㄤ
+匩 0 ㄎㄨㄤ
+䒰 0 ㄎㄨㄤ
+硄 0 ㄎㄨㄤ
+軭 0 ㄎㄨㄤ
+俇 0 ㄎㄨㄤˇ
+儣 0 ㄎㄨㄤˇ
+懬 0 ㄎㄨㄤˇ
+況 0 ㄎㄨㄤˋ
+礦 0 ㄎㄨㄤˋ
+曠 0 ㄎㄨㄤˋ
+框 0 ㄎㄨㄤˋ
+眶 0 ㄎㄨㄤˋ
+鄺 0 ㄎㄨㄤˋ
+貺 0 ㄎㄨㄤˋ
+壙 0 ㄎㄨㄤˋ
+纊 0 ㄎㄨㄤˋ
+絖 0 ㄎㄨㄤˋ
+懭 0 ㄎㄨㄤˋ
+爌 0 ㄎㄨㄤˋ
+彉 0 ㄎㄨㄤˋ
+怳 0 ㄎㄨㄤˋ
+紖 0 ㄎㄨㄤˋ
+軦 0 ㄎㄨㄤˋ
+矌 0 ㄎㄨㄤˋ
+况 0 ㄎㄨㄤˋ
+眖 0 ㄎㄨㄤˋ
+鋛 0 ㄎㄨㄤˋ
+兤 0 ㄎㄨㄤˋ
+鑛 0 ㄎㄨㄤˋ
+黋 0 ㄎㄨㄤˋ
+狂 0 ㄎㄨㄤˊ
+誑 0 ㄎㄨㄤˊ
+鵟 0 ㄎㄨㄤˊ
+狅 0 ㄎㄨㄤˊ
+俇 0 ㄎㄨㄤˊ
+仼 0 ㄎㄨㄤˊ
+抂 0 ㄎㄨㄤˊ
+軖 0 ㄎㄨㄤˊ
+寬 0 ㄎㄨㄢ
+髖 0 ㄎㄨㄢ
+臗 0 ㄎㄨㄢ
+寛 0 ㄎㄨㄢ
+款 0 ㄎㄨㄢˇ
+窾 0 ㄎㄨㄢˇ
+梡 0 ㄎㄨㄢˇ
+欵 0 ㄎㄨㄢˇ
+歀 0 ㄎㄨㄢˇ
+窽 0 ㄎㄨㄢˇ
+苦 0 ㄎㄨˇ
+楛 0 ㄎㄨˇ
+瘔 0 ㄎㄨˇ
+庫 0 ㄎㄨˋ
+褲 0 ㄎㄨˋ
+酷 0 ㄎㄨˋ
+嚳 0 ㄎㄨˋ
+矻 0 ㄎㄨˋ
+瘔 0 ㄎㄨˋ
+趶 0 ㄎㄨˋ
+厙 0 ㄎㄨˋ
+硞 0 ㄎㄨˋ
+俈 0 ㄎㄨˋ
+秙 0 ㄎㄨˋ
+絝 0 ㄎㄨˋ
+袴 0 ㄎㄨˋ
+焅 0 ㄎㄨˋ
+誇 0 ㄎㄨㄚ
+夸 0 ㄎㄨㄚ
+姱 0 ㄎㄨㄚ
+荂 0 ㄎㄨㄚ
+晇 0 ㄎㄨㄚ
+侉 0 ㄎㄨㄚ
+舿 0 ㄎㄨㄚ
+咼 0 ㄎㄨㄚ
+挎 0 ㄎㄨㄚ
+桍 0 ㄎㄨㄚ
+綔 0 ㄎㄨㄚ
+銙 0 ㄎㄨㄚ
+咵 0 ㄎㄨㄚ
+叧 0 ㄎㄨㄚ
+恗 0 ㄎㄨㄚ
+垮 0 ㄎㄨㄚˇ
+侉 0 ㄎㄨㄚˇ
+銙 0 ㄎㄨㄚˇ
+刳 0 ㄎㄨㄚˇ
+挎 0 ㄎㄨㄚˇ
+桍 0 ㄎㄨㄚˇ
+跨 0 ㄎㄨㄚˋ
+胯 0 ㄎㄨㄚˋ
+骻 0 ㄎㄨㄚˋ
+垮 0 ㄎㄨㄚˋ
+姱 0 ㄎㄨㄚˋ
+晇 0 ㄎㄨㄚˋ
+銙 0 ㄎㄨㄚˋ
+㐄 0 ㄎㄨㄚˋ
+挎 0 ㄎㄨㄚˋ
+咼 0 ㄎㄨㄞ
+喎 0 ㄎㄨㄞ
+擓 0 ㄎㄨㄞ
+叧 0 ㄎㄨㄞ
+蒯 0 ㄎㄨㄞˇ
+舀 0 ㄎㄨㄞˇ
+快 0 ㄎㄨㄞˋ
+塊 0 ㄎㄨㄞˋ
+會 0 ㄎㄨㄞˋ
+筷 0 ㄎㄨㄞˋ
+檜 0 ㄎㄨㄞˋ
+劊 0 ㄎㄨㄞˋ
+鄶 0 ㄎㄨㄞˋ
+澮 0 ㄎㄨㄞˋ
+膾 0 ㄎㄨㄞˋ
+噲 0 ㄎㄨㄞˋ
+獪 0 ㄎㄨㄞˋ
+儈 0 ㄎㄨㄞˋ
+鱠 0 ㄎㄨㄞˋ
+駃 0 ㄎㄨㄞˋ
+鬠 0 ㄎㄨㄞˋ
+欳 0 ㄎㄨㄞˋ
+炔 0 ㄎㄨㄞˋ
+蒯 0 ㄎㄨㄞˋ
+瘣 0 ㄎㄨㄞˋ
+廥 0 ㄎㄨㄞˋ
+璯 0 ㄎㄨㄞˋ
+癐 0 ㄎㄨㄞˋ
+瞺 0 ㄎㄨㄞˋ
+旝 0 ㄎㄨㄞˋ
+会 0 ㄎㄨㄞˋ
+块 0 ㄎㄨㄞˋ
+巜 0 ㄎㄨㄞˋ
+凷 0 ㄎㄨㄞˋ
+擃 0 ㄎㄨㄛˇ
+括 0 ㄎㄨㄛˋ
+擴 0 ㄎㄨㄛˋ
+闊 0 ㄎㄨㄛˋ
+廓 0 ㄎㄨㄛˋ
+鞹 0 ㄎㄨㄛˋ
+漷 0 ㄎㄨㄛˋ
+蛞 0 ㄎㄨㄛˋ
+姡 0 ㄎㄨㄛˋ
+霩 0 ㄎㄨㄛˋ
+籗 0 ㄎㄨㄛˋ
+适 0 ㄎㄨㄛˋ
+萿 0 ㄎㄨㄛˋ
+鬠 0 ㄎㄨㄛˋ
+拡 0 ㄎㄨㄛˋ
+挄 0 ㄎㄨㄛˋ
+頢 0 ㄎㄨㄛˋ
+濶 0 ㄎㄨㄛˋ
+鞟 0 ㄎㄨㄛˋ
+虧 0 ㄎㄨㄟ
+窺 0 ㄎㄨㄟ
+盔 0 ㄎㄨㄟ
+闚 0 ㄎㄨㄟ
+刲 0 ㄎㄨㄟ
+悝 0 ㄎㄨㄟ
+鍷 0 ㄎㄨㄟ
+茥 0 ㄎㄨㄟ
+藈 0 ㄎㄨㄟ
+噅 0 ㄎㄨㄟ
+巋 0 ㄎㄨㄟ
+蘬 0 ㄎㄨㄟ
+楏 0 ㄎㄨㄟ
+聧 0 ㄎㄨㄟ
+蝰 0 ㄎㄨㄟ
+傀 0 ㄎㄨㄟˇ
+跬 0 ㄎㄨㄟˇ
+頍 0 ㄎㄨㄟˇ
+煃 0 ㄎㄨㄟˇ
+蹞 0 ㄎㄨㄟˇ
+峞 0 ㄎㄨㄟˇ
+揆 0 ㄎㄨㄟˇ
+磈 0 ㄎㄨㄟˇ
+尯 0 ㄎㄨㄟˇ
+猤 0 ㄎㄨㄟˇ
+愧 0 ㄎㄨㄟˋ
+潰 0 ㄎㄨㄟˋ
+匱 0 ㄎㄨㄟˋ
+饋 0 ㄎㄨㄟˋ
+餽 0 ㄎㄨㄟˋ
+喟 0 ㄎㄨㄟˋ
+簣 0 ㄎㄨㄟˋ
+媿 0 ㄎㄨㄟˋ
+聵 0 ㄎㄨㄟˋ
+憒 0 ㄎㄨㄟˋ
+簀 0 ㄎㄨㄟˋ
+蕢 0 ㄎㄨㄟˋ
+瞶 0 ㄎㄨㄟˋ
+槶 0 ㄎㄨㄟˋ
+樻 0 ㄎㄨㄟˋ
+鐀 0 ㄎㄨㄟˋ
+嘳 0 ㄎㄨㄟˋ
+撌 0 ㄎㄨㄟˋ
+騩 0 ㄎㄨㄟˋ
+硊 0 ㄎㄨㄟˋ
+蔮 0 ㄎㄨㄟˋ
+歸 0 ㄎㄨㄟˋ
+腃 0 ㄎㄨㄟˋ
+归 0 ㄎㄨㄟˋ
+帰 0 ㄎㄨㄟˋ
+胿 0 ㄎㄨㄟˋ
+謉 0 ㄎㄨㄟˋ
+籄 0 ㄎㄨㄟˋ
+鑎 0 ㄎㄨㄟˋ
+殨 0 ㄎㄨㄟˋ
+聭 0 ㄎㄨㄟˋ
+䙡 0 ㄎㄨㄟˋ
+䰎 0 ㄎㄨㄟˋ
+糩 0 ㄎㄨㄟˋ
+魁 0 ㄎㄨㄟˊ
+睽 0 ㄎㄨㄟˊ
+奎 0 ㄎㄨㄟˊ
+揆 0 ㄎㄨㄟˊ
+葵 0 ㄎㄨㄟˊ
+逵 0 ㄎㄨㄟˊ
+戣 0 ㄎㄨㄟˊ
+夔 0 ㄎㄨㄟˊ
+騤 0 ㄎㄨㄟˊ
+暌 0 ㄎㄨㄟˊ
+鄈 0 ㄎㄨㄟˊ
+頯 0 ㄎㄨㄟˊ
+聧 0 ㄎㄨㄟˊ
+楏 0 ㄎㄨㄟˊ
+櫆 0 ㄎㄨㄟˊ
+湀 0 ㄎㄨㄟˊ
+馗 0 ㄎㄨㄟˊ
+楑 0 ㄎㄨㄟˊ
+犪 0 ㄎㄨㄟˊ
+躨 0 ㄎㄨㄟˊ
+眭 0 ㄎㄨㄟˊ
+鍷 0 ㄎㄨㄟˊ
+晆 0 ㄎㄨㄟˊ
+鍨 0 ㄎㄨㄟˊ
+虁 0 ㄎㄨㄟˊ
+昆 0 ㄎㄨㄣ
+崑 0 ㄎㄨㄣ
+坤 0 ㄎㄨㄣ
+琨 0 ㄎㄨㄣ
+錕 0 ㄎㄨㄣ
+焜 0 ㄎㄨㄣ
+褌 0 ㄎㄨㄣ
+晜 0 ㄎㄨㄣ
+鯤 0 ㄎㄨㄣ
+菎 0 ㄎㄨㄣ
+騉 0 ㄎㄨㄣ
+髡 0 ㄎㄨㄣ
+惃 0 ㄎㄨㄣ
+猑 0 ㄎㄨㄣ
+混 0 ㄎㄨㄣ
+倱 0 ㄎㄨㄣ
+緄 0 ㄎㄨㄣ
+堃 0 ㄎㄨㄣ
+崐 0 ㄎㄨㄣ
+㡓 0 ㄎㄨㄣ
+髠 0 ㄎㄨㄣ
+蜫 0 ㄎㄨㄣ
+裩 0 ㄎㄨㄣ
+髨 0 ㄎㄨㄣ
+瑻 0 ㄎㄨㄣ
+醌 0 ㄎㄨㄣ
+罤 0 ㄎㄨㄣ
+捆 0 ㄎㄨㄣˇ
+綑 0 ㄎㄨㄣˇ
+悃 0 ㄎㄨㄣˇ
+梱 0 ㄎㄨㄣˇ
+閫 0 ㄎㄨㄣˇ
+壼 0 ㄎㄨㄣˇ
+稛 0 ㄎㄨㄣˇ
+硱 0 ㄎㄨㄣˇ
+裍 0 ㄎㄨㄣˇ
+齫 0 ㄎㄨㄣˇ
+棞 0 ㄎㄨㄣˇ
+祵 0 ㄎㄨㄣˇ
+稇 0 ㄎㄨㄣˇ
+閸 0 ㄎㄨㄣˇ
+困 0 ㄎㄨㄣˋ
+睏 0 ㄎㄨㄣˋ
+涃 0 ㄎㄨㄣˋ
+梱 0 ㄎㄨㄣˋ
+悃 0 ㄎㄨㄣˋ
+硱 0 ㄎㄨㄣˋ
+碅 0 ㄎㄨㄣˋ
+裍 0 ㄎㄨㄣˋ
+㫻 0 ㄎㄨㄣˋ
+科 0 ㄎㄜ
+柯 0 ㄎㄜ
+刻 0 ㄎㄜ
+棵 0 ㄎㄜ
+顆 0 ㄎㄜ
+苛 0 ㄎㄜ
+瞌 0 ㄎㄜ
+磕 0 ㄎㄜ
+蚵 0 ㄎㄜ
+蝌 0 ㄎㄜ
+軻 0 ㄎㄜ
+稞 0 ㄎㄜ
+窠 0 ㄎㄜ
+珂 0 ㄎㄜ
+砢 0 ㄎㄜ
+簻 0 ㄎㄜ
+薖 0 ㄎㄜ
+峇 0 ㄎㄜ
+鈳 0 ㄎㄜ
+樖 0 ㄎㄜ
+犐 0 ㄎㄜ
+嵙 0 ㄎㄜ
+嗑 0 ㄎㄜ
+溘 0 ㄎㄜ
+髁 0 ㄎㄜ
+嵑 0 ㄎㄜ
+酠 0 ㄎㄜ
+搕 0 ㄎㄜ
+頦 0 ㄎㄜ
+魺 0 ㄎㄜ
+濭 0 ㄎㄜ
+胢 0 ㄎㄜ
+萪 0 ㄎㄜ
+礚 0 ㄎㄜ
+窼 0 ㄎㄜ
+可 0 ㄎㄜˇ
+渴 0 ㄎㄜˇ
+哿 0 ㄎㄜˇ
+坷 0 ㄎㄜˇ
+岢 0 ㄎㄜˇ
+堁 0 ㄎㄜˇ
+敤 0 ㄎㄜˇ
+嶱 0 ㄎㄜˇ
+閜 0 ㄎㄜˇ
+顆 0 ㄎㄜˇ
+酠 0 ㄎㄜˇ
+㞹 0 ㄎㄜˇ
+炣 0 ㄎㄜˇ
+渇 0 ㄎㄜˇ
+客 0 ㄎㄜˋ
+課 0 ㄎㄜˋ
+刻 0 ㄎㄜˋ
+克 0 ㄎㄜˋ
+剋 0 ㄎㄜˋ
+喀 0 ㄎㄜˋ
+溘 0 ㄎㄜˋ
+恪 0 ㄎㄜˋ
+嗑 0 ㄎㄜˋ
+可 0 ㄎㄜˋ
+榼 0 ㄎㄜˋ
+緙 0 ㄎㄜˋ
+髁 0 ㄎㄜˋ
+氪 0 ㄎㄜˋ
+騍 0 ㄎㄜˋ
+搕 0 ㄎㄜˋ
+厒 0 ㄎㄜˋ
+勀 0 ㄎㄜˋ
+蚵 0 ㄎㄜˋ
+佫 0 ㄎㄜˋ
+殑 0 ㄎㄜˋ
+愘 0 ㄎㄜˋ
+楁 0 ㄎㄜˋ
+錁 0 ㄎㄜˋ
+髂 0 ㄎㄜˋ
+勊 0 ㄎㄜˋ
+娔 0 ㄎㄜˋ
+尅 0 ㄎㄜˋ
+愙 0 ㄎㄜˋ
+碦 0 ㄎㄜˋ
+礊 0 ㄎㄜˋ
+醘 0 ㄎㄜˋ
+䶗 0 ㄎㄜˋ
+衉 0 ㄎㄜˋ
+咳 0 ㄎㄜˊ
+殼 0 ㄎㄜˊ
+欬 0 ㄎㄜˊ
+頦 0 ㄎㄜˊ
+壳 0 ㄎㄜˊ
+殻 0 ㄎㄜˊ
+揢 0 ㄎㄜˊ
+尻 0 ㄎㄠ
+訄 0 ㄎㄠ
+嵪 0 ㄎㄠ
+髛 0 ㄎㄠ
+考 0 ㄎㄠˇ
+烤 0 ㄎㄠˇ
+拷 0 ㄎㄠˇ
+栲 0 ㄎㄠˇ
+攷 0 ㄎㄠˇ
+薧 0 ㄎㄠˇ
+洘 0 ㄎㄠˇ
+熇 0 ㄎㄠˇ
+燺 0 ㄎㄠˇ
+丂 0 ㄎㄠˇ
+靠 0 ㄎㄠˋ
+銬 0 ㄎㄠˋ
+犒 0 ㄎㄠˋ
+鯌 0 ㄎㄠˋ
+焅 0 ㄎㄠˋ
+鮳 0 ㄎㄠˋ
+肯 0 ㄎㄣˇ
+啃 0 ㄎㄣˇ
+墾 0 ㄎㄣˇ
+懇 0 ㄎㄣˇ
+齦 0 ㄎㄣˇ
+豤 0 ㄎㄣˇ
+錹 0 ㄎㄣˇ
+掯 0 ㄎㄣˇ
+硍 0 ㄎㄣˇ
+肎 0 ㄎㄣˇ
+恳 0 ㄎㄣˇ
+貇 0 ㄎㄣˇ
+掯 0 ㄎㄣˋ
+硍 0 ㄎㄣˋ
+裉 0 ㄎㄣˋ
+啃 0 ㄎㄣˋ
+褃 0 ㄎㄣˋ
+ㄍ 0 ㄍ
+句 0 ㄍㄡ
+溝 0 ㄍㄡ
+勾 0 ㄍㄡ
+鉤 0 ㄍㄡ
+枸 0 ㄍㄡ
+泃 0 ㄍㄡ
+篝 0 ㄍㄡ
+緱 0 ㄍㄡ
+构 0 ㄍㄡ
+芶 0 ㄍㄡ
+耩 0 ㄍㄡ
+佝 0 ㄍㄡ
+區 0 ㄍㄡ
+搆 0 ㄍㄡ
+袧 0 ㄍㄡ
+斠 0 ㄍㄡ
+簼 0 ㄍㄡ
+韝 0 ㄍㄡ
+齁 0 ㄍㄡ
+区 0 ㄍㄡ
+沟 0 ㄍㄡ
+鈎 0 ㄍㄡ
+鞲 0 ㄍㄡ
+褠 0 ㄍㄡ
+䵶 0 ㄍㄡ
+狗 0 ㄍㄡˇ
+岣 0 ㄍㄡˇ
+枸 0 ㄍㄡˇ
+笱 0 ㄍㄡˇ
+耇 0 ㄍㄡˇ
+茩 0 ㄍㄡˇ
+蚼 0 ㄍㄡˇ
+怐 0 ㄍㄡˇ
+耈 0 ㄍㄡˇ
+豿 0 ㄍㄡˇ
+䔛 0 ㄍㄡˇ
+耉 0 ㄍㄡˇ
+苟 0 ㄍㄡˇ
+茍 0 ㄍㄡˇ
+夠 0 ㄍㄡˋ
+購 0 ㄍㄡˋ
+垢 0 ㄍㄡˋ
+構 0 ㄍㄡˋ
+媾 0 ㄍㄡˋ
+彀 0 ㄍㄡˋ
+搆 0 ㄍㄡˋ
+詬 0 ㄍㄡˋ
+遘 0 ㄍㄡˋ
+覯 0 ㄍㄡˋ
+冓 0 ㄍㄡˋ
+姤 0 ㄍㄡˋ
+雊 0 ㄍㄡˋ
+傋 0 ㄍㄡˋ
+瞉 0 ㄍㄡˋ
+簼 0 ㄍㄡˋ
+唦 0 ㄍㄡˋ
+勾 0 ㄍㄡˋ
+句 0 ㄍㄡˋ
+逅 0 ㄍㄡˋ
+构 0 ㄍㄡˋ
+鷇 0 ㄍㄡˋ
+坸 0 ㄍㄡˋ
+玽 0 ㄍㄡˋ
+够 0 ㄍㄡˋ
+訽 0 ㄍㄡˋ
+撀 0 ㄍㄡˋ
+鞲 0 ㄍㄡˋ
+煹 0 ㄍㄡˋ
+更 0 ㄍㄥ
+耕 0 ㄍㄥ
+庚 0 ㄍㄥ
+粳 0 ㄍㄥ
+羹 0 ㄍㄥ
+賡 0 ㄍㄥ
+浭 0 ㄍㄥ
+緪 0 ㄍㄥ
+鶊 0 ㄍㄥ
+菮 0 ㄍㄥ
+揯 0 ㄍㄥ
+挭 0 ㄍㄥ
+刯 0 ㄍㄥ
+畊 0 ㄍㄥ
+秔 0 ㄍㄥ
+稉 0 ㄍㄥ
+絚 0 ㄍㄥ
+羮 0 ㄍㄥ
+𨁈 0 ㄍㄥ
+梗 0 ㄍㄥˇ
+耿 0 ㄍㄥˇ
+哽 0 ㄍㄥˇ
+綆 0 ㄍㄥˇ
+鯁 0 ㄍㄥˇ
+埂 0 ㄍㄥˇ
+骾 0 ㄍㄥˇ
+郠 0 ㄍㄥˇ
+挭 0 ㄍㄥˇ
+炚 0 ㄍㄥˇ
+褧 0 ㄍㄥˇ
+峺 0 ㄍㄥˇ
+莄 0 ㄍㄥˇ
+炛 0 ㄍㄥˇ
+㹴 0 ㄍㄥˇ
+更 0 ㄍㄥˋ
+亙 0 ㄍㄥˋ
+堩 0 ㄍㄥˋ
+埂 0 ㄍㄥˋ
+挭 0 ㄍㄥˋ
+浭 0 ㄍㄥˋ
+綆 0 ㄍㄥˋ
+亘 0 ㄍㄥˋ
+䱭 0 ㄍㄥˋ
+剛 0 ㄍㄤ
+鋼 0 ㄍㄤ
+缸 0 ㄍㄤ
+崗 0 ㄍㄤ
+綱 0 ㄍㄤ
+岡 0 ㄍㄤ
+肛 0 ㄍㄤ
+扛 0 ㄍㄤ
+杠 0 ㄍㄤ
+罡 0 ㄍㄤ
+疘 0 ㄍㄤ
+釭 0 ㄍㄤ
+堽 0 ㄍㄤ
+碙 0 ㄍㄤ
+棡 0 ㄍㄤ
+笐 0 ㄍㄤ
+堈 0 ㄍㄤ
+犅 0 ㄍㄤ
+亢 0 ㄍㄤ
+缶 0 ㄍㄤ
+韁 0 ㄍㄤ
+仜 0 ㄍㄤ
+妅 0 ㄍㄤ
+灴 0 ㄍㄤ
+玒 0 ㄍㄤ
+瓨 0 ㄍㄤ
+矼 0 ㄍㄤ
+豇 0 ㄍㄤ
+魟 0 ㄍㄤ
+玜 0 ㄍㄤ
+娂 0 ㄍㄤ
+掆 0 ㄍㄤ
+缻 0 ㄍㄤ
+罁 0 ㄍㄤ
+鎠 0 ㄍㄤ
+繮 0 ㄍㄤ
+港 0 ㄍㄤˇ
+崗 0 ㄍㄤˇ
+岡 0 ㄍㄤˇ
+奋 0 ㄍㄤˇ
+㽘 0 ㄍㄤˇ
+槓 0 ㄍㄤˋ
+杠 0 ㄍㄤˋ
+虹 0 ㄍㄤˋ
+摃 0 ㄍㄤˋ
+戇 0 ㄍㄤˋ
+焵 0 ㄍㄤˋ
+戅 0 ㄍㄤˋ
+乾 0 ㄍㄢ
+甘 0 ㄍㄢ
+干 0 ㄍㄢ
+竿 0 ㄍㄢ
+肝 0 ㄍㄢ
+尷 0 ㄍㄢ
+柑 0 ㄍㄢ
+坩 0 ㄍㄢ
+泔 0 ㄍㄢ
+咁 0 ㄍㄢ
+疳 0 ㄍㄢ
+玕 0 ㄍㄢ
+杆 0 ㄍㄢ
+矸 0 ㄍㄢ
+虷 0 ㄍㄢ
+筸 0 ㄍㄢ
+蜬 0 ㄍㄢ
+鳱 0 ㄍㄢ
+嵅 0 ㄍㄢ
+訐 0 ㄍㄢ
+蚶 0 ㄍㄢ
+酣 0 ㄍㄢ
+扞 0 ㄍㄢ
+犴 0 ㄍㄢ
+旰 0 ㄍㄢ
+姏 0 ㄍㄢ
+拑 0 ㄍㄢ
+皯 0 ㄍㄢ
+盰 0 ㄍㄢ
+玵 0 ㄍㄢ
+哻 0 ㄍㄢ
+涆 0 ㄍㄢ
+酐 0 ㄍㄢ
+紺 0 ㄍㄢ
+釬 0 ㄍㄢ
+閈 0 ㄍㄢ
+詌 0 ㄍㄢ
+靬 0 ㄍㄢ
+頇 0 ㄍㄢ
+甝 0 ㄍㄢ
+雸 0 ㄍㄢ
+馯 0 ㄍㄢ
+骭 0 ㄍㄢ
+漧 0 ㄍㄢ
+魽 0 ㄍㄢ
+忓 0 ㄍㄢ
+佄 0 ㄍㄢ
+乹 0 ㄍㄢ
+苷 0 ㄍㄢ
+粓 0 ㄍㄢ
+亁 0 ㄍㄢ
+尶 0 ㄍㄢ
+魐 0 ㄍㄢ
+攼 0 ㄍㄢ
+芉 0 ㄍㄢ
+迀 0 ㄍㄢ
+凲 0 ㄍㄢ
+敢 0 ㄍㄢˇ
+感 0 ㄍㄢˇ
+趕 0 ㄍㄢˇ
+桿 0 ㄍㄢˇ
+橄 0 ㄍㄢˇ
+稈 0 ㄍㄢˇ
+澉 0 ㄍㄢˇ
+皯 0 ㄍㄢˇ
+盰 0 ㄍㄢˇ
+赶 0 ㄍㄢˇ
+瞰 0 ㄍㄢˇ
+矸 0 ㄍㄢˇ
+噉 0 ㄍㄢˇ
+撖 0 ㄍㄢˇ
+憨 0 ㄍㄢˇ
+簳 0 ㄍㄢˇ
+譀 0 ㄍㄢˇ
+豃 0 ㄍㄢˇ
+轗 0 ㄍㄢˇ
+矙 0 ㄍㄢˇ
+仠 0 ㄍㄢˇ
+秆 0 ㄍㄢˇ
+擀 0 ㄍㄢˇ
+饏 0 ㄍㄢˇ
+鱤 0 ㄍㄢˇ
+幹 0 ㄍㄢˋ
+贛 0 ㄍㄢˋ
+凎 0 ㄍㄢˋ
+淦 0 ㄍㄢˋ
+紺 0 ㄍㄢˋ
+旰 0 ㄍㄢˋ
+骭 0 ㄍㄢˋ
+詌 0 ㄍㄢˋ
+榦 0 ㄍㄢˋ
+灨 0 ㄍㄢˋ
+涻 0 ㄍㄢˋ
+嵅 0 ㄍㄢˋ
+盰 0 ㄍㄢˋ
+矸 0 ㄍㄢˋ
+涆 0 ㄍㄢˋ
+惍 0 ㄍㄢˋ
+菳 0 ㄍㄢˋ
+澣 0 ㄍㄢˋ
+螒 0 ㄍㄢˋ
+雗 0 ㄍㄢˋ
+鶾 0 ㄍㄢˋ
+汵 0 ㄍㄢˋ
+衦 0 ㄍㄢˋ
+倝 0 ㄍㄢˋ
+檊 0 ㄍㄢˋ
+贑 0 ㄍㄢˋ
+嘎 0 ㄍㄚ
+旮 0 ㄍㄚ
+軋 0 ㄍㄚ
+戛 0 ㄍㄚ
+戞 0 ㄍㄚ
+玍 0 ㄍㄚˇ
+尬 0 ㄍㄚˋ
+魀 0 ㄍㄚˋ
+軋 0 ㄍㄚˊ
+噶 0 ㄍㄚˊ
+釓 0 ㄍㄚˊ
+嘎 0 ㄍㄚˊ
+錷 0 ㄍㄚˊ
+價 0 ㄍㄚ˙
+価 0 ㄍㄚ˙
+該 0 ㄍㄞ
+垓 0 ㄍㄞ
+陔 0 ㄍㄞ
+賅 0 ㄍㄞ
+荄 0 ㄍㄞ
+侅 0 ㄍㄞ
+峐 0 ㄍㄞ
+胲 0 ㄍㄞ
+祴 0 ㄍㄞ
+絯 0 ㄍㄞ
+豥 0 ㄍㄞ
+賌 0 ㄍㄞ
+隑 0 ㄍㄞ
+欬 0 ㄍㄞ
+烗 0 ㄍㄞ
+喈 0 ㄍㄞ
+湝 0 ㄍㄞ
+瑎 0 ㄍㄞ
+輆 0 ㄍㄞ
+蝔 0 ㄍㄞ
+鶛 0 ㄍㄞ
+炌 0 ㄍㄞ
+姟 0 ㄍㄞ
+郂 0 ㄍㄞ
+晐 0 ㄍㄞ
+畡 0 ㄍㄞ
+改 0 ㄍㄞˇ
+妀 0 ㄍㄞˇ
+絠 0 ㄍㄞˇ
+忋 0 ㄍㄞˇ
+概 0 ㄍㄞˋ
+蓋 0 ㄍㄞˋ
+丐 0 ㄍㄞˋ
+鈣 0 ㄍㄞˋ
+溉 0 ㄍㄞˋ
+戤 0 ㄍㄞˋ
+摡 0 ㄍㄞˋ
+瓂 0 ㄍㄞˋ
+芥 0 ㄍㄞˋ
+盍 0 ㄍㄞˋ
+闔 0 ㄍㄞˋ
+丏 0 ㄍㄞˋ
+杚 0 ㄍㄞˋ
+廅 0 ㄍㄞˋ
+熆 0 ㄍㄞˋ
+篕 0 ㄍㄞˋ
+鑉 0 ㄍㄞˋ
+乢 0 ㄍㄞˋ
+匄 0 ㄍㄞˋ
+盇 0 ㄍㄞˋ
+盖 0 ㄍㄞˋ
+葢 0 ㄍㄞˋ
+漑 0 ㄍㄞˋ
+槪 0 ㄍㄞˋ
+槩 0 ㄍㄞˋ
+姑 0 ㄍㄨ
+孤 0 ㄍㄨ
+辜 0 ㄍㄨ
+咕 0 ㄍㄨ
+沽 0 ㄍㄨ
+估 0 ㄍㄨ
+菇 0 ㄍㄨ
+菰 0 ㄍㄨ
+呱 0 ㄍㄨ
+蛄 0 ㄍㄨ
+痼 0 ㄍㄨ
+箍 0 ㄍㄨ
+鴣 0 ㄍㄨ
+觚 0 ㄍㄨ
+酤 0 ㄍㄨ
+泒 0 ㄍㄨ
+罛 0 ㄍㄨ
+箛 0 ㄍㄨ
+鈷 0 ㄍㄨ
+鮕 0 ㄍㄨ
+夃 0 ㄍㄨ
+柧 0 ㄍㄨ
+鈲 0 ㄍㄨ
+軱 0 ㄍㄨ
+家 0 ㄍㄨ
+嫴 0 ㄍㄨ
+橭 0 ㄍㄨ
+枯 0 ㄍㄨ
+骨 0 ㄍㄨ
+轂 0 ㄍㄨ
+怙 0 ㄍㄨ
+胍 0 ㄍㄨ
+蛌 0 ㄍㄨ
+跍 0 ㄍㄨ
+哌 0 ㄍㄨ
+苽 0 ㄍㄨ
+唂 0 ㄍㄨ
+笟 0 ㄍㄨ
+軲 0 ㄍㄨ
+嗗 0 ㄍㄨ
+磆 0 ㄍㄨ
+工 0 ㄍㄨㄥ
+公 0 ㄍㄨㄥ
+功 0 ㄍㄨㄥ
+供 0 ㄍㄨㄥ
+攻 0 ㄍㄨㄥ
+宮 0 ㄍㄨㄥ
+恭 0 ㄍㄨㄥ
+躬 0 ㄍㄨㄥ
+弓 0 ㄍㄨㄥ
+蚣 0 ㄍㄨㄥ
+紅 0 ㄍㄨㄥ
+龔 0 ㄍㄨㄥ
+肱 0 ㄍㄨㄥ
+觥 0 ㄍㄨㄥ
+疘 0 ㄍㄨㄥ
+釭 0 ㄍㄨㄥ
+篢 0 ㄍㄨㄥ
+塨 0 ㄍㄨㄥ
+愩 0 ㄍㄨㄥ
+匑 0 ㄍㄨㄥ
+共 0 ㄍㄨㄥ
+幊 0 ㄍㄨㄥ
+仜 0 ㄍㄨㄥ
+妅 0 ㄍㄨㄥ
+玒 0 ㄍㄨㄥ
+昮 0 ㄍㄨㄥ
+羾 0 ㄍㄨㄥ
+舼 0 ㄍㄨㄥ
+蛬 0 ㄍㄨㄥ
+鈆 0 ㄍㄨㄥ
+輁 0 ㄍㄨㄥ
+杛 0 ㄍㄨㄥ
+侊 0 ㄍㄨㄥ
+玜 0 ㄍㄨㄥ
+糿 0 ㄍㄨㄥ
+糼 0 ㄍㄨㄥ
+咣 0 ㄍㄨㄥ
+娂 0 ㄍㄨㄥ
+宫 0 ㄍㄨㄥ
+躳 0 ㄍㄨㄥ
+匔 0 ㄍㄨㄥ
+髸 0 ㄍㄨㄥ
+觵 0 ㄍㄨㄥ
+碽 0 ㄍㄨㄥ
+䳍 0 ㄍㄨㄥ
+龏 0 ㄍㄨㄥ
+鞏 0 ㄍㄨㄥˇ
+拱 0 ㄍㄨㄥˇ
+汞 0 ㄍㄨㄥˇ
+共 0 ㄍㄨㄥˇ
+珙 0 ㄍㄨㄥˇ
+礦 0 ㄍㄨㄥˇ
+栱 0 ㄍㄨㄥˇ
+廾 0 ㄍㄨㄥˇ
+拲 0 ㄍㄨㄥˇ
+蛬 0 ㄍㄨㄥˇ
+穬 0 ㄍㄨㄥˇ
+龔 0 ㄍㄨㄥˇ
+銾 0 ㄍㄨㄥˇ
+鋛 0 ㄍㄨㄥˇ
+鑛 0 ㄍㄨㄥˇ
+孒 0 ㄍㄨㄥˇ
+巩 0 ㄍㄨㄥˇ
+㧬 0 ㄍㄨㄥˇ
+共 0 ㄍㄨㄥˋ
+供 0 ㄍㄨㄥˋ
+貢 0 ㄍㄨㄥˋ
+羾 0 ㄍㄨㄥˋ
+摃 0 ㄍㄨㄥˋ
+贛 0 ㄍㄨㄥˋ
+烡 0 ㄍㄨㄥˋ
+珙 0 ㄍㄨㄥˋ
+舼 0 ㄍㄨㄥˋ
+嗊 0 ㄍㄨㄥˋ
+幊 0 ㄍㄨㄥˋ
+愩 0 ㄍㄨㄥˋ
+輁 0 ㄍㄨㄥˋ
+輂 0 ㄍㄨㄥˋ
+觨 0 ㄍㄨㄥˋ
+篢 0 ㄍㄨㄥˋ
+光 0 ㄍㄨㄤ
+胱 0 ㄍㄨㄤ
+洸 0 ㄍㄨㄤ
+桄 0 ㄍㄨㄤ
+珖 0 ㄍㄨㄤ
+炚 0 ㄍㄨㄤ
+茪 0 ㄍㄨㄤ
+銧 0 ㄍㄨㄤ
+垙 0 ㄍㄨㄤ
+烡 0 ㄍㄨㄤ
+絖 0 ㄍㄨㄤ
+灮 0 ㄍㄨㄤ
+侊 0 ㄍㄨㄤ
+咣 0 ㄍㄨㄤ
+姯 0 ㄍㄨㄤ
+輄 0 ㄍㄨㄤ
+僙 0 ㄍㄨㄤ
+黆 0 ㄍㄨㄤ
+炗 0 ㄍㄨㄤ
+炛 0 ㄍㄨㄤ
+硄 0 ㄍㄨㄤ
+廣 0 ㄍㄨㄤˇ
+獷 0 ㄍㄨㄤˇ
+迋 0 ㄍㄨㄤˇ
+臩 0 ㄍㄨㄤˇ
+嚝 0 ㄍㄨㄤˇ
+懭 0 ㄍㄨㄤˇ
+瀇 0 ㄍㄨㄤˇ
+鄺 0 ㄍㄨㄤˇ
+爌 0 ㄍㄨㄤˇ
+穬 0 ㄍㄨㄤˇ
+纊 0 ㄍㄨㄤˇ
+広 0 ㄍㄨㄤˇ
+兤 0 ㄍㄨㄤˇ
+黋 0 ㄍㄨㄤˇ
+逛 0 ㄍㄨㄤˋ
+桄 0 ㄍㄨㄤˋ
+臩 0 ㄍㄨㄤˋ
+臦 0 ㄍㄨㄤˋ
+矌 0 ㄍㄨㄤˋ
+櫎 0 ㄍㄨㄤˋ
+官 0 ㄍㄨㄢ
+關 0 ㄍㄨㄢ
+觀 0 ㄍㄨㄢ
+冠 0 ㄍㄨㄢ
+棺 0 ㄍㄨㄢ
+矜 0 ㄍㄨㄢ
+鰥 0 ㄍㄨㄢ
+綸 0 ㄍㄨㄢ
+倌 0 ㄍㄨㄢ
+莞 0 ㄍㄨㄢ
+瘝 0 ㄍㄨㄢ
+毌 0 ㄍㄨㄢ
+鱞 0 ㄍㄨㄢ
+婠 0 ㄍㄨㄢ
+悺 0 ㄍㄨㄢ
+涫 0 ㄍㄨㄢ
+逭 0 ㄍㄨㄢ
+痯 0 ㄍㄨㄢ
+錧 0 ㄍㄨㄢ
+矝 0 ㄍㄨㄢ
+萖 0 ㄍㄨㄢ
+窤 0 ㄍㄨㄢ
+蒄 0 ㄍㄨㄢ
+関 0 ㄍㄨㄢ
+癏 0 ㄍㄨㄢ
+観 0 ㄍㄨㄢ
+闗 0 ㄍㄨㄢ
+輨 0 ㄍㄨㄢ
+管 0 ㄍㄨㄢˇ
+館 0 ㄍㄨㄢˇ
+莞 0 ㄍㄨㄢˇ
+琯 0 ㄍㄨㄢˇ
+筦 0 ㄍㄨㄢˇ
+脘 0 ㄍㄨㄢˇ
+痯 0 ㄍㄨㄢˇ
+錧 0 ㄍㄨㄢˇ
+菅 0 ㄍㄨㄢˇ
+斡 0 ㄍㄨㄢˇ
+綰 0 ㄍㄨㄢˇ
+朊 0 ㄍㄨㄢˇ
+嵈 0 ㄍㄨㄢˇ
+萖 0 ㄍㄨㄢˇ
+舘 0 ㄍㄨㄢˇ
+輨 0 ㄍㄨㄢˇ
+慣 0 ㄍㄨㄢˋ
+貫 0 ㄍㄨㄢˋ
+灌 0 ㄍㄨㄢˋ
+罐 0 ㄍㄨㄢˋ
+摜 0 ㄍㄨㄢˋ
+盥 0 ㄍㄨㄢˋ
+鸛 0 ㄍㄨㄢˋ
+冠 0 ㄍㄨㄢˋ
+觀 0 ㄍㄨㄢˋ
+丱 0 ㄍㄨㄢˋ
+爟 0 ㄍㄨㄢˋ
+瓘 0 ㄍㄨㄢˋ
+祼 0 ㄍㄨㄢˋ
+矔 0 ㄍㄨㄢˋ
+鑵 0 ㄍㄨㄢˋ
+涫 0 ㄍㄨㄢˋ
+悺 0 ㄍㄨㄢˋ
+悹 0 ㄍㄨㄢˋ
+雚 0 ㄍㄨㄢˋ
+鱹 0 ㄍㄨㄢˋ
+毌 0 ㄍㄨㄢˋ
+懽 0 ㄍㄨㄢˋ
+卝 0 ㄍㄨㄢˋ
+泴 0 ㄍㄨㄢˋ
+㮡 0 ㄍㄨㄢˋ
+樌 0 ㄍㄨㄢˋ
+罆 0 ㄍㄨㄢˋ
+観 0 ㄍㄨㄢˋ
+鏆 0 ㄍㄨㄢˋ
+潅 0 ㄍㄨㄢˋ
+遦 0 ㄍㄨㄢˋ
+股 0 ㄍㄨˇ
+古 0 ㄍㄨˇ
+鼓 0 ㄍㄨˇ
+骨 0 ㄍㄨˇ
+谷 0 ㄍㄨˇ
+穀 0 ㄍㄨˇ
+賈 0 ㄍㄨˇ
+凸 0 ㄍㄨˇ
+蠱 0 ㄍㄨˇ
+汩 0 ㄍㄨˇ
+牯 0 ㄍㄨˇ
+滑 0 ㄍㄨˇ
+罟 0 ㄍㄨˇ
+嘏 0 ㄍㄨˇ
+詁 0 ㄍㄨˇ
+轂 0 ㄍㄨˇ
+鵠 0 ㄍㄨˇ
+瞽 0 ㄍㄨˇ
+臌 0 ㄍㄨˇ
+盬 0 ㄍㄨˇ
+羖 0 ㄍㄨˇ
+蛌 0 ㄍㄨˇ
+扢 0 ㄍㄨˇ
+鈷 0 ㄍㄨˇ
+杚 0 ㄍㄨˇ
+淈 0 ㄍㄨˇ
+狜 0 ㄍㄨˇ
+唃 0 ㄍㄨˇ
+尳 0 ㄍㄨˇ
+榖 0 ㄍㄨˇ
+蓇 0 ㄍㄨˇ
+濲 0 ㄍㄨˇ
+瀔 0 ㄍㄨˇ
+愲 0 ㄍㄨˇ
+縎 0 ㄍㄨˇ
+薣 0 ㄍㄨˇ
+估 0 ㄍㄨˇ
+骰 0 ㄍㄨˇ
+抇 0 ㄍㄨˇ
+岵 0 ㄍㄨˇ
+祜 0 ㄍㄨˇ
+焀 0 ㄍㄨˇ
+跍 0 ㄍㄨˇ
+榾 0 ㄍㄨˇ
+谽 0 ㄍㄨˇ
+縠 0 ㄍㄨˇ
+螖 0 ㄍㄨˇ
+鮕 0 ㄍㄨˇ
+瀫 0 ㄍㄨˇ
+顝 0 ㄍㄨˇ
+鶻 0 ㄍㄨˇ
+鼜 0 ㄍㄨˇ
+淿 0 ㄍㄨˇ
+鼔 0 ㄍㄨˇ
+皷 0 ㄍㄨˇ
+糓 0 ㄍㄨˇ
+餶 0 ㄍㄨˇ
+蛊 0 ㄍㄨˇ
+䶜 0 ㄍㄨˇ
+故 0 ㄍㄨˋ
+固 0 ㄍㄨˋ
+顧 0 ㄍㄨˋ
+雇 0 ㄍㄨˋ
+僱 0 ㄍㄨˋ
+錮 0 ㄍㄨˋ
+告 0 ㄍㄨˋ
+估 0 ㄍㄨˋ
+痼 0 ㄍㄨˋ
+梏 0 ㄍㄨˋ
+榾 0 ㄍㄨˋ
+牿 0 ㄍㄨˋ
+堌 0 ㄍㄨˋ
+崮 0 ㄍㄨˋ
+凅 0 ㄍㄨˋ
+棝 0 ㄍㄨˋ
+稒 0 ㄍㄨˋ
+涸 0 ㄍㄨˋ
+婟 0 ㄍㄨˋ
+吿 0 ㄍㄨˋ
+崓 0 ㄍㄨˋ
+鳸 0 ㄍㄨˋ
+怘 0 ㄍㄨˋ
+祻 0 ㄍㄨˋ
+鯝 0 ㄍㄨˋ
+骨 0 ㄍㄨˊ
+豰 0 ㄍㄨˊ
+瓜 0 ㄍㄨㄚ
+括 0 ㄍㄨㄚ
+刮 0 ㄍㄨㄚ
+蝸 0 ㄍㄨㄚ
+颳 0 ㄍㄨㄚ
+呱 0 ㄍㄨㄚ
+聒 0 ㄍㄨㄚ
+鴰 0 ㄍㄨㄚ
+栝 0 ㄍㄨㄚ
+适 0 ㄍㄨㄚ
+騧 0 ㄍㄨㄚ
+胍 0 ㄍㄨㄚ
+腡 0 ㄍㄨㄚ
+筈 0 ㄍㄨㄚ
+葀 0 ㄍㄨㄚ
+劀 0 ㄍㄨㄚ
+瘑 0 ㄍㄨㄚ
+緺 0 ㄍㄨㄚ
+懖 0 ㄍㄨㄚ
+趏 0 ㄍㄨㄚ
+膼 0 ㄍㄨㄚ
+佸 0 ㄍㄨㄚ
+泒 0 ㄍㄨㄚ
+咶 0 ㄍㄨㄚ
+蛌 0 ㄍㄨㄚ
+萿 0 ㄍㄨㄚ
+鈲 0 ㄍㄨㄚ
+髺 0 ㄍㄨㄚ
+匃 0 ㄍㄨㄚ
+哌 0 ㄍㄨㄚ
+䒷 0 ㄍㄨㄚ
+桰 0 ㄍㄨㄚ
+歄 0 ㄍㄨㄚ
+諣 0 ㄍㄨㄚ
+踻 0 ㄍㄨㄚ
+銽 0 ㄍㄨㄚ
+寡 0 ㄍㄨㄚˇ
+剮 0 ㄍㄨㄚˇ
+䈑 0 ㄍㄨㄚˇ
+冎 0 ㄍㄨㄚˇ
+掛 0 ㄍㄨㄚˋ
+卦 0 ㄍㄨㄚˋ
+褂 0 ㄍㄨㄚˋ
+罫 0 ㄍㄨㄚˋ
+罣 0 ㄍㄨㄚˋ
+絓 0 ㄍㄨㄚˋ
+詿 0 ㄍㄨㄚˋ
+挂 0 ㄍㄨㄚˋ
+髺 0 ㄍㄨㄚˋ
+袿 0 ㄍㄨㄚˋ
+坬 0 ㄍㄨㄚˋ
+乖 0 ㄍㄨㄞ
+拐 0 ㄍㄨㄞˇ
+柺 0 ㄍㄨㄞˇ
+枴 0 ㄍㄨㄞˇ
+箉 0 ㄍㄨㄞˇ
+怪 0 ㄍㄨㄞˋ
+旝 0 ㄍㄨㄞˋ
+夬 0 ㄍㄨㄞˋ
+廥 0 ㄍㄨㄞˋ
+癐 0 ㄍㄨㄞˋ
+壞 0 ㄍㄨㄞˋ
+圣 0 ㄍㄨㄞˋ
+恠 0 ㄍㄨㄞˋ
+壊 0 ㄍㄨㄞˋ
+叏 0 ㄍㄨㄞˋ
+郭 0 ㄍㄨㄛ
+鍋 0 ㄍㄨㄛ
+蟈 0 ㄍㄨㄛ
+堝 0 ㄍㄨㄛ
+嘓 0 ㄍㄨㄛ
+崞 0 ㄍㄨㄛ
+埻 0 ㄍㄨㄛ
+墎 0 ㄍㄨㄛ
+濄 0 ㄍㄨㄛ
+渦 0 ㄍㄨㄛ
+過 0 ㄍㄨㄛ
+蝸 0 ㄍㄨㄛ
+撾 0 ㄍㄨㄛ
+咼 0 ㄍㄨㄛ
+剮 0 ㄍㄨㄛ
+漷 0 ㄍㄨㄛ
+瘑 0 ㄍㄨㄛ
+緺 0 ㄍㄨㄛ
+鞷 0 ㄍㄨㄛ
+檛 0 ㄍㄨㄛ
+懖 0 ㄍㄨㄛ
+霩 0 ㄍㄨㄛ
+过 0 ㄍㄨㄛ
+鈛 0 ㄍㄨㄛ
+鞟 0 ㄍㄨㄛ
+櫎 0 ㄍㄨㄛ
+叧 0 ㄍㄨㄛ
+冎 0 ㄍㄨㄛ
+㗻 0 ㄍㄨㄛ
+果 0 ㄍㄨㄛˇ
+裹 0 ㄍㄨㄛˇ
+槨 0 ㄍㄨㄛˇ
+蜾 0 ㄍㄨㄛˇ
+輠 0 ㄍㄨㄛˇ
+粿 0 ㄍㄨㄛˇ
+猓 0 ㄍㄨㄛˇ
+淉 0 ㄍㄨㄛˇ
+惈 0 ㄍㄨㄛˇ
+鐹 0 ㄍㄨㄛˇ
+錁 0 ㄍㄨㄛˇ
+杲 0 ㄍㄨㄛˇ
+踝 0 ㄍㄨㄛˇ
+堁 0 ㄍㄨㄛˇ
+婐 0 ㄍㄨㄛˇ
+捰 0 ㄍㄨㄛˇ
+敤 0 ㄍㄨㄛˇ
+椁 0 ㄍㄨㄛˇ
+菓 0 ㄍㄨㄛˇ
+楇 0 ㄍㄨㄛˇ
+綶 0 ㄍㄨㄛˇ
+過 0 ㄍㄨㄛˋ
+瘑 0 ㄍㄨㄛˋ
+薖 0 ㄍㄨㄛˋ
+鐹 0 ㄍㄨㄛˋ
+过 0 ㄍㄨㄛˋ
+國 0 ㄍㄨㄛˊ
+幗 0 ㄍㄨㄛˊ
+虢 0 ㄍㄨㄛˊ
+馘 0 ㄍㄨㄛˊ
+摑 0 ㄍㄨㄛˊ
+聝 0 ㄍㄨㄛˊ
+膕 0 ㄍㄨㄛˊ
+漍 0 ㄍㄨㄛˊ
+慖 0 ㄍㄨㄛˊ
+簂 0 ㄍㄨㄛˊ
+蟈 0 ㄍㄨㄛˊ
+嘓 0 ㄍㄨㄛˊ
+槶 0 ㄍㄨㄛˊ
+蔮 0 ㄍㄨㄛˊ
+囯 0 ㄍㄨㄛˊ
+国 0 ㄍㄨㄛˊ
+囻 0 ㄍㄨㄛˊ
+囶 0 ㄍㄨㄛˊ
+圀 0 ㄍㄨㄛˊ
+讗 0 ㄍㄨㄛˊ
+䆐 0 ㄍㄨㄛˊ
+腘 0 ㄍㄨㄛˊ
+過 0 ㄍㄨㄛ˙
+过 0 ㄍㄨㄛ˙
+歸 0 ㄍㄨㄟ
+規 0 ㄍㄨㄟ
+龜 0 ㄍㄨㄟ
+瑰 0 ㄍㄨㄟ
+閨 0 ㄍㄨㄟ
+圭 0 ㄍㄨㄟ
+珪 0 ㄍㄨㄟ
+皈 0 ㄍㄨㄟ
+傀 0 ㄍㄨㄟ
+媯 0 ㄍㄨㄟ
+槻 0 ㄍㄨㄟ
+鮭 0 ㄍㄨㄟ
+槼 0 ㄍㄨㄟ
+邽 0 ㄍㄨㄟ
+窐 0 ㄍㄨㄟ
+溈 0 ㄍㄨㄟ
+嫢 0 ㄍㄨㄟ
+摫 0 ㄍㄨㄟ
+洼 0 ㄍㄨㄟ
+烓 0 ㄍㄨㄟ
+茥 0 ㄍㄨㄟ
+硅 0 ㄍㄨㄟ
+筀 0 ㄍㄨㄟ
+楏 0 ㄍㄨㄟ
+煃 0 ㄍㄨㄟ
+觟 0 ㄍㄨㄟ
+銈 0 ㄍㄨㄟ
+瞡 0 ㄍㄨㄟ
+鍷 0 ㄍㄨㄟ
+蘣 0 ㄍㄨㄟ
+蘳 0 ㄍㄨㄟ
+蘬 0 ㄍㄨㄟ
+归 0 ㄍㄨㄟ
+帰 0 ㄍㄨㄟ
+胿 0 ㄍㄨㄟ
+亀 0 ㄍㄨㄟ
+槣 0 ㄍㄨㄟ
+蓕 0 ㄍㄨㄟ
+嬀 0 ㄍㄨㄟ
+潙 0 ㄍㄨㄟ
+炔 0 ㄍㄨㄟ
+璝 0 ㄍㄨㄟ
+膭 0 ㄍㄨㄟ
+瓌 0 ㄍㄨㄟ
+郌 0 ㄍㄨㄟ
+鬹 0 ㄍㄨㄟ
+䲅 0 ㄍㄨㄟ
+鬼 0 ㄍㄨㄟˇ
+軌 0 ㄍㄨㄟˇ
+詭 0 ㄍㄨㄟˇ
+癸 0 ㄍㄨㄟˇ
+匭 0 ㄍㄨㄟˇ
+晷 0 ㄍㄨㄟˇ
+宄 0 ㄍㄨㄟˇ
+簋 0 ㄍㄨㄟˇ
+佹 0 ㄍㄨㄟˇ
+垝 0 ㄍㄨㄟˇ
+氿 0 ㄍㄨㄟˇ
+姽 0 ㄍㄨㄟˇ
+蟡 0 ㄍㄨㄟˇ
+庪 0 ㄍㄨㄟˇ
+祪 0 ㄍㄨㄟˇ
+蛫 0 ㄍㄨㄟˇ
+觤 0 ㄍㄨㄟˇ
+厬 0 ㄍㄨㄟˇ
+葵 0 ㄍㄨㄟˇ
+睽 0 ㄍㄨㄟˇ
+闋 0 ㄍㄨㄟˇ
+庋 0 ㄍㄨㄟˇ
+湀 0 ㄍㄨㄟˇ
+廆 0 ㄍㄨㄟˇ
+溾 0 ㄍㄨㄟˇ
+粿 0 ㄍㄨㄟˇ
+螝 0 ㄍㄨㄟˇ
+藈 0 ㄍㄨㄟˇ
+藱 0 ㄍㄨㄟˇ
+騩 0 ㄍㄨㄟˇ
+恑 0 ㄍㄨㄟˇ
+攱 0 ㄍㄨㄟˇ
+謉 0 ㄍㄨㄟˇ
+孂 0 ㄍㄨㄟˇ
+陒 0 ㄍㄨㄟˇ
+䤥 0 ㄍㄨㄟˇ
+䤆 0 ㄍㄨㄟˇ
+貴 0 ㄍㄨㄟˋ
+桂 0 ㄍㄨㄟˋ
+櫃 0 ㄍㄨㄟˋ
+跪 0 ㄍㄨㄟˋ
+劌 0 ㄍㄨㄟˋ
+溎 0 ㄍㄨㄟˋ
+鱖 0 ㄍㄨㄟˋ
+昋 0 ㄍㄨㄟˋ
+炔 0 ㄍㄨㄟˋ
+筀 0 ㄍㄨㄟˋ
+柜 0 ㄍㄨㄟˋ
+嶡 0 ㄍㄨㄟˋ
+襘 0 ㄍㄨㄟˋ
+暩 0 ㄍㄨㄟˋ
+會 0 ㄍㄨㄟˋ
+匱 0 ㄍㄨㄟˋ
+瑰 0 ㄍㄨㄟˋ
+劊 0 ㄍㄨㄟˋ
+檜 0 ㄍㄨㄟˋ
+炅 0 ㄍㄨㄟˋ
+嘳 0 ㄍㄨㄟˋ
+圚 0 ㄍㄨㄟˋ
+撌 0 ㄍㄨㄟˋ
+槶 0 ㄍㄨㄟˋ
+蔮 0 ㄍㄨㄟˋ
+瞡 0 ㄍㄨㄟˋ
+瞶 0 ㄍㄨㄟˋ
+禬 0 ㄍㄨㄟˋ
+鐀 0 ㄍㄨㄟˋ
+闠 0 ㄍㄨㄟˋ
+会 0 ㄍㄨㄟˋ
+刏 0 ㄍㄨㄟˋ
+璝 0 ㄍㄨㄟˋ
+瓌 0 ㄍㄨㄟˋ
+鑎 0 ㄍㄨㄟˋ
+鱥 0 ㄍㄨㄟˋ
+㙺 0 ㄍㄨㄟˋ
+鞼 0 ㄍㄨㄟˋ
+攰 0 ㄍㄨㄟˋ
+滾 0 ㄍㄨㄣˇ
+袞 0 ㄍㄨㄣˇ
+鯀 0 ㄍㄨㄣˇ
+緄 0 ㄍㄨㄣˇ
+輥 0 ㄍㄨㄣˇ
+掍 0 ㄍㄨㄣˇ
+蔉 0 ㄍㄨㄣˇ
+混 0 ㄍㄨㄣˇ
+渾 0 ㄍㄨㄣˇ
+袬 0 ㄍㄨㄣˇ
+緷 0 ㄍㄨㄣˇ
+丨 0 ㄍㄨㄣˇ
+衮 0 ㄍㄨㄣˇ
+滚 0 ㄍㄨㄣˇ
+蓘 0 ㄍㄨㄣˇ
+鮌 0 ㄍㄨㄣˇ
+䙛 0 ㄍㄨㄣˇ
+棍 0 ㄍㄨㄣˋ
+璭 0 ㄍㄨㄣˋ
+掍 0 ㄍㄨㄣˋ
+睔 0 ㄍㄨㄣˋ
+睴 0 ㄍㄨㄣˋ
+謴 0 ㄍㄨㄣˋ
+哥 0 ㄍㄜ
+歌 0 ㄍㄜ
+割 0 ㄍㄜ
+鴿 0 ㄍㄜ
+擱 0 ㄍㄜ
+胳 0 ㄍㄜ
+戈 0 ㄍㄜ
+肐 0 ㄍㄜ
+疙 0 ㄍㄜ
+渮 0 ㄍㄜ
+牁 0 ㄍㄜ
+菏 0 ㄍㄜ
+滒 0 ㄍㄜ
+麧 0 ㄍㄜ
+咯 0 ㄍㄜ
+紇 0 ㄍㄜ
+隔 0 ㄍㄜ
+閣 0 ㄍㄜ
+蠽 0 ㄍㄜ
+戓 0 ㄍㄜ
+戨 0 ㄍㄜ
+鴚 0 ㄍㄜ
+謌 0 ㄍㄜ
+牫 0 ㄍㄜ
+牱 0 ㄍㄜ
+鎶 0 ㄍㄜ
+葛 0 ㄍㄜˇ
+哿 0 ㄍㄜˇ
+舸 0 ㄍㄜˇ
+擖 0 ㄍㄜˇ
+魺 0 ㄍㄜˇ
+騔 0 ㄍㄜˇ
+笴 0 ㄍㄜˇ
+合 0 ㄍㄜˇ
+蓋 0 ㄍㄜˇ
+褐 0 ㄍㄜˇ
+峆 0 ㄍㄜˇ
+嶱 0 ㄍㄜˇ
+鍻 0 ㄍㄜˇ
+齃 0 ㄍㄜˇ
+乢 0 ㄍㄜˇ
+盖 0 ㄍㄜˇ
+葢 0 ㄍㄜˇ
+個 0 ㄍㄜˋ
+各 0 ㄍㄜˋ
+鉻 0 ㄍㄜˋ
+虼 0 ㄍㄜˋ
+箇 0 ㄍㄜˋ
+詻 0 ㄍㄜˋ
+佫 0 ㄍㄜˋ
+硌 0 ㄍㄜˋ
+个 0 ㄍㄜˋ
+亇 0 ㄍㄜˋ
+狢 0 ㄍㄜˋ
+貈 0 ㄍㄜˋ
+格 0 ㄍㄜˊ
+革 0 ㄍㄜˊ
+隔 0 ㄍㄜˊ
+閣 0 ㄍㄜˊ
+葛 0 ㄍㄜˊ
+骼 0 ㄍㄜˊ
+蛤 0 ㄍㄜˊ
+咯 0 ㄍㄜˊ
+膈 0 ㄍㄜˊ
+轕 0 ㄍㄜˊ
+嗝 0 ㄍㄜˊ
+搿 0 ㄍㄜˊ
+郃 0 ㄍㄜˊ
+韐 0 ㄍㄜˊ
+塥 0 ㄍㄜˊ
+觡 0 ㄍㄜˊ
+鬲 0 ㄍㄜˊ
+閤 0 ㄍㄜˊ
+挌 0 ㄍㄜˊ
+佮 0 ㄍㄜˊ
+輵 0 ㄍㄜˊ
+鮯 0 ㄍㄜˊ
+敆 0 ㄍㄜˊ
+茖 0 ㄍㄜˊ
+愅 0 ㄍㄜˊ
+獦 0 ㄍㄜˊ
+鎘 0 ㄍㄜˊ
+齃 0 ㄍㄜˊ
+各 0 ㄍㄜˊ
+緙 0 ㄍㄜˊ
+頜 0 ㄍㄜˊ
+噶 0 ㄍㄜˊ
+翮 0 ㄍㄜˊ
+佫 0 ㄍㄜˊ
+搹 0 ㄍㄜˊ
+滆 0 ㄍㄜˊ
+煂 0 ㄍㄜˊ
+蒚 0 ㄍㄜˊ
+鞈 0 ㄍㄜˊ
+鬳 0 ㄍㄜˊ
+鶷 0 ㄍㄜˊ
+呄 0 ㄍㄜˊ
+敋 0 ㄍㄜˊ
+詥 0 ㄍㄜˊ
+槅 0 ㄍㄜˊ
+諽 0 ㄍㄜˊ
+臈 0 ㄍㄜˊ
+鞟 0 ㄍㄜˊ
+鬴 0 ㄍㄜˊ
+韚 0 ㄍㄜˊ
+匌 0 ㄍㄜˊ
+㭘 0 ㄍㄜˊ
+臵 0 ㄍㄜˊ
+蛒 0 ㄍㄜˊ
+裓 0 ㄍㄜˊ
+鰪 0 ㄍㄜˊ
+個 0 ㄍㄜ˙
+箇 0 ㄍㄜ˙
+个 0 ㄍㄜ˙
+亇 0 ㄍㄜ˙
+高 0 ㄍㄠ
+糕 0 ㄍㄠ
+膏 0 ㄍㄠ
+篙 0 ㄍㄠ
+羔 0 ㄍㄠ
+皋 0 ㄍㄠ
+櫜 0 ㄍㄠ
+睪 0 ㄍㄠ
+鼛 0 ㄍㄠ
+槔 0 ㄍㄠ
+睾 0 ㄍㄠ
+滜 0 ㄍㄠ
+韟 0 ㄍㄠ
+咎 0 ㄍㄠ
+臬 0 ㄍㄠ
+嗥 0 ㄍㄠ
+蒿 0 ㄍㄠ
+嗃 0 ㄍㄠ
+塙 0 ㄍㄠ
+暠 0 ㄍㄠ
+皞 0 ㄍㄠ
+碻 0 ㄍㄠ
+禚 0 ㄍㄠ
+翯 0 ㄍㄠ
+髜 0 ㄍㄠ
+髇 0 ㄍㄠ
+鰝 0 ㄍㄠ
+鷎 0 ㄍㄠ
+桕 0 ㄍㄠ
+皐 0 ㄍㄠ
+臯 0 ㄍㄠ
+獆 0 ㄍㄠ
+噑 0 ㄍㄠ
+暤 0 ㄍㄠ
+獔 0 ㄍㄠ
+嘷 0 ㄍㄠ
+墧 0 ㄍㄠ
+暭 0 ㄍㄠ
+槹 0 ㄍㄠ
+獋 0 ㄍㄠ
+曍 0 ㄍㄠ
+橰 0 ㄍㄠ
+皡 0 ㄍㄠ
+皥 0 ㄍㄠ
+餻 0 ㄍㄠ
+髙 0 ㄍㄠ
+㟸 0 ㄍㄠ
+鷱 0 ㄍㄠ
+稿 0 ㄍㄠˇ
+攪 0 ㄍㄠˇ
+搞 0 ㄍㄠˇ
+槁 0 ㄍㄠˇ
+縞 0 ㄍㄠˇ
+杲 0 ㄍㄠˇ
+暠 0 ㄍㄠˇ
+檺 0 ㄍㄠˇ
+筶 0 ㄍㄠˇ
+皋 0 ㄍㄠˇ
+睪 0 ㄍㄠˇ
+鄗 0 ㄍㄠˇ
+閣 0 ㄍㄠˇ
+鎬 0 ㄍㄠˇ
+嗃 0 ㄍㄠˇ
+塙 0 ㄍㄠˇ
+滈 0 ㄍㄠˇ
+睾 0 ㄍㄠˇ
+皜 0 ㄍㄠˇ
+碻 0 ㄍㄠˇ
+嚆 0 ㄍㄠˇ
+謞 0 ㄍㄠˇ
+髇 0 ㄍㄠˇ
+鰝 0 ㄍㄠˇ
+夰 0 ㄍㄠˇ
+皐 0 ㄍㄠˇ
+臯 0 ㄍㄠˇ
+菒 0 ㄍㄠˇ
+槀 0 ㄍㄠˇ
+墧 0 ㄍㄠˇ
+撹 0 ㄍㄠˇ
+稾 0 ㄍㄠˇ
+藁 0 ㄍㄠˇ
+瀥 0 ㄍㄠˇ
+藳 0 ㄍㄠˇ
+稁 0 ㄍㄠˇ
+告 0 ㄍㄠˋ
+誥 0 ㄍㄠˋ
+郜 0 ㄍㄠˋ
+鋯 0 ㄍㄠˋ
+祰 0 ㄍㄠˋ
+煰 0 ㄍㄠˋ
+窖 0 ㄍㄠˋ
+膏 0 ㄍㄠˋ
+鵠 0 ㄍㄠˋ
+勂 0 ㄍㄠˋ
+哠 0 ㄍㄠˋ
+悎 0 ㄍㄠˋ
+捁 0 ㄍㄠˋ
+梏 0 ㄍㄠˋ
+牿 0 ㄍㄠˋ
+硞 0 ㄍㄠˋ
+筶 0 ㄍㄠˋ
+吿 0 ㄍㄠˋ
+叝 0 ㄍㄠˋ
+祮 0 ㄍㄠˋ
+禞 0 ㄍㄠˋ
+給 0 ㄍㄟˇ
+跟 0 ㄍㄣ
+根 0 ㄍㄣ
+蛝 0 ㄍㄣ
+艮 0 ㄍㄣˇ
+亙 0 ㄍㄣˋ
+艮 0 ㄍㄣˋ
+茛 0 ㄍㄣˋ
+閬 0 ㄍㄣˋ
+亘 0 ㄍㄣˋ
+珢 0 ㄍㄣˋ
+哏 0 ㄍㄣˊ
+ㄑ 0 ㄑ
+胠 0 ㄑ
+啐 0 ㄑ˙
+區 0 ㄑㄩ
+屈 0 ㄑㄩ
+驅 0 ㄑㄩ
+趨 0 ㄑㄩ
+軀 0 ㄑㄩ
+嶇 0 ㄑㄩ
+曲 0 ㄑㄩ
+蛆 0 ㄑㄩ
+瞿 0 ㄑㄩ
+袪 0 ㄑㄩ
+敺 0 ㄑㄩ
+蛐 0 ㄑㄩ
+佉 0 ㄑㄩ
+砠 0 ㄑㄩ
+胠 0 ㄑㄩ
+岨 0 ㄑㄩ
+祛 0 ㄑㄩ
+呿 0 ㄑㄩ
+凵 0 ㄑㄩ
+抾 0 ㄑㄩ
+阹 0 ㄑㄩ
+镼 0 ㄑㄩ
+魼 0 ㄑㄩ
+鶌 0 ㄑㄩ
+鱋 0 ㄑㄩ
+紶 0 ㄑㄩ
+髷 0 ㄑㄩ
+屆 0 ㄑㄩ
+疽 0 ㄑㄩ
+崛 0 ㄑㄩ
+樞 0 ㄑㄩ
+毆 0 ㄑㄩ
+麴 0 ㄑㄩ
+沏 0 ㄑㄩ
+浀 0 ㄑㄩ
+啒 0 ㄑㄩ
+淈 0 ㄑㄩ
+詘 0 ㄑㄩ
+趄 0 ㄑㄩ
+摳 0 ㄑㄩ
+貙 0 ㄑㄩ
+区 0 ㄑㄩ
+伹 0 ㄑㄩ
+届 0 ㄑㄩ
+岴 0 ㄑㄩ
+枢 0 ㄑㄩ
+殴 0 ㄑㄩ
+唿 0 ㄑㄩ
+躯 0 ㄑㄩ
+筁 0 ㄑㄩ
+趋 0 ㄑㄩ
+憈 0 ㄑㄩ
+誳 0 ㄑㄩ
+駈 0 ㄑㄩ
+麯 0 ㄑㄩ
+鰸 0 ㄑㄩ
+䖦 0 ㄑㄩ
+駆 0 ㄑㄩ
+𨧱 0 ㄑㄩ
+𡲬 0 ㄑㄩ
+去 0 ㄑㄩ˙
+缺 0 ㄑㄩㄝ
+闕 0 ㄑㄩㄝ
+蒛 0 ㄑㄩㄝ
+炔 0 ㄑㄩㄝ
+卻 0 ㄑㄩㄝˋ
+確 0 ㄑㄩㄝˋ
+鵲 0 ㄑㄩㄝˋ
+雀 0 ㄑㄩㄝˋ
+怯 0 ㄑㄩㄝˋ
+闕 0 ㄑㄩㄝˋ
+榷 0 ㄑㄩㄝˋ
+搉 0 ㄑㄩㄝˋ
+恪 0 ㄑㄩㄝˋ
+殼 0 ㄑㄩㄝˋ
+闋 0 ㄑㄩㄝˋ
+愨 0 ㄑㄩㄝˋ
+騥 0 ㄑㄩㄝˋ
+埆 0 ㄑㄩㄝˋ
+确 0 ㄑㄩㄝˋ
+碏 0 ㄑㄩㄝˋ
+碻 0 ㄑㄩㄝˋ
+礐 0 ㄑㄩㄝˋ
+硞 0 ㄑㄩㄝˋ
+皵 0 ㄑㄩㄝˋ
+毃 0 ㄑㄩㄝˋ
+礭 0 ㄑㄩㄝˋ
+佉 0 ㄑㄩㄝˋ
+抾 0 ㄑㄩㄝˋ
+阹 0 ㄑㄩㄝˋ
+胠 0 ㄑㄩㄝˋ
+砳 0 ㄑㄩㄝˋ
+祛 0 ㄑㄩㄝˋ
+郤 0 ㄑㄩㄝˋ
+紶 0 ㄑㄩㄝˋ
+袪 0 ㄑㄩㄝˋ
+谻 0 ㄑㄩㄝˋ
+傕 0 ㄑㄩㄝˋ
+塙 0 ㄑㄩㄝˋ
+鉣 0 ㄑㄩㄝˋ
+魼 0 ㄑㄩㄝˋ
+礜 0 ㄑㄩㄝˋ
+却 0 ㄑㄩㄝˋ
+壳 0 ㄑㄩㄝˋ
+郄 0 ㄑㄩㄝˋ
+殻 0 ㄑㄩㄝˋ
+愙 0 ㄑㄩㄝˋ
+墧 0 ㄑㄩㄝˋ
+慤 0 ㄑㄩㄝˋ
+燩 0 ㄑㄩㄝˋ
+灍 0 ㄑㄩㄝˋ
+隺 0 ㄑㄩㄝˋ
+魥 0 ㄑㄩㄝˋ
+㲉 0 ㄑㄩㄝˋ
+瘸 0 ㄑㄩㄝˊ
+芎 0 ㄑㄩㄥ
+穹 0 ㄑㄩㄥ
+銎 0 ㄑㄩㄥ
+桏 0 ㄑㄩㄥ
+宆 0 ㄑㄩㄥ
+焪 0 ㄑㄩㄥ
+熍 0 ㄑㄩㄥ
+褧 0 ㄑㄩㄥˇ
+顈 0 ㄑㄩㄥˇ
+窮 0 ㄑㄩㄥˊ
+瓊 0 ㄑㄩㄥˊ
+芎 0 ㄑㄩㄥˊ
+穹 0 ㄑㄩㄥˊ
+跫 0 ㄑㄩㄥˊ
+蛩 0 ㄑㄩㄥˊ
+惸 0 ㄑㄩㄥˊ
+邛 0 ㄑㄩㄥˊ
+璚 0 ㄑㄩㄥˊ
+藭 0 ㄑㄩㄥˊ
+瞏 0 ㄑㄩㄥˊ
+煢 0 ㄑㄩㄥˊ
+筇 0 ㄑㄩㄥˊ
+輁 0 ㄑㄩㄥˊ
+藑 0 ㄑㄩㄥˊ
+桏 0 ㄑㄩㄥˊ
+赹 0 ㄑㄩㄥˊ
+笻 0 ㄑㄩㄥˊ
+橩 0 ㄑㄩㄥˊ
+蒆 0 ㄑㄩㄥˊ
+觼 0 ㄑㄩㄥˊ
+舼 0 ㄑㄩㄥˊ
+敻 0 ㄑㄩㄥˊ
+嬛 0 ㄑㄩㄥˊ
+矎 0 ㄑㄩㄥˊ
+讂 0 ㄑㄩㄥˊ
+卭 0 ㄑㄩㄥˊ
+宆 0 ㄑㄩㄥˊ
+棾 0 ㄑㄩㄥˊ
+焭 0 ㄑㄩㄥˊ
+琼 0 ㄑㄩㄥˊ
+䤝 0 ㄑㄩㄥˊ
+睘 0 ㄑㄩㄥˊ
+儝 0 ㄑㄩㄥˊ
+竆 0 ㄑㄩㄥˊ
+圈 0 ㄑㄩㄢ
+悛 0 ㄑㄩㄢ
+棬 0 ㄑㄩㄢ
+弮 0 ㄑㄩㄢ
+絟 0 ㄑㄩㄢ
+惓 0 ㄑㄩㄢ
+峜 0 ㄑㄩㄢ
+圏 0 ㄑㄩㄢ
+箞 0 ㄑㄩㄢ
+犬 0 ㄑㄩㄢˇ
+綣 0 ㄑㄩㄢˇ
+甽 0 ㄑㄩㄢˇ
+畎 0 ㄑㄩㄢˇ
+琄 0 ㄑㄩㄢˇ
+虇 0 ㄑㄩㄢˇ
+汱 0 ㄑㄩㄢˇ
+圈 0 ㄑㄩㄢˇ
+烇 0 ㄑㄩㄢˇ
+裷 0 ㄑㄩㄢˇ
+呟 0 ㄑㄩㄢˇ
+犭 0 ㄑㄩㄢˇ
+勸 0 ㄑㄩㄢˋ
+券 0 ㄑㄩㄢˋ
+牶 0 ㄑㄩㄢˋ
+烇 0 ㄑㄩㄢˋ
+絭 0 ㄑㄩㄢˋ
+圈 0 ㄑㄩㄢˋ
+劝 0 ㄑㄩㄢˋ
+勌 0 ㄑㄩㄢˋ
+圏 0 ㄑㄩㄢˋ
+勧 0 ㄑㄩㄢˋ
+箞 0 ㄑㄩㄢˋ
+全 0 ㄑㄩㄢˊ
+權 0 ㄑㄩㄢˊ
+泉 0 ㄑㄩㄢˊ
+詮 0 ㄑㄩㄢˊ
+拳 0 ㄑㄩㄢˊ
+銓 0 ㄑㄩㄢˊ
+痊 0 ㄑㄩㄢˊ
+顴 0 ㄑㄩㄢˊ
+蜷 0 ㄑㄩㄢˊ
+筌 0 ㄑㄩㄢˊ
+卷 0 ㄑㄩㄢˊ
+荃 0 ㄑㄩㄢˊ
+鬈 0 ㄑㄩㄢˊ
+牷 0 ㄑㄩㄢˊ
+輇 0 ㄑㄩㄢˊ
+佺 0 ㄑㄩㄢˊ
+犬 0 ㄑㄩㄢˊ
+踡 0 ㄑㄩㄢˊ
+醛 0 ㄑㄩㄢˊ
+恮 0 ㄑㄩㄢˊ
+婘 0 ㄑㄩㄢˊ
+犈 0 ㄑㄩㄢˊ
+觠 0 ㄑㄩㄢˊ
+駩 0 ㄑㄩㄢˊ
+巏 0 ㄑㄩㄢˊ
+齤 0 ㄑㄩㄢˊ
+蠸 0 ㄑㄩㄢˊ
+姾 0 ㄑㄩㄢˊ
+瑔 0 ㄑㄩㄢˊ
+跧 0 ㄑㄩㄢˊ
+縓 0 ㄑㄩㄢˊ
+灥 0 ㄑㄩㄢˊ
+豢 0 ㄑㄩㄢˊ
+烇 0 ㄑㄩㄢˊ
+牶 0 ㄑㄩㄢˊ
+惓 0 ㄑㄩㄢˊ
+絟 0 ㄑㄩㄢˊ
+蟤 0 ㄑㄩㄢˊ
+鐉 0 ㄑㄩㄢˊ
+虇 0 ㄑㄩㄢˊ
+㒰 0 ㄑㄩㄢˊ
+巻 0 ㄑㄩㄢˊ
+洤 0 ㄑㄩㄢˊ
+硂 0 ㄑㄩㄢˊ
+湶 0 ㄑㄩㄢˊ
+搼 0 ㄑㄩㄢˊ
+葲 0 ㄑㄩㄢˊ
+権 0 ㄑㄩㄢˊ
+騡 0 ㄑㄩㄢˊ
+孉 0 ㄑㄩㄢˊ
+鰁 0 ㄑㄩㄢˊ
+取 0 ㄑㄩˇ
+曲 0 ㄑㄩˇ
+娶 0 ㄑㄩˇ
+齲 0 ㄑㄩˇ
+浀 0 ㄑㄩˇ
+紶 0 ㄑㄩˇ
+娵 0 ㄑㄩˇ
+跔 0 ㄑㄩˇ
+竬 0 ㄑㄩˇ
+㾀 0 ㄑㄩˇ
+詓 0 ㄑㄩˇ
+去 0 ㄑㄩˋ
+趣 0 ㄑㄩˋ
+娶 0 ㄑㄩˋ
+漆 0 ㄑㄩˋ
+覷 0 ㄑㄩˋ
+闃 0 ㄑㄩˋ
+湨 0 ㄑㄩˋ
+麮 0 ㄑㄩˋ
+刞 0 ㄑㄩˋ
+鼁 0 ㄑㄩˋ
+且 0 ㄑㄩˋ
+佉 0 ㄑㄩˋ
+呿 0 ㄑㄩˋ
+抾 0 ㄑㄩˋ
+阹 0 ㄑㄩˋ
+胠 0 ㄑㄩˋ
+祛 0 ㄑㄩˋ
+紶 0 ㄑㄩˋ
+袪 0 ㄑㄩˋ
+鉣 0 ㄑㄩˋ
+魼 0 ㄑㄩˋ
+厷 0 ㄑㄩˋ
+厺 0 ㄑㄩˋ
+覰 0 ㄑㄩˋ
+覻 0 ㄑㄩˋ
+閴 0 ㄑㄩˋ
+黢 0 ㄑㄩˋ
+渠 0 ㄑㄩˊ
+劬 0 ㄑㄩˊ
+麴 0 ㄑㄩˊ
+衢 0 ㄑㄩˊ
+蟝 0 ㄑㄩˊ
+瞿 0 ㄑㄩˊ
+籧 0 ㄑㄩˊ
+璩 0 ㄑㄩˊ
+氍 0 ㄑㄩˊ
+蘧 0 ㄑㄩˊ
+磲 0 ㄑㄩˊ
+蕖 0 ㄑㄩˊ
+朐 0 ㄑㄩˊ
+軥 0 ㄑㄩˊ
+鴝 0 ㄑㄩˊ
+翑 0 ㄑㄩˊ
+葋 0 ㄑㄩˊ
+豦 0 ㄑㄩˊ
+懅 0 ㄑㄩˊ
+螶 0 ㄑㄩˊ
+鼩 0 ㄑㄩˊ
+匷 0 ㄑㄩˊ
+灈 0 ㄑㄩˊ
+欋 0 ㄑㄩˊ
+臞 0 ㄑㄩˊ
+蠷 0 ㄑㄩˊ
+躣 0 ㄑㄩˊ
+胊 0 ㄑㄩˊ
+斪 0 ㄑㄩˊ
+淭 0 ㄑㄩˊ
+菃 0 ㄑㄩˊ
+翵 0 ㄑㄩˊ
+蛐 0 ㄑㄩˊ
+絇 0 ㄑㄩˊ
+蚼 0 ㄑㄩˊ
+跔 0 ㄑㄩˊ
+璖 0 ㄑㄩˊ
+麯 0 ㄑㄩˊ
+忂 0 ㄑㄩˊ
+戵 0 ㄑㄩˊ
+癯 0 ㄑㄩˊ
+鑺 0 ㄑㄩˊ
+鸜 0 ㄑㄩˊ
+逡 0 ㄑㄩㄣ
+踆 0 ㄑㄩㄣ
+峮 0 ㄑㄩㄣ
+碅 0 ㄑㄩㄣ
+蜠 0 ㄑㄩㄣ
+輑 0 ㄑㄩㄣ
+群 0 ㄑㄩㄣˊ
+裙 0 ㄑㄩㄣˊ
+宭 0 ㄑㄩㄣˊ
+峮 0 ㄑㄩㄣˊ
+麇 0 ㄑㄩㄣˊ
+帬 0 ㄑㄩㄣˊ
+羣 0 ㄑㄩㄣˊ
+裠 0 ㄑㄩㄣˊ
+麕 0 ㄑㄩㄣˊ
+麏 0 ㄑㄩㄣˊ
+七 0 ㄑㄧ
+妻 0 ㄑㄧ
+欺 0 ㄑㄧ
+戚 0 ㄑㄧ
+漆 0 ㄑㄧ
+棲 0 ㄑㄧ
+悽 0 ㄑㄧ
+淒 0 ㄑㄧ
+柒 0 ㄑㄧ
+萋 0 ㄑㄧ
+慼 0 ㄑㄧ
+溪 0 ㄑㄧ
+沏 0 ㄑㄧ
+諆 0 ㄑㄧ
+郪 0 ㄑㄧ
+娸 0 ㄑㄧ
+鸂 0 ㄑㄧ
+嘁 0 ㄑㄧ
+悊 0 ㄑㄧ
+榿 0 ㄑㄧ
+磎 0 ㄑㄧ
+倛 0 ㄑㄧ
+咠 0 ㄑㄧ
+栖 0 ㄑㄧ
+谿 0 ㄑㄧ
+凄 0 ㄑㄧ
+唭 0 ㄑㄧ
+徛 0 ㄑㄧ
+桼 0 ㄑㄧ
+僛 0 ㄑㄧ
+緀 0 ㄑㄧ
+磩 0 ㄑㄧ
+霋 0 ㄑㄧ
+魌 0 ㄑㄧ
+鶈 0 ㄑㄧ
+攲 0 ㄑㄧ
+崎 0 ㄑㄧ
+期 0 ㄑㄧ
+緝 0 ㄑㄧ
+抾 0 ㄑㄧ
+傶 0 ㄑㄧ
+豯 0 ㄑㄧ
+鼜 0 ㄑㄧ
+捿 0 ㄑㄧ
+朞 0 ㄑㄧ
+嵠 0 ㄑㄧ
+慽 0 ㄑㄧ
+豀 0 ㄑㄧ
+紪 0 ㄑㄧ
+䗩 0 ㄑㄧ
+敧 0 ㄑㄧ
+切 0 ㄑㄧㄝ
+聺 0 ㄑㄧㄝ
+且 0 ㄑㄧㄝˇ
+怚 0 ㄑㄧㄝˇ
+切 0 ㄑㄧㄝˋ
+竊 0 ㄑㄧㄝˋ
+妾 0 ㄑㄧㄝˋ
+怯 0 ㄑㄧㄝˋ
+愜 0 ㄑㄧㄝˋ
+挈 0 ㄑㄧㄝˋ
+篋 0 ㄑㄧㄝˋ
+鍥 0 ㄑㄧㄝˋ
+契 0 ㄑㄧㄝˋ
+朅 0 ㄑㄧㄝˋ
+踥 0 ㄑㄧㄝˋ
+鯜 0 ㄑㄧㄝˋ
+蛪 0 ㄑㄧㄝˋ
+緀 0 ㄑㄧㄝˋ
+藒 0 ㄑㄧㄝˋ
+洯 0 ㄑㄧㄝˋ
+砌 0 ㄑㄧㄝˋ
+灱 0 ㄑㄧㄝˋ
+沏 0 ㄑㄧㄝˋ
+唼 0 ㄑㄧㄝˋ
+菨 0 ㄑㄧㄝˋ
+趄 0 ㄑㄧㄝˋ
+媐 0 ㄑㄧㄝˋ
+慊 0 ㄑㄧㄝˋ
+緁 0 ㄑㄧㄝˋ
+灲 0 ㄑㄧㄝˋ
+矵 0 ㄑㄧㄝˋ
+匧 0 ㄑㄧㄝˋ
+窃 0 ㄑㄧㄝˋ
+帹 0 ㄑㄧㄝˋ
+㤲 0 ㄑㄧㄝˋ
+淁 0 ㄑㄧㄝˋ
+笡 0 ㄑㄧㄝˋ
+磜 0 ㄑㄧㄝˋ
+悏 0 ㄑㄧㄝˋ
+㾀 0 ㄑㄧㄝˋ
+㰰 0 ㄑㄧㄝˋ
+穕 0 ㄑㄧㄝˋ
+䟙 0 ㄑㄧㄝˋ
+茄 0 ㄑㄧㄝˊ
+伽 0 ㄑㄧㄝˊ
+癿 0 ㄑㄧㄝˊ
+秋 0 ㄑㄧㄡ
+邱 0 ㄑㄧㄡ
+丘 0 ㄑㄧㄡ
+蚯 0 ㄑㄧㄡ
+鞦 0 ㄑㄧㄡ
+鰍 0 ㄑㄧㄡ
+鶖 0 ㄑㄧㄡ
+楸 0 ㄑㄧㄡ
+坵 0 ㄑㄧㄡ
+萩 0 ㄑㄧㄡ
+偢 0 ㄑㄧㄡ
+緧 0 ㄑㄧㄡ
+媝 0 ㄑㄧㄡ
+蓲 0 ㄑㄧㄡ
+趥 0 ㄑㄧㄡ
+龜 0 ㄑㄧㄡ
+恘 0 ㄑㄧㄡ
+蝵 0 ㄑㄧㄡ
+蟗 0 ㄑㄧㄡ
+蠤 0 ㄑㄧㄡ
+啾 0 ㄑㄧㄡ
+愀 0 ㄑㄧㄡ
+揪 0 ㄑㄧㄡ
+鍬 0 ㄑㄧㄡ
+揫 0 ㄑㄧㄡ
+煍 0 ㄑㄧㄡ
+瞅 0 ㄑㄧㄡ
+踿 0 ㄑㄧㄡ
+丠 0 ㄑㄧㄡ
+㚱 0 ㄑㄧㄡ
+㳋 0 ㄑㄧㄡ
+亀 0 ㄑㄧㄡ
+噍 0 ㄑㄧㄡ
+篍 0 ㄑㄧㄡ
+鍫 0 ㄑㄧㄡ
+矁 0 ㄑㄧㄡ
+龝 0 ㄑㄧㄡ
+鞧 0 ㄑㄧㄡ
+鱃 0 ㄑㄧㄡ
+㐀 0 ㄑㄧㄡ
+䟬 0 ㄑㄧㄡˋ
+糗 0 ㄑㄧㄡˇ
+螑 0 ㄑㄧㄡˇ
+搝 0 ㄑㄧㄡˇ
+求 0 ㄑㄧㄡˊ
+球 0 ㄑㄧㄡˊ
+囚 0 ㄑㄧㄡˊ
+仇 0 ㄑㄧㄡˊ
+酋 0 ㄑㄧㄡˊ
+裘 0 ㄑㄧㄡˊ
+遒 0 ㄑㄧㄡˊ
+毬 0 ㄑㄧㄡˊ
+泅 0 ㄑㄧㄡˊ
+鰽 0 ㄑㄧㄡˊ
+逑 0 ㄑㄧㄡˊ
+俅 0 ㄑㄧㄡˊ
+厹 0 ㄑㄧㄡˊ
+璆 0 ㄑㄧㄡˊ
+絿 0 ㄑㄧㄡˊ
+艽 0 ㄑㄧㄡˊ
+虯 0 ㄑㄧㄡˊ
+蝤 0 ㄑㄧㄡˊ
+觩 0 ㄑㄧㄡˊ
+賕 0 ㄑㄧㄡˊ
+盚 0 ㄑㄧㄡˊ
+銶 0 ㄑㄧㄡˊ
+頄 0 ㄑㄧㄡˊ
+鼽 0 ㄑㄧㄡˊ
+訄 0 ㄑㄧㄡˊ
+犰 0 ㄑㄧㄡˊ
+朹 0 ㄑㄧㄡˊ
+梂 0 ㄑㄧㄡˊ
+釚 0 ㄑㄧㄡˊ
+煪 0 ㄑㄧㄡˊ
+苬 0 ㄑㄧㄡˊ
+紌 0 ㄑㄧㄡˊ
+脙 0 ㄑㄧㄡˊ
+莍 0 ㄑㄧㄡˊ
+崷 0 ㄑㄧㄡˊ
+僋 0 ㄑㄧㄡˊ
+蛷 0 ㄑㄧㄡˊ
+鮂 0 ㄑㄧㄡˊ
+鯄 0 ㄑㄧㄡˊ
+殏 0 ㄑㄧㄡˊ
+猷 0 ㄑㄧㄡˊ
+觓 0 ㄑㄧㄡˊ
+唒 0 ㄑㄧㄡˊ
+捄 0 ㄑㄧㄡˊ
+偤 0 ㄑㄧㄡˊ
+揂 0 ㄑㄧㄡˊ
+趥 0 ㄑㄧㄡˊ
+輶 0 ㄑㄧㄡˊ
+㕤 0 ㄑㄧㄡˊ
+叴 0 ㄑㄧㄡˊ
+扏 0 ㄑㄧㄡˊ
+汓 0 ㄑㄧㄡˊ
+肍 0 ㄑㄧㄡˊ
+虬 0 ㄑㄧㄡˊ
+訅 0 ㄑㄧㄡˊ
+浗 0 ㄑㄧㄡˊ
+逎 0 ㄑㄧㄡˊ
+渞 0 ㄑㄧㄡˊ
+湭 0 ㄑㄧㄡˊ
+皳 0 ㄑㄧㄡˊ
+鰌 0 ㄑㄧㄡˊ
+玐 0 ㄑㄧㄡˊ
+䊵 0 ㄑㄧㄡˊ
+㞗 0 ㄑㄧㄡˊ
+輏 0 ㄑㄧㄡˊ
+醔 0 ㄑㄧㄡˊ
+清 0 ㄑㄧㄥ
+青 0 ㄑㄧㄥ
+輕 0 ㄑㄧㄥ
+傾 0 ㄑㄧㄥ
+卿 0 ㄑㄧㄥ
+氫 0 ㄑㄧㄥ
+蜻 0 ㄑㄧㄥ
+頃 0 ㄑㄧㄥ
+鯖 0 ㄑㄧㄥ
+圊 0 ㄑㄧㄥ
+氰 0 ㄑㄧㄥ
+狅 0 ㄑㄧㄥ
+郬 0 ㄑㄧㄥ
+菁 0 ㄑㄧㄥ
+請 0 ㄑㄧㄥ
+凊 0 ㄑㄧㄥ
+埥 0 ㄑㄧㄥ
+崝 0 ㄑㄧㄥ
+掅 0 ㄑㄧㄥ
+烴 0 ㄑㄧㄥ
+棈 0 ㄑㄧㄥ
+碃 0 ㄑㄧㄥ
+羥 0 ㄑㄧㄥ
+箐 0 ㄑㄧㄥ
+綪 0 ㄑㄧㄥ
+漀 0 ㄑㄧㄥ
+輤 0 ㄑㄧㄥ
+錆 0 ㄑㄧㄥ
+蹞 0 ㄑㄧㄥ
+鶄 0 ㄑㄧㄥ
+鼱 0 ㄑㄧㄥ
+鑋 0 ㄑㄧㄥ
+靑 0 ㄑㄧㄥ
+婙 0 ㄑㄧㄥ
+寈 0 ㄑㄧㄥ
+淸 0 ㄑㄧㄥ
+軽 0 ㄑㄧㄥ
+䨝 0 ㄑㄧㄥ
+請 0 ㄑㄧㄥˇ
+頃 0 ㄑㄧㄥˇ
+廎 0 ㄑㄧㄥˇ
+傾 0 ㄑㄧㄥˇ
+掅 0 ㄑㄧㄥˇ
+綪 0 ㄑㄧㄥˇ
+輤 0 ㄑㄧㄥˇ
+錆 0 ㄑㄧㄥˇ
+苘 0 ㄑㄧㄥˇ
+㷫 0 ㄑㄧㄥˇ
+檾 0 ㄑㄧㄥˇ
+慶 0 ㄑㄧㄥˋ
+罄 0 ㄑㄧㄥˋ
+親 0 ㄑㄧㄥˋ
+凊 0 ㄑㄧㄥˋ
+綮 0 ㄑㄧㄥˋ
+謦 0 ㄑㄧㄥˋ
+磬 0 ㄑㄧㄥˋ
+漀 0 ㄑㄧㄥˋ
+汫 0 ㄑㄧㄥˋ
+鑋 0 ㄑㄧㄥˋ
+靘 0 ㄑㄧㄥˋ
+掅 0 ㄑㄧㄥˋ
+碃 0 ㄑㄧㄥˋ
+罊 0 ㄑㄧㄥˋ
+請 0 ㄑㄧㄥˋ
+蟿 0 ㄑㄧㄥˋ
+羻 0 ㄑㄧㄥˋ
+亲 0 ㄑㄧㄥˋ
+媇 0 ㄑㄧㄥˋ
+濪 0 ㄑㄧㄥˋ
+殸 0 ㄑㄧㄥˋ
+情 0 ㄑㄧㄥˊ
+晴 0 ㄑㄧㄥˊ
+擎 0 ㄑㄧㄥˊ
+傾 0 ㄑㄧㄥˊ
+檠 0 ㄑㄧㄥˊ
+勍 0 ㄑㄧㄥˊ
+殑 0 ㄑㄧㄥˊ
+樈 0 ㄑㄧㄥˊ
+殌 0 ㄑㄧㄥˊ
+請 0 ㄑㄧㄥˊ
+鯨 0 ㄑㄧㄥˊ
+狅 0 ㄑㄧㄥˊ
+葝 0 ㄑㄧㄥˊ
+擏 0 ㄑㄧㄥˊ
+黥 0 ㄑㄧㄥˊ
+啨 0 ㄑㄧㄥˊ
+暒 0 ㄑㄧㄥˊ
+㯳 0 ㄑㄧㄥˊ
+夝 0 ㄑㄧㄥˊ
+甠 0 ㄑㄧㄥˊ
+槍 0 ㄑㄧㄤ
+腔 0 ㄑㄧㄤ
+鎗 0 ㄑㄧㄤ
+羌 0 ㄑㄧㄤ
+嗆 0 ㄑㄧㄤ
+搶 0 ㄑㄧㄤ
+鏘 0 ㄑㄧㄤ
+鏹 0 ㄑㄧㄤ
+蜣 0 ㄑㄧㄤ
+蹌 0 ㄑㄧㄤ
+斨 0 ㄑㄧㄤ
+瑲 0 ㄑㄧㄤ
+椌 0 ㄑㄧㄤ
+蹡 0 ㄑㄧㄤ
+錆 0 ㄑㄧㄤ
+矼 0 ㄑㄧㄤ
+嶈 0 ㄑㄧㄤ
+將 0 ㄑㄧㄤ
+牄 0 ㄑㄧㄤ
+謒 0 ㄑㄧㄤ
+唴 0 ㄑㄧㄤ
+戧 0 ㄑㄧㄤ
+錓 0 ㄑㄧㄤ
+将 0 ㄑㄧㄤ
+羗 0 ㄑㄧㄤ
+啌 0 ㄑㄧㄤ
+猐 0 ㄑㄧㄤ
+溬 0 ㄑㄧㄤ
+摤 0 ㄑㄧㄤ
+篬 0 ㄑㄧㄤ
+羫 0 ㄑㄧㄤ
+強 0 ㄑㄧㄤˇ
+搶 0 ㄑㄧㄤˇ
+襁 0 ㄑㄧㄤˇ
+磢 0 ㄑㄧㄤˇ
+傸 0 ㄑㄧㄤˇ
+墏 0 ㄑㄧㄤˇ
+繈 0 ㄑㄧㄤˇ
+彊 0 ㄑㄧㄤˇ
+鏹 0 ㄑㄧㄤˇ
+强 0 ㄑㄧㄤˇ
+摤 0 ㄑㄧㄤˇ
+繦 0 ㄑㄧㄤˇ
+勥 0 ㄑㄧㄤˇ
+羥 0 ㄑㄧㄤˇ
+嗆 0 ㄑㄧㄤˋ
+羻 0 ㄑㄧㄤˋ
+唴 0 ㄑㄧㄤˋ
+熗 0 ㄑㄧㄤˋ
+蹌 0 ㄑㄧㄤˋ
+戧 0 ㄑㄧㄤˋ
+蹡 0 ㄑㄧㄤˋ
+摪 0 ㄑㄧㄤˋ
+強 0 ㄑㄧㄤˊ
+牆 0 ㄑㄧㄤˊ
+薔 0 ㄑㄧㄤˊ
+戕 0 ㄑㄧㄤˊ
+墻 0 ㄑㄧㄤˊ
+嬙 0 ㄑㄧㄤˊ
+檣 0 ㄑㄧㄤˊ
+爿 0 ㄑㄧㄤˊ
+漒 0 ㄑㄧㄤˊ
+蘠 0 ㄑㄧㄤˊ
+廧 0 ㄑㄧㄤˊ
+彊 0 ㄑㄧㄤˊ
+繈 0 ㄑㄧㄤˊ
+嵹 0 ㄑㄧㄤˊ
+膙 0 ㄑㄧㄤˊ
+糨 0 ㄑㄧㄤˊ
+襁 0 ㄑㄧㄤˊ
+謽 0 ㄑㄧㄤˊ
+强 0 ㄑㄧㄤˊ
+蔃 0 ㄑㄧㄤˊ
+糡 0 ㄑㄧㄤˊ
+繦 0 ㄑㄧㄤˊ
+艢 0 ㄑㄧㄤˊ
+千 0 ㄑㄧㄢ
+鉛 0 ㄑㄧㄢ
+遷 0 ㄑㄧㄢ
+簽 0 ㄑㄧㄢ
+牽 0 ㄑㄧㄢ
+謙 0 ㄑㄧㄢ
+籤 0 ㄑㄧㄢ
+嵌 0 ㄑㄧㄢ
+仟 0 ㄑㄧㄢ
+阡 0 ㄑㄧㄢ
+韆 0 ㄑㄧㄢ
+騫 0 ㄑㄧㄢ
+愆 0 ㄑㄧㄢ
+僉 0 ㄑㄧㄢ
+慳 0 ㄑㄧㄢ
+搴 0 ㄑㄧㄢ
+褰 0 ㄑㄧㄢ
+粁 0 ㄑㄧㄢ
+岍 0 ㄑㄧㄢ
+汧 0 ㄑㄧㄢ
+縴 0 ㄑㄧㄢ
+芊 0 ㄑㄧㄢ
+掔 0 ㄑㄧㄢ
+扦 0 ㄑㄧㄢ
+檶 0 ㄑㄧㄢ
+鐱 0 ㄑㄧㄢ
+婜 0 ㄑㄧㄢ
+羥 0 ㄑㄧㄢ
+攐 0 ㄑㄧㄢ
+攓 0 ㄑㄧㄢ
+顩 0 ㄑㄧㄢ
+奷 0 ㄑㄧㄢ
+忏 0 ㄑㄧㄢ
+顅 0 ㄑㄧㄢ
+麉 0 ㄑㄧㄢ
+櫏 0 ㄑㄧㄢ
+虔 0 ㄑㄧㄢ
+縑 0 ㄑㄧㄢ
+殲 0 ㄑㄧㄢ
+纖 0 ㄑㄧㄢ
+讖 0 ㄑㄧㄢ
+寋 0 ㄑㄧㄢ
+鈆 0 ㄑㄧㄢ
+雃 0 ㄑㄧㄢ
+僊 0 ㄑㄧㄢ
+嗛 0 ㄑㄧㄢ
+舝 0 ㄑㄧㄢ
+鋟 0 ㄑㄧㄢ
+褼 0 ㄑㄧㄢ
+謇 0 ㄑㄧㄢ
+韱 0 ㄑㄧㄢ
+藆 0 ㄑㄧㄢ
+孅 0 ㄑㄧㄢ
+瀸 0 ㄑㄧㄢ
+櫼 0 ㄑㄧㄢ
+鶼 0 ㄑㄧㄢ
+鶱 0 ㄑㄧㄢ
+躚 0 ㄑㄧㄢ
+襳 0 ㄑㄧㄢ
+虃 0 ㄑㄧㄢ
+鑯 0 ㄑㄧㄢ
+圱 0 ㄑㄧㄢ
+圲 0 ㄑㄧㄢ
+汘 0 ㄑㄧㄢ
+杄 0 ㄑㄧㄢ
+迁 0 ㄑㄧㄢ
+茾 0 ㄑㄧㄢ
+拪 0 ㄑㄧㄢ
+䊹 0 ㄑㄧㄢ
+摼 0 ㄑㄧㄢ
+撁 0 ㄑㄧㄢ
+熑 0 ㄑㄧㄢ
+艌 0 ㄑㄧㄢ
+厱 0 ㄑㄧㄢ
+諐 0 ㄑㄧㄢ
+韯 0 ㄑㄧㄢ
+燫 0 ㄑㄧㄢ
+瀐 0 ㄑㄧㄢ
+覵 0 ㄑㄧㄢ
+鵮 0 ㄑㄧㄢ
+攑 0 ㄑㄧㄢ
+籖 0 ㄑㄧㄢ
+纎 0 ㄑㄧㄢ
+臤 0 ㄑㄧㄢ
+蚈 0 ㄑㄧㄢ
+孯 0 ㄑㄧㄢ
+蹮 0 ㄑㄧㄢ
+鬜 0 ㄑㄧㄢ
+谸 0 ㄑㄧㄢ
+遣 0 ㄑㄧㄢˇ
+淺 0 ㄑㄧㄢˇ
+譴 0 ㄑㄧㄢˇ
+繾 0 ㄑㄧㄢˇ
+槏 0 ㄑㄧㄢˇ
+撖 0 ㄑㄧㄢˇ
+忏 0 ㄑㄧㄢˇ
+蜸 0 ㄑㄧㄢˇ
+嵌 0 ㄑㄧㄢˇ
+潛 0 ㄑㄧㄢˇ
+嗛 0 ㄑㄧㄢˇ
+隒 0 ㄑㄧㄢˇ
+諓 0 ㄑㄧㄢˇ
+輚 0 ㄑㄧㄢˇ
+醆 0 ㄑㄧㄢˇ
+鼸 0 ㄑㄧㄢˇ
+欦 0 ㄑㄧㄢˇ
+浅 0 ㄑㄧㄢˇ
+膁 0 ㄑㄧㄢˇ
+潜 0 ㄑㄧㄢˇ
+濳 0 ㄑㄧㄢˇ
+㹂 0 ㄑㄧㄢˇ
+嵰 0 ㄑㄧㄢˇ
+欠 0 ㄑㄧㄢˋ
+歉 0 ㄑㄧㄢˋ
+倩 0 ㄑㄧㄢˋ
+慊 0 ㄑㄧㄢˋ
+茜 0 ㄑㄧㄢˋ
+塹 0 ㄑㄧㄢˋ
+芡 0 ㄑㄧㄢˋ
+傔 0 ㄑㄧㄢˋ
+嗛 0 ㄑㄧㄢˋ
+槧 0 ㄑㄧㄢˋ
+縴 0 ㄑㄧㄢˋ
+篟 0 ㄑㄧㄢˋ
+綪 0 ㄑㄧㄢˋ
+棈 0 ㄑㄧㄢˋ
+蒨 0 ㄑㄧㄢˋ
+輤 0 ㄑㄧㄢˋ
+嵌 0 ㄑㄧㄢˋ
+謙 0 ㄑㄧㄢˋ
+忺 0 ㄑㄧㄢˋ
+咁 0 ㄑㄧㄢˋ
+杴 0 ㄑㄧㄢˋ
+欥 0 ㄑㄧㄢˋ
+俔 0 ㄑㄧㄢˋ
+婧 0 ㄑㄧㄢˋ
+箐 0 ㄑㄧㄢˋ
+靚 0 ㄑㄧㄢˋ
+悓 0 ㄑㄧㄢˋ
+婙 0 ㄑㄧㄢˋ
+皘 0 ㄑㄧㄢˋ
+艌 0 ㄑㄧㄢˋ
+蔳 0 ㄑㄧㄢˋ
+壍 0 ㄑㄧㄢˋ
+嬱 0 ㄑㄧㄢˋ
+肷 0 ㄑㄧㄢˋ
+㟻 0 ㄑㄧㄢˋ
+儙 0 ㄑㄧㄢˋ
+前 0 ㄑㄧㄢˊ
+錢 0 ㄑㄧㄢˊ
+乾 0 ㄑㄧㄢˊ
+潛 0 ㄑㄧㄢˊ
+黔 0 ㄑㄧㄢˊ
+鉗 0 ㄑㄧㄢˊ
+虔 0 ㄑㄧㄢˊ
+箝 0 ㄑㄧㄢˊ
+鈐 0 ㄑㄧㄢˊ
+掮 0 ㄑㄧㄢˊ
+媊 0 ㄑㄧㄢˊ
+揵 0 ㄑㄧㄢˊ
+燂 0 ㄑㄧㄢˊ
+拑 0 ㄑㄧㄢˊ
+灊 0 ㄑㄧㄢˊ
+黚 0 ㄑㄧㄢˊ
+忴 0 ㄑㄧㄢˊ
+扲 0 ㄑㄧㄢˊ
+岒 0 ㄑㄧㄢˊ
+漧 0 ㄑㄧㄢˊ
+葥 0 ㄑㄧㄢˊ
+鳹 0 ㄑㄧㄢˊ
+騚 0 ㄑㄧㄢˊ
+鰬 0 ㄑㄧㄢˊ
+仱 0 ㄑㄧㄢˊ
+姏 0 ㄑㄧㄢˊ
+蚙 0 ㄑㄧㄢˊ
+軡 0 ㄑㄧㄢˊ
+榩 0 ㄑㄧㄢˊ
+柑 0 ㄑㄧㄢˊ
+湔 0 ㄑㄧㄢˊ
+僭 0 ㄑㄧㄢˊ
+赶 0 ㄑㄧㄢˊ
+揃 0 ㄑㄧㄢˊ
+雂 0 ㄑㄧㄢˊ
+瑐 0 ㄑㄧㄢˊ
+墘 0 ㄑㄧㄢˊ
+嶜 0 ㄑㄧㄢˊ
+糋 0 ㄑㄧㄢˊ
+羬 0 ㄑㄧㄢˊ
+熸 0 ㄑㄧㄢˊ
+鬋 0 ㄑㄧㄢˊ
+乹 0 ㄑㄧㄢˊ
+歬 0 ㄑㄧㄢˊ
+偂 0 ㄑㄧㄢˊ
+亁 0 ㄑㄧㄢˊ
+碊 0 ㄑㄧㄢˊ
+銭 0 ㄑㄧㄢˊ
+撍 0 ㄑㄧㄢˊ
+潜 0 ㄑㄧㄢˊ
+橬 0 ㄑㄧㄢˊ
+濳 0 ㄑㄧㄢˊ
+鵭 0 ㄑㄧㄢˊ
+䐶 0 ㄑㄧㄢˊ
+䕭 0 ㄑㄧㄢˊ
+起 0 ㄑㄧˇ
+啟 0 ㄑㄧˇ
+豈 0 ㄑㄧˇ
+乞 0 ㄑㄧˇ
+綺 0 ㄑㄧˇ
+杞 0 ㄑㄧˇ
+稽 0 ㄑㄧˇ
+綮 0 ㄑㄧˇ
+屺 0 ㄑㄧˇ
+棨 0 ㄑㄧˇ
+敧 0 ㄑㄧˇ
+芑 0 ㄑㄧˇ
+婍 0 ㄑㄧˇ
+邔 0 ㄑㄧˇ
+芞 0 ㄑㄧˇ
+呇 0 ㄑㄧˇ
+企 0 ㄑㄧˇ
+覬 0 ㄑㄧˇ
+刉 0 ㄑㄧˇ
+忔 0 ㄑㄧˇ
+犵 0 ㄑㄧˇ
+盵 0 ㄑㄧˇ
+釳 0 ㄑㄧˇ
+隑 0 ㄑㄧˇ
+暟 0 ㄑㄧˇ
+榿 0 ㄑㄧˇ
+麧 0 ㄑㄧˇ
+颽 0 ㄑㄧˇ
+启 0 ㄑㄧˇ
+玘 0 ㄑㄧˇ
+盀 0 ㄑㄧˇ
+唘 0 ㄑㄧˇ
+啔 0 ㄑㄧˇ
+啓 0 ㄑㄧˇ
+䄎 0 ㄑㄧˇ
+裿 0 ㄑㄧˇ
+諬 0 ㄑㄧˇ
+晵 0 ㄑㄧˇ
+袳 0 ㄑㄧˇ
+闙 0 ㄑㄧˇ
+企 0 ㄑㄧˋ
+氣 0 ㄑㄧˋ
+器 0 ㄑㄧˋ
+汽 0 ㄑㄧˋ
+棄 0 ㄑㄧˋ
+契 0 ㄑㄧˋ
+砌 0 ㄑㄧˋ
+泣 0 ㄑㄧˋ
+迄 0 ㄑㄧˋ
+訖 0 ㄑㄧˋ
+汔 0 ㄑㄧˋ
+憩 0 ㄑㄧˋ
+緝 0 ㄑㄧˋ
+亟 0 ㄑㄧˋ
+葺 0 ㄑㄧˋ
+磧 0 ㄑㄧˋ
+栔 0 ㄑㄧˋ
+愒 0 ㄑㄧˋ
+妻 0 ㄑㄧˋ
+蟿 0 ㄑㄧˋ
+鏚 0 ㄑㄧˋ
+盵 0 ㄑㄧˋ
+蚑 0 ㄑㄧˋ
+忔 0 ㄑㄧˋ
+湆 0 ㄑㄧˋ
+气 0 ㄑㄧˋ
+諿 0 ㄑㄧˋ
+湇 0 ㄑㄧˋ
+甈 0 ㄑㄧˋ
+鼜 0 ㄑㄧˋ
+乞 0 ㄑㄧˋ
+屹 0 ㄑㄧˋ
+紇 0 ㄑㄧˋ
+戚 0 ㄑㄧˋ
+揭 0 ㄑㄧˋ
+隙 0 ㄑㄧˋ
+囂 0 ㄑㄧˋ
+仡 0 ㄑㄧˋ
+犵 0 ㄑㄧˋ
+阣 0 ㄑㄧˋ
+沏 0 ㄑㄧˋ
+芞 0 ㄑㄧˋ
+咠 0 ㄑㄧˋ
+籺 0 ㄑㄧˋ
+恝 0 ㄑㄧˋ
+趷 0 ㄑㄧˋ
+偰 0 ㄑㄧˋ
+唭 0 ㄑㄧˋ
+跂 0 ㄑㄧˋ
+釳 0 ㄑㄧˋ
+揳 0 ㄑㄧˋ
+湒 0 ㄑㄧˋ
+蛪 0 ㄑㄧˋ
+滊 0 ㄑㄧˋ
+熂 0 ㄑㄧˋ
+瘈 0 ㄑㄧˋ
+禊 0 ㄑㄧˋ
+褉 0 ㄑㄧˋ
+鎎 0 ㄑㄧˋ
+餼 0 ㄑㄧˋ
+齕 0 ㄑㄧˋ
+㐹 0 ㄑㄧˋ
+呚 0 ㄑㄧˋ
+弃 0 ㄑㄧˋ
+矵 0 ㄑㄧˋ
+炁 0 ㄑㄧˋ
+洓 0 ㄑㄧˋ
+欫 0 ㄑㄧˋ
+掲 0 ㄑㄧˋ
+焏 0 ㄑㄧˋ
+硆 0 ㄑㄧˋ
+摖 0 ㄑㄧˋ
+隟 0 ㄑㄧˋ
+噐 0 ㄑㄧˋ
+憇 0 ㄑㄧˋ
+磜 0 ㄑㄧˋ
+礘 0 ㄑㄧˋ
+嚻 0 ㄑㄧˋ
+呮 0 ㄑㄧˋ
+㞓 0 ㄑㄧˋ
+敌 0 ㄑㄧˋ
+䞘 0 ㄑㄧˋ
+暣 0 ㄑㄧˋ
+夡 0 ㄑㄧˋ
+其 0 ㄑㄧˊ
+期 0 ㄑㄧˊ
+齊 0 ㄑㄧˊ
+奇 0 ㄑㄧˊ
+旗 0 ㄑㄧˊ
+騎 0 ㄑㄧˊ
+祈 0 ㄑㄧˊ
+棋 0 ㄑㄧˊ
+祺 0 ㄑㄧˊ
+碁 0 ㄑㄧˊ
+祁 0 ㄑㄧˊ
+崎 0 ㄑㄧˊ
+琦 0 ㄑㄧˊ
+岐 0 ㄑㄧˊ
+歧 0 ㄑㄧˊ
+琪 0 ㄑㄧˊ
+麒 0 ㄑㄧˊ
+鰭 0 ㄑㄧˊ
+畦 0 ㄑㄧˊ
+臍 0 ㄑㄧˊ
+祇 0 ㄑㄧˊ
+耆 0 ㄑㄧˊ
+淇 0 ㄑㄧˊ
+跂 0 ㄑㄧˊ
+枝 0 ㄑㄧˊ
+綦 0 ㄑㄧˊ
+騏 0 ㄑㄧˊ
+衹 0 ㄑㄧˊ
+蘄 0 ㄑㄧˊ
+圻 0 ㄑㄧˊ
+錡 0 ㄑㄧˊ
+旂 0 ㄑㄧˊ
+萁 0 ㄑㄧˊ
+蜞 0 ㄑㄧˊ
+埼 0 ㄑㄧˊ
+蠐 0 ㄑㄧˊ
+頎 0 ㄑㄧˊ
+懠 0 ㄑㄧˊ
+艩 0 ㄑㄧˊ
+蚔 0 ㄑㄧˊ
+軝 0 ㄑㄧˊ
+藄 0 ㄑㄧˊ
+鄿 0 ㄑㄧˊ
+鯕 0 ㄑㄧˊ
+鬐 0 ㄑㄧˊ
+蚑 0 ㄑㄧˊ
+錤 0 ㄑㄧˊ
+掑 0 ㄑㄧˊ
+岓 0 ㄑㄧˊ
+碕 0 ㄑㄧˊ
+翗 0 ㄑㄧˊ
+釮 0 ㄑㄧˊ
+亓 0 ㄑㄧˊ
+蚚 0 ㄑㄧˊ
+稘 0 ㄑㄧˊ
+鬿 0 ㄑㄧˊ
+踑 0 ㄑㄧˊ
+鮨 0 ㄑㄧˊ
+鶀 0 ㄑㄧˊ
+鵸 0 ㄑㄧˊ
+玂 0 ㄑㄧˊ
+麡 0 ㄑㄧˊ
+濝 0 ㄑㄧˊ
+示 0 ㄑㄧˊ
+俟 0 ㄑㄧˊ
+畸 0 ㄑㄧˊ
+畿 0 ㄑㄧˊ
+儕 0 ㄑㄧˊ
+薺 0 ㄑㄧˊ
+霽 0 ㄑㄧˊ
+忯 0 ㄑㄧˊ
+肵 0 ㄑㄧˊ
+倛 0 ㄑㄧˊ
+剞 0 ㄑㄧˊ
+唭 0 ㄑㄧˊ
+娸 0 ㄑㄧˊ
+婍 0 ㄑㄧˊ
+徛 0 ㄑㄧˊ
+惎 0 ㄑㄧˊ
+攲 0 ㄑㄧˊ
+敧 0 ㄑㄧˊ
+搘 0 ㄑㄧˊ
+榰 0 ㄑㄧˊ
+鬾 0 ㄑㄧˊ
+觭 0 ㄑㄧˊ
+諆 0 ㄑㄧˊ
+諅 0 ㄑㄧˊ
+踦 0 ㄑㄧˊ
+櫅 0 ㄑㄧˊ
+璾 0 ㄑㄧˊ
+齌 0 ㄑㄧˊ
+懻 0 ㄑㄧˊ
+鑇 0 ㄑㄧˊ
+齮 0 ㄑㄧˊ
+齐 0 ㄑㄧˊ
+亝 0 ㄑㄧˊ
+斉 0 ㄑㄧˊ
+芪 0 ㄑㄧˊ
+竒 0 ㄑㄧˊ
+帺 0 ㄑㄧˊ
+㥍 0 ㄑㄧˊ
+朞 0 ㄑㄧˊ
+棊 0 ㄑㄧˊ
+竢 0 ㄑㄧˊ
+粸 0 ㄑㄧˊ
+綨 0 ㄑㄧˊ
+蜝 0 ㄑㄧˊ
+褀 0 ㄑㄧˊ
+璂 0 ㄑㄧˊ
+禥 0 ㄑㄧˊ
+櫀 0 ㄑㄧˊ
+檱 0 ㄑㄧˊ
+弜 0 ㄑㄧˊ
+剘 0 ㄑㄧˊ
+斊 0 ㄑㄧˊ
+萕 0 ㄑㄧˊ
+愭 0 ㄑㄧˊ
+㓾 0 ㄑㄧˊ
+綥 0 ㄑㄧˊ
+䳢 0 ㄑㄧˊ
+猉 0 ㄑㄧˊ
+掐 0 ㄑㄧㄚ
+葜 0 ㄑㄧㄚ
+㤉 0 ㄑㄧㄚ
+卡 0 ㄑㄧㄚˇ
+酠 0 ㄑㄧㄚˇ
+跒 0 ㄑㄧㄚˇ
+恰 0 ㄑㄧㄚˋ
+洽 0 ㄑㄧㄚˋ
+帢 0 ㄑㄧㄚˋ
+愘 0 ㄑㄧㄚˋ
+殎 0 ㄑㄧㄚˋ
+冾 0 ㄑㄧㄚˋ
+垥 0 ㄑㄧㄚˋ
+烚 0 ㄑㄧㄚˋ
+珨 0 ㄑㄧㄚˋ
+楬 0 ㄑㄧㄚˋ
+跲 0 ㄑㄧㄚˋ
+圶 0 ㄑㄧㄚˋ
+胢 0 ㄑㄧㄚˋ
+㓤 0 ㄑㄧㄚˋ
+敲 0 ㄑㄧㄠ
+鍬 0 ㄑㄧㄠ
+橇 0 ㄑㄧㄠ
+撬 0 ㄑㄧㄠ
+蹺 0 ㄑㄧㄠ
+磽 0 ㄑㄧㄠ
+蹻 0 ㄑㄧㄠ
+墝 0 ㄑㄧㄠ
+幧 0 ㄑㄧㄠ
+繑 0 ㄑㄧㄠ
+髜 0 ㄑㄧㄠ
+鐰 0 ㄑㄧㄠ
+鏒 0 ㄑㄧㄠ
+塙 0 ㄑㄧㄠ
+鄡 0 ㄑㄧㄠ
+墽 0 ㄑㄧㄠ
+骹 0 ㄑㄧㄠ
+庨 0 ㄑㄧㄠ
+郻 0 ㄑㄧㄠ
+頝 0 ㄑㄧㄠ
+俏 0 ㄑㄧㄠ
+悄 0 ㄑㄧㄠ
+雀 0 ㄑㄧㄠ
+鄗 0 ㄑㄧㄠ
+誚 0 ㄑㄧㄠ
+毃 0 ㄑㄧㄠ
+敺 0 ㄑㄧㄠ
+趬 0 ㄑㄧㄠ
+鄥 0 ㄑㄧㄠ
+鍫 0 ㄑㄧㄠ
+嵪 0 ㄑㄧㄠ
+巧 0 ㄑㄧㄠˇ
+悄 0 ㄑㄧㄠˇ
+愀 0 ㄑㄧㄠˇ
+鵲 0 ㄑㄧㄠˇ
+雀 0 ㄑㄧㄠˇ
+燋 0 ㄑㄧㄠˇ
+頝 0 ㄑㄧㄠˇ
+釥 0 ㄑㄧㄠˇ
+翹 0 ㄑㄧㄠˋ
+竅 0 ㄑㄧㄠˋ
+俏 0 ㄑㄧㄠˋ
+峭 0 ㄑㄧㄠˋ
+鞘 0 ㄑㄧㄠˋ
+誚 0 ㄑㄧㄠˋ
+撬 0 ㄑㄧㄠˋ
+蹺 0 ㄑㄧㄠˋ
+殼 0 ㄑㄧㄠˋ
+帩 0 ㄑㄧㄠˋ
+撽 0 ㄑㄧㄠˋ
+躈 0 ㄑㄧㄠˋ
+譙 0 ㄑㄧㄠˋ
+獟 0 ㄑㄧㄠˋ
+礉 0 ㄑㄧㄠˋ
+壳 0 ㄑㄧㄠˋ
+殻 0 ㄑㄧㄠˋ
+䇌 0 ㄑㄧㄠˋ
+髚 0 ㄑㄧㄠˋ
+韒 0 ㄑㄧㄠˋ
+鞩 0 ㄑㄧㄠˋ
+㚁 0 ㄑㄧㄠˋ
+陗 0 ㄑㄧㄠˋ
+僺 0 ㄑㄧㄠˋ
+橋 0 ㄑㄧㄠˊ
+瞧 0 ㄑㄧㄠˊ
+僑 0 ㄑㄧㄠˊ
+喬 0 ㄑㄧㄠˊ
+樵 0 ㄑㄧㄠˊ
+翹 0 ㄑㄧㄠˊ
+憔 0 ㄑㄧㄠˊ
+蕎 0 ㄑㄧㄠˊ
+礄 0 ㄑㄧㄠˊ
+譙 0 ㄑㄧㄠˊ
+簥 0 ㄑㄧㄠˊ
+趫 0 ㄑㄧㄠˊ
+燆 0 ㄑㄧㄠˊ
+劁 0 ㄑㄧㄠˊ
+嘺 0 ㄑㄧㄠˊ
+憍 0 ㄑㄧㄠˊ
+嫶 0 ㄑㄧㄠˊ
+敿 0 ㄑㄧㄠˊ
+招 0 ㄑㄧㄠˊ
+蕉 0 ㄑㄧㄠˊ
+荍 0 ㄑㄧㄠˊ
+嶕 0 ㄑㄧㄠˊ
+嶠 0 ㄑㄧㄠˊ
+撟 0 ㄑㄧㄠˊ
+潐 0 ㄑㄧㄠˊ
+獢 0 ㄑㄧㄠˊ
+犞 0 ㄑㄧㄠˊ
+磽 0 ㄑㄧㄠˊ
+穚 0 ㄑㄧㄠˊ
+繑 0 ㄑㄧㄠˊ
+蟜 0 ㄑㄧㄠˊ
+譑 0 ㄑㄧㄠˊ
+趭 0 ㄑㄧㄠˊ
+毊 0 ㄑㄧㄠˊ
+鱎 0 ㄑㄧㄠˊ
+乔 0 ㄑㄧㄠˊ
+嶣 0 ㄑㄧㄠˊ
+癄 0 ㄑㄧㄠˊ
+䎗 0 ㄑㄧㄠˊ
+藮 0 ㄑㄧㄠˊ
+鐈 0 ㄑㄧㄠˊ
+顦 0 ㄑㄧㄠˊ
+槗 0 ㄑㄧㄠˊ
+㝯 0 ㄑㄧㄠˊ
+䀉 0 ㄑㄧㄠˊ
+親 0 ㄑㄧㄣ
+侵 0 ㄑㄧㄣ
+欽 0 ㄑㄧㄣ
+衾 0 ㄑㄧㄣ
+駸 0 ㄑㄧㄣ
+嶔 0 ㄑㄧㄣ
+綅 0 ㄑㄧㄣ
+瀙 0 ㄑㄧㄣ
+鋟 0 ㄑㄧㄣ
+撳 0 ㄑㄧㄣ
+唚 0 ㄑㄧㄣ
+梫 0 ㄑㄧㄣ
+寑 0 ㄑㄧㄣ
+菳 0 ㄑㄧㄣ
+廞 0 ㄑㄧㄣ
+顉 0 ㄑㄧㄣ
+儭 0 ㄑㄧㄣ
+亲 0 ㄑㄧㄣ
+媇 0 ㄑㄧㄣ
+搇 0 ㄑㄧㄣ
+誛 0 ㄑㄧㄣ
+澵 0 ㄑㄧㄣ
+儬 0 ㄑㄧㄣ
+鮼 0 ㄑㄧㄣ
+寴 0 ㄑㄧㄣ
+寢 0 ㄑㄧㄣˇ
+昑 0 ㄑㄧㄣˇ
+寑 0 ㄑㄧㄣˇ
+曋 0 ㄑㄧㄣˇ
+螼 0 ㄑㄧㄣˇ
+坅 0 ㄑㄧㄣˇ
+顉 0 ㄑㄧㄣˇ
+侵 0 ㄑㄧㄣˇ
+鋟 0 ㄑㄧㄣˇ
+赾 0 ㄑㄧㄣˇ
+寝 0 ㄑㄧㄣˇ
+沁 0 ㄑㄧㄣˋ
+撳 0 ㄑㄧㄣˋ
+唚 0 ㄑㄧㄣˋ
+菣 0 ㄑㄧㄣˋ
+嚫 0 ㄑㄧㄣˋ
+吣 0 ㄑㄧㄣˋ
+吢 0 ㄑㄧㄣˋ
+㤈 0 ㄑㄧㄣˋ
+抋 0 ㄑㄧㄣˋ
+搇 0 ㄑㄧㄣˋ
+臤 0 ㄑㄧㄣˋ
+勤 0 ㄑㄧㄣˊ
+琴 0 ㄑㄧㄣˊ
+秦 0 ㄑㄧㄣˊ
+禽 0 ㄑㄧㄣˊ
+擒 0 ㄑㄧㄣˊ
+芹 0 ㄑㄧㄣˊ
+檎 0 ㄑㄧㄣˊ
+覃 0 ㄑㄧㄣˊ
+噙 0 ㄑㄧㄣˊ
+懃 0 ㄑㄧㄣˊ
+芩 0 ㄑㄧㄣˊ
+螓 0 ㄑㄧㄣˊ
+鈙 0 ㄑㄧㄣˊ
+嫀 0 ㄑㄧㄣˊ
+斳 0 ㄑㄧㄣˊ
+耹 0 ㄑㄧㄣˊ
+靲 0 ㄑㄧㄣˊ
+澿 0 ㄑㄧㄣˊ
+庈 0 ㄑㄧㄣˊ
+肣 0 ㄑㄧㄣˊ
+蚙 0 ㄑㄧㄣˊ
+軡 0 ㄑㄧㄣˊ
+雂 0 ㄑㄧㄣˊ
+鈐 0 ㄑㄧㄣˊ
+黔 0 ㄑㄧㄣˊ
+覲 0 ㄑㄧㄣˊ
+衾 0 ㄑㄧㄣˊ
+慬 0 ㄑㄧㄣˊ
+瑧 0 ㄑㄧㄣˊ
+蓁 0 ㄑㄧㄣˊ
+嶜 0 ㄑㄧㄣˊ
+縥 0 ㄑㄧㄣˊ
+轃 0 ㄑㄧㄣˊ
+珡 0 ㄑㄧㄣˊ
+捦 0 ㄑㄧㄣˊ
+䓅 0 ㄑㄧㄣˊ
+琹 0 ㄑㄧㄣˊ
+菦 0 ㄑㄧㄣˊ
+嗪 0 ㄑㄧㄣˊ
+懄 0 ㄑㄧㄣˊ
+㩒 0 ㄑㄧㄣˊ
+䥅 0 ㄑㄧㄣˊ
+蠄 0 ㄑㄧㄣˊ
+失 0 ㄕ
+施 0 ㄕ
+師 0 ㄕ
+詩 0 ㄕ
+溼 0 ㄕ
+濕 0 ㄕ
+獅 0 ㄕ
+屍 0 ㄕ
+ㄕ 0 ㄕ
+蝨 0 ㄕ
+虱 0 ㄕ
+尸 0 ㄕ
+迉 0 ㄕ
+蓍 0 ㄕ
+葹 0 ㄕ
+鳲 0 ㄕ
+邿 0 ㄕ
+湤 0 ㄕ
+絁 0 ㄕ
+鰤 0 ㄕ
+溮 0 ㄕ
+鶳 0 ㄕ
+箷 0 ㄕ
+褷 0 ㄕ
+襹 0 ㄕ
+螄 0 ㄕ
+拾 0 ㄕ
+隰 0 ㄕ
+韅 0 ㄕ
+釃 0 ㄕ
+鸍 0 ㄕ
+师 0 ㄕ
+釶 0 ㄕ
+瑡 0 ㄕ
+蒒 0 ㄕ
+鳾 0 ㄕ
+鍦 0 ㄕ
+魳 0 ㄕ
+鯴 0 ㄕ
+收 0 ㄕㄡ
+荍 0 ㄕㄡ
+収 0 ㄕㄡ
+手 0 ㄕㄡˇ
+首 0 ㄕㄡˇ
+守 0 ㄕㄡˇ
+掱 0 ㄕㄡˇ
+艏 0 ㄕㄡˇ
+狩 0 ㄕㄡˇ
+垨 0 ㄕㄡˇ
+扌 0 ㄕㄡˇ
+受 0 ㄕㄡˋ
+售 0 ㄕㄡˋ
+壽 0 ㄕㄡˋ
+獸 0 ㄕㄡˋ
+授 0 ㄕㄡˋ
+瘦 0 ㄕㄡˋ
+狩 0 ㄕㄡˋ
+綬 0 ㄕㄡˋ
+守 0 ㄕㄡˋ
+燾 0 ㄕㄡˋ
+譸 0 ㄕㄡˋ
+寿 0 ㄕㄡˋ
+垨 0 ㄕㄡˋ
+涭 0 ㄕㄡˋ
+膄 0 ㄕㄡˋ
+璹 0 ㄕㄡˋ
+嘼 0 ㄕㄡˋ
+䛵 0 ㄕㄡˋ
+嚋 0 ㄕㄡˋ
+鏉 0 ㄕㄡˋ
+熟 0 ㄕㄡˊ
+生 0 ㄕㄥ
+聲 0 ㄕㄥ
+勝 0 ㄕㄥ
+升 0 ㄕㄥ
+牲 0 ㄕㄥ
+昇 0 ㄕㄥ
+甥 0 ㄕㄥ
+笙 0 ㄕㄥ
+陞 0 ㄕㄥ
+泩 0 ㄕㄥ
+鉎 0 ㄕㄥ
+鼪 0 ㄕㄥ
+呏 0 ㄕㄥ
+狌 0 ㄕㄥ
+湦 0 ㄕㄥ
+焺 0 ㄕㄥ
+鵿 0 ㄕㄥ
+胜 0 ㄕㄥ
+貹 0 ㄕㄥ
+髜 0 ㄕㄥ
+声 0 ㄕㄥ
+阩 0 ㄕㄥ
+珄 0 ㄕㄥ
+苼 0 ㄕㄥ
+陹 0 ㄕㄥ
+鍟 0 ㄕㄥ
+斘 0 ㄕㄥ
+殸 0 ㄕㄥ
+殅 0 ㄕㄥ
+省 0 ㄕㄥˇ
+眚 0 ㄕㄥˇ
+冼 0 ㄕㄥˇ
+箵 0 ㄕㄥˇ
+偗 0 ㄕㄥˇ
+勝 0 ㄕㄥˋ
+盛 0 ㄕㄥˋ
+聖 0 ㄕㄥˋ
+剩 0 ㄕㄥˋ
+嵊 0 ㄕㄥˋ
+乘 0 ㄕㄥˋ
+賸 0 ㄕㄥˋ
+圣 0 ㄕㄥˋ
+貹 0 ㄕㄥˋ
+晟 0 ㄕㄥˋ
+檉 0 ㄕㄥˋ
+蟶 0 ㄕㄥˋ
+乗 0 ㄕㄥˋ
+晠 0 ㄕㄥˋ
+剰 0 ㄕㄥˋ
+椉 0 ㄕㄥˋ
+琞 0 ㄕㄥˋ
+墭 0 ㄕㄥˋ
+膡 0 ㄕㄥˋ
+蕂 0 ㄕㄥˋ
+垩 0 ㄕㄥˋ
+榺 0 ㄕㄥˋ
+繩 0 ㄕㄥˊ
+澠 0 ㄕㄥˊ
+憴 0 ㄕㄥˊ
+譝 0 ㄕㄥˊ
+鱦 0 ㄕㄥˊ
+溗 0 ㄕㄥˊ
+縄 0 ㄕㄥˊ
+商 0 ㄕㄤ
+傷 0 ㄕㄤ
+殤 0 ㄕㄤ
+觴 0 ㄕㄤ
+湯 0 ㄕㄤ
+漡 0 ㄕㄤ
+蔏 0 ㄕㄤ
+螪 0 ㄕㄤ
+謪 0 ㄕㄤ
+鬺 0 ㄕㄤ
+裳 0 ㄕㄤ
+愓 0 ㄕㄤ
+熵 0 ㄕㄤ
+薚 0 ㄕㄤ
+墒 0 ㄕㄤ
+慯 0 ㄕㄤ
+滳 0 ㄕㄤ
+賞 0 ㄕㄤˇ
+晌 0 ㄕㄤˇ
+上 0 ㄕㄤˇ
+償 0 ㄕㄤˇ
+丄 0 ㄕㄤˇ
+上 0 ㄕㄤˋ
+尚 0 ㄕㄤˋ
+爙 0 ㄕㄤˋ
+姠 0 ㄕㄤˋ
+仩 0 ㄕㄤˋ
+蠰 0 ㄕㄤˋ
+丄 0 ㄕㄤˋ
+尙 0 ㄕㄤˋ
+裳 0 ㄕㄤ˙
+山 0 ㄕㄢ
+扇 0 ㄕㄢ
+衫 0 ㄕㄢ
+杉 0 ㄕㄢ
+刪 0 ㄕㄢ
+珊 0 ㄕㄢ
+羶 0 ㄕㄢ
+舢 0 ㄕㄢ
+煽 0 ㄕㄢ
+潸 0 ㄕㄢ
+跚 0 ㄕㄢ
+姍 0 ㄕㄢ
+芟 0 ㄕㄢ
+苫 0 ㄕㄢ
+搧 0 ㄕㄢ
+縿 0 ㄕㄢ
+穇 0 ㄕㄢ
+挻 0 ㄕㄢ
+烻 0 ㄕㄢ
+狦 0 ㄕㄢ
+笘 0 ㄕㄢ
+剼 0 ㄕㄢ
+摻 0 ㄕㄢ
+奾 0 ㄕㄢ
+屾 0 ㄕㄢ
+氙 0 ㄕㄢ
+埏 0 ㄕㄢ
+膻 0 ㄕㄢ
+襂 0 ㄕㄢ
+邓 0 ㄕㄢ
+邖 0 ㄕㄢ
+删 0 ㄕㄢ
+姗 0 ㄕㄢ
+掺 0 ㄕㄢ
+嘇 0 ㄕㄢ
+撡 0 ㄕㄢ
+檆 0 ㄕㄢ
+羴 0 ㄕㄢ
+鯅 0 ㄕㄢ
+㰑 0 ㄕㄢ
+䀐 0 ㄕㄢ
+傓 0 ㄕㄢ
+澘 0 ㄕㄢ
+閃 0 ㄕㄢˇ
+陝 0 ㄕㄢˇ
+睒 0 ㄕㄢˇ
+晱 0 ㄕㄢˇ
+覢 0 ㄕㄢˇ
+摻 0 ㄕㄢˇ
+陜 0 ㄕㄢˇ
+掺 0 ㄕㄢˇ
+撡 0 ㄕㄢˇ
+䀹 0 ㄕㄢˇ
+㜣 0 ㄕㄢˇ
+善 0 ㄕㄢˋ
+扇 0 ㄕㄢˋ
+汕 0 ㄕㄢˋ
+擅 0 ㄕㄢˋ
+膳 0 ㄕㄢˋ
+繕 0 ㄕㄢˋ
+鄯 0 ㄕㄢˋ
+煽 0 ㄕㄢˋ
+訕 0 ㄕㄢˋ
+單 0 ㄕㄢˋ
+贍 0 ㄕㄢˋ
+疝 0 ㄕㄢˋ
+鱔 0 ㄕㄢˋ
+騸 0 ㄕㄢˋ
+禪 0 ㄕㄢˋ
+墠 0 ㄕㄢˋ
+嬗 0 ㄕㄢˋ
+掞 0 ㄕㄢˋ
+摲 0 ㄕㄢˋ
+謆 0 ㄕㄢˋ
+墡 0 ㄕㄢˋ
+釤 0 ㄕㄢˋ
+蟺 0 ㄕㄢˋ
+赸 0 ㄕㄢˋ
+儃 0 ㄕㄢˋ
+柵 0 ㄕㄢˋ
+奾 0 ㄕㄢˋ
+抎 0 ㄕㄢˋ
+氙 0 ㄕㄢˋ
+剡 0 ㄕㄢˋ
+搧 0 ㄕㄢˋ
+煔 0 ㄕㄢˋ
+嫸 0 ㄕㄢˋ
+撣 0 ㄕㄢˋ
+樿 0 ㄕㄢˋ
+橏 0 ㄕㄢˋ
+灗 0 ㄕㄢˋ
+鱣 0 ㄕㄢˋ
+单 0 ㄕㄢˋ
+単 0 ㄕㄢˋ
+栅 0 ㄕㄢˋ
+炶 0 ㄕㄢˋ
+銏 0 ㄕㄢˋ
+僐 0 ㄕㄢˋ
+熌 0 ㄕㄢˋ
+嶦 0 ㄕㄢˋ
+䱇 0 ㄕㄢˋ
+磰 0 ㄕㄢˋ
+蟮 0 ㄕㄢˋ
+譱 0 ㄕㄢˋ
+饍 0 ㄕㄢˋ
+鱓 0 ㄕㄢˋ
+㣌 0 ㄕㄢˋ
+傓 0 ㄕㄢˋ
+使 0 ㄕˇ
+始 0 ㄕˇ
+史 0 ㄕˇ
+駛 0 ㄕˇ
+矢 0 ㄕˇ
+屎 0 ㄕˇ
+豕 0 ㄕˇ
+弛 0 ㄕˇ
+乨 0 ㄕˇ
+纚 0 ㄕˇ
+笶 0 ㄕˇ
+兘 0 ㄕˇ
+鉂 0 ㄕˇ
+市 0 ㄕˋ
+是 0 ㄕˋ
+事 0 ㄕˋ
+世 0 ㄕˋ
+士 0 ㄕˋ
+勢 0 ㄕˋ
+識 0 ㄕˋ
+室 0 ㄕˋ
+示 0 ㄕˋ
+試 0 ㄕˋ
+視 0 ㄕˋ
+式 0 ㄕˋ
+氏 0 ㄕˋ
+適 0 ㄕˋ
+釋 0 ㄕˋ
+飾 0 ㄕˋ
+侍 0 ㄕˋ
+誓 0 ㄕˋ
+逝 0 ㄕˋ
+嗜 0 ㄕˋ
+恃 0 ㄕˋ
+仕 0 ㄕˋ
+柿 0 ㄕˋ
+使 0 ㄕˋ
+螫 0 ㄕˋ
+弒 0 ㄕˋ
+噬 0 ㄕˋ
+拭 0 ㄕˋ
+豉 0 ㄕˋ
+媞 0 ㄕˋ
+筮 0 ㄕˋ
+舐 0 ㄕˋ
+軾 0 ㄕˋ
+諡 0 ㄕˋ
+貰 0 ㄕˋ
+芔 0 ㄕˋ
+奭 0 ㄕˋ
+戺 0 ㄕˋ
+澨 0 ㄕˋ
+諟 0 ㄕˋ
+襫 0 ㄕˋ
+鈰 0 ㄕˋ
+揓 0 ㄕˋ
+鉽 0 ㄕˋ
+唑 0 ㄕˋ
+翨 0 ㄕˋ
+銴 0 ㄕˋ
+謚 0 ㄕˋ
+遾 0 ㄕˋ
+簭 0 ㄕˋ
+齛 0 ㄕˋ
+跩 0 ㄕˋ
+烒 0 ㄕˋ
+崼 0 ㄕˋ
+徥 0 ㄕˋ
+詍 0 ㄕˋ
+戠 0 ㄕˋ
+褆 0 ㄕˋ
+始 0 ㄕˋ
+紲 0 ㄕˋ
+忕 0 ㄕˋ
+伳 0 ㄕˋ
+茌 0 ㄕˋ
+迣 0 ㄕˋ
+倳 0 ㄕˋ
+剚 0 ㄕˋ
+栻 0 ㄕˋ
+疶 0 ㄕˋ
+埶 0 ㄕˋ
+畤 0 ㄕˋ
+跇 0 ㄕˋ
+睼 0 ㄕˋ
+僿 0 ㄕˋ
+醍 0 ㄕˋ
+擿 0 ㄕˋ
+乨 0 ㄕˋ
+卋 0 ㄕˋ
+忲 0 ㄕˋ
+势 0 ㄕˋ
+呩 0 ㄕˋ
+柹 0 ㄕˋ
+冟 0 ㄕˋ
+昰 0 ㄕˋ
+眎 0 ㄕˋ
+眡 0 ㄕˋ
+絉 0 ㄕˋ
+弑 0 ㄕˋ
+舓 0 ㄕˋ
+緤 0 ㄕˋ
+䤭 0 ㄕˋ
+餙 0 ㄕˋ
+嬕 0 ㄕˋ
+餝 0 ㄕˋ
+丗 0 ㄕˋ
+叓 0 ㄕˋ
+𨑬 0 ㄕˋ
+兘 0 ㄕˋ
+眂 0 ㄕˋ
+啇 0 ㄕˋ
+睗 0 ㄕˋ
+十 0 ㄕˊ
+什 0 ㄕˊ
+石 0 ㄕˊ
+時 0 ㄕˊ
+實 0 ㄕˊ
+食 0 ㄕˊ
+拾 0 ㄕˊ
+蝕 0 ㄕˊ
+碩 0 ㄕˊ
+射 0 ㄕˊ
+提 0 ㄕˊ
+蒔 0 ㄕˊ
+湜 0 ㄕˊ
+鰣 0 ㄕˊ
+塒 0 ㄕˊ
+祏 0 ㄕˊ
+鼫 0 ㄕˊ
+鉐 0 ㄕˊ
+榯 0 ㄕˊ
+湁 0 ㄕˊ
+溡 0 ㄕˊ
+鼭 0 ㄕˊ
+寔 0 ㄕˊ
+籵 0 ㄕˊ
+姼 0 ㄕˊ
+时 0 ㄕˊ
+实 0 ㄕˊ
+実 0 ㄕˊ
+炻 0 ㄕˊ
+遈 0 ㄕˊ
+旹 0 ㄕˊ
+宲 0 ㄕˊ
+匙 0 ㄕ˙
+實 0 ㄕ˙
+殺 0 ㄕㄚ
+沙 0 ㄕㄚ
+紗 0 ㄕㄚ
+砂 0 ㄕㄚ
+莎 0 ㄕㄚ
+剎 0 ㄕㄚ
+煞 0 ㄕㄚ
+鯊 0 ㄕㄚ
+裟 0 ㄕㄚ
+杉 0 ㄕㄚ
+痧 0 ㄕㄚ
+鎩 0 ㄕㄚ
+魦 0 ㄕㄚ
+樧 0 ㄕㄚ
+猀 0 ㄕㄚ
+帴 0 ㄕㄚ
+摋 0 ㄕㄚ
+蔱 0 ㄕㄚ
+硰 0 ㄕㄚ
+唦 0 ㄕㄚ
+挲 0 ㄕㄚ
+桫 0 ㄕㄚ
+逤 0 ㄕㄚ
+閷 0 ㄕㄚ
+繺 0 ㄕㄚ
+挱 0 ㄕㄚ
+粆 0 ㄕㄚ
+桬 0 ㄕㄚ
+榝 0 ㄕㄚ
+檆 0 ㄕㄚ
+鯋 0 ㄕㄚ
+髿 0 ㄕㄚ
+傻 0 ㄕㄚˇ
+繌 0 ㄕㄚˇ
+儍 0 ㄕㄚˇ
+緵 0 ㄕㄚˇ
+訯 0 ㄕㄚˇ
+煞 0 ㄕㄚˋ
+霎 0 ㄕㄚˋ
+廈 0 ㄕㄚˋ
+嗄 0 ㄕㄚˋ
+歃 0 ㄕㄚˋ
+箑 0 ㄕㄚˋ
+翣 0 ㄕㄚˋ
+萐 0 ㄕㄚˋ
+喢 0 ㄕㄚˋ
+唼 0 ㄕㄚˋ
+啑 0 ㄕㄚˋ
+翜 0 ㄕㄚˋ
+樧 0 ㄕㄚˋ
+刹 0 ㄕㄚˋ
+帹 0 ㄕㄚˋ
+厦 0 ㄕㄚˋ
+榝 0 ㄕㄚˋ
+閯 0 ㄕㄚˋ
+啥 0 ㄕㄚˊ
+篩 0 ㄕㄞ
+㴓 0 ㄕㄞ
+骰 0 ㄕㄞˇ
+繺 0 ㄕㄞˇ
+色 0 ㄕㄞˇ
+曬 0 ㄕㄞˋ
+晒 0 ㄕㄞˋ
+閷 0 ㄕㄞˋ
+殺 0 ㄕㄞˋ
+鎩 0 ㄕㄞˋ
+書 0 ㄕㄨ
+輸 0 ㄕㄨ
+殊 0 ㄕㄨ
+舒 0 ㄕㄨ
+梳 0 ㄕㄨ
+疏 0 ㄕㄨ
+蔬 0 ㄕㄨ
+樞 0 ㄕㄨ
+紓 0 ㄕㄨ
+抒 0 ㄕㄨ
+攄 0 ㄕㄨ
+姝 0 ㄕㄨ
+樗 0 ㄕㄨ
+摴 0 ㄕㄨ
+殳 0 ㄕㄨ
+杸 0 ㄕㄨ
+陎 0 ㄕㄨ
+綀 0 ㄕㄨ
+橾 0 ㄕㄨ
+祋 0 ㄕㄨ
+軗 0 ㄕㄨ
+鵨 0 ㄕㄨ
+藲 0 ㄕㄨ
+疋 0 ㄕㄨ
+叔 0 ㄕㄨ
+俞 0 ㄕㄨ
+荼 0 ㄕㄨ
+洙 0 ㄕㄨ
+悆 0 ㄕㄨ
+毹 0 ㄕㄨ
+忬 0 ㄕㄨ
+枢 0 ㄕㄨ
+俆 0 ㄕㄨ
+兪 0 ㄕㄨ
+疎 0 ㄕㄨ
+毺 0 ㄕㄨ
+踈 0 ㄕㄨ
+雙 0 ㄕㄨㄤ
+霜 0 ㄕㄨㄤ
+孀 0 ㄕㄨㄤ
+艭 0 ㄕㄨㄤ
+驦 0 ㄕㄨㄤ
+鷞 0 ㄕㄨㄤ
+孇 0 ㄕㄨㄤ
+礵 0 ㄕㄨㄤ
+瀧 0 ㄕㄨㄤ
+双 0 ㄕㄨㄤ
+滝 0 ㄕㄨㄤ
+騻 0 ㄕㄨㄤ
+欆 0 ㄕㄨㄤ
+鸘 0 ㄕㄨㄤ
+䉶 0 ㄕㄨㄤ
+䝄 0 ㄕㄨㄤ
+爽 0 ㄕㄨㄤˇ
+塽 0 ㄕㄨㄤˇ
+樉 0 ㄕㄨㄤˇ
+漺 0 ㄕㄨㄤˇ
+慡 0 ㄕㄨㄤˇ
+縔 0 ㄕㄨㄤˇ
+傸 0 ㄕㄨㄤˇ
+磢 0 ㄕㄨㄤˇ
+鷞 0 ㄕㄨㄤˇ
+逺 0 ㄕㄨㄤˇ
+鸘 0 ㄕㄨㄤˇ
+灀 0 ㄕㄨㄤˋ
+雙 0 ㄕㄨㄤˋ
+双 0 ㄕㄨㄤˋ
+栓 0 ㄕㄨㄢ
+閂 0 ㄕㄨㄢ
+拴 0 ㄕㄨㄢ
+涮 0 ㄕㄨㄢˋ
+諼 0 ㄕㄨㄢˋ
+踹 0 ㄕㄨㄢˋ
+數 0 ㄕㄨˇ
+鼠 0 ㄕㄨˇ
+屬 0 ㄕㄨˇ
+暑 0 ㄕㄨˇ
+署 0 ㄕㄨˇ
+薯 0 ㄕㄨˇ
+蜀 0 ㄕㄨˇ
+黍 0 ㄕㄨˇ
+癙 0 ㄕㄨˇ
+潻 0 ㄕㄨˇ
+藷 0 ㄕㄨˇ
+钃 0 ㄕㄨˇ
+婌 0 ㄕㄨˇ
+襩 0 ㄕㄨˇ
+糬 0 ㄕㄨˇ
+曙 0 ㄕㄨˇ
+襡 0 ㄕㄨˇ
+孎 0 ㄕㄨˇ
+灟 0 ㄕㄨˇ
+鸀 0 ㄕㄨˇ
+蠾 0 ㄕㄨˇ
+属 0 ㄕㄨˇ
+数 0 ㄕㄨˇ
+暏 0 ㄕㄨˇ
+㻿 0 ㄕㄨˇ
+薥 0 ㄕㄨˇ
+術 0 ㄕㄨˋ
+數 0 ㄕㄨˋ
+樹 0 ㄕㄨˋ
+束 0 ㄕㄨˋ
+述 0 ㄕㄨˋ
+署 0 ㄕㄨˋ
+豎 0 ㄕㄨˋ
+疏 0 ㄕㄨˋ
+恕 0 ㄕㄨˋ
+庶 0 ㄕㄨˋ
+曙 0 ㄕㄨˋ
+墅 0 ㄕㄨˋ
+漱 0 ㄕㄨˋ
+倏 0 ㄕㄨˋ
+戍 0 ㄕㄨˋ
+澍 0 ㄕㄨˋ
+翛 0 ㄕㄨˋ
+沭 0 ㄕㄨˋ
+裋 0 ㄕㄨˋ
+鉥 0 ㄕㄨˋ
+尌 0 ㄕㄨˋ
+儵 0 ㄕㄨˋ
+鏣 0 ㄕㄨˋ
+鶐 0 ㄕㄨˋ
+嗽 0 ㄕㄨˋ
+摭 0 ㄕㄨˋ
+鯈 0 ㄕㄨˋ
+焂 0 ㄕㄨˋ
+訹 0 ㄕㄨˋ
+鈙 0 ㄕㄨˋ
+腧 0 ㄕㄨˋ
+嫬 0 ㄕㄨˋ
+籔 0 ㄕㄨˋ
+侸 0 ㄕㄨˋ
+倐 0 ㄕㄨˋ
+捒 0 ㄕㄨˋ
+荗 0 ㄕㄨˋ
+庻 0 ㄕㄨˋ
+疎 0 ㄕㄨˋ
+数 0 ㄕㄨˋ
+暏 0 ㄕㄨˋ
+㴻 0 ㄕㄨˋ
+竪 0 ㄕㄨˋ
+潄 0 ㄕㄨˋ
+踈 0 ㄕㄨˋ
+瘶 0 ㄕㄨˋ
+錰 0 ㄕㄨˋ
+濖 0 ㄕㄨˋ
+䉀 0 ㄕㄨˋ
+蒁 0 ㄕㄨˋ
+叔 0 ㄕㄨˊ
+熟 0 ㄕㄨˊ
+淑 0 ㄕㄨˊ
+塾 0 ㄕㄨˊ
+贖 0 ㄕㄨˊ
+孰 0 ㄕㄨˊ
+菽 0 ㄕㄨˊ
+秫 0 ㄕㄨˊ
+襡 0 ㄕㄨˊ
+埱 0 ㄕㄨˊ
+焂 0 ㄕㄨˊ
+跾 0 ㄕㄨˊ
+鸀 0 ㄕㄨˊ
+虪 0 ㄕㄨˊ
+朱 0 ㄕㄨˊ
+椒 0 ㄕㄨˊ
+婌 0 ㄕㄨˊ
+鮛 0 ㄕㄨˊ
+掓 0 ㄕㄨˊ
+蒣 0 ㄕㄨˊ
+璹 0 ㄕㄨˊ
+尗 0 ㄕㄨˊ
+叔 0 ㄕㄨ˙
+刷 0 ㄕㄨㄚ
+唰 0 ㄕㄨㄚ
+鮛 0 ㄕㄨㄚ
+涮 0 ㄕㄨㄚ
+耍 0 ㄕㄨㄚˇ
+刷 0 ㄕㄨㄚˋ
+誜 0 ㄕㄨㄚˋ
+摔 0 ㄕㄨㄞ
+衰 0 ㄕㄨㄞ
+縗 0 ㄕㄨㄞ
+孈 0 ㄕㄨㄞ
+榱 0 ㄕㄨㄞ
+甩 0 ㄕㄨㄞˇ
+率 0 ㄕㄨㄞˋ
+帥 0 ㄕㄨㄞˋ
+蟀 0 ㄕㄨㄞˋ
+咰 0 ㄕㄨㄞˋ
+繂 0 ㄕㄨㄞˋ
+卛 0 ㄕㄨㄞˋ
+說 0 ㄕㄨㄛ
+説 0 ㄕㄨㄛ
+哾 0 ㄕㄨㄛ
+朔 0 ㄕㄨㄛˋ
+碩 0 ㄕㄨㄛˋ
+爍 0 ㄕㄨㄛˋ
+數 0 ㄕㄨㄛˋ
+鑠 0 ㄕㄨㄛˋ
+嗍 0 ㄕㄨㄛˋ
+率 0 ㄕㄨㄛˋ
+蟀 0 ㄕㄨㄛˋ
+帥 0 ㄕㄨㄛˋ
+搠 0 ㄕㄨㄛˋ
+妁 0 ㄕㄨㄛˋ
+槊 0 ㄕㄨㄛˋ
+箾 0 ㄕㄨㄛˋ
+蒴 0 ㄕㄨㄛˋ
+勺 0 ㄕㄨㄛˋ
+欶 0 ㄕㄨㄛˋ
+揱 0 ㄕㄨㄛˋ
+獡 0 ㄕㄨㄛˋ
+鎙 0 ㄕㄨㄛˋ
+芍 0 ㄕㄨㄛˋ
+矟 0 ㄕㄨㄛˋ
+数 0 ㄕㄨㄛˋ
+卛 0 ㄕㄨㄛˋ
+水 0 ㄕㄨㄟˇ
+說 0 ㄕㄨㄟˋ
+睡 0 ㄕㄨㄟˋ
+稅 0 ㄕㄨㄟˋ
+蛻 0 ㄕㄨㄟˋ
+帨 0 ㄕㄨㄟˋ
+涗 0 ㄕㄨㄟˋ
+裞 0 ㄕㄨㄟˋ
+挩 0 ㄕㄨㄟˋ
+娷 0 ㄕㄨㄟˋ
+捝 0 ㄕㄨㄟˋ
+涚 0 ㄕㄨㄟˋ
+祱 0 ㄕㄨㄟˋ
+税 0 ㄕㄨㄟˋ
+蜕 0 ㄕㄨㄟˋ
+説 0 ㄕㄨㄟˋ
+誰 0 ㄕㄨㄟˊ
+脽 0 ㄕㄨㄟˊ
+盾 0 ㄕㄨㄣˇ
+楯 0 ㄕㄨㄣˇ
+吮 0 ㄕㄨㄣˇ
+揗 0 ㄕㄨㄣˇ
+賰 0 ㄕㄨㄣˇ
+順 0 ㄕㄨㄣˋ
+舜 0 ㄕㄨㄣˋ
+瞬 0 ㄕㄨㄣˋ
+蕣 0 ㄕㄨㄣˋ
+鬊 0 ㄕㄨㄣˋ
+瞚 0 ㄕㄨㄣˋ
+馴 0 ㄕㄨㄣˋ
+橓 0 ㄕㄨㄣˋ
+瞤 0 ㄕㄨㄣˋ
+奢 0 ㄕㄜ
+賒 0 ㄕㄜ
+奓 0 ㄕㄜ
+檨 0 ㄕㄜ
+譇 0 ㄕㄜ
+畬 0 ㄕㄜ
+撦 0 ㄕㄜ
+偖 0 ㄕㄜ
+畭 0 ㄕㄜ
+賖 0 ㄕㄜ
+畲 0 ㄕㄜ
+捨 0 ㄕㄜˇ
+舍 0 ㄕㄜˇ
+舎 0 ㄕㄜˇ
+䬷 0 ㄕㄜˇ
+社 0 ㄕㄜˋ
+設 0 ㄕㄜˋ
+射 0 ㄕㄜˋ
+涉 0 ㄕㄜˋ
+舍 0 ㄕㄜˋ
+攝 0 ㄕㄜˋ
+赦 0 ㄕㄜˋ
+歙 0 ㄕㄜˋ
+麝 0 ㄕㄜˋ
+厙 0 ㄕㄜˋ
+猞 0 ㄕㄜˋ
+灄 0 ㄕㄜˋ
+蔎 0 ㄕㄜˋ
+韘 0 ㄕㄜˋ
+騇 0 ㄕㄜˋ
+拾 0 ㄕㄜˋ
+葉 0 ㄕㄜˋ
+捑 0 ㄕㄜˋ
+蠂 0 ㄕㄜˋ
+色 0 ㄕㄜˋ
+庫 0 ㄕㄜˋ
+聶 0 ㄕㄜˋ
+懾 0 ㄕㄜˋ
+躡 0 ㄕㄜˋ
+涻 0 ㄕㄜˋ
+舎 0 ㄕㄜˋ
+渉 0 ㄕㄜˋ
+䜓 0 ㄕㄜˋ
+欇 0 ㄕㄜˋ
+弽 0 ㄕㄜˋ
+蹑 0 ㄕㄜˋ
+蛇 0 ㄕㄜˊ
+舌 0 ㄕㄜˊ
+甚 0 ㄕㄜˊ
+佘 0 ㄕㄜˊ
+什 0 ㄕㄜˊ
+揲 0 ㄕㄜˊ
+鉈 0 ㄕㄜˊ
+折 0 ㄕㄜˊ
+咶 0 ㄕㄜˊ
+輋 0 ㄕㄜˊ
+闍 0 ㄕㄜˊ
+譇 0 ㄕㄜˊ
+虵 0 ㄕㄜˊ
+釶 0 ㄕㄜˊ
+鍦 0 ㄕㄜˊ
+蛥 0 ㄕㄜˊ
+鉇 0 ㄕㄜˊ
+燒 0 ㄕㄠ
+稍 0 ㄕㄠ
+梢 0 ㄕㄠ
+艄 0 ㄕㄠ
+捎 0 ㄕㄠ
+弰 0 ㄕㄠ
+蛸 0 ㄕㄠ
+莦 0 ㄕㄠ
+筲 0 ㄕㄠ
+旓 0 ㄕㄠ
+髾 0 ㄕㄠ
+輎 0 ㄕㄠ
+鮹 0 ㄕㄠ
+蕱 0 ㄕㄠ
+杪 0 ㄕㄠ
+娋 0 ㄕㄠ
+颵 0 ㄕㄠ
+少 0 ㄕㄠˇ
+尐 0 ㄕㄠˇ
+少 0 ㄕㄠˋ
+紹 0 ㄕㄠˋ
+哨 0 ㄕㄠˋ
+邵 0 ㄕㄠˋ
+召 0 ㄕㄠˋ
+卲 0 ㄕㄠˋ
+劭 0 ㄕㄠˋ
+袑 0 ㄕㄠˋ
+睄 0 ㄕㄠˋ
+潲 0 ㄕㄠˋ
+捎 0 ㄕㄠˋ
+稍 0 ㄕㄠˋ
+娋 0 ㄕㄠˋ
+綤 0 ㄕㄠˋ
+杓 0 ㄕㄠˊ
+韶 0 ㄕㄠˊ
+芍 0 ㄕㄠˊ
+勺 0 ㄕㄠˊ
+玿 0 ㄕㄠˊ
+圴 0 ㄕㄠˊ
+牊 0 ㄕㄠˊ
+招 0 ㄕㄠˊ
+枃 0 ㄕㄠˊ
+柖 0 ㄕㄠˊ
+誰 0 ㄕㄟˊ
+身 0 ㄕㄣ
+深 0 ㄕㄣ
+伸 0 ㄕㄣ
+申 0 ㄕㄣ
+紳 0 ㄕㄣ
+呻 0 ㄕㄣ
+信 0 ㄕㄣ
+參 0 ㄕㄣ
+蔘 0 ㄕㄣ
+娠 0 ㄕㄣ
+莘 0 ㄕㄣ
+甡 0 ㄕㄣ
+侁 0 ㄕㄣ
+籸 0 ㄕㄣ
+葠 0 ㄕㄣ
+詵 0 ㄕㄣ
+駪 0 ㄕㄣ
+燊 0 ㄕㄣ
+砷 0 ㄕㄣ
+柛 0 ㄕㄣ
+氠 0 ㄕㄣ
+屾 0 ㄕㄣ
+珅 0 ㄕㄣ
+胂 0 ㄕㄣ
+阠 0 ㄕㄣ
+妽 0 ㄕㄣ
+峷 0 ㄕㄣ
+眒 0 ㄕㄣ
+琛 0 ㄕㄣ
+兟 0 ㄕㄣ
+棽 0 ㄕㄣ
+幓 0 ㄕㄣ
+銵 0 ㄕㄣ
+篸 0 ㄕㄣ
+鯓 0 ㄕㄣ
+㕥 0 ㄕㄣ
+扟 0 ㄕㄣ
+叁 0 ㄕㄣ
+参 0 ㄕㄣ
+籶 0 ㄕㄣ
+訫 0 ㄕㄣ
+叅 0 ㄕㄣ
+鉮 0 ㄕㄣ
+曑 0 ㄕㄣ
+敒 0 ㄕㄣ
+訷 0 ㄕㄣ
+瘮 0 ㄕㄣ
+鵢 0 ㄕㄣ
+裑 0 ㄕㄣ
+甧 0 ㄕㄣ
+沈 0 ㄕㄣˇ
+審 0 ㄕㄣˇ
+嬸 0 ㄕㄣˇ
+瀋 0 ㄕㄣˇ
+諗 0 ㄕㄣˇ
+讅 0 ㄕㄣˇ
+矧 0 ㄕㄣˇ
+哂 0 ㄕㄣˇ
+寀 0 ㄕㄣˇ
+瞫 0 ㄕㄣˇ
+邥 0 ㄕㄣˇ
+覾 0 ㄕㄣˇ
+沉 0 ㄕㄣˇ
+淰 0 ㄕㄣˇ
+曋 0 ㄕㄣˇ
+吲 0 ㄕㄣˇ
+弞 0 ㄕㄣˇ
+宷 0 ㄕㄣˇ
+訠 0 ㄕㄣˇ
+魫 0 ㄕㄣˇ
+鯅 0 ㄕㄣˇ
+矤 0 ㄕㄣˇ
+頣 0 ㄕㄣˇ
+慎 0 ㄕㄣˋ
+腎 0 ㄕㄣˋ
+滲 0 ㄕㄣˋ
+甚 0 ㄕㄣˋ
+蜃 0 ㄕㄣˋ
+沁 0 ㄕㄣˋ
+葚 0 ㄕㄣˋ
+椹 0 ㄕㄣˋ
+脤 0 ㄕㄣˋ
+抻 0 ㄕㄣˋ
+侺 0 ㄕㄣˋ
+鋠 0 ㄕㄣˋ
+諶 0 ㄕㄣˋ
+偡 0 ㄕㄣˋ
+堔 0 ㄕㄣˋ
+煁 0 ㄕㄣˋ
+踸 0 ㄕㄣˋ
+鍖 0 ㄕㄣˋ
+昚 0 ㄕㄣˋ
+涁 0 ㄕㄣˋ
+眘 0 ㄕㄣˋ
+渗 0 ㄕㄣˋ
+趻 0 ㄕㄣˋ
+愼 0 ㄕㄣˋ
+神 0 ㄕㄣˊ
+甚 0 ㄕㄣˊ
+什 0 ㄕㄣˊ
+嬸 0 ㄕㄣ˙
+疵 0 ㄘ
+庛 0 ㄘ
+雌 0 ㄘ
+ㄘ 0 ㄘ
+差 0 ㄘ
+趀 0 ㄘ
+骴 0 ㄘ
+恣 0 ㄘ
+呲 0 ㄘ
+跐 0 ㄘ
+鈭 0 ㄘ
+蠀 0 ㄘ
+髊 0 ㄘ
+湊 0 ㄘㄡˋ
+輳 0 ㄘㄡˋ
+腠 0 ㄘㄡˋ
+楱 0 ㄘㄡˋ
+凑 0 ㄘㄡˋ
+噌 0 ㄘㄥ
+噌 0 ㄘㄥˇ
+蹭 0 ㄘㄥˋ
+曾 0 ㄘㄥˊ
+層 0 ㄘㄥˊ
+嶒 0 ㄘㄥˊ
+鄫 0 ㄘㄥˊ
+碀 0 ㄘㄥˊ
+驓 0 ㄘㄥˊ
+竲 0 ㄘㄥˊ
+蒼 0 ㄘㄤ
+倉 0 ㄘㄤ
+滄 0 ㄘㄤ
+艙 0 ㄘㄤ
+傖 0 ㄘㄤ
+鶬 0 ㄘㄤ
+凔 0 ㄘㄤ
+嵢 0 ㄘㄤ
+愴 0 ㄘㄤ
+瑲 0 ㄘㄤ
+謒 0 ㄘㄤ
+蹌 0 ㄘㄤ
+仺 0 ㄘㄤ
+篬 0 ㄘㄤ
+駔 0 ㄘㄤˇ
+䅮 0 ㄘㄤˋ
+賶 0 ㄘㄤˋ
+藏 0 ㄘㄤˊ
+鑶 0 ㄘㄤˊ
+蔵 0 ㄘㄤˊ
+匨 0 ㄘㄤˊ
+參 0 ㄘㄢ
+餐 0 ㄘㄢ
+驂 0 ㄘㄢ
+縿 0 ㄘㄢ
+墋 0 ㄘㄢ
+毿 0 ㄘㄢ
+磣 0 ㄘㄢ
+襂 0 ㄘㄢ
+贂 0 ㄘㄢ
+鏒 0 ㄘㄢ
+鬖 0 ㄘㄢ
+叁 0 ㄘㄢ
+参 0 ㄘㄢ
+飡 0 ㄘㄢ
+叅 0 ㄘㄢ
+湌 0 ㄘㄢ
+傪 0 ㄘㄢ
+曑 0 ㄘㄢ
+䱗 0 ㄘㄢ
+慘 0 ㄘㄢˇ
+憯 0 ㄘㄢˇ
+朁 0 ㄘㄢˇ
+噆 0 ㄘㄢˇ
+黲 0 ㄘㄢˇ
+惨 0 ㄘㄢˇ
+燦 0 ㄘㄢˋ
+孱 0 ㄘㄢˋ
+璨 0 ㄘㄢˋ
+粲 0 ㄘㄢˋ
+澯 0 ㄘㄢˋ
+摻 0 ㄘㄢˋ
+澶 0 ㄘㄢˋ
+掺 0 ㄘㄢˋ
+嘇 0 ㄘㄢˋ
+撡 0 ㄘㄢˋ
+薒 0 ㄘㄢˋ
+謲 0 ㄘㄢˋ
+殘 0 ㄘㄢˊ
+蠶 0 ㄘㄢˊ
+慚 0 ㄘㄢˊ
+嬠 0 ㄘㄢˊ
+帴 0 ㄘㄢˊ
+蛬 0 ㄘㄢˊ
+魙 0 ㄘㄢˊ
+残 0 ㄘㄢˊ
+蝅 0 ㄘㄢˊ
+慙 0 ㄘㄢˊ
+嬱 0 ㄘㄢˊ
+㨻 0 ㄘㄢˊ
+蠺 0 ㄘㄢˊ
+此 0 ㄘˇ
+佌 0 ㄘˇ
+泚 0 ㄘˇ
+玼 0 ㄘˇ
+跐 0 ㄘˇ
+皉 0 ㄘˇ
+次 0 ㄘˋ
+刺 0 ㄘˋ
+賜 0 ㄘˋ
+廁 0 ㄘˋ
+伺 0 ㄘˋ
+佽 0 ㄘˋ
+蛓 0 ㄘˋ
+莿 0 ㄘˋ
+朿 0 ㄘˋ
+栨 0 ㄘˋ
+蚝 0 ㄘˋ
+絘 0 ㄘˋ
+庛 0 ㄘˋ
+厠 0 ㄘˋ
+螆 0 ㄘˋ
+詞 0 ㄘˊ
+辭 0 ㄘˊ
+慈 0 ㄘˊ
+磁 0 ㄘˊ
+瓷 0 ㄘˊ
+雌 0 ㄘˊ
+祠 0 ㄘˊ
+疵 0 ㄘˊ
+茨 0 ㄘˊ
+粢 0 ㄘˊ
+餈 0 ㄘˊ
+柌 0 ㄘˊ
+嬨 0 ㄘˊ
+濨 0 ㄘˊ
+呲 0 ㄘˊ
+飺 0 ㄘˊ
+薋 0 ㄘˊ
+茲 0 ㄘˊ
+茈 0 ㄘˊ
+鈶 0 ㄘˊ
+鶿 0 ㄘˊ
+珁 0 ㄘˊ
+䛐 0 ㄘˊ
+辝 0 ㄘˊ
+辞 0 ㄘˊ
+甆 0 ㄘˊ
+糍 0 ㄘˊ
+辤 0 ㄘˊ
+礠 0 ㄘˊ
+鴜 0 ㄘˊ
+鷀 0 ㄘˊ
+擦 0 ㄘㄚ
+搽 0 ㄘㄚ
+嚓 0 ㄘㄚ
+䃰 0 ㄘㄚ
+礤 0 ㄘㄚˇ
+囃 0 ㄘㄚˋ
+攃 0 ㄘㄚˋ
+遪 0 ㄘㄚˋ
+猜 0 ㄘㄞ
+採 0 ㄘㄞˇ
+彩 0 ㄘㄞˇ
+采 0 ㄘㄞˇ
+睬 0 ㄘㄞˇ
+踩 0 ㄘㄞˇ
+綵 0 ㄘㄞˇ
+跴 0 ㄘㄞˇ
+寀 0 ㄘㄞˇ
+棌 0 ㄘㄞˇ
+婇 0 ㄘㄞˇ
+釆 0 ㄘㄞˇ
+啋 0 ㄘㄞˇ
+跐 0 ㄘㄞˇ
+倸 0 ㄘㄞˇ
+蔡 0 ㄘㄞˋ
+菜 0 ㄘㄞˋ
+埰 0 ㄘㄞˋ
+采 0 ㄘㄞˋ
+縩 0 ㄘㄞˋ
+寀 0 ㄘㄞˋ
+才 0 ㄘㄞˊ
+財 0 ㄘㄞˊ
+材 0 ㄘㄞˊ
+裁 0 ㄘㄞˊ
+纔 0 ㄘㄞˊ
+釮 0 ㄘㄞˊ
+溨 0 ㄘㄞˊ
+粗 0 ㄘㄨ
+麤 0 ㄘㄨ
+觕 0 ㄘㄨ
+麆 0 ㄘㄨ
+麁 0 ㄘㄨ
+麄 0 ㄘㄨ
+匆 0 ㄘㄨㄥ
+聰 0 ㄘㄨㄥ
+從 0 ㄘㄨㄥ
+囪 0 ㄘㄨㄥ
+璁 0 ㄘㄨㄥ
+瑽 0 ㄘㄨㄥ
+樅 0 ㄘㄨㄥ
+驄 0 ㄘㄨㄥ
+蓯 0 ㄘㄨㄥ
+鏦 0 ㄘㄨㄥ
+熜 0 ㄘㄨㄥ
+棇 0 ㄘㄨㄥ
+暰 0 ㄘㄨㄥ
+蔥 0 ㄘㄨㄥ
+瞛 0 ㄘㄨㄥ
+蟌 0 ㄘㄨㄥ
+鍐 0 ㄘㄨㄥ
+叢 0 ㄘㄨㄥ
+囟 0 ㄘㄨㄥ
+濍 0 ㄘㄨㄥ
+从 0 ㄘㄨㄥ
+匇 0 ㄘㄨㄥ
+囱 0 ㄘㄨㄥ
+忩 0 ㄘㄨㄥ
+怱 0 ㄘㄨㄥ
+従 0 ㄘㄨㄥ
+悤 0 ㄘㄨㄥ
+楤 0 ㄘㄨㄥ
+葱 0 ㄘㄨㄥ
+漗 0 ㄘㄨㄥ
+聡 0 ㄘㄨㄥ
+樬 0 ㄘㄨㄥ
+緫 0 ㄘㄨㄥ
+聪 0 ㄘㄨㄥ
+聦 0 ㄘㄨㄥ
+樷 0 ㄘㄨㄥ
+繱 0 ㄘㄨㄥ
+鏓 0 ㄘㄨㄥ
+顖 0 ㄘㄨㄥ
+騘 0 ㄘㄨㄥ
+枞 0 ㄘㄨㄥ
+苁 0 ㄘㄨㄥ
+篵 0 ㄘㄨㄥ
+鍯 0 ㄘㄨㄥ
+衳 0 ㄘㄨㄥˇ
+幒 0 ㄘㄨㄥˇ
+欉 0 ㄘㄨㄥˋ
+藂 0 ㄘㄨㄥˋ
+謥 0 ㄘㄨㄥˋ
+從 0 ㄘㄨㄥˊ
+叢 0 ㄘㄨㄥˊ
+淙 0 ㄘㄨㄥˊ
+琮 0 ㄘㄨㄥˊ
+悰 0 ㄘㄨㄥˊ
+潀 0 ㄘㄨㄥˊ
+漎 0 ㄘㄨㄥˊ
+賨 0 ㄘㄨㄥˊ
+錝 0 ㄘㄨㄥˊ
+婃 0 ㄘㄨㄥˊ
+孮 0 ㄘㄨㄥˊ
+徖 0 ㄘㄨㄥˊ
+慒 0 ㄘㄨㄥˊ
+摐 0 ㄘㄨㄥˊ
+蓯 0 ㄘㄨㄥˊ
+藂 0 ㄘㄨㄥˊ
+欉 0 ㄘㄨㄥˊ
+从 0 ㄘㄨㄥˊ
+従 0 ㄘㄨㄥˊ
+碂 0 ㄘㄨㄥˊ
+誴 0 ㄘㄨㄥˊ
+賩 0 ㄘㄨㄥˊ
+樷 0 ㄘㄨㄥˊ
+灇 0 ㄘㄨㄥˊ
+爜 0 ㄘㄨㄥˊ
+苁 0 ㄘㄨㄥˊ
+潨 0 ㄘㄨㄥˊ
+攛 0 ㄘㄨㄢ
+躥 0 ㄘㄨㄢ
+鋑 0 ㄘㄨㄢ
+汆 0 ㄘㄨㄢ
+鑹 0 ㄘㄨㄢ
+竄 0 ㄘㄨㄢˋ
+篡 0 ㄘㄨㄢˋ
+爨 0 ㄘㄨㄢˋ
+篹 0 ㄘㄨㄢˋ
+纂 0 ㄘㄨㄢˋ
+攥 0 ㄘㄨㄢˋ
+熶 0 ㄘㄨㄢˋ
+簒 0 ㄘㄨㄢˋ
+殩 0 ㄘㄨㄢˋ
+攢 0 ㄘㄨㄢˊ
+巑 0 ㄘㄨㄢˊ
+劗 0 ㄘㄨㄢˊ
+欑 0 ㄘㄨㄢˊ
+攅 0 ㄘㄨㄢˊ
+櫕 0 ㄘㄨㄢˊ
+穳 0 ㄘㄨㄢˊ
+促 0 ㄘㄨˋ
+醋 0 ㄘㄨˋ
+簇 0 ㄘㄨˋ
+蹴 0 ㄘㄨˋ
+蔟 0 ㄘㄨˋ
+蹙 0 ㄘㄨˋ
+猝 0 ㄘㄨˋ
+卒 0 ㄘㄨˋ
+錯 0 ㄘㄨˋ
+趣 0 ㄘㄨˋ
+趨 0 ㄘㄨˋ
+鏃 0 ㄘㄨˋ
+瘯 0 ㄘㄨˋ
+踧 0 ㄘㄨˋ
+槭 0 ㄘㄨˋ
+梀 0 ㄘㄨˋ
+噈 0 ㄘㄨˋ
+殧 0 ㄘㄨˋ
+鼀 0 ㄘㄨˋ
+厝 0 ㄘㄨˋ
+戚 0 ㄘㄨˋ
+數 0 ㄘㄨˋ
+岨 0 ㄘㄨˋ
+唶 0 ㄘㄨˋ
+酢 0 ㄘㄨˋ
+碏 0 ㄘㄨˋ
+踀 0 ㄘㄨˋ
+憱 0 ㄘㄨˋ
+顣 0 ㄘㄨˋ
+卆 0 ㄘㄨˋ
+趋 0 ㄘㄨˋ
+数 0 ㄘㄨˋ
+誎 0 ㄘㄨˋ
+趗 0 ㄘㄨˋ
+縬 0 ㄘㄨˋ
+蹵 0 ㄘㄨˋ
+齚 0 ㄘㄨˋ
+鉃 0 ㄘㄨˋ
+殂 0 ㄘㄨˊ
+徂 0 ㄘㄨˊ
+鼀 0 ㄘㄨˊ
+搓 0 ㄘㄨㄛ
+撮 0 ㄘㄨㄛ
+磋 0 ㄘㄨㄛ
+蹉 0 ㄘㄨㄛ
+蒫 0 ㄘㄨㄛ
+遳 0 ㄘㄨㄛ
+髊 0 ㄘㄨㄛ
+差 0 ㄘㄨㄛ
+莏 0 ㄘㄨㄛ
+傞 0 ㄘㄨㄛ
+瑳 0 ㄘㄨㄛ
+醝 0 ㄘㄨㄛ
+齹 0 ㄘㄨㄛ
+瑳 0 ㄘㄨㄛˇ
+脞 0 ㄘㄨㄛˇ
+縒 0 ㄘㄨㄛˇ
+硰 0 ㄘㄨㄛˇ
+錯 0 ㄘㄨㄛˋ
+措 0 ㄘㄨㄛˋ
+挫 0 ㄘㄨㄛˋ
+銼 0 ㄘㄨㄛˋ
+撮 0 ㄘㄨㄛˋ
+剉 0 ㄘㄨㄛˋ
+厝 0 ㄘㄨㄛˋ
+莝 0 ㄘㄨㄛˋ
+侳 0 ㄘㄨㄛˋ
+剒 0 ㄘㄨㄛˋ
+蓌 0 ㄘㄨㄛˋ
+昔 0 ㄘㄨㄛˋ
+蕞 0 ㄘㄨㄛˋ
+庴 0 ㄘㄨㄛˋ
+棤 0 ㄘㄨㄛˋ
+碏 0 ㄘㄨㄛˋ
+縒 0 ㄘㄨㄛˋ
+莡 0 ㄘㄨㄛˋ
+逪 0 ㄘㄨㄛˋ
+襊 0 ㄘㄨㄛˋ
+瘥 0 ㄘㄨㄛˊ
+矬 0 ㄘㄨㄛˊ
+鹺 0 ㄘㄨㄛˊ
+痤 0 ㄘㄨㄛˊ
+醝 0 ㄘㄨㄛˊ
+嵯 0 ㄘㄨㄛˊ
+蔖 0 ㄘㄨㄛˊ
+蒫 0 ㄘㄨㄛˊ
+虘 0 ㄘㄨㄛˊ
+睉 0 ㄘㄨㄛˊ
+嵖 0 ㄘㄨㄛˊ
+嵳 0 ㄘㄨㄛˊ
+摧 0 ㄘㄨㄟ
+催 0 ㄘㄨㄟ
+崔 0 ㄘㄨㄟ
+嗺 0 ㄘㄨㄟ
+墔 0 ㄘㄨㄟ
+磪 0 ㄘㄨㄟ
+榱 0 ㄘㄨㄟ
+衰 0 ㄘㄨㄟ
+凗 0 ㄘㄨㄟ
+膗 0 ㄘㄨㄟ
+縗 0 ㄘㄨㄟ
+獕 0 ㄘㄨㄟ
+槯 0 ㄘㄨㄟ
+璀 0 ㄘㄨㄟˇ
+趡 0 ㄘㄨㄟˇ
+漼 0 ㄘㄨㄟˇ
+洒 0 ㄘㄨㄟˇ
+踓 0 ㄘㄨㄟˇ
+鏙 0 ㄘㄨㄟˇ
+熣 0 ㄘㄨㄟˇ
+皠 0 ㄘㄨㄟˇ
+翠 0 ㄘㄨㄟˋ
+脆 0 ㄘㄨㄟˋ
+粹 0 ㄘㄨㄟˋ
+悴 0 ㄘㄨㄟˋ
+瘁 0 ㄘㄨㄟˋ
+萃 0 ㄘㄨㄟˋ
+啐 0 ㄘㄨㄟˋ
+淬 0 ㄘㄨㄟˋ
+倅 0 ㄘㄨㄟˋ
+毳 0 ㄘㄨㄟˋ
+焠 0 ㄘㄨㄟˋ
+竁 0 ㄘㄨㄟˋ
+膬 0 ㄘㄨㄟˋ
+綷 0 ㄘㄨㄟˋ
+膵 0 ㄘㄨㄟˋ
+脺 0 ㄘㄨㄟˋ
+濢 0 ㄘㄨㄟˋ
+碎 0 ㄘㄨㄟˋ
+椊 0 ㄘㄨㄟˋ
+嶉 0 ㄘㄨㄟˋ
+噿 0 ㄘㄨㄟˋ
+璻 0 ㄘㄨㄟˋ
+伜 0 ㄘㄨㄟˋ
+忰 0 ㄘㄨㄟˋ
+砕 0 ㄘㄨㄟˋ
+粋 0 ㄘㄨㄟˋ
+翆 0 ㄘㄨㄟˋ
+脃 0 ㄘㄨㄟˋ
+琗 0 ㄘㄨㄟˋ
+顇 0 ㄘㄨㄟˋ
+臎 0 ㄘㄨㄟˋ
+襊 0 ㄘㄨㄟˋ
+韢 0 ㄘㄨㄟˋ
+紣 0 ㄘㄨㄟˋ
+啛 0 ㄘㄨㄟˋ
+凗 0 ㄘㄨㄟˊ
+慛 0 ㄘㄨㄟˊ
+村 0 ㄘㄨㄣ
+皴 0 ㄘㄨㄣ
+踆 0 ㄘㄨㄣ
+邨 0 ㄘㄨㄣ
+澊 0 ㄘㄨㄣ
+竴 0 ㄘㄨㄣ
+忖 0 ㄘㄨㄣˇ
+刌 0 ㄘㄨㄣˇ
+寸 0 ㄘㄨㄣˋ
+吋 0 ㄘㄨㄣˋ
+籿 0 ㄘㄨㄣˋ
+存 0 ㄘㄨㄣˊ
+袸 0 ㄘㄨㄣˊ
+蹲 0 ㄘㄨㄣˊ
+拵 0 ㄘㄨㄣˊ
+洊 0 ㄘㄨㄣˊ
+栫 0 ㄘㄨㄣˊ
+珔 0 ㄘㄨㄣˊ
+冊 0 ㄘㄜˋ
+策 0 ㄘㄜˋ
+測 0 ㄘㄜˋ
+側 0 ㄘㄜˋ
+廁 0 ㄘㄜˋ
+惻 0 ㄘㄜˋ
+筴 0 ㄘㄜˋ
+畟 0 ㄘㄜˋ
+茦 0 ㄘㄜˋ
+粣 0 ㄘㄜˋ
+拺 0 ㄘㄜˋ
+矠 0 ㄘㄜˋ
+憡 0 ㄘㄜˋ
+蓛 0 ㄘㄜˋ
+簎 0 ㄘㄜˋ
+鍘 0 ㄘㄜˋ
+册 0 ㄘㄜˋ
+厠 0 ㄘㄜˋ
+萗 0 ㄘㄜˋ
+筞 0 ㄘㄜˋ
+墄 0 ㄘㄜˋ
+嫧 0 ㄘㄜˋ
+箣 0 ㄘㄜˋ
+㩞 0 ㄘㄜˋ
+敇 0 ㄘㄜˋ
+笧 0 ㄘㄜˋ
+操 0 ㄘㄠ
+糙 0 ㄘㄠ
+鄵 0 ㄘㄠ
+喿 0 ㄘㄠ
+劋 0 ㄘㄠ
+幧 0 ㄘㄠ
+矂 0 ㄘㄠ
+鐰 0 ㄘㄠ
+撡 0 ㄘㄠ
+草 0 ㄘㄠˇ
+懆 0 ㄘㄠˇ
+騲 0 ㄘㄠˇ
+艸 0 ㄘㄠˇ
+慅 0 ㄘㄠˇ
+愺 0 ㄘㄠˇ
+艹 0 ㄘㄠˇ
+糙 0 ㄘㄠˋ
+操 0 ㄘㄠˋ
+肏 0 ㄘㄠˋ
+襙 0 ㄘㄠˋ
+造 0 ㄘㄠˋ
+慥 0 ㄘㄠˋ
+鄵 0 ㄘㄠˋ
+艁 0 ㄘㄠˋ
+曹 0 ㄘㄠˊ
+槽 0 ㄘㄠˊ
+嘈 0 ㄘㄠˊ
+漕 0 ㄘㄠˊ
+螬 0 ㄘㄠˊ
+艚 0 ㄘㄠˊ
+嶆 0 ㄘㄠˊ
+鰽 0 ㄘㄠˊ
+蓸 0 ㄘㄠˊ
+褿 0 ㄘㄠˊ
+鏪 0 ㄘㄠˊ
+參 0 ㄘㄣ
+嵾 0 ㄘㄣ
+梫 0 ㄘㄣ
+叁 0 ㄘㄣ
+参 0 ㄘㄣ
+叅 0 ㄘㄣ
+曑 0 ㄘㄣ
+岑 0 ㄘㄣˊ
+涔 0 ㄘㄣˊ
+梣 0 ㄘㄣˊ
+笒 0 ㄘㄣˊ
+埁 0 ㄘㄣˊ
+侺 0 ㄘㄣˊ
+汵 0 ㄘㄣˊ
+筨 0 ㄘㄣˊ
+喔 0 ㄛ
+ㄛ 0 ㄛ
+呵 0 ㄛ
+啊 0 ㄛ
+嚄 0 ㄛˇ
+哦 0 ㄛˊ
+屋 0 ㄨ
+烏 0 ㄨ
+污 0 ㄨ
+汙 0 ㄨ
+圬 0 ㄨ
+誣 0 ㄨ
+嗚 0 ㄨ
+巫 0 ㄨ
+鎢 0 ㄨ
+鄔 0 ㄨ
+洿 0 ㄨ
+歍 0 ㄨ
+ㄨ 0 ㄨ
+惡 0 ㄨ
+於 0 ㄨ
+杇 0 ㄨ
+陓 0 ㄨ
+剭 0 ㄨ
+窏 0 ㄨ
+腛 0 ㄨ
+鴮 0 ㄨ
+螐 0 ㄨ
+喔 0 ㄨ
+匢 0 ㄨ
+釫 0 ㄨ
+覡 0 ㄨ
+汚 0 ㄨ
+扵 0 ㄨ
+悪 0 ㄨ
+媉 0 ㄨ
+誈 0 ㄨ
+隖 0 ㄨ
+僫 0 ㄨ
+弙 0 ㄨ
+匫 0 ㄨ
+箼 0 ㄨ
+鼿 0 ㄨ
+䵦 0 ㄨ
+䖚 0 ㄨ
+鰞 0 ㄨ
+䶍 0 ㄨ
+翁 0 ㄨㄥ
+嗡 0 ㄨㄥ
+螉 0 ㄨㄥ
+鶲 0 ㄨㄥ
+霐 0 ㄨㄥ
+蓊 0 ㄨㄥ
+鎓 0 ㄨㄥ
+䩺 0 ㄨㄥ
+䱵 0 ㄨㄥ
+蓊 0 ㄨㄥˇ
+滃 0 ㄨㄥˇ
+暡 0 ㄨㄥˇ
+浻 0 ㄨㄥˇ
+瞈 0 ㄨㄥˇ
+聬 0 ㄨㄥˇ
+塕 0 ㄨㄥˇ
+奣 0 ㄨㄥˇ
+䐥 0 ㄨㄥˇ
+嵡 0 ㄨㄥˇ
+甕 0 ㄨㄥˋ
+瓮 0 ㄨㄥˋ
+齆 0 ㄨㄥˋ
+罋 0 ㄨㄥˋ
+汪 0 ㄨㄤ
+尪 0 ㄨㄤ
+尢 0 ㄨㄤ
+尫 0 ㄨㄤ
+尣 0 ㄨㄤ
+尩 0 ㄨㄤ
+往 0 ㄨㄤˇ
+網 0 ㄨㄤˇ
+枉 0 ㄨㄤˇ
+罔 0 ㄨㄤˇ
+惘 0 ㄨㄤˇ
+魍 0 ㄨㄤˇ
+輞 0 ㄨㄤˇ
+瀇 0 ㄨㄤˇ
+网 0 ㄨㄤˇ
+暀 0 ㄨㄤˇ
+菵 0 ㄨㄤˇ
+臦 0 ㄨㄤˇ
+俇 0 ㄨㄤˇ
+仼 0 ㄨㄤˇ
+徃 0 ㄨㄤˇ
+棢 0 ㄨㄤˇ
+誷 0 ㄨㄤˇ
+冈 0 ㄨㄤˇ
+罒 0 ㄨㄤˇ
+䒽 0 ㄨㄤˇ
+蛧 0 ㄨㄤˇ
+迬 0 ㄨㄤˇ
+忘 0 ㄨㄤˋ
+妄 0 ㄨㄤˋ
+望 0 ㄨㄤˋ
+旺 0 ㄨㄤˋ
+王 0 ㄨㄤˋ
+朢 0 ㄨㄤˋ
+迋 0 ㄨㄤˋ
+莣 0 ㄨㄤˋ
+䤑 0 ㄨㄤˋ
+王 0 ㄨㄤˊ
+亡 0 ㄨㄤˊ
+忘 0 ㄨㄤˊ
+莣 0 ㄨㄤˊ
+亾 0 ㄨㄤˊ
+兦 0 ㄨㄤˊ
+蚟 0 ㄨㄤˊ
+彺 0 ㄨㄤˊ
+灣 0 ㄨㄢ
+彎 0 ㄨㄢ
+豌 0 ㄨㄢ
+剜 0 ㄨㄢ
+莞 0 ㄨㄢ
+蜿 0 ㄨㄢ
+刓 0 ㄨㄢ
+潫 0 ㄨㄢ
+眢 0 ㄨㄢ
+婠 0 ㄨㄢ
+弯 0 ㄨㄢ
+帵 0 ㄨㄢ
+湾 0 ㄨㄢ
+萖 0 ㄨㄢ
+晚 0 ㄨㄢˇ
+碗 0 ㄨㄢˇ
+挽 0 ㄨㄢˇ
+宛 0 ㄨㄢˇ
+婉 0 ㄨㄢˇ
+娩 0 ㄨㄢˇ
+皖 0 ㄨㄢˇ
+輓 0 ㄨㄢˇ
+莞 0 ㄨㄢˇ
+浣 0 ㄨㄢˇ
+蜿 0 ㄨㄢˇ
+畹 0 ㄨㄢˇ
+菀 0 ㄨㄢˇ
+琬 0 ㄨㄢˇ
+鞔 0 ㄨㄢˇ
+綰 0 ㄨㄢˇ
+晼 0 ㄨㄢˇ
+綩 0 ㄨㄢˇ
+倇 0 ㄨㄢˇ
+脕 0 ㄨㄢˇ
+睕 0 ㄨㄢˇ
+鋄 0 ㄨㄢˇ
+睌 0 ㄨㄢˇ
+葂 0 ㄨㄢˇ
+剜 0 ㄨㄢˇ
+梡 0 ㄨㄢˇ
+腕 0 ㄨㄢˇ
+豌 0 ㄨㄢˇ
+妴 0 ㄨㄢˇ
+捖 0 ㄨㄢˇ
+婠 0 ㄨㄢˇ
+捥 0 ㄨㄢˇ
+晥 0 ㄨㄢˇ
+涴 0 ㄨㄢˇ
+脘 0 ㄨㄢˇ
+羦 0 ㄨㄢˇ
+踠 0 ㄨㄢˇ
+鋎 0 ㄨㄢˇ
+鋺 0 ㄨㄢˇ
+鵷 0 ㄨㄢˇ
+唍 0 ㄨㄢˇ
+㝃 0 ㄨㄢˇ
+盌 0 ㄨㄢˇ
+埦 0 ㄨㄢˇ
+梚 0 ㄨㄢˇ
+晩 0 ㄨㄢˇ
+椀 0 ㄨㄢˇ
+萖 0 ㄨㄢˇ
+鋔 0 ㄨㄢˇ
+䥑 0 ㄨㄢˇ
+鯶 0 ㄨㄢˇ
+鰀 0 ㄨㄢˇ
+箢 0 ㄨㄢˇ
+䘼 0 ㄨㄢˇ
+䛷 0 ㄨㄢˇ
+鎫 0 ㄨㄢˇ
+錽 0 ㄨㄢˇ
+鮸 0 ㄨㄢˇ
+萬 0 ㄨㄢˋ
+玩 0 ㄨㄢˋ
+腕 0 ㄨㄢˋ
+惋 0 ㄨㄢˋ
+卍 0 ㄨㄢˋ
+翫 0 ㄨㄢˋ
+忨 0 ㄨㄢˋ
+仴 0 ㄨㄢˋ
+綄 0 ㄨㄢˋ
+万 0 ㄨㄢˋ
+蟃 0 ㄨㄢˋ
+捥 0 ㄨㄢˋ
+踠 0 ㄨㄢˋ
+曼 0 ㄨㄢˋ
+蔓 0 ㄨㄢˋ
+躉 0 ㄨㄢˋ
+杬 0 ㄨㄢˋ
+獌 0 ㄨㄢˋ
+輐 0 ㄨㄢˋ
+薍 0 ㄨㄢˋ
+卐 0 ㄨㄢˋ
+貦 0 ㄨㄢˋ
+䕕 0 ㄨㄢˋ
+贃 0 ㄨㄢˋ
+贎 0 ㄨㄢˋ
+完 0 ㄨㄢˊ
+玩 0 ㄨㄢˊ
+頑 0 ㄨㄢˊ
+丸 0 ㄨㄢˊ
+汍 0 ㄨㄢˊ
+紈 0 ㄨㄢˊ
+芄 0 ㄨㄢˊ
+烷 0 ㄨㄢˊ
+婠 0 ㄨㄢˊ
+岏 0 ㄨㄢˊ
+抏 0 ㄨㄢˊ
+梡 0 ㄨㄢˊ
+刓 0 ㄨㄢˊ
+妧 0 ㄨㄢˊ
+肒 0 ㄨㄢˊ
+垸 0 ㄨㄢˊ
+捖 0 ㄨㄢˊ
+睆 0 ㄨㄢˊ
+筦 0 ㄨㄢˊ
+羦 0 ㄨㄢˊ
+鋎 0 ㄨㄢˊ
+貦 0 ㄨㄢˊ
+鯶 0 ㄨㄢˊ
+鰀 0 ㄨㄢˊ
+五 0 ㄨˇ
+午 0 ㄨˇ
+武 0 ㄨˇ
+舞 0 ㄨˇ
+侮 0 ㄨˇ
+伍 0 ㄨˇ
+鵡 0 ㄨˇ
+憮 0 ㄨˇ
+嫵 0 ㄨˇ
+潕 0 ㄨˇ
+廡 0 ㄨˇ
+仵 0 ㄨˇ
+忤 0 ㄨˇ
+嘸 0 ㄨˇ
+碔 0 ㄨˇ
+甒 0 ㄨˇ
+摀 0 ㄨˇ
+啎 0 ㄨˇ
+捂 0 ㄨˇ
+嵨 0 ㄨˇ
+玝 0 ㄨˇ
+倵 0 ㄨˇ
+橆 0 ㄨˇ
+躌 0 ㄨˇ
+撫 0 ㄨˇ
+汻 0 ㄨˇ
+迕 0 ㄨˇ
+埡 0 ㄨˇ
+牾 0 ㄨˇ
+幠 0 ㄨˇ
+膴 0 ㄨˇ
+旿 0 ㄨˇ
+娬 0 ㄨˇ
+捬 0 ㄨˇ
+珷 0 ㄨˇ
+遌 0 ㄨˇ
+瑦 0 ㄨˇ
+儛 0 ㄨˇ
+抚 0 ㄨˇ
+㵲 0 ㄨˇ
+㐅 0 ㄨˇ
+勿 0 ㄨˋ
+物 0 ㄨˋ
+務 0 ㄨˋ
+惡 0 ㄨˋ
+誤 0 ㄨˋ
+悟 0 ㄨˋ
+晤 0 ㄨˋ
+霧 0 ㄨˋ
+戊 0 ㄨˋ
+鎢 0 ㄨˋ
+塢 0 ㄨˋ
+兀 0 ㄨˋ
+兀 0 ㄨˋ
+騖 0 ㄨˋ
+寤 0 ㄨˋ
+軏 0 ㄨˋ
+杌 0 ㄨˋ
+婺 0 ㄨˋ
+鶩 0 ㄨˋ
+沕 0 ㄨˋ
+迕 0 ㄨˋ
+遻 0 ㄨˋ
+鋈 0 ㄨˋ
+屼 0 ㄨˋ
+扤 0 ㄨˋ
+煟 0 ㄨˋ
+卼 0 ㄨˋ
+焐 0 ㄨˋ
+靰 0 ㄨˋ
+阢 0 ㄨˋ
+粅 0 ㄨˋ
+矹 0 ㄨˋ
+芴 0 ㄨˋ
+埡 0 ㄨˋ
+逜 0 ㄨˋ
+痦 0 ㄨˋ
+齀 0 ㄨˋ
+蘁 0 ㄨˋ
+岉 0 ㄨˋ
+噁 0 ㄨˋ
+蓩 0 ㄨˋ
+毋 0 ㄨˋ
+汙 0 ㄨˋ
+污 0 ㄨˋ
+沃 0 ㄨˋ
+捂 0 ㄨˋ
+梧 0 ㄨˋ
+匢 0 ㄨˋ
+昒 0 ㄨˋ
+曶 0 ㄨˋ
+矻 0 ㄨˋ
+俉 0 ㄨˋ
+眓 0 ㄨˋ
+啎 0 ㄨˋ
+寣 0 ㄨˋ
+殟 0 ㄨˋ
+鋘 0 ㄨˋ
+汚 0 ㄨˋ
+敄 0 ㄨˋ
+悮 0 ㄨˋ
+悞 0 ㄨˋ
+悪 0 ㄨˋ
+嵍 0 ㄨˋ
+奦 0 ㄨˋ
+榅 0 ㄨˋ
+溩 0 ㄨˋ
+遌 0 ㄨˋ
+隖 0 ㄨˋ
+僫 0 ㄨˋ
+榲 0 ㄨˋ
+熃 0 ㄨˋ
+銐 0 ㄨˋ
+霚 0 ㄨˋ
+忢 0 ㄨˋ
+匫 0 ㄨˋ
+窹 0 ㄨˋ
+䜑 0 ㄨˋ
+無 0 ㄨˊ
+吳 0 ㄨˊ
+吾 0 ㄨˊ
+梧 0 ㄨˊ
+巫 0 ㄨˊ
+蕪 0 ㄨˊ
+唔 0 ㄨˊ
+蜈 0 ㄨˊ
+誣 0 ㄨˊ
+毋 0 ㄨˊ
+亡 0 ㄨˊ
+膴 0 ㄨˊ
+鼯 0 ㄨˊ
+郚 0 ㄨˊ
+鋘 0 ㄨˊ
+鋙 0 ㄨˊ
+峿 0 ㄨˊ
+浯 0 ㄨˊ
+珸 0 ㄨˊ
+俉 0 ㄨˊ
+鯃 0 ㄨˊ
+莁 0 ㄨˊ
+鷡 0 ㄨˊ
+洖 0 ㄨˊ
+瞴 0 ㄨˊ
+圄 0 ㄨˊ
+齬 0 ㄨˊ
+曶 0 ㄨˊ
+亾 0 ㄨˊ
+兦 0 ㄨˊ
+无 0 ㄨˊ
+吴 0 ㄨˊ
+呉 0 ㄨˊ
+芜 0 ㄨˊ
+娪 0 ㄨˊ
+茣 0 ㄨˊ
+銐 0 ㄨˊ
+墲 0 ㄨˊ
+鵐 0 ㄨˊ
+璑 0 ㄨˊ
+禑 0 ㄨˊ
+蟱 0 ㄨˊ
+哇 0 ㄨㄚ
+蛙 0 ㄨㄚ
+挖 0 ㄨㄚ
+窪 0 ㄨㄚ
+呱 0 ㄨㄚ
+媧 0 ㄨㄚ
+洼 0 ㄨㄚ
+穵 0 ㄨㄚ
+溛 0 ㄨㄚ
+窊 0 ㄨㄚ
+窐 0 ㄨㄚ
+漥 0 ㄨㄚ
+凹 0 ㄨㄚ
+汙 0 ㄨㄚ
+畦 0 ㄨㄚ
+汚 0 ㄨㄚ
+哌 0 ㄨㄚ
+畖 0 ㄨㄚ
+嗗 0 ㄨㄚ
+搲 0 ㄨㄚ
+䵷 0 ㄨㄚ
+鼃 0 ㄨㄚ
+攨 0 ㄨㄚ
+徍 0 ㄨㄚ
+劸 0 ㄨㄚ
+瓦 0 ㄨㄚˇ
+佤 0 ㄨㄚˇ
+瓨 0 ㄨㄚˇ
+瓻 0 ㄨㄚˇ
+齀 0 ㄨㄚˇ
+咓 0 ㄨㄚˇ
+邷 0 ㄨㄚˇ
+攨 0 ㄨㄚˇ
+襪 0 ㄨㄚˋ
+嗢 0 ㄨㄚˋ
+膃 0 ㄨㄚˋ
+凹 0 ㄨㄚˋ
+瓦 0 ㄨㄚˋ
+殟 0 ㄨㄚˋ
+聉 0 ㄨㄚˋ
+袜 0 ㄨㄚˋ
+腽 0 ㄨㄚˋ
+韈 0 ㄨㄚˋ
+韤 0 ㄨㄚˋ
+娃 0 ㄨㄚˊ
+挖 0 ㄨㄚˊ
+哇 0 ㄨㄚ˙
+歪 0 ㄨㄞ
+竵 0 ㄨㄞ
+舀 0 ㄨㄞˇ
+歪 0 ㄨㄞˇ
+外 0 ㄨㄞˋ
+窩 0 ㄨㄛ
+倭 0 ㄨㄛ
+渦 0 ㄨㄛ
+萵 0 ㄨㄛ
+猧 0 ㄨㄛ
+踒 0 ㄨㄛ
+媧 0 ㄨㄛ
+蝸 0 ㄨㄛ
+齷 0 ㄨㄛ
+覣 0 ㄨㄛ
+唩 0 ㄨㄛ
+涹 0 ㄨㄛ
+我 0 ㄨㄛˇ
+婐 0 ㄨㄛˇ
+捰 0 ㄨㄛˇ
+婑 0 ㄨㄛˇ
+握 0 ㄨㄛˋ
+臥 0 ㄨㄛˋ
+沃 0 ㄨㄛˋ
+渥 0 ㄨㄛˋ
+斡 0 ㄨㄛˋ
+齷 0 ㄨㄛˋ
+幄 0 ㄨㄛˋ
+涴 0 ㄨㄛˋ
+偓 0 ㄨㄛˋ
+濣 0 ㄨㄛˋ
+焥 0 ㄨㄛˋ
+喔 0 ㄨㄛˋ
+腛 0 ㄨㄛˋ
+鋈 0 ㄨㄛˋ
+雘 0 ㄨㄛˋ
+矱 0 ㄨㄛˋ
+蠖 0 ㄨㄛˋ
+肟 0 ㄨㄛˋ
+枂 0 ㄨㄛˋ
+卧 0 ㄨㄛˋ
+捾 0 ㄨㄛˋ
+楃 0 ㄨㄛˋ
+嬒 0 ㄨㄛˋ
+威 0 ㄨㄟ
+崴 0 ㄨㄟ
+偎 0 ㄨㄟ
+煨 0 ㄨㄟ
+葳 0 ㄨㄟ
+隈 0 ㄨㄟ
+萎 0 ㄨㄟ
+委 0 ㄨㄟ
+逶 0 ㄨㄟ
+烓 0 ㄨㄟ
+椳 0 ㄨㄟ
+渨 0 ㄨㄟ
+碨 0 ㄨㄟ
+愄 0 ㄨㄟ
+揋 0 ㄨㄟ
+葨 0 ㄨㄟ
+隇 0 ㄨㄟ
+溾 0 ㄨㄟ
+詴 0 ㄨㄟ
+蝛 0 ㄨㄟ
+覣 0 ㄨㄟ
+燰 0 ㄨㄟ
+危 0 ㄨㄟ
+倭 0 ㄨㄟ
+微 0 ㄨㄟ
+薇 0 ㄨㄟ
+喡 0 ㄨㄟ
+溦 0 ㄨㄟ
+蜲 0 ㄨㄟ
+踒 0 ㄨㄟ
+喴 0 ㄨㄟ
+媙 0 ㄨㄟ
+鰄 0 ㄨㄟ
+㙎 0 ㄨㄟ
+嵔 0 ㄨㄟ
+楲 0 ㄨㄟ
+鰃 0 ㄨㄟ
+委 0 ㄨㄟˇ
+尾 0 ㄨㄟˇ
+偉 0 ㄨㄟˇ
+緯 0 ㄨㄟˇ
+萎 0 ㄨㄟˇ
+諉 0 ㄨㄟˇ
+葦 0 ㄨㄟˇ
+痿 0 ㄨㄟˇ
+猥 0 ㄨㄟˇ
+煒 0 ㄨㄟˇ
+亹 0 ㄨㄟˇ
+隗 0 ㄨㄟˇ
+娓 0 ㄨㄟˇ
+韙 0 ㄨㄟˇ
+寪 0 ㄨㄟˇ
+洧 0 ㄨㄟˇ
+瑋 0 ㄨㄟˇ
+薳 0 ㄨㄟˇ
+蘤 0 ㄨㄟˇ
+韡 0 ㄨㄟˇ
+鮪 0 ㄨㄟˇ
+磈 0 ㄨㄟˇ
+蒍 0 ㄨㄟˇ
+頠 0 ㄨㄟˇ
+暐 0 ㄨㄟˇ
+痏 0 ㄨㄟˇ
+骫 0 ㄨㄟˇ
+椲 0 ㄨㄟˇ
+浘 0 ㄨㄟˇ
+艉 0 ㄨㄟˇ
+芛 0 ㄨㄟˇ
+鍡 0 ㄨㄟˇ
+峗 0 ㄨㄟˇ
+壝 0 ㄨㄟˇ
+喡 0 ㄨㄟˇ
+徫 0 ㄨㄟˇ
+腲 0 ㄨㄟˇ
+蜲 0 ㄨㄟˇ
+儰 0 ㄨㄟˇ
+蓶 0 ㄨㄟˇ
+崣 0 ㄨㄟˇ
+硊 0 ㄨㄟˇ
+踓 0 ㄨㄟˇ
+斖 0 ㄨㄟˇ
+韋 0 ㄨㄟˇ
+偽 0 ㄨㄟˇ
+唯 0 ㄨㄟˇ
+逶 0 ㄨㄟˇ
+違 0 ㄨㄟˇ
+諱 0 ㄨㄟˇ
+婑 0 ㄨㄟˇ
+郼 0 ㄨㄟˇ
+緌 0 ㄨㄟˇ
+覣 0 ㄨㄟˇ
+梶 0 ㄨㄟˇ
+荱 0 ㄨㄟˇ
+愇 0 ㄨㄟˇ
+骩 0 ㄨㄟˇ
+僞 0 ㄨㄟˇ
+㬙 0 ㄨㄟˇ
+蔿 0 ㄨㄟˇ
+膸 0 ㄨㄟˇ
+颹 0 ㄨㄟˇ
+厃 0 ㄨㄟˇ
+骪 0 ㄨㄟˇ
+韑 0 ㄨㄟˇ
+為 0 ㄨㄟˋ
+位 0 ㄨㄟˋ
+未 0 ㄨㄟˋ
+魏 0 ㄨㄟˋ
+衛 0 ㄨㄟˋ
+味 0 ㄨㄟˋ
+偽 0 ㄨㄟˋ
+謂 0 ㄨㄟˋ
+胃 0 ㄨㄟˋ
+喂 0 ㄨㄟˋ
+慰 0 ㄨㄟˋ
+餵 0 ㄨㄟˋ
+尉 0 ㄨㄟˋ
+渭 0 ㄨㄟˋ
+畏 0 ㄨㄟˋ
+蔚 0 ㄨㄟˋ
+蘶 0 ㄨㄟˋ
+蝟 0 ㄨㄟˋ
+犩 0 ㄨㄟˋ
+遺 0 ㄨㄟˋ
+霨 0 ㄨㄟˋ
+磑 0 ㄨㄟˋ
+罻 0 ㄨㄟˋ
+褽 0 ㄨㄟˋ
+薉 0 ㄨㄟˋ
+媦 0 ㄨㄟˋ
+蜼 0 ㄨㄟˋ
+藯 0 ㄨㄟˋ
+鏏 0 ㄨㄟˋ
+菋 0 ㄨㄟˋ
+犚 0 ㄨㄟˋ
+餧 0 ㄨㄟˋ
+贀 0 ㄨㄟˋ
+讆 0 ㄨㄟˋ
+躗 0 ㄨㄟˋ
+穌 0 ㄨㄟˋ
+鮇 0 ㄨㄟˋ
+徻 0 ㄨㄟˋ
+偎 0 ㄨㄟˋ
+穢 0 ㄨㄟˋ
+噅 0 ㄨㄟˋ
+媯 0 ㄨㄟˋ
+撝 0 ㄨㄟˋ
+溈 0 ㄨㄟˋ
+煟 0 ㄨㄟˋ
+蔧 0 ㄨㄟˋ
+蟡 0 ㄨㄟˋ
+濊 0 ㄨㄟˋ
+薈 0 ㄨㄟˋ
+鍡 0 ㄨㄟˋ
+瓗 0 ㄨㄟˋ
+㷉 0 ㄨㄟˋ
+爲 0 ㄨㄟˋ
+猬 0 ㄨㄟˋ
+僞 0 ㄨㄟˋ
+嬀 0 ㄨㄟˋ
+潙 0 ㄨㄟˋ
+熭 0 ㄨㄟˋ
+緭 0 ㄨㄟˋ
+嬒 0 ㄨㄟˋ
+懀 0 ㄨㄟˋ
+衞 0 ㄨㄟˋ
+錗 0 ㄨㄟˋ
+螱 0 ㄨㄟˋ
+轊 0 ㄨㄟˋ
+㼇 0 ㄨㄟˋ
+䲁 0 ㄨㄟˋ
+軎 0 ㄨㄟˋ
+苿 0 ㄨㄟˋ
+叞 0 ㄨㄟˋ
+為 0 ㄨㄟˊ
+圍 0 ㄨㄟˊ
+微 0 ㄨㄟˊ
+危 0 ㄨㄟˊ
+唯 0 ㄨㄟˊ
+維 0 ㄨㄟˊ
+惟 0 ㄨㄟˊ
+違 0 ㄨㄟˊ
+韋 0 ㄨㄟˊ
+薇 0 ㄨㄟˊ
+巍 0 ㄨㄟˊ
+桅 0 ㄨㄟˊ
+闈 0 ㄨㄟˊ
+濰 0 ㄨㄟˊ
+帷 0 ㄨㄟˊ
+嵬 0 ㄨㄟˊ
+幃 0 ㄨㄟˊ
+囗 0 ㄨㄟˊ
+湋 0 ㄨㄟˊ
+溦 0 ㄨㄟˊ
+鄬 0 ㄨㄟˊ
+鍏 0 ㄨㄟˊ
+鮠 0 ㄨㄟˊ
+潿 0 ㄨㄟˊ
+洈 0 ㄨㄟˊ
+覹 0 ㄨㄟˊ
+醀 0 ㄨㄟˊ
+霺 0 ㄨㄟˊ
+瀢 0 ㄨㄟˊ
+濻 0 ㄨㄟˊ
+癓 0 ㄨㄟˊ
+欈 0 ㄨㄟˊ
+圩 0 ㄨㄟˊ
+葦 0 ㄨㄟˊ
+魏 0 ㄨㄟˊ
+佹 0 ㄨㄟˊ
+垝 0 ㄨㄟˊ
+姽 0 ㄨㄟˊ
+峗 0 ㄨㄟˊ
+峞 0 ㄨㄟˊ
+祪 0 ㄨㄟˊ
+噅 0 ㄨㄟˊ
+媯 0 ㄨㄟˊ
+撝 0 ㄨㄟˊ
+溈 0 ㄨㄟˊ
+蛫 0 ㄨㄟˊ
+觤 0 ㄨㄟˊ
+磑 0 ㄨㄟˊ
+蓶 0 ㄨㄟˊ
+蟡 0 ㄨㄟˊ
+犩 0 ㄨㄟˊ
+媁 0 ㄨㄟˊ
+爲 0 ㄨㄟˊ
+琟 0 ㄨㄟˊ
+嬀 0 ㄨㄟˊ
+潙 0 ㄨㄟˊ
+矀 0 ㄨㄟˊ
+䉠 0 ㄨㄟˊ
+陒 0 ㄨㄟˊ
+㵟 0 ㄨㄟˊ
+溫 0 ㄨㄣ
+瘟 0 ㄨㄣ
+轀 0 ㄨㄣ
+塭 0 ㄨㄣ
+馧 0 ㄨㄣ
+瞃 0 ㄨㄣ
+豱 0 ㄨㄣ
+殟 0 ㄨㄣ
+媼 0 ㄨㄣ
+嗢 0 ㄨㄣ
+膃 0 ㄨㄣ
+褞 0 ㄨㄣ
+昷 0 ㄨㄣ
+媪 0 ㄨㄣ
+温 0 ㄨㄣ
+腽 0 ㄨㄣ
+瑥 0 ㄨㄣ
+輼 0 ㄨㄣ
+鰛 0 ㄨㄣ
+鰮 0 ㄨㄣ
+穩 0 ㄨㄣˇ
+吻 0 ㄨㄣˇ
+刎 0 ㄨㄣˇ
+呡 0 ㄨㄣˇ
+桽 0 ㄨㄣˇ
+昒 0 ㄨㄣˇ
+曶 0 ㄨㄣˇ
+勽 0 ㄨㄣˇ
+伆 0 ㄨㄣˇ
+肳 0 ㄨㄣˇ
+脗 0 ㄨㄣˇ
+䦟 0 ㄨㄣˇ
+穏 0 ㄨㄣˇ
+問 0 ㄨㄣˋ
+聞 0 ㄨㄣˋ
+紊 0 ㄨㄣˋ
+文 0 ㄨㄣˋ
+汶 0 ㄨㄣˋ
+抆 0 ㄨㄣˋ
+免 0 ㄨㄣˋ
+搵 0 ㄨㄣˋ
+璺 0 ㄨㄣˋ
+妏 0 ㄨㄣˋ
+醞 0 ㄨㄣˋ
+蘊 0 ㄨㄣˋ
+脕 0 ㄨㄣˋ
+絻 0 ㄨㄣˋ
+鼤 0 ㄨㄣˋ
+顐 0 ㄨㄣˋ
+彣 0 ㄨㄣˋ
+渂 0 ㄨㄣˋ
+揾 0 ㄨㄣˋ
+醖 0 ㄨㄣˋ
+藴 0 ㄨㄣˋ
+文 0 ㄨㄣˊ
+聞 0 ㄨㄣˊ
+紋 0 ㄨㄣˊ
+蚊 0 ㄨㄣˊ
+玟 0 ㄨㄣˊ
+雯 0 ㄨㄣˊ
+閿 0 ㄨㄣˊ
+炆 0 ㄨㄣˊ
+芠 0 ㄨㄣˊ
+琝 0 ㄨㄣˊ
+閺 0 ㄨㄣˊ
+闅 0 ㄨㄣˊ
+鼤 0 ㄨㄣˊ
+駇 0 ㄨㄣˊ
+魰 0 ㄨㄣˊ
+鳼 0 ㄨㄣˊ
+抆 0 ㄨㄣˊ
+汶 0 ㄨㄣˊ
+畋 0 ㄨㄣˊ
+妏 0 ㄨㄣˊ
+顐 0 ㄨㄣˊ
+彣 0 ㄨㄣˊ
+珉 0 ㄨㄣˊ
+砇 0 ㄨㄣˊ
+蚉 0 ㄨㄣˊ
+渂 0 ㄨㄣˊ
+珳 0 ㄨㄣˊ
+琘 0 ㄨㄣˊ
+瑉 0 ㄨㄣˊ
+碈 0 ㄨㄣˊ
+馼 0 ㄨㄣˊ
+鴍 0 ㄨㄣˊ
+螡 0 ㄨㄣˊ
+鴖 0 ㄨㄣˊ
+蟁 0 ㄨㄣˊ
+瘒 0 ㄨㄣˊ
+阿 0 ㄜ
+婀 0 ㄜ
+痾 0 ㄜ
+ㄜ 0 ㄜ
+屙 0 ㄜ
+峉 0 ㄜ
+錒 0 ㄜ
+歞 0 ㄜ
+妿 0 ㄜ
+妸 0 ㄜ
+疴 0 ㄜ
+娿 0 ㄜ
+噁 0 ㄜˇ
+我 0 ㄜˇ
+婀 0 ㄜˇ
+惡 0 ㄜˇ
+婐 0 ㄜˇ
+猗 0 ㄜˇ
+閜 0 ㄜˇ
+硪 0 ㄜˇ
+悪 0 ㄜˇ
+頋 0 ㄜˇ
+僫 0 ㄜˇ
+騀 0 ㄜˇ
+惡 0 ㄜˋ
+餓 0 ㄜˋ
+俄 0 ㄜˋ
+鄂 0 ㄜˋ
+厄 0 ㄜˋ
+遏 0 ㄜˋ
+鍔 0 ㄜˋ
+扼 0 ㄜˋ
+鱷 0 ㄜˋ
+顎 0 ㄜˋ
+呃 0 ㄜˋ
+愕 0 ㄜˋ
+噩 0 ㄜˋ
+軛 0 ㄜˋ
+阨 0 ㄜˋ
+鶚 0 ㄜˋ
+堊 0 ㄜˋ
+諤 0 ㄜˋ
+萼 0 ㄜˋ
+咢 0 ㄜˋ
+啞 0 ㄜˋ
+崿 0 ㄜˋ
+搤 0 ㄜˋ
+詻 0 ㄜˋ
+閼 0 ㄜˋ
+頞 0 ㄜˋ
+堨 0 ㄜˋ
+齶 0 ㄜˋ
+枙 0 ㄜˋ
+堮 0 ㄜˋ
+岋 0 ㄜˋ
+鑩 0 ㄜˋ
+櫮 0 ㄜˋ
+砐 0 ㄜˋ
+砨 0 ㄜˋ
+蚅 0 ㄜˋ
+豟 0 ㄜˋ
+軶 0 ㄜˋ
+圔 0 ㄜˋ
+搹 0 ㄜˋ
+蝁 0 ㄜˋ
+嶭 0 ㄜˋ
+餩 0 ㄜˋ
+蘁 0 ㄜˋ
+歹 0 ㄜˋ
+隘 0 ㄜˋ
+額 0 ㄜˋ
+仴 0 ㄜˋ
+姶 0 ㄜˋ
+唈 0 ㄜˋ
+嫮 0 ㄜˋ
+遻 0 ㄜˋ
+齃 0 ㄜˋ
+戹 0 ㄜˋ
+歺 0 ㄜˋ
+咹 0 ㄜˋ
+偔 0 ㄜˋ
+悪 0 ㄜˋ
+㗁 0 ㄜˋ
+湂 0 ㄜˋ
+㮙 0 ㄜˋ
+琧 0 ㄜˋ
+瘂 0 ㄜˋ
+腭 0 ㄜˋ
+僫 0 ㄜˋ
+磀 0 ㄜˋ
+頟 0 ㄜˋ
+擜 0 ㄜˋ
+蕚 0 ㄜˋ
+鰐 0 ㄜˋ
+讍 0 ㄜˋ
+𣎴 0 ㄜˋ
+𠱥 0 ㄜˋ
+屵 0 ㄜˋ
+呝 0 ㄜˋ
+苊 0 ㄜˋ
+阸 0 ㄜˋ
+唖 0 ㄜˋ
+卾 0 ㄜˋ
+㷈 0 ㄜˋ
+覨 0 ㄜˋ
+囐 0 ㄜˋ
+額 0 ㄜˊ
+訛 0 ㄜˊ
+鵝 0 ㄜˊ
+娥 0 ㄜˊ
+哦 0 ㄜˊ
+蛾 0 ㄜˊ
+峨 0 ㄜˊ
+莪 0 ㄜˊ
+俄 0 ㄜˊ
+囮 0 ㄜˊ
+吪 0 ㄜˊ
+硪 0 ㄜˊ
+蚵 0 ㄜˊ
+鋨 0 ㄜˊ
+迗 0 ㄜˊ
+珴 0 ㄜˊ
+涐 0 ㄜˊ
+皒 0 ㄜˊ
+睋 0 ㄜˊ
+魤 0 ㄜˊ
+枙 0 ㄜˊ
+峉 0 ㄜˊ
+匎 0 ㄜˊ
+峩 0 ㄜˊ
+鈋 0 ㄜˊ
+誐 0 ㄜˊ
+頟 0 ㄜˊ
+騀 0 ㄜˊ
+鵞 0 ㄜˊ
+譌 0 ㄜˊ
+䄉 0 ㄜˊ
+㘥 0 ㄜˊ
+鰪 0 ㄜˊ
+凹 0 ㄠ
+ㄠ 0 ㄠ
+坳 0 ㄠ
+柪 0 ㄠ
+熬 0 ㄠ
+爊 0 ㄠ
+㘭 0 ㄠ
+軪 0 ㄠ
+㕭 0 ㄠ
+垇 0 ㄠ
+襖 0 ㄠˇ
+媼 0 ㄠˇ
+芺 0 ㄠˇ
+镺 0 ㄠˇ
+夭 0 ㄠˇ
+拗 0 ㄠˇ
+郩 0 ㄠˇ
+抝 0 ㄠˇ
+袄 0 ㄠˇ
+媪 0 ㄠˇ
+鴁 0 ㄠˇ
+狕 0 ㄠˇ
+傲 0 ㄠˋ
+澳 0 ㄠˋ
+奧 0 ㄠˋ
+懊 0 ㄠˋ
+墺 0 ㄠˋ
+奡 0 ㄠˋ
+扷 0 ㄠˋ
+擙 0 ㄠˋ
+拗 0 ㄠˋ
+詏 0 ㄠˋ
+嶴 0 ㄠˋ
+敖 0 ㄠˋ
+燠 0 ㄠˋ
+坳 0 ㄠˋ
+柪 0 ㄠˋ
+镺 0 ㄠˋ
+隩 0 ㄠˋ
+謷 0 ㄠˋ
+鏊 0 ㄠˋ
+驁 0 ㄠˋ
+㑃 0 ㄠˋ
+抝 0 ㄠˋ
+嫯 0 ㄠˋ
+㜜 0 ㄠˋ
+慠 0 ㄠˋ
+謸 0 ㄠˋ
+圫 0 ㄠˋ
+奥 0 ㄠˋ
+熬 0 ㄠˊ
+敖 0 ㄠˊ
+遨 0 ㄠˊ
+翱 0 ㄠˊ
+嗷 0 ㄠˊ
+螯 0 ㄠˊ
+鰲 0 ㄠˊ
+鼇 0 ㄠˊ
+鏖 0 ㄠˊ
+驁 0 ㄠˊ
+廒 0 ㄠˊ
+獒 0 ㄠˊ
+璈 0 ㄠˊ
+聱 0 ㄠˊ
+鏊 0 ㄠˊ
+滶 0 ㄠˊ
+磝 0 ㄠˊ
+隞 0 ㄠˊ
+摮 0 ㄠˊ
+蔜 0 ㄠˊ
+簢 0 ㄠˊ
+謷 0 ㄠˊ
+爊 0 ㄠˊ
+厫 0 ㄠˊ
+嗸 0 ㄠˊ
+煾 0 ㄠˊ
+獓 0 ㄠˊ
+翶 0 ㄠˊ
+翺 0 ㄠˊ
+嶅 0 ㄠˊ
+鷔 0 ㄠˊ
+淤 0 ㄩ
+迂 0 ㄩ
+瘀 0 ㄩ
+紆 0 ㄩ
+ㄩ 0 ㄩ
+毹 0 ㄩ
+箊 0 ㄩ
+扜 0 ㄩ
+穻 0 ㄩ
+盓 0 ㄩ
+汙 0 ㄩ
+污 0 ㄩ
+胠 0 ㄩ
+陓 0 ㄩ
+唹 0 ㄩ
+汚 0 ㄩ
+虶 0 ㄩ
+迃 0 ㄩ
+約 0 ㄩㄝ
+曰 0 ㄩㄝ
+噦 0 ㄩㄝ
+箹 0 ㄩㄝ
+焥 0 ㄩㄝ
+月 0 ㄩㄝˋ
+越 0 ㄩㄝˋ
+樂 0 ㄩㄝˋ
+悅 0 ㄩㄝˋ
+閱 0 ㄩㄝˋ
+粵 0 ㄩㄝˋ
+躍 0 ㄩㄝˋ
+岳 0 ㄩㄝˋ
+嶽 0 ㄩㄝˋ
+耀 0 ㄩㄝˋ
+鑰 0 ㄩㄝˋ
+曜 0 ㄩㄝˋ
+藥 0 ㄩㄝˋ
+鉞 0 ㄩㄝˋ
+說 0 ㄩㄝˋ
+囝 0 ㄩㄝˋ
+刖 0 ㄩㄝˋ
+瀹 0 ㄩㄝˋ
+籥 0 ㄩㄝˋ
+樾 0 ㄩㄝˋ
+爚 0 ㄩㄝˋ
+礿 0 ㄩㄝˋ
+禴 0 ㄩㄝˋ
+趯 0 ㄩㄝˋ
+軏 0 ㄩㄝˋ
+鸑 0 ㄩㄝˋ
+龠 0 ㄩㄝˋ
+狘 0 ㄩㄝˋ
+玥 0 ㄩㄝˋ
+戉 0 ㄩㄝˋ
+泧 0 ㄩㄝˋ
+鈅 0 ㄩㄝˋ
+抈 0 ㄩㄝˋ
+蚎 0 ㄩㄝˋ
+蘥 0 ㄩㄝˋ
+鸙 0 ㄩㄝˋ
+兌 0 ㄩㄝˋ
+眓 0 ㄩㄝˋ
+葯 0 ㄩㄝˋ
+魆 0 ㄩㄝˋ
+燿 0 ㄩㄝˋ
+龤 0 ㄩㄝˋ
+兊 0 ㄩㄝˋ
+兑 0 ㄩㄝˋ
+岄 0 ㄩㄝˋ
+悦 0 ㄩㄝˋ
+蚏 0 ㄩㄝˋ
+捳 0 ㄩㄝˋ
+跀 0 ㄩㄝˋ
+粤 0 ㄩㄝˋ
+楽 0 ㄩㄝˋ
+説 0 ㄩㄝˋ
+熭 0 ㄩㄝˋ
+閲 0 ㄩㄝˋ
+嬳 0 ㄩㄝˋ
+薬 0 ㄩㄝˋ
+㜰 0 ㄩㄝˋ
+爠 0 ㄩㄝˋ
+恱 0 ㄩㄝˋ
+哾 0 ㄩㄝˋ
+籰 0 ㄩㄝˋ
+篗 0 ㄩㄝˋ
+籆 0 ㄩㄝˋ
+跃 0 ㄩㄝˋ
+傭 0 ㄩㄥ
+庸 0 ㄩㄥ
+雍 0 ㄩㄥ
+擁 0 ㄩㄥ
+壅 0 ㄩㄥ
+癰 0 ㄩㄥ
+臃 0 ㄩㄥ
+墉 0 ㄩㄥ
+鏞 0 ㄩㄥ
+慵 0 ㄩㄥ
+饔 0 ㄩㄥ
+邕 0 ㄩㄥ
+廱 0 ㄩㄥ
+雝 0 ㄩㄥ
+嗈 0 ㄩㄥ
+灉 0 ㄩㄥ
+鄘 0 ㄩㄥ
+噰 0 ㄩㄥ
+澭 0 ㄩㄥ
+蕹 0 ㄩㄥ
+滽 0 ㄩㄥ
+郺 0 ㄩㄥ
+㴩 0 ㄩㄥ
+牅 0 ㄩㄥ
+㿈 0 ㄩㄥ
+癕 0 ㄩㄥ
+永 0 ㄩㄥˇ
+泳 0 ㄩㄥˇ
+詠 0 ㄩㄥˇ
+勇 0 ㄩㄥˇ
+擁 0 ㄩㄥˇ
+踴 0 ㄩㄥˇ
+湧 0 ㄩㄥˇ
+蛹 0 ㄩㄥˇ
+甬 0 ㄩㄥˇ
+壅 0 ㄩㄥˇ
+恿 0 ㄩㄥˇ
+臃 0 ㄩㄥˇ
+俑 0 ㄩㄥˇ
+踊 0 ㄩㄥˇ
+埇 0 ㄩㄥˇ
+塎 0 ㄩㄥˇ
+禜 0 ㄩㄥˇ
+涌 0 ㄩㄥˇ
+悀 0 ㄩㄥˇ
+銢 0 ㄩㄥˇ
+臾 0 ㄩㄥˇ
+咏 0 ㄩㄥˇ
+惥 0 ㄩㄥˇ
+愑 0 ㄩㄥˇ
+彮 0 ㄩㄥˇ
+慂 0 ㄩㄥˇ
+鯒 0 ㄩㄥˇ
+勈 0 ㄩㄥˇ
+柡 0 ㄩㄥˇ
+硧 0 ㄩㄥˇ
+愹 0 ㄩㄥˇ
+用 0 ㄩㄥˋ
+佣 0 ㄩㄥˋ
+醟 0 ㄩㄥˋ
+傭 0 ㄩㄥˋ
+禜 0 ㄩㄥˋ
+苚 0 ㄩㄥˋ
+傭 0 ㄩㄥˊ
+喁 0 ㄩㄥˊ
+顒 0 ㄩㄥˊ
+傛 0 ㄩㄥˊ
+槦 0 ㄩㄥˊ
+嫆 0 ㄩㄥˊ
+嵱 0 ㄩㄥˊ
+嫞 0 ㄩㄥˊ
+庸 0 ㄩㄥˊ
+慵 0 ㄩㄥˊ
+鄘 0 ㄩㄥˊ
+墉 0 ㄩㄥˊ
+滽 0 ㄩㄥˊ
+鏞 0 ㄩㄥˊ
+鷛 0 ㄩㄥˊ
+搈 0 ㄩㄥˊ
+鱅 0 ㄩㄥˊ
+㣑 0 ㄩㄥˊ
+牅 0 ㄩㄥˊ
+冤 0 ㄩㄢ
+淵 0 ㄩㄢ
+鴛 0 ㄩㄢ
+鳶 0 ㄩㄢ
+宛 0 ㄩㄢ
+眢 0 ㄩㄢ
+蜎 0 ㄩㄢ
+鵷 0 ㄩㄢ
+肙 0 ㄩㄢ
+鋺 0 ㄩㄢ
+惌 0 ㄩㄢ
+棩 0 ㄩㄢ
+蒬 0 ㄩㄢ
+裷 0 ㄩㄢ
+鼘 0 ㄩㄢ
+葾 0 ㄩㄢ
+蜵 0 ㄩㄢ
+裫 0 ㄩㄢ
+駌 0 ㄩㄢ
+嬽 0 ㄩㄢ
+灁 0 ㄩㄢ
+怨 0 ㄩㄢ
+妴 0 ㄩㄢ
+奫 0 ㄩㄢ
+潫 0 ㄩㄢ
+囦 0 ㄩㄢ
+剈 0 ㄩㄢ
+寃 0 ㄩㄢ
+渆 0 ㄩㄢ
+渊 0 ㄩㄢ
+渁 0 ㄩㄢ
+鼝 0 ㄩㄢ
+㾓 0 ㄩㄢ
+䡝 0 ㄩㄢ
+遠 0 ㄩㄢˇ
+妴 0 ㄩㄢˇ
+鋺 0 ㄩㄢˇ
+薳 0 ㄩㄢˇ
+盶 0 ㄩㄢˇ
+齳 0 ㄩㄢˇ
+齫 0 ㄩㄢˇ
+院 0 ㄩㄢˋ
+願 0 ㄩㄢˋ
+怨 0 ㄩㄢˋ
+苑 0 ㄩㄢˋ
+遠 0 ㄩㄢˋ
+媛 0 ㄩㄢˋ
+瑗 0 ㄩㄢˋ
+愿 0 ㄩㄢˋ
+掾 0 ㄩㄢˋ
+褑 0 ㄩㄢˋ
+夗 0 ㄩㄢˋ
+謜 0 ㄩㄢˋ
+禐 0 ㄩㄢˋ
+噮 0 ㄩㄢˋ
+原 0 ㄩㄢˋ
+緣 0 ㄩㄢˋ
+妴 0 ㄩㄢˋ
+菀 0 ㄩㄢˋ
+夘 0 ㄩㄢˋ
+衏 0 ㄩㄢˋ
+縁 0 ㄩㄢˋ
+褤 0 ㄩㄢˋ
+厡 0 ㄩㄢˋ
+傆 0 ㄩㄢˋ
+原 0 ㄩㄢˊ
+元 0 ㄩㄢˊ
+員 0 ㄩㄢˊ
+園 0 ㄩㄢˊ
+圓 0 ㄩㄢˊ
+緣 0 ㄩㄢˊ
+源 0 ㄩㄢˊ
+援 0 ㄩㄢˊ
+媛 0 ㄩㄢˊ
+袁 0 ㄩㄢˊ
+猿 0 ㄩㄢˊ
+垣 0 ㄩㄢˊ
+沅 0 ㄩㄢˊ
+轅 0 ㄩㄢˊ
+爰 0 ㄩㄢˊ
+圜 0 ㄩㄢˊ
+黿 0 ㄩㄢˊ
+嫄 0 ㄩㄢˊ
+櫞 0 ㄩㄢˊ
+芫 0 ㄩㄢˊ
+湲 0 ㄩㄢˊ
+騵 0 ㄩㄢˊ
+笎 0 ㄩㄢˊ
+羱 0 ㄩㄢˊ
+蝯 0 ㄩㄢˊ
+邧 0 ㄩㄢˊ
+蝝 0 ㄩㄢˊ
+妧 0 ㄩㄢˊ
+萲 0 ㄩㄢˊ
+螈 0 ㄩㄢˊ
+蚖 0 ㄩㄢˊ
+杬 0 ㄩㄢˊ
+榞 0 ㄩㄢˊ
+溒 0 ㄩㄢˊ
+媴 0 ㄩㄢˊ
+猭 0 ㄩㄢˊ
+獂 0 ㄩㄢˊ
+榬 0 ㄩㄢˊ
+蒝 0 ㄩㄢˊ
+鎱 0 ㄩㄢˊ
+邍 0 ㄩㄢˊ
+鶢 0 ㄩㄢˊ
+京 0 ㄩㄢˊ
+洹 0 ㄩㄢˊ
+苑 0 ㄩㄢˊ
+晅 0 ㄩㄢˊ
+喙 0 ㄩㄢˊ
+隕 0 ㄩㄢˊ
+姮 0 ㄩㄢˊ
+峘 0 ㄩㄢˊ
+狟 0 ㄩㄢˊ
+掾 0 ㄩㄢˊ
+椽 0 ㄩㄢˊ
+瑗 0 ㄩㄢˊ
+貆 0 ㄩㄢˊ
+禒 0 ㄩㄢˊ
+禐 0 ㄩㄢˊ
+瞏 0 ㄩㄢˊ
+縓 0 ㄩㄢˊ
+謜 0 ㄩㄢˊ
+豲 0 ㄩㄢˊ
+円 0 ㄩㄢˊ
+园 0 ㄩㄢˊ
+亰 0 ㄩㄢˊ
+貟 0 ㄩㄢˊ
+圎 0 ㄩㄢˊ
+猨 0 ㄩㄢˊ
+塬 0 ㄩㄢˊ
+睘 0 ㄩㄢˊ
+磒 0 ㄩㄢˊ
+縁 0 ㄩㄢˊ
+䲮 0 ㄩㄢˊ
+薗 0 ㄩㄢˊ
+鶰 0 ㄩㄢˊ
+厡 0 ㄩㄢˊ
+㟲 0 ㄩㄢˊ
+暅 0 ㄩㄢˊ
+魭 0 ㄩㄢˊ
+與 0 ㄩˇ
+語 0 ㄩˇ
+雨 0 ㄩˇ
+予 0 ㄩˇ
+羽 0 ㄩˇ
+嶼 0 ㄩˇ
+宇 0 ㄩˇ
+禹 0 ㄩˇ
+庾 0 ㄩˇ
+齬 0 ㄩˇ
+噢 0 ㄩˇ
+圄 0 ㄩˇ
+圉 0 ㄩˇ
+窳 0 ㄩˇ
+傴 0 ㄩˇ
+俁 0 ㄩˇ
+敔 0 ㄩˇ
+噳 0 ㄩˇ
+楀 0 ㄩˇ
+瑀 0 ㄩˇ
+与 0 ㄩˇ
+萭 0 ㄩˇ
+貐 0 ㄩˇ
+偊 0 ㄩˇ
+祤 0 ㄩˇ
+斞 0 ㄩˇ
+鄅 0 ㄩˇ
+寙 0 ㄩˇ
+篽 0 ㄩˇ
+蘌 0 ㄩˇ
+斔 0 ㄩˇ
+螤 0 ㄩˇ
+齲 0 ㄩˇ
+珝 0 ㄩˇ
+欳 0 ㄩˇ
+堣 0 ㄩˇ
+翗 0 ㄩˇ
+瘐 0 ㄩˇ
+趐 0 ㄩˇ
+嫮 0 ㄩˇ
+蝺 0 ㄩˇ
+頨 0 ㄩˇ
+踽 0 ㄩˇ
+翵 0 ㄩˇ
+璵 0 ㄩˇ
+藇 0 ㄩˇ
+麌 0 ㄩˇ
+鱮 0 ㄩˇ
+俣 0 ㄩˇ
+㝢 0 ㄩˇ
+萮 0 ㄩˇ
+魣 0 ㄩˇ
+懙 0 ㄩˇ
+伛 0 ㄩˇ
+匬 0 ㄩˇ
+㦛 0 ㄩˇ
+育 0 ㄩˋ
+遇 0 ㄩˋ
+預 0 ㄩˋ
+玉 0 ㄩˋ
+欲 0 ㄩˋ
+域 0 ㄩˋ
+喻 0 ㄩˋ
+愈 0 ㄩˋ
+譽 0 ㄩˋ
+獄 0 ㄩˋ
+慾 0 ㄩˋ
+浴 0 ㄩˋ
+裕 0 ㄩˋ
+煜 0 ㄩˋ
+寓 0 ㄩˋ
+禦 0 ㄩˋ
+與 0 ㄩˋ
+鈺 0 ㄩˋ
+豫 0 ㄩˋ
+御 0 ㄩˋ
+鬱 0 ㄩˋ
+籲 0 ㄩˋ
+諭 0 ㄩˋ
+癒 0 ㄩˋ
+郁 0 ㄩˋ
+馭 0 ㄩˋ
+昱 0 ㄩˋ
+毓 0 ㄩˋ
+芋 0 ㄩˋ
+尉 0 ㄩˋ
+熨 0 ㄩˋ
+俞 0 ㄩˋ
+峪 0 ㄩˋ
+聿 0 ㄩˋ
+嫗 0 ㄩˋ
+彧 0 ㄩˋ
+飫 0 ㄩˋ
+鬻 0 ㄩˋ
+谷 0 ㄩˋ
+鷸 0 ㄩˋ
+燠 0 ㄩˋ
+蜮 0 ㄩˋ
+堉 0 ㄩˋ
+語 0 ㄩˋ
+瘉 0 ㄩˋ
+棫 0 ㄩˋ
+澦 0 ㄩˋ
+矞 0 ㄩˋ
+禺 0 ㄩˋ
+罭 0 ㄩˋ
+蕷 0 ㄩˋ
+遹 0 ㄩˋ
+閾 0 ㄩˋ
+隩 0 ㄩˋ
+鵒 0 ㄩˋ
+棜 0 ㄩˋ
+淢 0 ㄩˋ
+燏 0 ㄩˋ
+獝 0 ㄩˋ
+繘 0 ㄩˋ
+魊 0 ㄩˋ
+薁 0 ㄩˋ
+驈 0 ㄩˋ
+悆 0 ㄩˋ
+鴥 0 ㄩˋ
+鋊 0 ㄩˋ
+淯 0 ㄩˋ
+黦 0 ㄩˋ
+栯 0 ㄩˋ
+砡 0 ㄩˋ
+礜 0 ㄩˋ
+欥 0 ㄩˋ
+軉 0 ㄩˋ
+輍 0 ㄩˋ
+悇 0 ㄩˋ
+稢 0 ㄩˋ
+蒮 0 ㄩˋ
+噊 0 ㄩˋ
+鳿 0 ㄩˋ
+醧 0 ㄩˋ
+饇 0 ㄩˋ
+爩 0 ㄩˋ
+灪 0 ㄩˋ
+戫 0 ㄩˋ
+袬 0 ㄩˋ
+緎 0 ㄩˋ
+蓹 0 ㄩˋ
+錥 0 ㄩˋ
+王 0 ㄩˋ
+卸 0 ㄩˋ
+拗 0 ㄩˋ
+玨 0 ㄩˋ
+盂 0 ㄩˋ
+雨 0 ㄩˋ
+苑 0 ㄩˋ
+娛 0 ㄩˋ
+雩 0 ㄩˋ
+愉 0 ㄩˋ
+粥 0 ㄩˋ
+奧 0 ㄩˋ
+逾 0 ㄩˋ
+蔚 0 ㄩˋ
+澳 0 ㄩˋ
+与 0 ㄩˋ
+汩 0 ㄩˋ
+掝 0 ㄩˋ
+焀 0 ㄩˋ
+郩 0 ㄩˋ
+菀 0 ㄩˋ
+綌 0 ㄩˋ
+嫮 0 ㄩˋ
+鄠 0 ㄩˋ
+踰 0 ㄩˋ
+閼 0 ㄩˋ
+儥 0 ㄩˋ
+礐 0 ㄩˋ
+鬵 0 ㄩˋ
+蘛 0 ㄩˋ
+鱊 0 ㄩˋ
+鸒 0 ㄩˋ
+抝 0 ㄩˋ
+芌 0 ㄩˋ
+兪 0 ㄩˋ
+哊 0 ㄩˋ
+珏 0 ㄩˋ
+秗 0 ㄩˋ
+俼 0 ㄩˋ
+娱 0 ㄩˋ
+娯 0 ㄩˋ
+茟 0 ㄩˋ
+惐 0 ㄩˋ
+棛 0 ㄩˋ
+淿 0 ㄩˋ
+喅 0 ㄩˋ
+喩 0 ㄩˋ
+媀 0 ㄩˋ
+㷉 0 ㄩˋ
+庽 0 ㄩˋ
+焴 0 ㄩˋ
+琙 0 ㄩˋ
+㽣 0 ㄩˋ
+䋭 0 ㄩˋ
+萮 0 ㄩˋ
+瑴 0 ㄩˋ
+銉 0 ㄩˋ
+鴪 0 ㄩˋ
+鴧 0 ㄩˋ
+礇 0 ㄩˋ
+霱 0 ㄩˋ
+鐭 0 ㄩˋ
+籞 0 ㄩˋ
+欝 0 ㄩˋ
+龥 0 ㄩˋ
+鬰 0 ㄩˋ
+缷 0 ㄩˋ
+㧒 0 ㄩˋ
+逳 0 ㄩˋ
+喐 0 ㄩˋ
+奥 0 ㄩˋ
+蜟 0 ㄩˋ
+稶 0 ㄩˋ
+穥 0 ㄩˋ
+櫲 0 ㄩˋ
+㣃 0 ㄩˋ
+於 0 ㄩˊ
+愉 0 ㄩˊ
+魚 0 ㄩˊ
+娛 0 ㄩˊ
+餘 0 ㄩˊ
+于 0 ㄩˊ
+漁 0 ㄩˊ
+予 0 ㄩˊ
+愚 0 ㄩˊ
+余 0 ㄩˊ
+竽 0 ㄩˊ
+榆 0 ㄩˊ
+逾 0 ㄩˊ
+虞 0 ㄩˊ
+俞 0 ㄩˊ
+輿 0 ㄩˊ
+瑜 0 ㄩˊ
+渝 0 ㄩˊ
+隅 0 ㄩˊ
+臾 0 ㄩˊ
+腴 0 ㄩˊ
+盂 0 ㄩˊ
+諛 0 ㄩˊ
+踰 0 ㄩˊ
+伃 0 ㄩˊ
+舁 0 ㄩˊ
+圩 0 ㄩˊ
+歟 0 ㄩˊ
+覦 0 ㄩˊ
+畬 0 ㄩˊ
+萸 0 ㄩˊ
+嵎 0 ㄩˊ
+窬 0 ㄩˊ
+妤 0 ㄩˊ
+揄 0 ㄩˊ
+歈 0 ㄩˊ
+禺 0 ㄩˊ
+轝 0 ㄩˊ
+隃 0 ㄩˊ
+雩 0 ㄩˊ
+杅 0 ㄩˊ
+楰 0 ㄩˊ
+玗 0 ㄩˊ
+緰 0 ㄩˊ
+羭 0 ㄩˊ
+蝓 0 ㄩˊ
+褕 0 ㄩˊ
+瘐 0 ㄩˊ
+艅 0 ㄩˊ
+狳 0 ㄩˊ
+邘 0 ㄩˊ
+璵 0 ㄩˊ
+硢 0 ㄩˊ
+籅 0 ㄩˊ
+釪 0 ㄩˊ
+崳 0 ㄩˊ
+湡 0 ㄩˊ
+鄃 0 ㄩˊ
+腧 0 ㄩˊ
+睮 0 ㄩˊ
+雓 0 ㄩˊ
+澞 0 ㄩˊ
+蕍 0 ㄩˊ
+螸 0 ㄩˊ
+謣 0 ㄩˊ
+鮽 0 ㄩˊ
+蘛 0 ㄩˊ
+鸆 0 ㄩˊ
+衧 0 ㄩˊ
+唹 0 ㄩˊ
+堣 0 ㄩˊ
+堬 0 ㄩˊ
+雽 0 ㄩˊ
+歶 0 ㄩˊ
+旟 0 ㄩˊ
+鰅 0 ㄩˊ
+齵 0 ㄩˊ
+吁 0 ㄩˊ
+汙 0 ㄩˊ
+污 0 ㄩˊ
+吾 0 ㄩˊ
+邪 0 ㄩˊ
+訏 0 ㄩˊ
+喻 0 ㄩˊ
+菸 0 ㄩˊ
+衙 0 ㄩˊ
+與 0 ㄩˊ
+譽 0 ㄩˊ
+亍 0 ㄩˊ
+与 0 ㄩˊ
+佘 0 ㄩˊ
+芧 0 ㄩˊ
+悇 0 ㄩˊ
+趶 0 ㄩˊ
+悆 0 ㄩˊ
+喁 0 ㄩˊ
+棜 0 ㄩˊ
+毹 0 ㄩˊ
+蜍 0 ㄩˊ
+虡 0 ㄩˊ
+顒 0 ㄩˊ
+亏 0 ㄩˊ
+汚 0 ㄩˊ
+兪 0 ㄩˊ
+娱 0 ㄩˊ
+娯 0 ㄩˊ
+桙 0 ㄩˊ
+衺 0 ㄩˊ
+酑 0 ㄩˊ
+喩 0 ㄩˊ
+媀 0 ㄩˊ
+嵛 0 ㄩˊ
+惥 0 ㄩˊ
+畭 0 ㄩˊ
+祦 0 ㄩˊ
+楡 0 ㄩˊ
+毺 0 ㄩˊ
+萮 0 ㄩˊ
+慂 0 ㄩˊ
+嬩 0 ㄩˊ
+懙 0 ㄩˊ
+鍝 0 ㄩˊ
+簴 0 ㄩˊ
+騟 0 ㄩˊ
+䱷 0 ㄩˊ
+㚥 0 ㄩˊ
+欤 0 ㄩˊ
+茰 0 ㄩˊ
+畲 0 ㄩˊ
+骬 0 ㄩˊ
+䰻 0 ㄩˊ
+㦛 0 ㄩˊ
+鷠 0 ㄩˊ
+暈 0 ㄩㄣ
+氳 0 ㄩㄣ
+縕 0 ㄩㄣ
+贇 0 ㄩㄣ
+奫 0 ㄩㄣ
+蝹 0 ㄩㄣ
+涒 0 ㄩㄣ
+氲 0 ㄩㄣ
+蒀 0 ㄩㄣ
+蒕 0 ㄩㄣ
+緼 0 ㄩㄣ
+允 0 ㄩㄣˇ
+隕 0 ㄩㄣˇ
+殞 0 ㄩㄣˇ
+狁 0 ㄩㄣˇ
+霣 0 ㄩㄣˇ
+褞 0 ㄩㄣˇ
+抎 0 ㄩㄣˇ
+賱 0 ㄩㄣˇ
+輑 0 ㄩㄣˇ
+鈗 0 ㄩㄣˇ
+阭 0 ㄩㄣˇ
+吮 0 ㄩㄣˇ
+抁 0 ㄩㄣˇ
+沇 0 ㄩㄣˇ
+荺 0 ㄩㄣˇ
+塤 0 ㄩㄣˇ
+熉 0 ㄩㄣˇ
+馻 0 ㄩㄣˇ
+薀 0 ㄩㄣˇ
+夽 0 ㄩㄣˇ
+玧 0 ㄩㄣˇ
+㽙 0 ㄩㄣˇ
+喗 0 ㄩㄣˇ
+䤞 0 ㄩㄣˇ
+腪 0 ㄩㄣˇ
+磒 0 ㄩㄣˇ
+蕰 0 ㄩㄣˇ
+䨶 0 ㄩㄣˇ
+运 0 ㄩㄣˇ
+傊 0 ㄩㄣˇ
+渷 0 ㄩㄣˇ
+運 0 ㄩㄣˋ
+韻 0 ㄩㄣˋ
+孕 0 ㄩㄣˋ
+熨 0 ㄩㄣˋ
+蘊 0 ㄩㄣˋ
+慍 0 ㄩㄣˋ
+醞 0 ㄩㄣˋ
+惲 0 ㄩㄣˋ
+暈 0 ㄩㄣˋ
+韞 0 ㄩㄣˋ
+鄆 0 ㄩㄣˋ
+薀 0 ㄩㄣˋ
+枟 0 ㄩㄣˋ
+緷 0 ㄩㄣˋ
+鶤 0 ㄩㄣˋ
+員 0 ㄩㄣˋ
+均 0 ㄩㄣˋ
+熅 0 ㄩㄣˋ
+縕 0 ㄩㄣˋ
+賱 0 ㄩㄣˋ
+璭 0 ㄩㄣˋ
+餫 0 ㄩㄣˋ
+韗 0 ㄩㄣˋ
+貟 0 ㄩㄣˋ
+愠 0 ㄩㄣˋ
+煴 0 ㄩㄣˋ
+腪 0 ㄩㄣˋ
+韵 0 ㄩㄣˋ
+緼 0 ㄩㄣˋ
+蕰 0 ㄩㄣˋ
+醖 0 ㄩㄣˋ
+藴 0 ㄩㄣˋ
+鵾 0 ㄩㄣˋ
+运 0 ㄩㄣˋ
+䲰 0 ㄩㄣˋ
+鞰 0 ㄩㄣˋ
+雲 0 ㄩㄣˊ
+云 0 ㄩㄣˊ
+勻 0 ㄩㄣˊ
+昀 0 ㄩㄣˊ
+耘 0 ㄩㄣˊ
+芸 0 ㄩㄣˊ
+紜 0 ㄩㄣˊ
+熅 0 ㄩㄣˊ
+筠 0 ㄩㄣˊ
+溳 0 ㄩㄣˊ
+澐 0 ㄩㄣˊ
+畇 0 ㄩㄣˊ
+篔 0 ㄩㄣˊ
+沄 0 ㄩㄣˊ
+熉 0 ㄩㄣˊ
+鋆 0 ㄩㄣˊ
+蕓 0 ㄩㄣˊ
+妘 0 ㄩㄣˊ
+伝 0 ㄩㄣˊ
+縜 0 ㄩㄣˊ
+荺 0 ㄩㄣˊ
+鄖 0 ㄩㄣˊ
+枃 0 ㄩㄣˊ
+眃 0 ㄩㄣˊ
+員 0 ㄩㄣˊ
+呁 0 ㄩㄣˊ
+盷 0 ㄩㄣˊ
+笉 0 ㄩㄣˊ
+匀 0 ㄩㄣˊ
+囩 0 ㄩㄣˊ
+秐 0 ㄩㄣˊ
+貟 0 ㄩㄣˊ
+愪 0 ㄩㄣˊ
+煴 0 ㄩㄣˊ
+蒷 0 ㄩㄣˊ
+橒 0 ㄩㄣˊ
+耺 0 ㄩㄣˊ
+司 0 ㄙ
+思 0 ㄙ
+斯 0 ㄙ
+絲 0 ㄙ
+私 0 ㄙ
+撕 0 ㄙ
+廝 0 ㄙ
+鷥 0 ㄙ
+嘶 0 ㄙ
+ㄙ 0 ㄙ
+澌 0 ㄙ
+緦 0 ㄙ
+偲 0 ㄙ
+罳 0 ㄙ
+颸 0 ㄙ
+禠 0 ㄙ
+虒 0 ㄙ
+楒 0 ㄙ
+鍶 0 ㄙ
+凘 0 ㄙ
+泀 0 ㄙ
+蕬 0 ㄙ
+鉰 0 ㄙ
+俬 0 ㄙ
+覗 0 ㄙ
+榹 0 ㄙ
+禗 0 ㄙ
+蜤 0 ㄙ
+磃 0 ㄙ
+謕 0 ㄙ
+蟴 0 ㄙ
+鼶 0 ㄙ
+糸 0 ㄙ
+葸 0 ㄙ
+螄 0 ㄙ
+諰 0 ㄙ
+簁 0 ㄙ
+厶 0 ㄙ
+㺨 0 ㄙ
+恖 0 ㄙ
+媤 0 ㄙ
+愢 0 ㄙ
+厮 0 ㄙ
+簛 0 ㄙ
+蟖 0 ㄙ
+騦 0 ㄙ
+籭 0 ㄙ
+㴲 0 ㄙ
+䔮 0 ㄙ
+䰄 0 ㄙ
+鐁 0 ㄙ
+搜 0 ㄙㄡ
+颼 0 ㄙㄡ
+鄋 0 ㄙㄡ
+蒐 0 ㄙㄡ
+廋 0 ㄙㄡ
+溲 0 ㄙㄡ
+餿 0 ㄙㄡ
+獀 0 ㄙㄡ
+醙 0 ㄙㄡ
+嗖 0 ㄙㄡ
+鎪 0 ㄙㄡ
+騪 0 ㄙㄡ
+叟 0 ㄙㄡ
+艘 0 ㄙㄡ
+叜 0 ㄙㄡ
+捒 0 ㄙㄡ
+捜 0 ㄙㄡ
+傁 0 ㄙㄡ
+廀 0 ㄙㄡ
+摗 0 ㄙㄡ
+蓃 0 ㄙㄡ
+撨 0 ㄙㄡ
+螋 0 ㄙㄡ
+叟 0 ㄙㄡˇ
+嗾 0 ㄙㄡˇ
+藪 0 ㄙㄡˇ
+擻 0 ㄙㄡˇ
+瞍 0 ㄙㄡˇ
+謏 0 ㄙㄡˇ
+籔 0 ㄙㄡˇ
+廋 0 ㄙㄡˇ
+溲 0 ㄙㄡˇ
+叜 0 ㄙㄡˇ
+傁 0 ㄙㄡˇ
+廀 0 ㄙㄡˇ
+蓃 0 ㄙㄡˇ
+櫢 0 ㄙㄡˇ
+嗽 0 ㄙㄡˋ
+漱 0 ㄙㄡˋ
+擻 0 ㄙㄡˋ
+欶 0 ㄙㄡˋ
+廋 0 ㄙㄡˋ
+瘐 0 ㄙㄡˋ
+凁 0 ㄙㄡˋ
+廀 0 ㄙㄡˋ
+潄 0 ㄙㄡˋ
+瘶 0 ㄙㄡˋ
+僧 0 ㄙㄥ
+鬙 0 ㄙㄥ
+䒏 0 ㄙㄥ
+喪 0 ㄙㄤ
+桑 0 ㄙㄤ
+縔 0 ㄙㄤ
+桒 0 ㄙㄤ
+槡 0 ㄙㄤ
+嗓 0 ㄙㄤˇ
+顙 0 ㄙㄤˇ
+搡 0 ㄙㄤˇ
+磉 0 ㄙㄤˇ
+鎟 0 ㄙㄤˇ
+褬 0 ㄙㄤˇ
+喪 0 ㄙㄤˋ
+三 0 ㄙㄢ
+參 0 ㄙㄢ
+毿 0 ㄙㄢ
+鬖 0 ㄙㄢ
+仨 0 ㄙㄢ
+槮 0 ㄙㄢ
+襂 0 ㄙㄢ
+弎 0 ㄙㄢ
+叁 0 ㄙㄢ
+参 0 ㄙㄢ
+叄 0 ㄙㄢ
+叅 0 ㄙㄢ
+椮 0 ㄙㄢ
+犙 0 ㄙㄢ
+曑 0 ㄙㄢ
+謲 0 ㄙㄢ
+散 0 ㄙㄢˇ
+傘 0 ㄙㄢˇ
+繖 0 ㄙㄢˇ
+糝 0 ㄙㄢˇ
+鏾 0 ㄙㄢˇ
+槮 0 ㄙㄢˇ
+鏒 0 ㄙㄢˇ
+椮 0 ㄙㄢˇ
+嘇 0 ㄙㄢˇ
+潵 0 ㄙㄢˇ
+糂 0 ㄙㄢˇ
+糣 0 ㄙㄢˇ
+仐 0 ㄙㄢˇ
+糤 0 ㄙㄢˇ
+饊 0 ㄙㄢˇ
+散 0 ㄙㄢˋ
+閐 0 ㄙㄢˋ
+三 0 ㄙㄢˋ
+霰 0 ㄙㄢˋ
+鏾 0 ㄙㄢˋ
+弎 0 ㄙㄢˋ
+俕 0 ㄙㄢˋ
+死 0 ㄙˇ
+四 0 ㄙˋ
+似 0 ㄙˋ
+賜 0 ㄙˋ
+嗣 0 ㄙˋ
+飼 0 ㄙˋ
+寺 0 ㄙˋ
+肆 0 ㄙˋ
+祀 0 ㄙˋ
+食 0 ㄙˋ
+俟 0 ㄙˋ
+伺 0 ㄙˋ
+泗 0 ㄙˋ
+巳 0 ㄙˋ
+耜 0 ㄙˋ
+儩 0 ㄙˋ
+姒 0 ㄙˋ
+笥 0 ㄙˋ
+駟 0 ㄙˋ
+兕 0 ㄙˋ
+涘 0 ㄙˋ
+柶 0 ㄙˋ
+汜 0 ㄙˋ
+肂 0 ㄙˋ
+貄 0 ㄙˋ
+蕼 0 ㄙˋ
+洍 0 ㄙˋ
+思 0 ㄙˋ
+廁 0 ㄙˋ
+圮 0 ㄙˋ
+怬 0 ㄙˋ
+羠 0 ㄙˋ
+鈶 0 ㄙˋ
+佀 0 ㄙˋ
+孠 0 ㄙˋ
+杫 0 ㄙˋ
+泤 0 ㄙˋ
+牭 0 ㄙˋ
+恖 0 ㄙˋ
+厠 0 ㄙˋ
+釲 0 ㄙˋ
+竢 0 ㄙˋ
+鈻 0 ㄙˋ
+禩 0 ㄙˋ
+瀃 0 ㄙˋ
+亖 0 ㄙˋ
+攺 0 ㄙˋ
+㹭 0 ㄙˋ
+逘 0 ㄙˋ
+𥒲 0 ㄙˋ
+娰 0 ㄙˋ
+撒 0 ㄙㄚ
+仨 0 ㄙㄚ
+三 0 ㄙㄚ
+弎 0 ㄙㄚ
+灑 0 ㄙㄚˇ
+撒 0 ㄙㄚˇ
+靸 0 ㄙㄚˇ
+洒 0 ㄙㄚˇ
+薩 0 ㄙㄚˋ
+卅 0 ㄙㄚˋ
+趿 0 ㄙㄚˋ
+颯 0 ㄙㄚˋ
+攃 0 ㄙㄚˋ
+馺 0 ㄙㄚˋ
+隡 0 ㄙㄚˋ
+蔡 0 ㄙㄚˋ
+摋 0 ㄙㄚˋ
+鎝 0 ㄙㄚˋ
+躠 0 ㄙㄚˋ
+蕯 0 ㄙㄚˋ
+櫒 0 ㄙㄚˋ
+挲 0 ㄙㄚ˙
+薩 0 ㄙㄚ˙
+挱 0 ㄙㄚ˙
+塞 0 ㄙㄞ
+鰓 0 ㄙㄞ
+腮 0 ㄙㄞ
+毢 0 ㄙㄞ
+揌 0 ㄙㄞ
+思 0 ㄙㄞ
+偲 0 ㄙㄞ
+毸 0 ㄙㄞ
+恖 0 ㄙㄞ
+愢 0 ㄙㄞ
+噻 0 ㄙㄞ
+顋 0 ㄙㄞ
+䚡 0 ㄙㄞ
+賽 0 ㄙㄞˋ
+塞 0 ㄙㄞˋ
+僿 0 ㄙㄞˋ
+簺 0 ㄙㄞˋ
+蘇 0 ㄙㄨ
+甦 0 ㄙㄨ
+酥 0 ㄙㄨ
+穌 0 ㄙㄨ
+囌 0 ㄙㄨ
+櫯 0 ㄙㄨ
+疏 0 ㄙㄨ
+蔬 0 ㄙㄨ
+薊 0 ㄙㄨ
+姀 0 ㄙㄨ
+鉌 0 ㄙㄨ
+鞂 0 ㄙㄨ
+龢 0 ㄙㄨ
+疎 0 ㄙㄨ
+踈 0 ㄙㄨ
+鯂 0 ㄙㄨ
+蘓 0 ㄙㄨ
+松 0 ㄙㄨㄥ
+鬆 0 ㄙㄨㄥ
+淞 0 ㄙㄨㄥ
+嵩 0 ㄙㄨㄥ
+忪 0 ㄙㄨㄥ
+菘 0 ㄙㄨㄥ
+娀 0 ㄙㄨㄥ
+崧 0 ㄙㄨㄥ
+濍 0 ㄙㄨㄥ
+倯 0 ㄙㄨㄥ
+硹 0 ㄙㄨㄥ
+蜙 0 ㄙㄨㄥ
+枀 0 ㄙㄨㄥ
+柗 0 ㄙㄨㄥ
+凇 0 ㄙㄨㄥ
+庺 0 ㄙㄨㄥ
+梥 0 ㄙㄨㄥ
+憽 0 ㄙㄨㄥ
+檧 0 ㄙㄨㄥ
+聳 0 ㄙㄨㄥˇ
+慫 0 ㄙㄨㄥˇ
+悚 0 ㄙㄨㄥˇ
+竦 0 ㄙㄨㄥˇ
+傱 0 ㄙㄨㄥˇ
+愯 0 ㄙㄨㄥˇ
+嵷 0 ㄙㄨㄥˇ
+駷 0 ㄙㄨㄥˇ
+捒 0 ㄙㄨㄥˇ
+摗 0 ㄙㄨㄥˇ
+㩳 0 ㄙㄨㄥˇ
+耸 0 ㄙㄨㄥˇ
+送 0 ㄙㄨㄥˋ
+宋 0 ㄙㄨㄥˋ
+頌 0 ㄙㄨㄥˋ
+訟 0 ㄙㄨㄥˋ
+誦 0 ㄙㄨㄥˋ
+㕬 0 ㄙㄨㄥˋ
+餸 0 ㄙㄨㄥˋ
+悚 0 ㄙㄨㄥˊ
+酸 0 ㄙㄨㄢ
+痠 0 ㄙㄨㄢ
+狻 0 ㄙㄨㄢ
+匴 0 ㄙㄨㄢˇ
+篹 0 ㄙㄨㄢˇ
+算 0 ㄙㄨㄢˋ
+蒜 0 ㄙㄨㄢˋ
+筭 0 ㄙㄨㄢˋ
+萛 0 ㄙㄨㄢˋ
+匴 0 ㄙㄨㄢˋ
+祘 0 ㄙㄨㄢˋ
+訴 0 ㄙㄨˋ
+速 0 ㄙㄨˋ
+素 0 ㄙㄨˋ
+肅 0 ㄙㄨˋ
+宿 0 ㄙㄨˋ
+塑 0 ㄙㄨˋ
+夙 0 ㄙㄨˋ
+粟 0 ㄙㄨˋ
+溯 0 ㄙㄨˋ
+餗 0 ㄙㄨˋ
+愬 0 ㄙㄨˋ
+蓿 0 ㄙㄨˋ
+縮 0 ㄙㄨˋ
+觫 0 ㄙㄨˋ
+愫 0 ㄙㄨˋ
+膆 0 ㄙㄨˋ
+謖 0 ㄙㄨˋ
+嗉 0 ㄙㄨˋ
+橚 0 ㄙㄨˋ
+泝 0 ㄙㄨˋ
+涑 0 ㄙㄨˋ
+潚 0 ㄙㄨˋ
+簌 0 ㄙㄨˋ
+蔌 0 ㄙㄨˋ
+樕 0 ㄙㄨˋ
+遫 0 ㄙㄨˋ
+驌 0 ㄙㄨˋ
+鱐 0 ㄙㄨˋ
+鷫 0 ㄙㄨˋ
+嫊 0 ㄙㄨˋ
+玊 0 ㄙㄨˋ
+榡 0 ㄙㄨˋ
+洬 0 ㄙㄨˋ
+栜 0 ㄙㄨˋ
+傃 0 ㄙㄨˋ
+溹 0 ㄙㄨˋ
+憟 0 ㄙㄨˋ
+鋉 0 ㄙㄨˋ
+縤 0 ㄙㄨˋ
+藗 0 ㄙㄨˋ
+僳 0 ㄙㄨˋ
+窣 0 ㄙㄨˋ
+數 0 ㄙㄨˋ
+稷 0 ㄙㄨˋ
+摍 0 ㄙㄨˋ
+熽 0 ㄙㄨˋ
+蹜 0 ㄙㄨˋ
+颽 0 ㄙㄨˋ
+珟 0 ㄙㄨˋ
+殐 0 ㄙㄨˋ
+粛 0 ㄙㄨˋ
+塐 0 ㄙㄨˋ
+㨞 0 ㄙㄨˋ
+数 0 ㄙㄨˋ
+溸 0 ㄙㄨˋ
+趚 0 ㄙㄨˋ
+遡 0 ㄙㄨˋ
+樎 0 ㄙㄨˋ
+㯈 0 ㄙㄨˋ
+潥 0 ㄙㄨˋ
+璛 0 ㄙㄨˋ
+碿 0 ㄙㄨˋ
+㩋 0 ㄙㄨˋ
+俗 0 ㄙㄨˊ
+縮 0 ㄙㄨㄛ
+梭 0 ㄙㄨㄛ
+莎 0 ㄙㄨㄛ
+唆 0 ㄙㄨㄛ
+娑 0 ㄙㄨㄛ
+簑 0 ㄙㄨㄛ
+嗦 0 ㄙㄨㄛ
+傞 0 ㄙㄨㄛ
+挲 0 ㄙㄨㄛ
+蓑 0 ㄙㄨㄛ
+桫 0 ㄙㄨㄛ
+蹜 0 ㄙㄨㄛ
+莏 0 ㄙㄨㄛ
+趖 0 ㄙㄨㄛ
+摍 0 ㄙㄨㄛ
+嗾 0 ㄙㄨㄛ
+莤 0 ㄙㄨㄛ
+㛖 0 ㄙㄨㄛ
+挱 0 ㄙㄨㄛ
+桬 0 ㄙㄨㄛ
+鮻 0 ㄙㄨㄛ
+䔋 0 ㄙㄨㄛ
+所 0 ㄙㄨㄛˇ
+索 0 ㄙㄨㄛˇ
+鎖 0 ㄙㄨㄛˇ
+瑣 0 ㄙㄨㄛˇ
+璅 0 ㄙㄨㄛˇ
+嗩 0 ㄙㄨㄛˇ
+摵 0 ㄙㄨㄛˇ
+鎍 0 ㄙㄨㄛˇ
+鏼 0 ㄙㄨㄛˇ
+惢 0 ㄙㄨㄛˇ
+溑 0 ㄙㄨㄛˇ
+鎻 0 ㄙㄨㄛˇ
+鏁 0 ㄙㄨㄛˇ
+暛 0 ㄙㄨㄛˇ
+褨 0 ㄙㄨㄛˇ
+擌 0 ㄙㄨㄛˇ
+逤 0 ㄙㄨㄛˋ
+些 0 ㄙㄨㄛˋ
+塑 0 ㄙㄨㄛˋ
+溯 0 ㄙㄨㄛˋ
+㱔 0 ㄙㄨㄛˋ
+塐 0 ㄙㄨㄛˋ
+蜶 0 ㄙㄨㄛˋ
+遡 0 ㄙㄨㄛˋ
+索 0 ㄙㄨㄛˊ
+雖 0 ㄙㄨㄟ
+綏 0 ㄙㄨㄟ
+濉 0 ㄙㄨㄟ
+睢 0 ㄙㄨㄟ
+荽 0 ㄙㄨㄟ
+毸 0 ㄙㄨㄟ
+眭 0 ㄙㄨㄟ
+浽 0 ㄙㄨㄟ
+哸 0 ㄙㄨㄟ
+娞 0 ㄙㄨㄟ
+荾 0 ㄙㄨㄟ
+滖 0 ㄙㄨㄟ
+尿 0 ㄙㄨㄟ
+葰 0 ㄙㄨㄟ
+雎 0 ㄙㄨㄟ
+夊 0 ㄙㄨㄟ
+芕 0 ㄙㄨㄟ
+虽 0 ㄙㄨㄟ
+奞 0 ㄙㄨㄟ
+熣 0 ㄙㄨㄟ
+鴡 0 ㄙㄨㄟ
+䕑 0 ㄙㄨㄟ
+鞖 0 ㄙㄨㄟ
+髓 0 ㄙㄨㄟˇ
+嶲 0 ㄙㄨㄟˇ
+瀡 0 ㄙㄨㄟˇ
+巂 0 ㄙㄨㄟˇ
+靃 0 ㄙㄨㄟˇ
+雟 0 ㄙㄨㄟˇ
+膸 0 ㄙㄨㄟˇ
+髄 0 ㄙㄨㄟˇ
+歲 0 ㄙㄨㄟˋ
+遂 0 ㄙㄨㄟˋ
+碎 0 ㄙㄨㄟˋ
+穗 0 ㄙㄨㄟˋ
+隧 0 ㄙㄨㄟˋ
+祟 0 ㄙㄨㄟˋ
+燧 0 ㄙㄨㄟˋ
+誶 0 ㄙㄨㄟˋ
+睟 0 ㄙㄨㄟˋ
+穟 0 ㄙㄨㄟˋ
+璲 0 ㄙㄨㄟˋ
+檖 0 ㄙㄨㄟˋ
+襚 0 ㄙㄨㄟˋ
+鐩 0 ㄙㄨㄟˋ
+邃 0 ㄙㄨㄟˋ
+埣 0 ㄙㄨㄟˋ
+賥 0 ㄙㄨㄟˋ
+檅 0 ㄙㄨㄟˋ
+繀 0 ㄙㄨㄟˋ
+禭 0 ㄙㄨㄟˋ
+旞 0 ㄙㄨㄟˋ
+繸 0 ㄙㄨㄟˋ
+鐆 0 ㄙㄨㄟˋ
+術 0 ㄙㄨㄟˋ
+箤 0 ㄙㄨㄟˋ
+劌 0 ㄙㄨㄟˋ
+薉 0 ㄙㄨㄟˋ
+繐 0 ㄙㄨㄟˋ
+鏏 0 ㄙㄨㄟˋ
+鐬 0 ㄙㄨㄟˋ
+饖 0 ㄙㄨㄟˋ
+顪 0 ㄙㄨㄟˋ
+亗 0 ㄙㄨㄟˋ
+砕 0 ㄙㄨㄟˋ
+嵗 0 ㄙㄨㄟˋ
+歳 0 ㄙㄨㄟˋ
+煫 0 ㄙㄨㄟˋ
+穂 0 ㄙㄨㄟˋ
+嬘 0 ㄙㄨㄟˋ
+澻 0 ㄙㄨㄟˋ
+譢 0 ㄙㄨㄟˋ
+韢 0 ㄙㄨㄟˋ
+疩 0 ㄙㄨㄟˋ
+隨 0 ㄙㄨㄟˊ
+隋 0 ㄙㄨㄟˊ
+雟 0 ㄙㄨㄟˊ
+綏 0 ㄙㄨㄟˊ
+遂 0 ㄙㄨㄟˊ
+雖 0 ㄙㄨㄟˊ
+陏 0 ㄙㄨㄟˊ
+虽 0 ㄙㄨㄟˊ
+遀 0 ㄙㄨㄟˊ
+随 0 ㄙㄨㄟˊ
+瓍 0 ㄙㄨㄟˊ
+孫 0 ㄙㄨㄣ
+飧 0 ㄙㄨㄣ
+蓀 0 ㄙㄨㄣ
+猻 0 ㄙㄨㄣ
+搎 0 ㄙㄨㄣ
+槂 0 ㄙㄨㄣ
+薞 0 ㄙㄨㄣ
+蕵 0 ㄙㄨㄣ
+飱 0 ㄙㄨㄣ
+損 0 ㄙㄨㄣˇ
+筍 0 ㄙㄨㄣˇ
+榫 0 ㄙㄨㄣˇ
+簨 0 ㄙㄨㄣˇ
+鎨 0 ㄙㄨㄣˇ
+隕 0 ㄙㄨㄣˇ
+芛 0 ㄙㄨㄣˇ
+塤 0 ㄙㄨㄣˇ
+笋 0 ㄙㄨㄣˇ
+磒 0 ㄙㄨㄣˇ
+箰 0 ㄙㄨㄣˇ
+潠 0 ㄙㄨㄣˋ
+愻 0 ㄙㄨㄣˋ
+孫 0 ㄙㄨㄣˋ
+巽 0 ㄙㄨㄣˋ
+遜 0 ㄙㄨㄣˋ
+噀 0 ㄙㄨㄣˋ
+巺 0 ㄙㄨㄣˋ
+摌 0 ㄙㄨㄣˋ
+顨 0 ㄙㄨㄣˋ
+色 0 ㄙㄜˋ
+塞 0 ㄙㄜˋ
+瑟 0 ㄙㄜˋ
+圾 0 ㄙㄜˋ
+嗇 0 ㄙㄜˋ
+澀 0 ㄙㄜˋ
+穡 0 ㄙㄜˋ
+濇 0 ㄙㄜˋ
+轖 0 ㄙㄜˋ
+譅 0 ㄙㄜˋ
+銫 0 ㄙㄜˋ
+璱 0 ㄙㄜˋ
+翜 0 ㄙㄜˋ
+犞 0 ㄙㄜˋ
+飋 0 ㄙㄜˋ
+濏 0 ㄙㄜˋ
+摵 0 ㄙㄜˋ
+鏼 0 ㄙㄜˋ
+歮 0 ㄙㄜˋ
+趇 0 ㄙㄜˋ
+雭 0 ㄙㄜˋ
+澁 0 ㄙㄜˋ
+懎 0 ㄙㄜˋ
+繬 0 ㄙㄜˋ
+穯 0 ㄙㄜˋ
+渋 0 ㄙㄜˋ
+歰 0 ㄙㄜˋ
+瀒 0 ㄙㄜˋ
+艘 0 ㄙㄠ
+騷 0 ㄙㄠ
+繅 0 ㄙㄠ
+搔 0 ㄙㄠ
+臊 0 ㄙㄠ
+慅 0 ㄙㄠ
+溞 0 ㄙㄠ
+颾 0 ㄙㄠ
+鱢 0 ㄙㄠ
+橾 0 ㄙㄠ
+璅 0 ㄙㄠ
+瘙 0 ㄙㄠ
+糔 0 ㄙㄠ
+繰 0 ㄙㄠ
+鰺 0 ㄙㄠ
+鰠 0 ㄙㄠ
+掃 0 ㄙㄠˇ
+嫂 0 ㄙㄠˇ
+埽 0 ㄙㄠˇ
+掃 0 ㄙㄠˋ
+臊 0 ㄙㄠˋ
+氉 0 ㄙㄠˋ
+瘙 0 ㄙㄠˋ
+埽 0 ㄙㄠˋ
+髞 0 ㄙㄠˋ
+塞 0 ㄙㄟ
+森 0 ㄙㄣ
+槮 0 ㄙㄣ
+罧 0 ㄙㄣ
+襂 0 ㄙㄣ
+幓 0 ㄙㄣ
+篸 0 ㄙㄣ
+穼 0 ㄙㄣ
+椮 0 ㄙㄣ
+ㄟ 0 ㄟ
+欸 0 ㄟ
+欸 0 ㄟˋ
+恩 0 ㄣ
+嗯 0 ㄣ
+ㄣ 0 ㄣ
+蒽 0 ㄣ
+峎 0 ㄣˇ
+摁 0 ㄣˋ
+ㄆ 0 ㄆ
+剖 0 ㄆㄡ
+吥 0 ㄆㄡ
+娝 0 ㄆㄡ
+剖 0 ㄆㄡˇ
+瓿 0 ㄆㄡˇ
+棓 0 ㄆㄡˇ
+婄 0 ㄆㄡˇ
+叵 0 ㄆㄡˇ
+培 0 ㄆㄡˇ
+掊 0 ㄆㄡˇ
+咅 0 ㄆㄡˇ
+勏 0 ㄆㄡˇ
+犃 0 ㄆㄡˇ
+箁 0 ㄆㄡˇ
+哣 0 ㄆㄡˇ
+掊 0 ㄆㄡˊ
+裒 0 ㄆㄡˊ
+抔 0 ㄆㄡˊ
+捊 0 ㄆㄡˊ
+抙 0 ㄆㄡˊ
+箁 0 ㄆㄡˊ
+錇 0 ㄆㄡˊ
+砰 0 ㄆㄥ
+烹 0 ㄆㄥ
+抨 0 ㄆㄥ
+怦 0 ㄆㄥ
+漰 0 ㄆㄥ
+澎 0 ㄆㄥ
+匉 0 ㄆㄥ
+閛 0 ㄆㄥ
+恲 0 ㄆㄥ
+軯 0 ㄆㄥ
+駍 0 ㄆㄥ
+磞 0 ㄆㄥ
+亨 0 ㄆㄥ
+硼 0 ㄆㄥ
+泙 0 ㄆㄥ
+淜 0 ㄆㄥ
+㛁 0 ㄆㄥ
+胓 0 ㄆㄥ
+㧸 0 ㄆㄥ
+硑 0 ㄆㄥ
+嘭 0 ㄆㄥ
+梈 0 ㄆㄥ
+捧 0 ㄆㄥˇ
+皏 0 ㄆㄥˇ
+淎 0 ㄆㄥˇ
+碰 0 ㄆㄥˋ
+堋 0 ㄆㄥˋ
+掽 0 ㄆㄥˋ
+椪 0 ㄆㄥˋ
+踫 0 ㄆㄥˋ
+甏 0 ㄆㄥˋ
+朋 0 ㄆㄥˊ
+彭 0 ㄆㄥˊ
+澎 0 ㄆㄥˊ
+蓬 0 ㄆㄥˊ
+膨 0 ㄆㄥˊ
+硼 0 ㄆㄥˊ
+棚 0 ㄆㄥˊ
+鵬 0 ㄆㄥˊ
+篷 0 ㄆㄥˊ
+蟛 0 ㄆㄥˊ
+芃 0 ㄆㄥˊ
+淜 0 ㄆㄥˊ
+鬅 0 ㄆㄥˊ
+痭 0 ㄆㄥˊ
+錋 0 ㄆㄥˊ
+倗 0 ㄆㄥˊ
+輣 0 ㄆㄥˊ
+傰 0 ㄆㄥˊ
+韸 0 ㄆㄥˊ
+髼 0 ㄆㄥˊ
+憉 0 ㄆㄥˊ
+樥 0 ㄆㄥˊ
+鑝 0 ㄆㄥˊ
+逢 0 ㄆㄥˊ
+堋 0 ㄆㄥˊ
+磞 0 ㄆㄥˊ
+竼 0 ㄆㄥˊ
+浲 0 ㄆㄥˊ
+塜 0 ㄆㄥˊ
+稝 0 ㄆㄥˊ
+塳 0 ㄆㄥˊ
+漨 0 ㄆㄥˊ
+槰 0 ㄆㄥˊ
+蟚 0 ㄆㄥˊ
+韼 0 ㄆㄥˊ
+騯 0 ㄆㄥˊ
+纄 0 ㄆㄥˊ
+蘕 0 ㄆㄥˊ
+鬔 0 ㄆㄥˊ
+㦀 0 ㄆㄥˊ
+䮾 0 ㄆㄥˊ
+乓 0 ㄆㄤ
+磅 0 ㄆㄤ
+滂 0 ㄆㄤ
+膀 0 ㄆㄤ
+汸 0 ㄆㄤ
+胮 0 ㄆㄤ
+膖 0 ㄆㄤ
+髈 0 ㄆㄤ
+霶 0 ㄆㄤ
+嗙 0 ㄆㄤˇ
+耪 0 ㄆㄤˇ
+覫 0 ㄆㄤˇ
+胖 0 ㄆㄤˋ
+㕩 0 ㄆㄤˋ
+炐 0 ㄆㄤˋ
+肨 0 ㄆㄤˋ
+旁 0 ㄆㄤˊ
+龐 0 ㄆㄤˊ
+膀 0 ㄆㄤˊ
+螃 0 ㄆㄤˊ
+徬 0 ㄆㄤˊ
+蒡 0 ㄆㄤˊ
+厖 0 ㄆㄤˊ
+尨 0 ㄆㄤˊ
+雱 0 ㄆㄤˊ
+逄 0 ㄆㄤˊ
+庬 0 ㄆㄤˊ
+篣 0 ㄆㄤˊ
+舽 0 ㄆㄤˊ
+彷 0 ㄆㄤˊ
+傍 0 ㄆㄤˊ
+嫎 0 ㄆㄤˊ
+龎 0 ㄆㄤˊ
+髈 0 ㄆㄤˊ
+潘 0 ㄆㄢ
+攀 0 ㄆㄢ
+眅 0 ㄆㄢ
+扳 0 ㄆㄢ
+拚 0 ㄆㄢ
+番 0 ㄆㄢ
+㐴 0 ㄆㄢ
+畨 0 ㄆㄢ
+坢 0 ㄆㄢˇ
+判 0 ㄆㄢˋ
+叛 0 ㄆㄢˋ
+盼 0 ㄆㄢˋ
+畔 0 ㄆㄢˋ
+拚 0 ㄆㄢˋ
+袢 0 ㄆㄢˋ
+泮 0 ㄆㄢˋ
+襻 0 ㄆㄢˋ
+詊 0 ㄆㄢˋ
+頄 0 ㄆㄢˋ
+溿 0 ㄆㄢˋ
+沜 0 ㄆㄢˋ
+牉 0 ㄆㄢˋ
+頖 0 ㄆㄢˋ
+拌 0 ㄆㄢˋ
+盻 0 ㄆㄢˋ
+冸 0 ㄆㄢˋ
+炍 0 ㄆㄢˋ
+鑻 0 ㄆㄢˋ
+鋬 0 ㄆㄢˋ
+盤 0 ㄆㄢˊ
+磐 0 ㄆㄢˊ
+蟠 0 ㄆㄢˊ
+般 0 ㄆㄢˊ
+胖 0 ㄆㄢˊ
+槃 0 ㄆㄢˊ
+蹣 0 ㄆㄢˊ
+磻 0 ㄆㄢˊ
+踫 0 ㄆㄢˊ
+鞶 0 ㄆㄢˊ
+幋 0 ㄆㄢˊ
+縏 0 ㄆㄢˊ
+柈 0 ㄆㄢˊ
+瀊 0 ㄆㄢˊ
+蒰 0 ㄆㄢˊ
+媻 0 ㄆㄢˊ
+搫 0 ㄆㄢˊ
+跘 0 ㄆㄢˊ
+弁 0 ㄆㄢˊ
+樊 0 ㄆㄢˊ
+顢 0 ㄆㄢˊ
+鎜 0 ㄆㄢˊ
+趴 0 ㄆㄚ
+葩 0 ㄆㄚ
+啪 0 ㄆㄚ
+蚆 0 ㄆㄚ
+舥 0 ㄆㄚ
+夿 0 ㄆㄚ
+妑 0 ㄆㄚ
+皅 0 ㄆㄚ
+𥐙 0 ㄆㄚ
+怕 0 ㄆㄚˋ
+帕 0 ㄆㄚˋ
+帊 0 ㄆㄚˋ
+袙 0 ㄆㄚˋ
+汃 0 ㄆㄚˋ
+袹 0 ㄆㄚˋ
+帞 0 ㄆㄚˋ
+絈 0 ㄆㄚˋ
+爬 0 ㄆㄚˊ
+扒 0 ㄆㄚˊ
+琶 0 ㄆㄚˊ
+耙 0 ㄆㄚˊ
+杷 0 ㄆㄚˊ
+跁 0 ㄆㄚˊ
+筢 0 ㄆㄚˊ
+欛 0 ㄆㄚˊ
+潖 0 ㄆㄚˊ
+杷 0 ㄆㄚ˙
+琶 0 ㄆㄚ˙
+欛 0 ㄆㄚ˙
+拍 0 ㄆㄞ
+啪 0 ㄆㄞ
+𢫦 0 ㄆㄞ
+俖 0 ㄆㄞˇ
+排 0 ㄆㄞˇ
+㧳 0 ㄆㄞˇ
+派 0 ㄆㄞˋ
+湃 0 ㄆㄞˋ
+鎃 0 ㄆㄞˋ
+蒎 0 ㄆㄞˋ
+排 0 ㄆㄞˊ
+牌 0 ㄆㄞˊ
+徘 0 ㄆㄞˊ
+俳 0 ㄆㄞˊ
+簰 0 ㄆㄞˊ
+棑 0 ㄆㄞˊ
+箄 0 ㄆㄞˊ
+輫 0 ㄆㄞˊ
+猅 0 ㄆㄞˊ
+波 0 ㄆㄛ
+潑 0 ㄆㄛ
+坡 0 ㄆㄛ
+陂 0 ㄆㄛ
+鏺 0 ㄆㄛ
+癹 0 ㄆㄛ
+翍 0 ㄆㄛ
+頗 0 ㄆㄛ
+沷 0 ㄆㄛ
+汖 0 ㄆㄛ
+昁 0 ㄆㄛ
+鉕 0 ㄆㄛ
+頗 0 ㄆㄛˇ
+剖 0 ㄆㄛˇ
+叵 0 ㄆㄛˇ
+笸 0 ㄆㄛˇ
+尀 0 ㄆㄛˇ
+鉕 0 ㄆㄛˇ
+駊 0 ㄆㄛˇ
+箥 0 ㄆㄛˇ
+破 0 ㄆㄛˋ
+迫 0 ㄆㄛˋ
+魄 0 ㄆㄛˋ
+珀 0 ㄆㄛˋ
+泊 0 ㄆㄛˋ
+朴 0 ㄆㄛˋ
+粕 0 ㄆㄛˋ
+醱 0 ㄆㄛˋ
+岶 0 ㄆㄛˋ
+烞 0 ㄆㄛˋ
+蒪 0 ㄆㄛˋ
+扑 0 ㄆㄛˋ
+拍 0 ㄆㄛˋ
+釙 0 ㄆㄛˋ
+胉 0 ㄆㄛˋ
+哱 0 ㄆㄛˋ
+濼 0 ㄆㄛˋ
+廹 0 ㄆㄛˋ
+狛 0 ㄆㄛˋ
+洦 0 ㄆㄛˋ
+砶 0 ㄆㄛˋ
+奤 0 ㄆㄛˋ
+湐 0 ㄆㄛˋ
+屰 0 ㄆㄛˋ
+婆 0 ㄆㄛˊ
+鄱 0 ㄆㄛˊ
+皤 0 ㄆㄛˊ
+櫇 0 ㄆㄛˊ
+番 0 ㄆㄛˊ
+幡 0 ㄆㄛˊ
+繁 0 ㄆㄛˊ
+碆 0 ㄆㄛˊ
+畨 0 ㄆㄛˊ
+嘙 0 ㄆㄛˊ
+蔢 0 ㄆㄛˊ
+撲 0 ㄆㄨ
+仆 0 ㄆㄨ
+鋪 0 ㄆㄨ
+噗 0 ㄆㄨ
+扑 0 ㄆㄨ
+痡 0 ㄆㄨ
+抪 0 ㄆㄨ
+瞨 0 ㄆㄨ
+駇 0 ㄆㄨ
+舖 0 ㄆㄨ
+鋍 0 ㄆㄨ
+攴 0 ㄆㄨ
+炇 0 ㄆㄨ
+陠 0 ㄆㄨ
+豧 0 ㄆㄨ
+擈 0 ㄆㄨ
+普 0 ㄆㄨˇ
+浦 0 ㄆㄨˇ
+埔 0 ㄆㄨˇ
+譜 0 ㄆㄨˇ
+圃 0 ㄆㄨˇ
+溥 0 ㄆㄨˇ
+烳 0 ㄆㄨˇ
+氆 0 ㄆㄨˇ
+鐠 0 ㄆㄨˇ
+潽 0 ㄆㄨˇ
+誧 0 ㄆㄨˇ
+哺 0 ㄆㄨˇ
+樸 0 ㄆㄨˇ
+賻 0 ㄆㄨˇ
+暜 0 ㄆㄨˇ
+諩 0 ㄆㄨˇ
+檏 0 ㄆㄨˇ
+暴 0 ㄆㄨˋ
+鋪 0 ㄆㄨˋ
+瀑 0 ㄆㄨˋ
+曝 0 ㄆㄨˋ
+舖 0 ㄆㄨˋ
+堡 0 ㄆㄨˋ
+昢 0 ㄆㄨˋ
+堢 0 ㄆㄨˋ
+曓 0 ㄆㄨˋ
+僕 0 ㄆㄨˊ
+樸 0 ㄆㄨˊ
+葡 0 ㄆㄨˊ
+蒲 0 ㄆㄨˊ
+菩 0 ㄆㄨˊ
+朴 0 ㄆㄨˊ
+蹼 0 ㄆㄨˊ
+脯 0 ㄆㄨˊ
+濮 0 ㄆㄨˊ
+璞 0 ㄆㄨˊ
+匍 0 ㄆㄨˊ
+莆 0 ㄆㄨˊ
+蒱 0 ㄆㄨˊ
+襆 0 ㄆㄨˊ
+酺 0 ㄆㄨˊ
+釙 0 ㄆㄨˊ
+鏷 0 ㄆㄨˊ
+轐 0 ㄆㄨˊ
+纀 0 ㄆㄨˊ
+墣 0 ㄆㄨˊ
+瞨 0 ㄆㄨˊ
+醭 0 ㄆㄨˊ
+圤 0 ㄆㄨˊ
+㺪 0 ㄆㄨˊ
+箁 0 ㄆㄨˊ
+幞 0 ㄆㄨˊ
+檏 0 ㄆㄨˊ
+襥 0 ㄆㄨˊ
+穙 0 ㄆㄨˊ
+菐 0 ㄆㄨˊ
+拋 0 ㄆㄠ
+脬 0 ㄆㄠ
+泡 0 ㄆㄠ
+抛 0 ㄆㄠ
+跑 0 ㄆㄠˇ
+泡 0 ㄆㄠˋ
+砲 0 ㄆㄠˋ
+炮 0 ㄆㄠˋ
+皰 0 ㄆㄠˋ
+奅 0 ㄆㄠˋ
+麭 0 ㄆㄠˋ
+髱 0 ㄆㄠˋ
+疱 0 ㄆㄠˋ
+靤 0 ㄆㄠˋ
+礮 0 ㄆㄠˋ
+礟 0 ㄆㄠˋ
+袍 0 ㄆㄠˊ
+咆 0 ㄆㄠˊ
+刨 0 ㄆㄠˊ
+匏 0 ㄆㄠˊ
+庖 0 ㄆㄠˊ
+麃 0 ㄆㄠˊ
+炰 0 ㄆㄠˊ
+齙 0 ㄆㄠˊ
+鞄 0 ㄆㄠˊ
+炮 0 ㄆㄠˊ
+瓟 0 ㄆㄠˊ
+跑 0 ㄆㄠˊ
+鉋 0 ㄆㄠˊ
+袌 0 ㄆㄠˊ
+颮 0 ㄆㄠˊ
+狍 0 ㄆㄠˊ
+爮 0 ㄆㄠˊ
+軳 0 ㄆㄠˊ
+麅 0 ㄆㄠˊ
+礮 0 ㄆㄠˊ
+礟 0 ㄆㄠˊ
+胚 0 ㄆㄟ
+呸 0 ㄆㄟ
+坏 0 ㄆㄟ
+醅 0 ㄆㄟ
+柸 0 ㄆㄟ
+岯 0 ㄆㄟ
+垺 0 ㄆㄟ
+衃 0 ㄆㄟ
+丕 0 ㄆㄟ
+披 0 ㄆㄟ
+坯 0 ㄆㄟ
+怌 0 ㄆㄟ
+妚 0 ㄆㄟ
+抷 0 ㄆㄟ
+肧 0 ㄆㄟ
+琣 0 ㄆㄟˇ
+昢 0 ㄆㄟˇ
+配 0 ㄆㄟˋ
+佩 0 ㄆㄟˋ
+沛 0 ㄆㄟˋ
+珮 0 ㄆㄟˋ
+霈 0 ㄆㄟˋ
+帔 0 ㄆㄟˋ
+旆 0 ㄆㄟˋ
+浿 0 ㄆㄟˋ
+轡 0 ㄆㄟˋ
+姵 0 ㄆㄟˋ
+翇 0 ㄆㄟˋ
+伂 0 ㄆㄟˋ
+妃 0 ㄆㄟˋ
+肺 0 ㄆㄟˋ
+朏 0 ㄆㄟˋ
+淠 0 ㄆㄟˋ
+琲 0 ㄆㄟˋ
+昁 0 ㄆㄟˋ
+斾 0 ㄆㄟˋ
+苝 0 ㄆㄟˋ
+㻗 0 ㄆㄟˋ
+馷 0 ㄆㄟˋ
+嶏 0 ㄆㄟˋ
+笩 0 ㄆㄟˋ
+培 0 ㄆㄟˊ
+賠 0 ㄆㄟˊ
+陪 0 ㄆㄟˊ
+裴 0 ㄆㄟˊ
+邳 0 ㄆㄟˊ
+碚 0 ㄆㄟˊ
+毰 0 ㄆㄟˊ
+陫 0 ㄆㄟˊ
+荖 0 ㄆㄟˊ
+坏 0 ㄆㄟˊ
+斐 0 ㄆㄟˊ
+焙 0 ㄆㄟˊ
+蓓 0 ㄆㄟˊ
+坯 0 ㄆㄟˊ
+岯 0 ㄆㄟˊ
+踣 0 ㄆㄟˊ
+醅 0 ㄆㄟˊ
+阫 0 ㄆㄟˊ
+裵 0 ㄆㄟˊ
+噴 0 ㄆㄣ
+歕 0 ㄆㄣ
+賁 0 ㄆㄣ
+濆 0 ㄆㄣ
+喯 0 ㄆㄣ
+呠 0 ㄆㄣˇ
+翸 0 ㄆㄣˇ
+翉 0 ㄆㄣˇ
+噴 0 ㄆㄣˋ
+歕 0 ㄆㄣˋ
+喯 0 ㄆㄣˋ
+盆 0 ㄆㄣˊ
+湓 0 ㄆㄣˊ
+葐 0 ㄆㄣˊ
+瓫 0 ㄆㄣˊ
+㖹 0 ㄆㄣˊ
+批 0 ㄆㄧ
+披 0 ㄆㄧ
+匹 0 ㄆㄧ
+劈 0 ㄆㄧ
+霹 0 ㄆㄧ
+砒 0 ㄆㄧ
+被 0 ㄆㄧ
+丕 0 ㄆㄧ
+坯 0 ㄆㄧ
+坏 0 ㄆㄧ
+伾 0 ㄆㄧ
+狉 0 ㄆㄧ
+紕 0 ㄆㄧ
+秠 0 ㄆㄧ
+鈹 0 ㄆㄧ
+鴄 0 ㄆㄧ
+怌 0 ㄆㄧ
+翍 0 ㄆㄧ
+釽 0 ㄆㄧ
+憵 0 ㄆㄧ
+銔 0 ㄆㄧ
+駓 0 ㄆㄧ
+髬 0 ㄆㄧ
+胚 0 ㄆㄧ
+帔 0 ㄆㄧ
+邳 0 ㄆㄧ
+鎞 0 ㄆㄧ
+妚 0 ㄆㄧ
+阫 0 ㄆㄧ
+抷 0 ㄆㄧ
+炋 0 ㄆㄧ
+狓 0 ㄆㄧ
+肧 0 ㄆㄧ
+秛 0 ㄆㄧ
+耚 0 ㄆㄧ
+㓻 0 ㄆㄧ
+豾 0 ㄆㄧ
+鈈 0 ㄆㄧ
+鉟 0 ㄆㄧ
+磇 0 ㄆㄧ
+悂 0 ㄆㄧ
+䤵 0 ㄆㄧ
+鮍 0 ㄆㄧ
+瞥 0 ㄆㄧㄝ
+撇 0 ㄆㄧㄝ
+氕 0 ㄆㄧㄝ
+潎 0 ㄆㄧㄝ
+蟞 0 ㄆㄧㄝ
+撆 0 ㄆㄧㄝ
+𢳂 0 ㄆㄧㄝ
+撇 0 ㄆㄧㄝˇ
+苤 0 ㄆㄧㄝˇ
+丿 0 ㄆㄧㄝˇ
+撆 0 ㄆㄧㄝˇ
+鐅 0 ㄆㄧㄝˇ
+嫳 0 ㄆㄧㄝˋ
+乒 0 ㄆㄧㄥ
+娉 0 ㄆㄧㄥ
+砯 0 ㄆㄧㄥ
+頩 0 ㄆㄧㄥ
+覮 0 ㄆㄧㄥ
+砰 0 ㄆㄧㄥ
+甹 0 ㄆㄧㄥ
+俜 0 ㄆㄧㄥ
+艵 0 ㄆㄧㄥ
+硑 0 ㄆㄧㄥ
+聠 0 ㄆㄧㄥ
+絣 0 ㄆㄧㄥˇ
+聘 0 ㄆㄧㄥˋ
+平 0 ㄆㄧㄥˊ
+瓶 0 ㄆㄧㄥˊ
+憑 0 ㄆㄧㄥˊ
+評 0 ㄆㄧㄥˊ
+屏 0 ㄆㄧㄥˊ
+蘋 0 ㄆㄧㄥˊ
+萍 0 ㄆㄧㄥˊ
+坪 0 ㄆㄧㄥˊ
+枰 0 ㄆㄧㄥˊ
+泙 0 ㄆㄧㄥˊ
+帡 0 ㄆㄧㄥˊ
+洴 0 ㄆㄧㄥˊ
+缾 0 ㄆㄧㄥˊ
+軿 0 ㄆㄧㄥˊ
+俜 0 ㄆㄧㄥˊ
+玶 0 ㄆㄧㄥˊ
+甹 0 ㄆㄧㄥˊ
+苹 0 ㄆㄧㄥˊ
+郱 0 ㄆㄧㄥˊ
+呯 0 ㄆㄧㄥˊ
+竮 0 ㄆㄧㄥˊ
+艵 0 ㄆㄧㄥˊ
+蛢 0 ㄆㄧㄥˊ
+馮 0 ㄆㄧㄥˊ
+荓 0 ㄆㄧㄥˊ
+蓱 0 ㄆㄧㄥˊ
+炾 0 ㄆㄧㄥˊ
+抨 0 ㄆㄧㄥˊ
+秤 0 ㄆㄧㄥˊ
+摒 0 ㄆㄧㄥˊ
+栟 0 ㄆㄧㄥˊ
+銔 0 ㄆㄧㄥˊ
+鵧 0 ㄆㄧㄥˊ
+凭 0 ㄆㄧㄥˊ
+胓 0 ㄆㄧㄥˊ
+㺸 0 ㄆㄧㄥˊ
+㻂 0 ㄆㄧㄥˊ
+屛 0 ㄆㄧㄥˊ
+帲 0 ㄆㄧㄥˊ
+蚲 0 ㄆㄧㄥˊ
+幈 0 ㄆㄧㄥˊ
+甁 0 ㄆㄧㄥˊ
+凴 0 ㄆㄧㄥˊ
+箳 0 ㄆㄧㄥˊ
+輧 0 ㄆㄧㄥˊ
+鮃 0 ㄆㄧㄥˊ
+簈 0 ㄆㄧㄥˊ
+薲 0 ㄆㄧㄥˊ
+慿 0 ㄆㄧㄥˊ
+篇 0 ㄆㄧㄢ
+偏 0 ㄆㄧㄢ
+扁 0 ㄆㄧㄢ
+翩 0 ㄆㄧㄢ
+萹 0 ㄆㄧㄢ
+媥 0 ㄆㄧㄢ
+貵 0 ㄆㄧㄢ
+頨 0 ㄆㄧㄢ
+鶣 0 ㄆㄧㄢ
+片 0 ㄆㄧㄢ
+犏 0 ㄆㄧㄢ
+貵 0 ㄆㄧㄢˇ
+諞 0 ㄆㄧㄢˇ
+覑 0 ㄆㄧㄢˇ
+片 0 ㄆㄧㄢˋ
+騙 0 ㄆㄧㄢˋ
+遍 0 ㄆㄧㄢˋ
+徧 0 ㄆㄧㄢˋ
+騗 0 ㄆㄧㄢˋ
+便 0 ㄆㄧㄢˊ
+胼 0 ㄆㄧㄢˊ
+駢 0 ㄆㄧㄢˊ
+諞 0 ㄆㄧㄢˊ
+蹁 0 ㄆㄧㄢˊ
+楩 0 ㄆㄧㄢˊ
+骿 0 ㄆㄧㄢˊ
+褊 0 ㄆㄧㄢˊ
+楄 0 ㄆㄧㄢˊ
+跰 0 ㄆㄧㄢˊ
+緶 0 ㄆㄧㄢˊ
+腁 0 ㄆㄧㄢˊ
+騈 0 ㄆㄧㄢˊ
+賆 0 ㄆㄧㄢˊ
+否 0 ㄆㄧˇ
+匹 0 ㄆㄧˇ
+疋 0 ㄆㄧˇ
+痞 0 ㄆㄧˇ
+嚭 0 ㄆㄧˇ
+苤 0 ㄆㄧˇ
+仳 0 ㄆㄧˇ
+庀 0 ㄆㄧˇ
+圮 0 ㄆㄧˇ
+崥 0 ㄆㄧˇ
+諀 0 ㄆㄧˇ
+毗 0 ㄆㄧˇ
+劈 0 ㄆㄧˇ
+癖 0 ㄆㄧˇ
+苉 0 ㄆㄧˇ
+脴 0 ㄆㄧˇ
+嶏 0 ㄆㄧˇ
+噽 0 ㄆㄧˇ
+䫌 0 ㄆㄧˇ
+譬 0 ㄆㄧˋ
+闢 0 ㄆㄧˋ
+僻 0 ㄆㄧˋ
+媲 0 ㄆㄧˋ
+屁 0 ㄆㄧˋ
+辟 0 ㄆㄧˋ
+癖 0 ㄆㄧˋ
+甓 0 ㄆㄧˋ
+擗 0 ㄆㄧˋ
+澼 0 ㄆㄧˋ
+濞 0 ㄆㄧˋ
+淠 0 ㄆㄧˋ
+揊 0 ㄆㄧˋ
+潎 0 ㄆㄧˋ
+鷿 0 ㄆㄧˋ
+髲 0 ㄆㄧˋ
+礔 0 ㄆㄧˋ
+副 0 ㄆㄧˋ
+埤 0 ㄆㄧˋ
+堛 0 ㄆㄧˋ
+廦 0 ㄆㄧˋ
+壀 0 ㄆㄧˋ
+礕 0 ㄆㄧˋ
+疈 0 ㄆㄧˋ
+鸊 0 ㄆㄧˋ
+皮 0 ㄆㄧˊ
+疲 0 ㄆㄧˊ
+脾 0 ㄆㄧˊ
+琵 0 ㄆㄧˊ
+枇 0 ㄆㄧˊ
+裨 0 ㄆㄧˊ
+啤 0 ㄆㄧˊ
+毗 0 ㄆㄧˊ
+埤 0 ㄆㄧˊ
+沘 0 ㄆㄧˊ
+貔 0 ㄆㄧˊ
+陂 0 ㄆㄧˊ
+羆 0 ㄆㄧˊ
+罷 0 ㄆㄧˊ
+紕 0 ㄆㄧˊ
+郫 0 ㄆㄧˊ
+陴 0 ㄆㄧˊ
+鼙 0 ㄆㄧˊ
+鈹 0 ㄆㄧˊ
+膍 0 ㄆㄧˊ
+毘 0 ㄆㄧˊ
+阰 0 ㄆㄧˊ
+蚽 0 ㄆㄧˊ
+蜱 0 ㄆㄧˊ
+玭 0 ㄆㄧˊ
+笓 0 ㄆㄧˊ
+鈚 0 ㄆㄧˊ
+錍 0 ㄆㄧˊ
+魾 0 ㄆㄧˊ
+螷 0 ㄆㄧˊ
+犤 0 ㄆㄧˊ
+毞 0 ㄆㄧˊ
+猈 0 ㄆㄧˊ
+蠯 0 ㄆㄧˊ
+比 0 ㄆㄧˊ
+芘 0 ㄆㄧˊ
+蚍 0 ㄆㄧˊ
+崥 0 ㄆㄧˊ
+椑 0 ㄆㄧˊ
+痹 0 ㄆㄧˊ
+髀 0 ㄆㄧˊ
+夶 0 ㄆㄧˊ
+肶 0 ㄆㄧˊ
+罢 0 ㄆㄧˊ
+渒 0 ㄆㄧˊ
+豼 0 ㄆㄧˊ
+焷 0 ㄆㄧˊ
+鈈 0 ㄆㄧˊ
+鉟 0 ㄆㄧˊ
+壀 0 ㄆㄧˊ
+篺 0 ㄆㄧˊ
+㓟 0 ㄆㄧˊ
+魮 0 ㄆㄧˊ
+隦 0 ㄆㄧˊ
+朇 0 ㄆㄧˊ
+飄 0 ㄆㄧㄠ
+漂 0 ㄆㄧㄠ
+慓 0 ㄆㄧㄠ
+螵 0 ㄆㄧㄠ
+薸 0 ㄆㄧㄠ
+僄 0 ㄆㄧㄠ
+旚 0 ㄆㄧㄠ
+翲 0 ㄆㄧㄠ
+魒 0 ㄆㄧㄠ
+票 0 ㄆㄧㄠ
+嫖 0 ㄆㄧㄠ
+縹 0 ㄆㄧㄠ
+嘌 0 ㄆㄧㄠ
+彯 0 ㄆㄧㄠ
+暼 0 ㄆㄧㄠ
+麅 0 ㄆㄧㄠ
+闝 0 ㄆㄧㄠ
+飃 0 ㄆㄧㄠ
+漂 0 ㄆㄧㄠˇ
+莩 0 ㄆㄧㄠˇ
+縹 0 ㄆㄧㄠˇ
+瞟 0 ㄆㄧㄠˇ
+殍 0 ㄆㄧㄠˇ
+皫 0 ㄆㄧㄠˇ
+摽 0 ㄆㄧㄠˇ
+醥 0 ㄆㄧㄠˇ
+犥 0 ㄆㄧㄠˇ
+剽 0 ㄆㄧㄠˇ
+篻 0 ㄆㄧㄠˇ
+顠 0 ㄆㄧㄠˇ
+勡 0 ㄆㄧㄠˇ
+票 0 ㄆㄧㄠˋ
+漂 0 ㄆㄧㄠˋ
+剽 0 ㄆㄧㄠˋ
+驃 0 ㄆㄧㄠˋ
+彯 0 ㄆㄧㄠˋ
+篻 0 ㄆㄧㄠˋ
+蔈 0 ㄆㄧㄠˋ
+縹 0 ㄆㄧㄠˋ
+鰾 0 ㄆㄧㄠˋ
+僄 0 ㄆㄧㄠˋ
+慓 0 ㄆㄧㄠˋ
+勡 0 ㄆㄧㄠˋ
+徱 0 ㄆㄧㄠˋ
+瓢 0 ㄆㄧㄠˊ
+嫖 0 ㄆㄧㄠˊ
+淲 0 ㄆㄧㄠˊ
+薸 0 ㄆㄧㄠˊ
+闝 0 ㄆㄧㄠˊ
+朴 0 ㄆㄧㄠˊ
+拼 0 ㄆㄧㄣ
+姘 0 ㄆㄧㄣ
+礗 0 ㄆㄧㄣ
+涄 0 ㄆㄧㄣ
+品 0 ㄆㄧㄣˇ
+煰 0 ㄆㄧㄣˇ
+嘂 0 ㄆㄧㄣˇ
+聘 0 ㄆㄧㄣˋ
+牝 0 ㄆㄧㄣˋ
+騁 0 ㄆㄧㄣˋ
+貧 0 ㄆㄧㄣˊ
+瀕 0 ㄆㄧㄣˊ
+頻 0 ㄆㄧㄣˊ
+顰 0 ㄆㄧㄣˊ
+嬪 0 ㄆㄧㄣˊ
+嚬 0 ㄆㄧㄣˊ
+矉 0 ㄆㄧㄣˊ
+濱 0 ㄆㄧㄣˊ
+蘋 0 ㄆㄧㄣˊ
+玭 0 ㄆㄧㄣˊ
+娦 0 ㄆㄧㄣˊ
+浜 0 ㄆㄧㄣˊ
+琕 0 ㄆㄧㄣˊ
+滨 0 ㄆㄧㄣˊ
+濵 0 ㄆㄧㄣˊ
+薲 0 ㄆㄧㄣˊ
+蠙 0 ㄆㄧㄣˊ
+ㄐ 0 ㄐ
+居 0 ㄐㄩ
+拘 0 ㄐㄩ
+駒 0 ㄐㄩ
+沮 0 ㄐㄩ
+疽 0 ㄐㄩ
+蛆 0 ㄐㄩ
+狙 0 ㄐㄩ
+俱 0 ㄐㄩ
+車 0 ㄐㄩ
+据 0 ㄐㄩ
+鋸 0 ㄐㄩ
+裾 0 ㄐㄩ
+苴 0 ㄐㄩ
+趄 0 ㄐㄩ
+罝 0 ㄐㄩ
+菹 0 ㄐㄩ
+娵 0 ㄐㄩ
+椐 0 ㄐㄩ
+腒 0 ㄐㄩ
+崌 0 ㄐㄩ
+痀 0 ㄐㄩ
+琚 0 ㄐㄩ
+雎 0 ㄐㄩ
+涺 0 ㄐㄩ
+葅 0 ㄐㄩ
+鮈 0 ㄐㄩ
+鶋 0 ㄐㄩ
+斪 0 ㄐㄩ
+揟 0 ㄐㄩ
+蜛 0 ㄐㄩ
+踙 0 ㄐㄩ
+輋 0 ㄐㄩ
+且 0 ㄐㄩ
+咀 0 ㄐㄩ
+倨 0 ㄐㄩ
+砠 0 ㄐㄩ
+踞 0 ㄐㄩ
+齟 0 ㄐㄩ
+岨 0 ㄐㄩ
+凥 0 ㄐㄩ
+抅 0 ㄐㄩ
+俥 0 ㄐㄩ
+倶 0 ㄐㄩ
+婮 0 ㄐㄩ
+鴡 0 ㄐㄩ
+眗 0 ㄐㄩ
+噘 0 ㄐㄩㄝ
+嗟 0 ㄐㄩㄝ
+撅 0 ㄐㄩㄝ
+蹶 0 ㄐㄩㄝˇ
+袦 0 ㄐㄩㄝˇ
+蹷 0 ㄐㄩㄝˇ
+倔 0 ㄐㄩㄝˋ
+𠄌 0 ㄐㄩㄝˋ
+決 0 ㄐㄩㄝˊ
+覺 0 ㄐㄩㄝˊ
+絕 0 ㄐㄩㄝˊ
+爵 0 ㄐㄩㄝˊ
+掘 0 ㄐㄩㄝˊ
+嚼 0 ㄐㄩㄝˊ
+訣 0 ㄐㄩㄝˊ
+厥 0 ㄐㄩㄝˊ
+獗 0 ㄐㄩㄝˊ
+蹶 0 ㄐㄩㄝˊ
+蕨 0 ㄐㄩㄝˊ
+崛 0 ㄐㄩㄝˊ
+攫 0 ㄐㄩㄝˊ
+倔 0 ㄐㄩㄝˊ
+炔 0 ㄐㄩㄝˊ
+抉 0 ㄐㄩㄝˊ
+噱 0 ㄐㄩㄝˊ
+矍 0 ㄐㄩㄝˊ
+觖 0 ㄐㄩㄝˊ
+角 0 ㄐㄩㄝˊ
+孓 0 ㄐㄩㄝˊ
+玨 0 ㄐㄩㄝˊ
+劂 0 ㄐㄩㄝˊ
+橛 0 ㄐㄩㄝˊ
+爝 0 ㄐㄩㄝˊ
+譎 0 ㄐㄩㄝˊ
+屩 0 ㄐㄩㄝˊ
+觼 0 ㄐㄩㄝˊ
+玦 0 ㄐㄩㄝˊ
+腳 0 ㄐㄩㄝˊ
+臄 0 ㄐㄩㄝˊ
+蕝 0 ㄐㄩㄝˊ
+躩 0 ㄐㄩㄝˊ
+戄 0 ㄐㄩㄝˊ
+桷 0 ㄐㄩㄝˊ
+潏 0 ㄐㄩㄝˊ
+鴃 0 ㄐㄩㄝˊ
+貜 0 ㄐㄩㄝˊ
+趹 0 ㄐㄩㄝˊ
+鱖 0 ㄐㄩㄝˊ
+傕 0 ㄐㄩㄝˊ
+嵑 0 ㄐㄩㄝˊ
+瘚 0 ㄐㄩㄝˊ
+蠼 0 ㄐㄩㄝˊ
+鐍 0 ㄐㄩㄝˊ
+钁 0 ㄐㄩㄝˊ
+玃 0 ㄐㄩㄝˊ
+捔 0 ㄐㄩㄝˊ
+芵 0 ㄐㄩㄝˊ
+焆 0 ㄐㄩㄝˊ
+鈌 0 ㄐㄩㄝˊ
+蚗 0 ㄐㄩㄝˊ
+谻 0 ㄐㄩㄝˊ
+赽 0 ㄐㄩㄝˊ
+僪 0 ㄐㄩㄝˊ
+憰 0 ㄐㄩㄝˊ
+蟨 0 ㄐㄩㄝˊ
+彏 0 ㄐㄩㄝˊ
+鱊 0 ㄐㄩㄝˊ
+鷢 0 ㄐㄩㄝˊ
+堀 0 ㄐㄩㄝˊ
+殌 0 ㄐㄩㄝˊ
+穱 0 ㄐㄩㄝˊ
+袂 0 ㄐㄩㄝˊ
+較 0 ㄐㄩㄝˊ
+夬 0 ㄐㄩㄝˊ
+吷 0 ㄐㄩㄝˊ
+埆 0 ㄐㄩㄝˊ
+矞 0 ㄐㄩㄝˊ
+駃 0 ㄐㄩㄝˊ
+噘 0 ㄐㄩㄝˊ
+嶡 0 ㄐㄩㄝˊ
+撅 0 ㄐㄩㄝˊ
+璚 0 ㄐㄩㄝˊ
+瞲 0 ㄐㄩㄝˊ
+鵙 0 ㄐㄩㄝˊ
+蹻 0 ㄐㄩㄝˊ
+鶪 0 ㄐㄩㄝˊ
+皭 0 ㄐㄩㄝˊ
+灚 0 ㄐㄩㄝˊ
+釂 0 ㄐㄩㄝˊ
+亅 0 ㄐㄩㄝˊ
+决 0 ㄐㄩㄝˊ
+刔 0 ㄐㄩㄝˊ
+妜 0 ㄐㄩㄝˊ
+弡 0 ㄐㄩㄝˊ
+挗 0 ㄐㄩㄝˊ
+珏 0 ㄐㄩㄝˊ
+疦 0 ㄐㄩㄝˊ
+砄 0 ㄐㄩㄝˊ
+欮 0 ㄐㄩㄝˊ
+斍 0 ㄐㄩㄝˊ
+脚 0 ㄐㄩㄝˊ
+焳 0 ㄐㄩㄝˊ
+絶 0 ㄐㄩㄝˊ
+覚 0 ㄐㄩㄝˊ
+逫 0 ㄐㄩㄝˊ
+勪 0 ㄐㄩㄝˊ
+瑴 0 ㄐㄩㄝˊ
+踋 0 ㄐㄩㄝˊ
+撧 0 ㄐㄩㄝˊ
+熦 0 ㄐㄩㄝˊ
+觮 0 ㄐㄩㄝˊ
+鴂 0 ㄐㄩㄝˊ
+橜 0 ㄐㄩㄝˊ
+蟩 0 ㄐㄩㄝˊ
+嚯 0 ㄐㄩㄝˊ
+屫 0 ㄐㄩㄝˊ
+蹷 0 ㄐㄩㄝˊ
+爑 0 ㄐㄩㄝˊ
+髉 0 ㄐㄩㄝˊ
+鞽 0 ㄐㄩㄝˊ
+欔 0 ㄐㄩㄝˊ
+鱥 0 ㄐㄩㄝˊ
+龣 0 ㄐㄩㄝˊ
+孒 0 ㄐㄩㄝˊ
+叏 0 ㄐㄩㄝˊ
+氒 0 ㄐㄩㄝˊ
+覐 0 ㄐㄩㄝˊ
+㖸 0 ㄐㄩㄝˊ
+爴 0 ㄐㄩㄝˊ
+憠 0 ㄐㄩㄝˊ
+鐝 0 ㄐㄩㄝˊ
+矡 0 ㄐㄩㄝˊ
+崫 0 ㄐㄩㄝˊ
+扃 0 ㄐㄩㄥ
+坰 0 ㄐㄩㄥ
+駉 0 ㄐㄩㄥ
+冂 0 ㄐㄩㄥ
+垧 0 ㄐㄩㄥ
+埛 0 ㄐㄩㄥ
+駫 0 ㄐㄩㄥ
+䮐 0 ㄐㄩㄥ
+窘 0 ㄐㄩㄥˇ
+迥 0 ㄐㄩㄥˇ
+煚 0 ㄐㄩㄥˇ
+泂 0 ㄐㄩㄥˇ
+炅 0 ㄐㄩㄥˇ
+絅 0 ㄐㄩㄥˇ
+褧 0 ㄐㄩㄥˇ
+冏 0 ㄐㄩㄥˇ
+熲 0 ㄐㄩㄥˇ
+囧 0 ㄐㄩㄥˇ
+皛 0 ㄐㄩㄥˇ
+炯 0 ㄐㄩㄥˇ
+幜 0 ㄐㄩㄥˇ
+顈 0 ㄐㄩㄥˇ
+坰 0 ㄐㄩㄥˇ
+炚 0 ㄐㄩㄥˇ
+扃 0 ㄐㄩㄥˇ
+浻 0 ㄐㄩㄥˇ
+迵 0 ㄐㄩㄥˇ
+駉 0 ㄐㄩㄥˇ
+冂 0 ㄐㄩㄥˇ
+垧 0 ㄐㄩㄥˇ
+埛 0 ㄐㄩㄥˇ
+逈 0 ㄐㄩㄥˇ
+烱 0 ㄐㄩㄥˇ
+䢛 0 ㄐㄩㄥˇ
+綗 0 ㄐㄩㄥˇ
+煛 0 ㄐㄩㄥˇ
+駫 0 ㄐㄩㄥˇ
+䮐 0 ㄐㄩㄥˇ
+蘏 0 ㄐㄩㄥˇ
+炛 0 ㄐㄩㄥˇ
+僒 0 ㄐㄩㄥˇ
+澃 0 ㄐㄩㄥˋ
+捐 0 ㄐㄩㄢ
+娟 0 ㄐㄩㄢ
+鵑 0 ㄐㄩㄢ
+涓 0 ㄐㄩㄢ
+鐫 0 ㄐㄩㄢ
+圈 0 ㄐㄩㄢ
+蠲 0 ㄐㄩㄢ
+朘 0 ㄐㄩㄢ
+身 0 ㄐㄩㄢ
+脧 0 ㄐㄩㄢ
+裐 0 ㄐㄩㄢ
+狷 0 ㄐㄩㄢ
+絹 0 ㄐㄩㄢ
+悁 0 ㄐㄩㄢ
+梋 0 ㄐㄩㄢ
+焆 0 ㄐㄩㄢ
+琄 0 ㄐㄩㄢ
+睊 0 ㄐㄩㄢ
+蜎 0 ㄐㄩㄢ
+鋗 0 ㄐㄩㄢ
+鋑 0 ㄐㄩㄢ
+鞙 0 ㄐㄩㄢ
+駽 0 ㄐㄩㄢ
+姢 0 ㄐㄩㄢ
+剶 0 ㄐㄩㄢ
+圏 0 ㄐㄩㄢ
+瓹 0 ㄐㄩㄢ
+鎸 0 ㄐㄩㄢ
+勬 0 ㄐㄩㄢ
+捲 0 ㄐㄩㄢˇ
+卷 0 ㄐㄩㄢˇ
+埢 0 ㄐㄩㄢˇ
+菤 0 ㄐㄩㄢˇ
+臇 0 ㄐㄩㄢˇ
+蜷 0 ㄐㄩㄢˇ
+踡 0 ㄐㄩㄢˇ
+婘 0 ㄐㄩㄢˇ
+惓 0 ㄐㄩㄢˇ
+犈 0 ㄐㄩㄢˇ
+腃 0 ㄐㄩㄢˇ
+綣 0 ㄐㄩㄢˇ
+蔨 0 ㄐㄩㄢˇ
+錈 0 ㄐㄩㄢˇ
+鬈 0 ㄐㄩㄢˇ
+巻 0 ㄐㄩㄢˇ
+埍 0 ㄐㄩㄢˇ
+㷷 0 ㄐㄩㄢˇ
+孉 0 ㄐㄩㄢˇ
+奆 0 ㄐㄩㄢˇ
+倦 0 ㄐㄩㄢˋ
+卷 0 ㄐㄩㄢˋ
+眷 0 ㄐㄩㄢˋ
+絹 0 ㄐㄩㄢˋ
+雋 0 ㄐㄩㄢˋ
+悁 0 ㄐㄩㄢˋ
+狷 0 ㄐㄩㄢˋ
+圈 0 ㄐㄩㄢˋ
+獧 0 ㄐㄩㄢˋ
+睊 0 ㄐㄩㄢˋ
+睠 0 ㄐㄩㄢˋ
+罥 0 ㄐㄩㄢˋ
+鄄 0 ㄐㄩㄢˋ
+帣 0 ㄐㄩㄢˋ
+錈 0 ㄐㄩㄢˋ
+腃 0 ㄐㄩㄢˋ
+韏 0 ㄐㄩㄢˋ
+鬳 0 ㄐㄩㄢˋ
+弮 0 ㄐㄩㄢˋ
+悛 0 ㄐㄩㄢˋ
+牶 0 ㄐㄩㄢˋ
+絭 0 ㄐㄩㄢˋ
+菤 0 ㄐㄩㄢˋ
+楗 0 ㄐㄩㄢˋ
+臇 0 ㄐㄩㄢˋ
+蠵 0 ㄐㄩㄢˋ
+觿 0 ㄐㄩㄢˋ
+鑴 0 ㄐㄩㄢˋ
+驨 0 ㄐㄩㄢˋ
+劵 0 ㄐㄩㄢˋ
+巻 0 ㄐㄩㄢˋ
+隽 0 ㄐㄩㄢˋ
+淃 0 ㄐㄩㄢˋ
+圏 0 ㄐㄩㄢˋ
+瓹 0 ㄐㄩㄢˋ
+飬 0 ㄐㄩㄢˋ
+慻 0 ㄐㄩㄢˋ
+㷷 0 ㄐㄩㄢˋ
+襈 0 ㄐㄩㄢˋ
+桊 0 ㄐㄩㄢˋ
+䣺 0 ㄐㄩㄢˋ
+餋 0 ㄐㄩㄢˋ
+羂 0 ㄐㄩㄢˋ
+觹 0 ㄐㄩㄢˋ
+觽 0 ㄐㄩㄢˋ
+舉 0 ㄐㄩˇ
+矩 0 ㄐㄩˇ
+咀 0 ㄐㄩˇ
+莒 0 ㄐㄩˇ
+沮 0 ㄐㄩˇ
+齟 0 ㄐㄩˇ
+櫸 0 ㄐㄩˇ
+筥 0 ㄐㄩˇ
+踽 0 ㄐㄩˇ
+蒟 0 ㄐㄩˇ
+椇 0 ㄐㄩˇ
+柜 0 ㄐㄩˇ
+竘 0 ㄐㄩˇ
+袓 0 ㄐㄩˇ
+跙 0 ㄐㄩˇ
+蝺 0 ㄐㄩˇ
+佝 0 ㄐㄩˇ
+狙 0 ㄐㄩˇ
+枸 0 ㄐㄩˇ
+砠 0 ㄐㄩˇ
+苴 0 ㄐㄩˇ
+菹 0 ㄐㄩˇ
+趄 0 ㄐㄩˇ
+萭 0 ㄐㄩˇ
+籧 0 ㄐㄩˇ
+弆 0 ㄐㄩˇ
+挙 0 ㄐㄩˇ
+榘 0 ㄐㄩˇ
+聥 0 ㄐㄩˇ
+擧 0 ㄐㄩˇ
+據 0 ㄐㄩˋ
+句 0 ㄐㄩˋ
+具 0 ㄐㄩˋ
+巨 0 ㄐㄩˋ
+劇 0 ㄐㄩˋ
+聚 0 ㄐㄩˋ
+俱 0 ㄐㄩˋ
+拒 0 ㄐㄩˋ
+距 0 ㄐㄩˋ
+鋸 0 ㄐㄩˋ
+懼 0 ㄐㄩˋ
+鉅 0 ㄐㄩˋ
+炬 0 ㄐㄩˋ
+詎 0 ㄐㄩˋ
+遽 0 ㄐㄩˋ
+倨 0 ㄐㄩˋ
+瞿 0 ㄐㄩˋ
+踞 0 ㄐㄩˋ
+颶 0 ㄐㄩˋ
+泃 0 ㄐㄩˋ
+苣 0 ㄐㄩˋ
+窶 0 ㄐㄩˋ
+醵 0 ㄐㄩˋ
+屨 0 ㄐㄩˋ
+秬 0 ㄐㄩˋ
+虡 0 ㄐㄩˋ
+寠 0 ㄐㄩˋ
+鐻 0 ㄐㄩˋ
+佢 0 ㄐㄩˋ
+据 0 ㄐㄩˋ
+粔 0 ㄐㄩˋ
+姖 0 ㄐㄩˋ
+怚 0 ㄐㄩˋ
+絇 0 ㄐㄩˋ
+足 0 ㄐㄩˋ
+耟 0 ㄐㄩˋ
+岠 0 ㄐㄩˋ
+埧 0 ㄐㄩˋ
+蚷 0 ㄐㄩˋ
+駏 0 ㄐㄩˋ
+澽 0 ㄐㄩˋ
+貗 0 ㄐㄩˋ
+躆 0 ㄐㄩˋ
+洰 0 ㄐㄩˋ
+焣 0 ㄐㄩˋ
+壉 0 ㄐㄩˋ
+犋 0 ㄐㄩˋ
+叵 0 ㄐㄩˋ
+沮 0 ㄐㄩˋ
+噱 0 ㄐㄩˋ
+璩 0 ㄐㄩˋ
+怐 0 ㄐㄩˋ
+朐 0 ㄐㄩˋ
+柜 0 ㄐㄩˋ
+狊 0 ㄐㄩˋ
+耇 0 ㄐㄩˋ
+胊 0 ㄐㄩˋ
+痀 0 ㄐㄩˋ
+竘 0 ㄐㄩˋ
+崌 0 ㄐㄩˋ
+涺 0 ㄐㄩˋ
+翑 0 ㄐㄩˋ
+蚼 0 ㄐㄩˋ
+袓 0 ㄐㄩˋ
+椐 0 ㄐㄩˋ
+椇 0 ㄐㄩˋ
+琚 0 ㄐㄩˋ
+腒 0 ㄐㄩˋ
+菃 0 ㄐㄩˋ
+跙 0 ㄐㄩˋ
+軥 0 ㄐㄩˋ
+郹 0 ㄐㄩˋ
+犑 0 ㄐㄩˋ
+豦 0 ㄐㄩˋ
+裾 0 ㄐㄩˋ
+懅 0 ㄐㄩˋ
+鮈 0 ㄐㄩˋ
+臄 0 ㄐㄩˋ
+螶 0 ㄐㄩˋ
+鼩 0 ㄐㄩˋ
+鶪 0 ㄐㄩˋ
+鼳 0 ㄐㄩˋ
+坥 0 ㄐㄩˋ
+怇 0 ㄐㄩˋ
+拠 0 ㄐㄩˋ
+邭 0 ㄐㄩˋ
+昛 0 ㄐㄩˋ
+歫 0 ㄐㄩˋ
+倶 0 ㄐㄩˋ
+冣 0 ㄐㄩˋ
+剧 0 ㄐㄩˋ
+埾 0 ㄐㄩˋ
+惧 0 ㄐㄩˋ
+耈 0 ㄐㄩˋ
+鄓 0 ㄐㄩˋ
+愳 0 ㄐㄩˋ
+勮 0 ㄐㄩˋ
+璖 0 ㄐㄩˋ
+鮔 0 ㄐㄩˋ
+㵵 0 ㄐㄩˋ
+嚯 0 ㄐㄩˋ
+簴 0 ㄐㄩˋ
+耉 0 ㄐㄩˋ
+㖸 0 ㄐㄩˋ
+檋 0 ㄐㄩˋ
+局 0 ㄐㄩˊ
+鞠 0 ㄐㄩˊ
+菊 0 ㄐㄩˊ
+橘 0 ㄐㄩˊ
+掬 0 ㄐㄩˊ
+跼 0 ㄐㄩˊ
+桔 0 ㄐㄩˊ
+挶 0 ㄐㄩˊ
+鞫 0 ㄐㄩˊ
+侷 0 ㄐㄩˊ
+匊 0 ㄐㄩˊ
+踘 0 ㄐㄩˊ
+鋦 0 ㄐㄩˊ
+鵙 0 ㄐㄩˊ
+鶪 0 ㄐㄩˊ
+椈 0 ㄐㄩˊ
+焗 0 ㄐㄩˊ
+淗 0 ㄐㄩˊ
+驧 0 ㄐㄩˊ
+狊 0 ㄐㄩˊ
+梮 0 ㄐㄩˊ
+郹 0 ㄐㄩˊ
+犑 0 ㄐㄩˊ
+輂 0 ㄐㄩˊ
+箤 0 ㄐㄩˊ
+趜 0 ㄐㄩˊ
+鵴 0 ㄐㄩˊ
+蘜 0 ㄐㄩˊ
+鼳 0 ㄐㄩˊ
+陱 0 ㄐㄩˊ
+駶 0 ㄐㄩˊ
+拘 0 ㄐㄩˊ
+鴃 0 ㄐㄩˊ
+譎 0 ㄐㄩˊ
+麴 0 ㄐㄩˊ
+佢 0 ㄐㄩˊ
+扃 0 ㄐㄩˊ
+匑 0 ㄐㄩˊ
+湨 0 ㄐㄩˊ
+憰 0 ㄐㄩˊ
+潏 0 ㄐㄩˊ
+閰 0 ㄐㄩˊ
+璚 0 ㄐㄩˊ
+輷 0 ㄐㄩˊ
+瞲 0 ㄐㄩˊ
+鐍 0 ㄐㄩˊ
+抅 0 ㄐㄩˊ
+毩 0 ㄐㄩˊ
+婅 0 ㄐㄩˊ
+鄓 0 ㄐㄩˊ
+粷 0 ㄐㄩˊ
+諊 0 ㄐㄩˊ
+躹 0 ㄐㄩˊ
+鴂 0 ㄐㄩˊ
+匔 0 ㄐㄩˊ
+麯 0 ㄐㄩˊ
+蹫 0 ㄐㄩˊ
+巈 0 ㄐㄩˊ
+泦 0 ㄐㄩˊ
+毱 0 ㄐㄩˊ
+軍 0 ㄐㄩㄣ
+君 0 ㄐㄩㄣ
+均 0 ㄐㄩㄣ
+鈞 0 ㄐㄩㄣ
+皸 0 ㄐㄩㄣ
+囷 0 ㄐㄩㄣ
+麇 0 ㄐㄩㄣ
+莙 0 ㄐㄩㄣ
+鮶 0 ㄐㄩㄣ
+桾 0 ㄐㄩㄣ
+蚐 0 ㄐㄩㄣ
+袀 0 ㄐㄩㄣ
+頵 0 ㄐㄩㄣ
+龜 0 ㄐㄩㄣ
+碅 0 ㄐㄩㄣ
+裙 0 ㄐㄩㄣ
+呁 0 ㄐㄩㄣ
+枃 0 ㄐㄩㄣ
+峮 0 ㄐㄩㄣ
+捃 0 ㄐㄩㄣ
+焄 0 ㄐㄩㄣ
+珺 0 ㄐㄩㄣ
+赹 0 ㄐㄩㄣ
+憌 0 ㄐㄩㄣ
+鍕 0 ㄐㄩㄣ
+鵘 0 ㄐㄩㄣ
+鼲 0 ㄐㄩㄣ
+㚬 0 ㄐㄩㄣ
+汮 0 ㄐㄩㄣ
+帬 0 ㄐㄩㄣ
+亀 0 ㄐㄩㄣ
+裠 0 ㄐㄩㄣ
+皹 0 ㄐㄩㄣ
+銁 0 ㄐㄩㄣ
+銞 0 ㄐㄩㄣ
+攈 0 ㄐㄩㄣ
+鵾 0 ㄐㄩㄣ
+麕 0 ㄐㄩㄣ
+攟 0 ㄐㄩㄣ
+覠 0 ㄐㄩㄣ
+麏 0 ㄐㄩㄣ
+窘 0 ㄐㄩㄣˇ
+蜠 0 ㄐㄩㄣˇ
+俊 0 ㄐㄩㄣˋ
+菌 0 ㄐㄩㄣˋ
+郡 0 ㄐㄩㄣˋ
+峻 0 ㄐㄩㄣˋ
+竣 0 ㄐㄩㄣˋ
+雋 0 ㄐㄩㄣˋ
+濬 0 ㄐㄩㄣˋ
+駿 0 ㄐㄩㄣˋ
+蕈 0 ㄐㄩㄣˋ
+浚 0 ㄐㄩㄣˋ
+珺 0 ㄐㄩㄣˋ
+畯 0 ㄐㄩㄣˋ
+焌 0 ㄐㄩㄣˋ
+捃 0 ㄐㄩㄣˋ
+餕 0 ㄐㄩㄣˋ
+箘 0 ㄐㄩㄣˋ
+寯 0 ㄐㄩㄣˋ
+晙 0 ㄐㄩㄣˋ
+呁 0 ㄐㄩㄣˋ
+鵘 0 ㄐㄩㄣˋ
+葰 0 ㄐㄩㄣˋ
+蔨 0 ㄐㄩㄣˋ
+甽 0 ㄐㄩㄣˋ
+璿 0 ㄐㄩㄣˋ
+紃 0 ㄐㄩㄣˋ
+朘 0 ㄐㄩㄣˋ
+脧 0 ㄐㄩㄣˋ
+莙 0 ㄐㄩㄣˋ
+逡 0 ㄐㄩㄣˋ
+踆 0 ㄐㄩㄣˋ
+鵔 0 ㄐㄩㄣˋ
+夋 0 ㄐㄩㄣˋ
+侰 0 ㄐㄩㄣˋ
+埈 0 ㄐㄩㄣˋ
+陖 0 ㄐㄩㄣˋ
+隽 0 ㄐㄩㄣˋ
+㑺 0 ㄐㄩㄣˋ
+睃 0 ㄐㄩㄣˋ
+䇹 0 ㄐㄩㄣˋ
+箟 0 ㄐㄩㄣˋ
+儁 0 ㄐㄩㄣˋ
+懏 0 ㄐㄩㄣˋ
+𤀹 0 ㄐㄩㄣˋ
+䕑 0 ㄐㄩㄣˋ
+鵕 0 ㄐㄩㄣˋ
+攈 0 ㄐㄩㄣˋ
+攟 0 ㄐㄩㄣˋ
+㖥 0 ㄐㄩㄣˋ
+㕙 0 ㄐㄩㄣˋ
+𣽊 0 ㄐㄩㄣˋ
+𤩅 0 ㄐㄩㄣˋ
+觹 0 ㄐㄩㄣˋ
+觽 0 ㄐㄩㄣˋ
+機 0 ㄐㄧ
+基 0 ㄐㄧ
+積 0 ㄐㄧ
+績 0 ㄐㄧ
+蹟 0 ㄐㄧ
+激 0 ㄐㄧ
+跡 0 ㄐㄧ
+姬 0 ㄐㄧ
+雞 0 ㄐㄧ
+饑 0 ㄐㄧ
+肌 0 ㄐㄧ
+稽 0 ㄐㄧ
+飢 0 ㄐㄧ
+奇 0 ㄐㄧ
+畸 0 ㄐㄧ
+碁 0 ㄐㄧ
+箕 0 ㄐㄧ
+磯 0 ㄐㄧ
+譏 0 ㄐㄧ
+羈 0 ㄐㄧ
+几 0 ㄐㄧ
+机 0 ㄐㄧ
+乩 0 ㄐㄧ
+屐 0 ㄐㄧ
+躋 0 ㄐㄧ
+璣 0 ㄐㄧ
+幾 0 ㄐㄧ
+嘰 0 ㄐㄧ
+畿 0 ㄐㄧ
+嵇 0 ㄐㄧ
+犄 0 ㄐㄧ
+齎 0 ㄐㄧ
+其 0 ㄐㄧ
+期 0 ㄐㄧ
+居 0 ㄐㄧ
+唧 0 ㄐㄧ
+勣 0 ㄐㄧ
+禨 0 ㄐㄧ
+欚 0 ㄐㄧ
+癘 0 ㄐㄧ
+羇 0 ㄐㄧ
+虀 0 ㄐㄧ
+觭 0 ㄐㄧ
+霙 0 ㄐㄧ
+蛣 0 ㄐㄧ
+銈 0 ㄐㄧ
+枅 0 ㄐㄧ
+丌 0 ㄐㄧ
+尐 0 ㄐㄧ
+簊 0 ㄐㄧ
+虮 0 ㄐㄧ
+鐖 0 ㄐㄧ
+櫅 0 ㄐㄧ
+稘 0 ㄐㄧ
+毄 0 ㄐㄧ
+樍 0 ㄐㄧ
+諅 0 ㄐㄧ
+鞿 0 ㄐㄧ
+鑇 0 ㄐㄧ
+齏 0 ㄐㄧ
+笄 0 ㄐㄧ
+剞 0 ㄐㄧ
+隮 0 ㄐㄧ
+鸄 0 ㄐㄧ
+癪 0 ㄐㄧ
+圾 0 ㄐㄧ
+棋 0 ㄐㄧ
+刉 0 ㄐㄧ
+咭 0 ㄐㄧ
+惎 0 ㄐㄧ
+敧 0 ㄐㄧ
+憿 0 ㄐㄧ
+獥 0 ㄐㄧ
+錤 0 ㄐㄧ
+濝 0 ㄐㄧ
+穖 0 ㄐㄧ
+齌 0 ㄐㄧ
+魕 0 ㄐㄧ
+凥 0 ㄐㄧ
+卟 0 ㄐㄧ
+㚻 0 ㄐㄧ
+竒 0 ㄐㄧ
+迹 0 ㄐㄧ
+㥍 0 ㄐㄧ
+喞 0 ㄐㄧ
+嵆 0 ㄐㄧ
+朞 0 ㄐㄧ
+棊 0 ㄐㄧ
+筓 0 ㄐㄧ
+鳮 0 ㄐㄧ
+槣 0 ㄐㄧ
+賫 0 ㄐㄧ
+躸 0 ㄐㄧ
+賷 0 ㄐㄧ
+櫀 0 ㄐㄧ
+檱 0 ㄐㄧ
+韲 0 ㄐㄧ
+鷄 0 ㄐㄧ
+覉 0 ㄐㄧ
+覊 0 ㄐㄧ
+㞓 0 ㄐㄧ
+嗘 0 ㄐㄧ
+僟 0 ㄐㄧ
+耭 0 ㄐㄧ
+㼄 0 ㄐㄧ
+鑙 0 ㄐㄧ
+街 0 ㄐㄧㄝ
+接 0 ㄐㄧㄝ
+皆 0 ㄐㄧㄝ
+階 0 ㄐㄧㄝ
+揭 0 ㄐㄧㄝ
+偕 0 ㄐㄧㄝ
+嗟 0 ㄐㄧㄝ
+喈 0 ㄐㄧㄝ
+幯 0 ㄐㄧㄝ
+結 0 ㄐㄧㄝ
+湝 0 ㄐㄧㄝ
+薢 0 ㄐㄧㄝ
+啑 0 ㄐㄧㄝ
+椄 0 ㄐㄧㄝ
+菨 0 ㄐㄧㄝ
+蝔 0 ㄐㄧㄝ
+鶛 0 ㄐㄧㄝ
+隔 0 ㄐㄧㄝ
+諧 0 ㄐㄧㄝ
+勓 0 ㄐㄧㄝ
+痎 0 ㄐㄧㄝ
+瑎 0 ㄐㄧㄝ
+踥 0 ㄐㄧㄝ
+癤 0 ㄐㄧㄝ
+龤 0 ㄐㄧㄝ
+掲 0 ㄐㄧㄝ
+堦 0 ㄐㄧㄝ
+媘 0 ㄐㄧㄝ
+脻 0 ㄐㄧㄝ
+嫅 0 ㄐㄧㄝ
+煯 0 ㄐㄧㄝ
+擑 0 ㄐㄧㄝ
+䕸 0 ㄐㄧㄝ
+𣶏 0 ㄐㄧㄝ
+䃈 0 ㄐㄧㄝ
+姐 0 ㄐㄧㄝˇ
+解 0 ㄐㄧㄝˇ
+姊 0 ㄐㄧㄝˇ
+檞 0 ㄐㄧㄝˇ
+媎 0 ㄐㄧㄝˇ
+薢 0 ㄐㄧㄝˇ
+繲 0 ㄐㄧㄝˇ
+姉 0 ㄐㄧㄝˇ
+毑 0 ㄐㄧㄝˇ
+觧 0 ㄐㄧㄝˇ
+飷 0 ㄐㄧㄝˇ
+界 0 ㄐㄧㄝˋ
+借 0 ㄐㄧㄝˋ
+介 0 ㄐㄧㄝˋ
+戒 0 ㄐㄧㄝˋ
+藉 0 ㄐㄧㄝˋ
+屆 0 ㄐㄧㄝˋ
+疥 0 ㄐㄧㄝˋ
+芥 0 ㄐㄧㄝˋ
+誡 0 ㄐㄧㄝˋ
+解 0 ㄐㄧㄝˋ
+唶 0 ㄐㄧㄝˋ
+喈 0 ㄐㄧㄝˋ
+玠 0 ㄐㄧㄝˋ
+蚧 0 ㄐㄧㄝˋ
+犗 0 ㄐㄧㄝˋ
+褯 0 ㄐㄧㄝˋ
+吤 0 ㄐㄧㄝˋ
+岕 0 ㄐㄧㄝˋ
+价 0 ㄐㄧㄝˋ
+砎 0 ㄐㄧㄝˋ
+悈 0 ㄐㄧㄝˋ
+紒 0 ㄐㄧㄝˋ
+祴 0 ㄐㄧㄝˋ
+躤 0 ㄐㄧㄝˋ
+繲 0 ㄐㄧㄝˋ
+尬 0 ㄐㄧㄝˋ
+械 0 ㄐㄧㄝˋ
+嗟 0 ㄐㄧㄝˋ
+隔 0 ㄐㄧㄝˋ
+妎 0 ㄐㄧㄝˋ
+扴 0 ㄐㄧㄝˋ
+昦 0 ㄐㄧㄝˋ
+祄 0 ㄐㄧㄝˋ
+骱 0 ㄐㄧㄝˋ
+廨 0 ㄐㄧㄝˋ
+臩 0 ㄐㄧㄝˋ
+駴 0 ㄐㄧㄝˋ
+齘 0 ㄐㄧㄝˋ
+届 0 ㄐㄧㄝˋ
+畍 0 ㄐㄧㄝˋ
+衸 0 ㄐㄧㄝˋ
+堺 0 ㄐㄧㄝˋ
+楐 0 ㄐㄧㄝˋ
+琾 0 ㄐㄧㄝˋ
+觧 0 ㄐㄧㄝˋ
+魀 0 ㄐㄧㄝˋ
+諎 0 ㄐㄧㄝˋ
+丯 0 ㄐㄧㄝˋ
+庎 0 ㄐㄧㄝˋ
+徣 0 ㄐㄧㄝˋ
+㾏 0 ㄐㄧㄝˋ
+魪 0 ㄐㄧㄝˋ
+節 0 ㄐㄧㄝˊ
+潔 0 ㄐㄧㄝˊ
+傑 0 ㄐㄧㄝˊ
+捷 0 ㄐㄧㄝˊ
+竭 0 ㄐㄧㄝˊ
+劫 0 ㄐㄧㄝˊ
+截 0 ㄐㄧㄝˊ
+結 0 ㄐㄧㄝˊ
+杰 0 ㄐㄧㄝˊ
+頡 0 ㄐㄧㄝˊ
+詰 0 ㄐㄧㄝˊ
+桀 0 ㄐㄧㄝˊ
+睫 0 ㄐㄧㄝˊ
+訐 0 ㄐㄧㄝˊ
+拮 0 ㄐㄧㄝˊ
+羯 0 ㄐㄧㄝˊ
+櫛 0 ㄐㄧㄝˊ
+桔 0 ㄐㄧㄝˊ
+孑 0 ㄐㄧㄝˊ
+癤 0 ㄐㄧㄝˊ
+絜 0 ㄐㄧㄝˊ
+偈 0 ㄐㄧㄝˊ
+擷 0 ㄐㄧㄝˊ
+倢 0 ㄐㄧㄝˊ
+劼 0 ㄐㄧㄝˊ
+婕 0 ㄐㄧㄝˊ
+楬 0 ㄐㄧㄝˊ
+碣 0 ㄐㄧㄝˊ
+鮚 0 ㄐㄧㄝˊ
+岊 0 ㄐㄧㄝˊ
+榤 0 ㄐㄧㄝˊ
+犵 0 ㄐㄧㄝˊ
+袺 0 ㄐㄧㄝˊ
+嵑 0 ㄐㄧㄝˊ
+栨 0 ㄐㄧㄝˊ
+騔 0 ㄐㄧㄝˊ
+滐 0 ㄐㄧㄝˊ
+鉣 0 ㄐㄧㄝˊ
+鐑 0 ㄐㄧㄝˊ
+衱 0 ㄐㄧㄝˊ
+迼 0 ㄐㄧㄝˊ
+崨 0 ㄐㄧㄝˊ
+嵥 0 ㄐㄧㄝˊ
+楶 0 ㄐㄧㄝˊ
+趌 0 ㄐㄧㄝˊ
+踕 0 ㄐㄧㄝˊ
+擳 0 ㄐㄧㄝˊ
+瀄 0 ㄐㄧㄝˊ
+鍻 0 ㄐㄧㄝˊ
+蠽 0 ㄐㄧㄝˊ
+昅 0 ㄐㄧㄝˊ
+揤 0 ㄐㄧㄝˊ
+緁 0 ㄐㄧㄝˊ
+巀 0 ㄐㄧㄝˊ
+緳 0 ㄐㄧㄝˊ
+舛 0 ㄐㄧㄝˊ
+揭 0 ㄐㄧㄝˊ
+渴 0 ㄐㄧㄝˊ
+隔 0 ㄐㄧㄝˊ
+泲 0 ㄐㄧㄝˊ
+疌 0 ㄐㄧㄝˊ
+狤 0 ㄐㄧㄝˊ
+勍 0 ㄐㄧㄝˊ
+栔 0 ㄐㄧㄝˊ
+洯 0 ㄐㄧㄝˊ
+荈 0 ㄐㄧㄝˊ
+啑 0 ㄐㄧㄝˊ
+梜 0 ㄐㄧㄝˊ
+楖 0 ㄐㄧㄝˊ
+萐 0 ㄐㄧㄝˊ
+蛣 0 ㄐㄧㄝˊ
+袷 0 ㄐㄧㄝˊ
+蝍 0 ㄐㄧㄝˊ
+裌 0 ㄐㄧㄝˊ
+朅 0 ㄐㄧㄝˊ
+箑 0 ㄐㄧㄝˊ
+蜨 0 ㄐㄧㄝˊ
+磔 0 ㄐㄧㄝˊ
+鋏 0 ㄐㄧㄝˊ
+幯 0 ㄐㄧㄝˊ
+謋 0 ㄐㄧㄝˊ
+鵖 0 ㄐㄧㄝˊ
+卩 0 ㄐㄧㄝˊ
+刧 0 ㄐㄧㄝˊ
+刦 0 ㄐㄧㄝˊ
+刼 0 ㄐㄧㄝˊ
+偼 0 ㄐㄧㄝˊ
+掲 0 ㄐㄧㄝˊ
+渇 0 ㄐㄧㄝˊ
+莭 0 ㄐㄧㄝˊ
+媫 0 ㄐㄧㄝˊ
+㨗 0 ㄐㄧㄝˊ
+魝 0 ㄐㄧㄝˊ
+蓵 0 ㄐㄧㄝˊ
+誱 0 ㄐㄧㄝˊ
+嶻 0 ㄐㄧㄝˊ
+擮 0 ㄐㄧㄝˊ
+櫭 0 ㄐㄧㄝˊ
+礍 0 ㄐㄧㄝˊ
+蠘 0 ㄐㄧㄝˊ
+㔾 0 ㄐㄧㄝˊ
+卪 0 ㄐㄧㄝˊ
+厇 0 ㄐㄧㄝˊ
+㛃 0 ㄐㄧㄝˊ
+蜐 0 ㄐㄧㄝˊ
+㘉 0 ㄐㄧㄝˊ
+蠞 0 ㄐㄧㄝˊ
+𠲵 0 ㄐㄧㄝˊ
+𡩣 0 ㄐㄧㄝˊ
+𦵴 0 ㄐㄧㄝˊ
+姊 0 ㄐㄧㄝ˙
+舅 0 ㄐㄧㄡ˙
+糾 0 ㄐㄧㄡ
+揪 0 ㄐㄧㄡ
+啾 0 ㄐㄧㄡ
+鳩 0 ㄐㄧㄡ
+轇 0 ㄐㄧㄡ
+湫 0 ㄐㄧㄡ
+樛 0 ㄐㄧㄡ
+揫 0 ㄐㄧㄡ
+勼 0 ㄐㄧㄡ
+朻 0 ㄐㄧㄡ
+牞 0 ㄐㄧㄡ
+觓 0 ㄐㄧㄡ
+揂 0 ㄐㄧㄡ
+萛 0 ㄐㄧㄡ
+鬮 0 ㄐㄧㄡ
+灸 0 ㄐㄧㄡ
+究 0 ㄐㄧㄡ
+虯 0 ㄐㄧㄡ
+釓 0 ㄐㄧㄡ
+蝤 0 ㄐㄧㄡ
+糺 0 ㄐㄧㄡ
+虬 0 ㄐㄧㄡ
+湬 0 ㄐㄧㄡ
+噍 0 ㄐㄧㄡ
+丩 0 ㄐㄧㄡ
+芁 0 ㄐㄧㄡ
+稵 0 ㄐㄧㄡ
+鬏 0 ㄐㄧㄡ
+赳 0 ㄐㄧㄡ
+九 0 ㄐㄧㄡˇ
+久 0 ㄐㄧㄡˇ
+酒 0 ㄐㄧㄡˇ
+玖 0 ㄐㄧㄡˇ
+赳 0 ㄐㄧㄡˇ
+灸 0 ㄐㄧㄡˇ
+韭 0 ㄐㄧㄡˇ
+糾 0 ㄐㄧㄡˇ
+炙 0 ㄐㄧㄡˇ
+疚 0 ㄐㄧㄡˇ
+柩 0 ㄐㄧㄡˇ
+愀 0 ㄐㄧㄡˇ
+勼 0 ㄐㄧㄡˇ
+虯 0 ㄐㄧㄡˇ
+觓 0 ㄐㄧㄡˇ
+釓 0 ㄐㄧㄡˇ
+韰 0 ㄐㄧㄡˇ
+薤 0 ㄐㄧㄡˇ
+齏 0 ㄐㄧㄡˇ
+乆 0 ㄐㄧㄡˇ
+乣 0 ㄐㄧㄡˇ
+奺 0 ㄐㄧㄡˇ
+糺 0 ㄐㄧㄡˇ
+虬 0 ㄐㄧㄡˇ
+柾 0 ㄐㄧㄡˇ
+紤 0 ㄐㄧㄡˇ
+韮 0 ㄐㄧㄡˇ
+熫 0 ㄐㄧㄡˇ
+韲 0 ㄐㄧㄡˇ
+匶 0 ㄐㄧㄡˇ
+匛 0 ㄐㄧㄡˇ
+舏 0 ㄐㄧㄡˇ
+镹 0 ㄐㄧㄡˇ
+就 0 ㄐㄧㄡˋ
+究 0 ㄐㄧㄡˋ
+救 0 ㄐㄧㄡˋ
+舊 0 ㄐㄧㄡˋ
+舅 0 ㄐㄧㄡˋ
+臼 0 ㄐㄧㄡˋ
+柩 0 ㄐㄧㄡˋ
+疚 0 ㄐㄧㄡˋ
+咎 0 ㄐㄧㄡˋ
+僦 0 ㄐㄧㄡˋ
+鷲 0 ㄐㄧㄡˋ
+廄 0 ㄐㄧㄡˋ
+捄 0 ㄐㄧㄡˋ
+慦 0 ㄐㄧㄡˋ
+鯦 0 ㄐㄧㄡˋ
+麔 0 ㄐㄧㄡˋ
+晷 0 ㄐㄧㄡˋ
+宄 0 ㄐㄧㄡˋ
+閰 0 ㄐㄧㄡˋ
+旧 0 ㄐㄧㄡˋ
+柾 0 ㄐㄧㄡˋ
+倃 0 ㄐㄧㄡˋ
+粙 0 ㄐㄧㄡˋ
+媨 0 ㄐㄧㄡˋ
+厩 0 ㄐㄧㄡˋ
+廐 0 ㄐㄧㄡˋ
+廏 0 ㄐㄧㄡˋ
+匶 0 ㄐㄧㄡˋ
+匛 0 ㄐㄧㄡˋ
+玐 0 ㄐㄧㄡˋ
+䊆 0 ㄐㄧㄡˋ
+齨 0 ㄐㄧㄡˋ
+匓 0 ㄐㄧㄡˋ
+經 0 ㄐㄧㄥ
+精 0 ㄐㄧㄥ
+京 0 ㄐㄧㄥ
+驚 0 ㄐㄧㄥ
+睛 0 ㄐㄧㄥ
+莖 0 ㄐㄧㄥ
+晶 0 ㄐㄧㄥ
+菁 0 ㄐㄧㄥ
+更 0 ㄐㄧㄥ
+兢 0 ㄐㄧㄥ
+涇 0 ㄐㄧㄥ
+鯨 0 ㄐㄧㄥ
+荊 0 ㄐㄧㄥ
+旌 0 ㄐㄧㄥ
+粳 0 ㄐㄧㄥ
+黥 0 ㄐㄧㄥ
+箐 0 ㄐㄧㄥ
+鶄 0 ㄐㄧㄥ
+巠 0 ㄐㄧㄥ
+婛 0 ㄐㄧㄥ
+旍 0 ㄐㄧㄥ
+鵛 0 ㄐㄧㄥ
+鶁 0 ㄐㄧㄥ
+鼱 0 ㄐㄧㄥ
+麠 0 ㄐㄧㄥ
+仱 0 ㄐㄧㄥ
+惊 0 ㄐㄧㄥ
+青 0 ㄐㄧㄥ
+耕 0 ㄐㄧㄥ
+痙 0 ㄐㄧㄥ
+弳 0 ㄐㄧㄥ
+挳 0 ㄐㄧㄥ
+婧 0 ㄐㄧㄥ
+桱 0 ㄐㄧㄥ
+殌 0 ㄐㄧㄥ
+牼 0 ㄐㄧㄥ
+硜 0 ㄐㄧㄥ
+羥 0 ㄐㄧㄥ
+蛵 0 ㄐㄧㄥ
+翞 0 ㄐㄧㄥ
+蒯 0 ㄐㄧㄥ
+誙 0 ㄐㄧㄥ
+鋞 0 ㄐㄧㄥ
+坕 0 ㄐㄧㄥ
+靑 0 ㄐㄧㄥ
+亰 0 ㄐㄧㄥ
+畊 0 ㄐㄧㄥ
+秔 0 ㄐㄧㄥ
+茎 0 ㄐㄧㄥ
+婙 0 ㄐㄧㄥ
+寈 0 ㄐㄧㄥ
+経 0 ㄐㄧㄥ
+稉 0 ㄐㄧㄥ
+腈 0 ㄐㄧㄥ
+荆 0 ㄐㄧㄥ
+葏 0 ㄐㄧㄥ
+摾 0 ㄐㄧㄥ
+䃘 0 ㄐㄧㄥ
+薓 0 ㄐㄧㄥ
+猄 0 ㄐㄧㄥ
+聙 0 ㄐㄧㄥ
+鹶 0 ㄐㄧㄥ
+麖 0 ㄐㄧㄥ
+景 0 ㄐㄧㄥˇ
+警 0 ㄐㄧㄥˇ
+井 0 ㄐㄧㄥˇ
+頸 0 ㄐㄧㄥˇ
+阱 0 ㄐㄧㄥˇ
+儆 0 ㄐㄧㄥˇ
+璟 0 ㄐㄧㄥˇ
+憬 0 ㄐㄧㄥˇ
+剄 0 ㄐㄧㄥˇ
+璥 0 ㄐㄧㄥˇ
+丼 0 ㄐㄧㄥˇ
+肼 0 ㄐㄧㄥˇ
+憼 0 ㄐㄧㄥˇ
+暻 0 ㄐㄧㄥˇ
+蟼 0 ㄐㄧㄥˇ
+燛 0 ㄐㄧㄥˇ
+境 0 ㄐㄧㄥˇ
+擎 0 ㄐㄧㄥˇ
+汫 0 ㄐㄧㄥˇ
+幜 0 ㄐㄧㄥˇ
+澋 0 ㄐㄧㄥˇ
+鵛 0 ㄐㄧㄥˇ
+汬 0 ㄐㄧㄥˇ
+穽 0 ㄐㄧㄥˇ
+頚 0 ㄐㄧㄥˇ
+璄 0 ㄐㄧㄥˇ
+䜘 0 ㄐㄧㄥˇ
+敬 0 ㄐㄧㄥˋ
+竟 0 ㄐㄧㄥˋ
+鏡 0 ㄐㄧㄥˋ
+靜 0 ㄐㄧㄥˋ
+境 0 ㄐㄧㄥˋ
+淨 0 ㄐㄧㄥˋ
+競 0 ㄐㄧㄥˋ
+逕 0 ㄐㄧㄥˋ
+徑 0 ㄐㄧㄥˋ
+靖 0 ㄐㄧㄥˋ
+勁 0 ㄐㄧㄥˋ
+凊 0 ㄐㄧㄥˋ
+脛 0 ㄐㄧㄥˋ
+痙 0 ㄐㄧㄥˋ
+獍 0 ㄐㄧㄥˋ
+倞 0 ㄐㄧㄥˋ
+靚 0 ㄐㄧㄥˋ
+竫 0 ㄐㄧㄥˋ
+婧 0 ㄐㄧㄥˋ
+桱 0 ㄐㄧㄥˋ
+俓 0 ㄐㄧㄥˋ
+凈 0 ㄐㄧㄥˋ
+葝 0 ㄐㄧㄥˋ
+擏 0 ㄐㄧㄥˋ
+弳 0 ㄐㄧㄥˋ
+莖 0 ㄐㄧㄥˋ
+兢 0 ㄐㄧㄥˋ
+請 0 ㄐㄧㄥˋ
+檠 0 ㄐㄧㄥˋ
+汫 0 ㄐㄧㄥˋ
+肵 0 ㄐㄧㄥˋ
+剄 0 ㄐㄧㄥˋ
+挳 0 ㄐㄧㄥˋ
+殌 0 ㄐㄧㄥˋ
+牼 0 ㄐㄧㄥˋ
+硜 0 ㄐㄧㄥˋ
+羥 0 ㄐㄧㄥˋ
+摬 0 ㄐㄧㄥˋ
+誙 0 ㄐㄧㄥˋ
+儆 0 ㄐㄧㄥˋ
+樈 0 ㄐㄧㄥˋ
+憼 0 ㄐㄧㄥˋ
+璥 0 ㄐㄧㄥˋ
+蟼 0 ㄐㄧㄥˋ
+妌 0 ㄐㄧㄥˋ
+径 0 ㄐㄧㄥˋ
+浄 0 ㄐㄧㄥˋ
+茎 0 ㄐㄧㄥˋ
+梷 0 ㄐㄧㄥˋ
+竧 0 ㄐㄧㄥˋ
+傹 0 ㄐㄧㄥˋ
+滰 0 ㄐㄧㄥˋ
+誩 0 ㄐㄧㄥˋ
+踁 0 ㄐㄧㄥˋ
+静 0 ㄐㄧㄥˋ
+䃘 0 ㄐㄧㄥˋ
+曔 0 ㄐㄧㄥˋ
+㯳 0 ㄐㄧㄥˋ
+瀞 0 ㄐㄧㄥˋ
+竸 0 ㄐㄧㄥˋ
+净 0 ㄐㄧㄥˋ
+將 0 ㄐㄧㄤ
+江 0 ㄐㄧㄤ
+疆 0 ㄐㄧㄤ
+僵 0 ㄐㄧㄤ
+漿 0 ㄐㄧㄤ
+姜 0 ㄐㄧㄤ
+薑 0 ㄐㄧㄤ
+豇 0 ㄐㄧㄤ
+殭 0 ㄐㄧㄤ
+韁 0 ㄐㄧㄤ
+螿 0 ㄐㄧㄤ
+橿 0 ㄐㄧㄤ
+茳 0 ㄐㄧㄤ
+礓 0 ㄐㄧㄤ
+瓨 0 ㄐㄧㄤ
+翞 0 ㄐㄧㄤ
+鏘 0 ㄐㄧㄤ
+矼 0 ㄐㄧㄤ
+墏 0 ㄐㄧㄤ
+嶈 0 ㄐㄧㄤ
+将 0 ㄐㄧㄤ
+畕 0 ㄐㄧㄤ
+畺 0 ㄐㄧㄤ
+葁 0 ㄐㄧㄤ
+摪 0 ㄐㄧㄤ
+壃 0 ㄐㄧㄤ
+繮 0 ㄐㄧㄤ
+疅 0 ㄐㄧㄤ
+講 0 ㄐㄧㄤˇ
+獎 0 ㄐㄧㄤˇ
+蔣 0 ㄐㄧㄤˇ
+槳 0 ㄐㄧㄤˇ
+顜 0 ㄐㄧㄤˇ
+膙 0 ㄐㄧㄤˇ
+傋 0 ㄐㄧㄤˇ
+耩 0 ㄐㄧㄤˇ
+奨 0 ㄐㄧㄤˇ
+奬 0 ㄐㄧㄤˇ
+鞲 0 ㄐㄧㄤˇ
+降 0 ㄐㄧㄤˋ
+匠 0 ㄐㄧㄤˋ
+醬 0 ㄐㄧㄤˋ
+強 0 ㄐㄧㄤˋ
+將 0 ㄐㄧㄤˋ
+絳 0 ㄐㄧㄤˋ
+糨 0 ㄐㄧㄤˋ
+洚 0 ㄐㄧㄤˋ
+謽 0 ㄐㄧㄤˋ
+嵹 0 ㄐㄧㄤˋ
+彊 0 ㄐㄧㄤˋ
+弶 0 ㄐㄧㄤˋ
+袶 0 ㄐㄧㄤˋ
+虹 0 ㄐㄧㄤˋ
+漿 0 ㄐㄧㄤˋ
+嶈 0 ㄐㄧㄤˋ
+鏹 0 ㄐㄧㄤˋ
+匞 0 ㄐㄧㄤˋ
+夅 0 ㄐㄧㄤˋ
+将 0 ㄐㄧㄤˋ
+强 0 ㄐㄧㄤˋ
+摾 0 ㄐㄧㄤˋ
+滰 0 ㄐㄧㄤˋ
+蔃 0 ㄐㄧㄤˋ
+糡 0 ㄐㄧㄤˋ
+弜 0 ㄐㄧㄤˋ
+犟 0 ㄐㄧㄤˋ
+間 0 ㄐㄧㄢ
+監 0 ㄐㄧㄢ
+堅 0 ㄐㄧㄢ
+尖 0 ㄐㄧㄢ
+兼 0 ㄐㄧㄢ
+肩 0 ㄐㄧㄢ
+艱 0 ㄐㄧㄢ
+奸 0 ㄐㄧㄢ
+姦 0 ㄐㄧㄢ
+煎 0 ㄐㄧㄢ
+緘 0 ㄐㄧㄢ
+濺 0 ㄐㄧㄢ
+漸 0 ㄐㄧㄢ
+箋 0 ㄐㄧㄢ
+殲 0 ㄐㄧㄢ
+菅 0 ㄐㄧㄢ
+戔 0 ㄐㄧㄢ
+鞬 0 ㄐㄧㄢ
+牋 0 ㄐㄧㄢ
+椷 0 ㄐㄧㄢ
+縑 0 ㄐㄧㄢ
+湔 0 ㄐㄧㄢ
+熸 0 ㄐㄧㄢ
+蒹 0 ㄐㄧㄢ
+鶼 0 ㄐㄧㄢ
+廌 0 ㄐㄧㄢ
+犍 0 ㄐㄧㄢ
+籛 0 ㄐㄧㄢ
+豜 0 ㄐㄧㄢ
+韉 0 ㄐㄧㄢ
+鬋 0 ㄐㄧㄢ
+鈃 0 ㄐㄧㄢ
+鑯 0 ㄐㄧㄢ
+鰹 0 ㄐㄧㄢ
+鰜 0 ㄐㄧㄢ
+櫼 0 ㄐㄧㄢ
+熞 0 ㄐㄧㄢ
+蕑 0 ㄐㄧㄢ
+揃 0 ㄐㄧㄢ
+搛 0 ㄐㄧㄢ
+幵 0 ㄐㄧㄢ
+菺 0 ㄐㄧㄢ
+靬 0 ㄐㄧㄢ
+葌 0 ㄐㄧㄢ
+鳽 0 ㄐㄧㄢ
+餰 0 ㄐㄧㄢ
+礛 0 ㄐㄧㄢ
+騝 0 ㄐㄧㄢ
+鵳 0 ㄐㄧㄢ
+瀸 0 ㄐㄧㄢ
+虃 0 ㄐㄧㄢ
+惤 0 ㄐㄧㄢ
+猏 0 ㄐㄧㄢ
+麉 0 ㄐㄧㄢ
+訐 0 ㄐㄧㄢ
+淺 0 ㄐㄧㄢ
+閒 0 ㄐㄧㄢ
+尷 0 ㄐㄧㄢ
+鏗 0 ㄐㄧㄢ
+犴 0 ㄐㄧㄢ
+掮 0 ㄐㄧㄢ
+傔 0 ㄐㄧㄢ
+堿 0 ㄐㄧㄢ
+媊 0 ㄐㄧㄢ
+慊 0 ㄐㄧㄢ
+硻 0 ㄐㄧㄢ
+葴 0 ㄐㄧㄢ
+慳 0 ㄐㄧㄢ
+槏 0 ㄐㄧㄢ
+蒧 0 ㄐㄧㄢ
+蜸 0 ㄐㄧㄢ
+鋻 0 ㄐㄧㄢ
+豏 0 ㄐㄧㄢ
+襉 0 ㄐㄧㄢ
+馦 0 ㄐㄧㄢ
+鰔 0 ㄐㄧㄢ
+鼸 0 ㄐㄧㄢ
+姧 0 ㄐㄧㄢ
+浅 0 ㄐㄧㄢ
+飦 0 ㄐㄧㄢ
+碊 0 ㄐㄧㄢ
+豣 0 ㄐㄧㄢ
+睷 0 ㄐㄧㄢ
+銒 0 ㄐㄧㄢ
+䊕 0 ㄐㄧㄢ
+尶 0 ㄐㄧㄢ
+鍳 0 ㄐㄧㄢ
+馢 0 ㄐㄧㄢ
+瀐 0 ㄐㄧㄢ
+魐 0 ㄐㄧㄢ
+譼 0 ㄐㄧㄢ
+韀 0 ㄐㄧㄢ
+礷 0 ㄐㄧㄢ
+开 0 ㄐㄧㄢ
+冿 0 ㄐㄧㄢ
+黬 0 ㄐㄧㄢ
+囏 0 ㄐㄧㄢ
+凲 0 ㄐㄧㄢ
+簡 0 ㄐㄧㄢˇ
+撿 0 ㄐㄧㄢˇ
+剪 0 ㄐㄧㄢˇ
+減 0 ㄐㄧㄢˇ
+檢 0 ㄐㄧㄢˇ
+揀 0 ㄐㄧㄢˇ
+繭 0 ㄐㄧㄢˇ
+儉 0 ㄐㄧㄢˇ
+鹼 0 ㄐㄧㄢˇ
+柬 0 ㄐㄧㄢˇ
+筧 0 ㄐㄧㄢˇ
+翦 0 ㄐㄧㄢˇ
+謇 0 ㄐㄧㄢˇ
+戩 0 ㄐㄧㄢˇ
+蹇 0 ㄐㄧㄢˇ
+譾 0 ㄐㄧㄢˇ
+趼 0 ㄐㄧㄢˇ
+堿 0 ㄐㄧㄢˇ
+囝 0 ㄐㄧㄢˇ
+鰔 0 ㄐㄧㄢˇ
+挸 0 ㄐㄧㄢˇ
+湕 0 ㄐㄧㄢˇ
+瞼 0 ㄐㄧㄢˇ
+寋 0 ㄐㄧㄢˇ
+藆 0 ㄐㄧㄢˇ
+襺 0 ㄐㄧㄢˇ
+暕 0 ㄐㄧㄢˇ
+瑐 0 ㄐㄧㄢˇ
+件 0 ㄐㄧㄢˇ
+錢 0 ㄐㄧㄢˇ
+鐧 0 ㄐㄧㄢˇ
+騫 0 ㄐㄧㄢˇ
+帴 0 ㄐㄧㄢˇ
+媊 0 ㄐㄧㄢˇ
+揃 0 ㄐㄧㄢˇ
+僉 0 ㄐㄧㄢˇ
+噞 0 ㄐㄧㄢˇ
+嬐 0 ㄐㄧㄢˇ
+憸 0 ㄐㄧㄢˇ
+襉 0 ㄐㄧㄢˇ
+攓 0 ㄐㄧㄢˇ
+鐱 0 ㄐㄧㄢˇ
+鑳 0 ㄐㄧㄢˇ
+倹 0 ㄐㄧㄢˇ
+减 0 ㄐㄧㄢˇ
+梘 0 ㄐㄧㄢˇ
+検 0 ㄐㄧㄢˇ
+詃 0 ㄐㄧㄢˇ
+絸 0 ㄐㄧㄢˇ
+戬 0 ㄐㄧㄢˇ
+碱 0 ㄐㄧㄢˇ
+銭 0 ㄐㄧㄢˇ
+謭 0 ㄐㄧㄢˇ
+瀽 0 ㄐㄧㄢˇ
+蠒 0 ㄐㄧㄢˇ
+鹻 0 ㄐㄧㄢˇ
+弿 0 ㄐㄧㄢˇ
+見 0 ㄐㄧㄢˋ
+建 0 ㄐㄧㄢˋ
+健 0 ㄐㄧㄢˋ
+漸 0 ㄐㄧㄢˋ
+件 0 ㄐㄧㄢˋ
+間 0 ㄐㄧㄢˋ
+監 0 ㄐㄧㄢˋ
+鍵 0 ㄐㄧㄢˋ
+鑑 0 ㄐㄧㄢˋ
+箭 0 ㄐㄧㄢˋ
+劍 0 ㄐㄧㄢˋ
+艦 0 ㄐㄧㄢˋ
+鑒 0 ㄐㄧㄢˋ
+賤 0 ㄐㄧㄢˋ
+踐 0 ㄐㄧㄢˋ
+諫 0 ㄐㄧㄢˋ
+毽 0 ㄐㄧㄢˋ
+薦 0 ㄐㄧㄢˋ
+餞 0 ㄐㄧㄢˋ
+腱 0 ㄐㄧㄢˋ
+濺 0 ㄐㄧㄢˋ
+僭 0 ㄐㄧㄢˋ
+檻 0 ㄐㄧㄢˋ
+閒 0 ㄐㄧㄢˋ
+洊 0 ㄐㄧㄢˋ
+俴 0 ㄐㄧㄢˋ
+牮 0 ㄐㄧㄢˋ
+栫 0 ㄐㄧㄢˋ
+楗 0 ㄐㄧㄢˋ
+珔 0 ㄐㄧㄢˋ
+瀳 0 ㄐㄧㄢˋ
+澗 0 ㄐㄧㄢˋ
+瞷 0 ㄐㄧㄢˋ
+荐 0 ㄐㄧㄢˋ
+諓 0 ㄐㄧㄢˋ
+榗 0 ㄐㄧㄢˋ
+糋 0 ㄐㄧㄢˋ
+鰎 0 ㄐㄧㄢˋ
+蔪 0 ㄐㄧㄢˋ
+鋻 0 ㄐㄧㄢˋ
+螹 0 ㄐㄧㄢˋ
+襉 0 ㄐㄧㄢˋ
+糮 0 ㄐㄧㄢˋ
+鑳 0 ㄐㄧㄢˋ
+峴 0 ㄐㄧㄢˋ
+莧 0 ㄐㄧㄢˋ
+筧 0 ㄐㄧㄢˋ
+儉 0 ㄐㄧㄢˋ
+韉 0 ㄐㄧㄢˋ
+俔 0 ㄐㄧㄢˋ
+娊 0 ㄐㄧㄢˋ
+挸 0 ㄐㄧㄢˋ
+涀 0 ㄐㄧㄢˋ
+揵 0 ㄐㄧㄢˋ
+湕 0 ㄐㄧㄢˋ
+睍 0 ㄐㄧㄢˋ
+廌 0 ㄐㄧㄢˋ
+煡 0 ㄐㄧㄢˋ
+犍 0 ㄐㄧㄢˋ
+粯 0 ㄐㄧㄢˋ
+葥 0 ㄐㄧㄢˋ
+僣 0 ㄐㄧㄢˋ
+摲 0 ㄐㄧㄢˋ
+壏 0 ㄐㄧㄢˋ
+覮 0 ㄐㄧㄢˋ
+鞬 0 ㄐㄧㄢˋ
+轞 0 ㄐㄧㄢˋ
+侟 0 ㄐㄧㄢˋ
+倹 0 ㄐㄧㄢˋ
+剣 0 ㄐㄧㄢˋ
+悓 0 ㄐㄧㄢˋ
+臶 0 ㄐㄧㄢˋ
+㨴 0 ㄐㄧㄢˋ
+劎 0 ㄐㄧㄢˋ
+㵎 0 ㄐㄧㄢˋ
+趝 0 ㄐㄧㄢˋ
+劔 0 ㄐㄧㄢˋ
+瞯 0 ㄐㄧㄢˋ
+鍳 0 ㄐㄧㄢˋ
+擶 0 ㄐㄧㄢˋ
+繝 0 ㄐㄧㄢˋ
+鏩 0 ㄐㄧㄢˋ
+鐗 0 ㄐㄧㄢˋ
+鐧 0 ㄐㄧㄢˋ
+譼 0 ㄐㄧㄢˋ
+韀 0 ㄐㄧㄢˋ
+鑬 0 ㄐㄧㄢˋ
+徤 0 ㄐㄧㄢˋ
+旔 0 ㄐㄧㄢˋ
+劒 0 ㄐㄧㄢˋ
+踺 0 ㄐㄧㄢˋ
+礀 0 ㄐㄧㄢˋ
+幾 0 ㄐㄧˇ
+給 0 ㄐㄧˇ
+己 0 ㄐㄧˇ
+擠 0 ㄐㄧˇ
+脊 0 ㄐㄧˇ
+戟 0 ㄐㄧˇ
+濟 0 ㄐㄧˇ
+几 0 ㄐㄧˇ
+麂 0 ㄐㄧˇ
+庋 0 ㄐㄧˇ
+蟣 0 ㄐㄧˇ
+剞 0 ㄐㄧˇ
+掎 0 ㄐㄧˇ
+泲 0 ㄐㄧˇ
+踦 0 ㄐㄧˇ
+魕 0 ㄐㄧˇ
+丮 0 ㄐㄧˇ
+穖 0 ㄐㄧˇ
+妀 0 ㄐㄧˇ
+撠 0 ㄐㄧˇ
+紀 0 ㄐㄧˇ
+机 0 ㄐㄧˇ
+邔 0 ㄐㄧˇ
+芑 0 ㄐㄧˇ
+枳 0 ㄐㄧˇ
+鳧 0 ㄐㄧˇ
+橶 0 ㄐㄧˇ
+鞿 0 ㄐㄧˇ
+犱 0 ㄐㄧˇ
+鳬 0 ㄐㄧˇ
+済 0 ㄐㄧˇ
+㦸 0 ㄐㄧˇ
+嵴 0 ㄐㄧˇ
+魢 0 ㄐㄧˇ
+計 0 ㄐㄧˋ
+記 0 ㄐㄧˋ
+既 0 ㄐㄧˋ
+紀 0 ㄐㄧˋ
+際 0 ㄐㄧˋ
+繼 0 ㄐㄧˋ
+季 0 ㄐㄧˋ
+寄 0 ㄐㄧˋ
+技 0 ㄐㄧˋ
+妓 0 ㄐㄧˋ
+濟 0 ㄐㄧˋ
+劑 0 ㄐㄧˋ
+繫 0 ㄐㄧˋ
+悸 0 ㄐㄧˋ
+祭 0 ㄐㄧˋ
+忌 0 ㄐㄧˋ
+暨 0 ㄐㄧˋ
+冀 0 ㄐㄧˋ
+騎 0 ㄐㄧˋ
+鯽 0 ㄐㄧˋ
+稷 0 ㄐㄧˋ
+躋 0 ㄐㄧˋ
+薺 0 ㄐㄧˋ
+驥 0 ㄐㄧˋ
+霽 0 ㄐㄧˋ
+薊 0 ㄐㄧˋ
+髻 0 ㄐㄧˋ
+罽 0 ㄐㄧˋ
+覬 0 ㄐㄧˋ
+伎 0 ㄐㄧˋ
+洎 0 ㄐㄧˋ
+瘈 0 ㄐㄧˋ
+跽 0 ㄐㄧˋ
+嚌 0 ㄐㄧˋ
+塈 0 ㄐㄧˋ
+惎 0 ㄐㄧˋ
+漈 0 ㄐㄧˋ
+穧 0 ㄐㄧˋ
+芰 0 ㄐㄧˋ
+蔇 0 ㄐㄧˋ
+痵 0 ㄐㄧˋ
+癠 0 ㄐㄧˋ
+穄 0 ㄐㄧˋ
+鮆 0 ㄐㄧˋ
+鱭 0 ㄐㄧˋ
+鯚 0 ㄐㄧˋ
+鰶 0 ㄐㄧˋ
+旡 0 ㄐㄧˋ
+刉 0 ㄐㄧˋ
+臮 0 ㄐㄧˋ
+裚 0 ㄐㄧˋ
+穊 0 ㄐㄧˋ
+誋 0 ㄐㄧˋ
+鬾 0 ㄐㄧˋ
+瞡 0 ㄐㄧˋ
+檕 0 ㄐㄧˋ
+璾 0 ㄐㄧˋ
+鵋 0 ㄐㄧˋ
+齌 0 ㄐㄧˋ
+懻 0 ㄐㄧˋ
+瀱 0 ㄐㄧˋ
+鱀 0 ㄐㄧˋ
+蘮 0 ㄐㄧˋ
+蘻 0 ㄐㄧˋ
+即 0 ㄐㄧˋ
+其 0 ㄐㄧˋ
+寂 0 ㄐㄧˋ
+廄 0 ㄐㄧˋ
+揖 0 ㄐㄧˋ
+齊 0 ㄐㄧˋ
+儕 0 ㄐㄧˋ
+邔 0 ㄐㄧˋ
+庪 0 ㄐㄧˋ
+紒 0 ㄐㄧˋ
+茤 0 ㄐㄧˋ
+偈 0 ㄐㄧˋ
+徛 0 ㄐㄧˋ
+漃 0 ㄐㄧˋ
+暩 0 ㄐㄧˋ
+瘵 0 ㄐㄧˋ
+黖 0 ㄐㄧˋ
+謖 0 ㄐㄧˋ
+齍 0 ㄐㄧˋ
+艩 0 ㄐㄧˋ
+羇 0 ㄐㄧˋ
+麡 0 ㄐㄧˋ
+彐 0 ㄐㄧˋ
+彑 0 ㄐㄧˋ
+齐 0 ㄐㄧˋ
+坖 0 ㄐㄧˋ
+亝 0 ㄐㄧˋ
+斉 0 ㄐㄧˋ
+卽 0 ㄐㄧˋ
+垍 0 ㄐㄧˋ
+峑 0 ㄐㄧˋ
+剤 0 ㄐㄧˋ
+帺 0 ㄐㄧˋ
+㥍 0 ㄐㄧˋ
+旣 0 ㄐㄧˋ
+梞 0 ㄐㄧˋ
+済 0 ㄐㄧˋ
+㻑 0 ㄐㄧˋ
+兾 0 ㄐㄧˋ
+厩 0 ㄐㄧˋ
+継 0 ㄐㄧˋ
+魝 0 ㄐㄧˋ
+墍 0 ㄐㄧˋ
+廐 0 ㄐㄧˋ
+廏 0 ㄐㄧˋ
+稩 0 ㄐㄧˋ
+褀 0 ㄐㄧˋ
+禝 0 ㄐㄧˋ
+曁 0 ㄐㄧˋ
+襀 0 ㄐㄧˋ
+櫭 0 ㄐㄧˋ
+檵 0 ㄐㄧˋ
+聻 0 ㄐㄧˋ
+斊 0 ㄐㄧˋ
+皍 0 ㄐㄧˋ
+萕 0 ㄐㄧˋ
+葪 0 ㄐㄧˋ
+縘 0 ㄐㄧˋ
+鯯 0 ㄐㄧˋ
+蘎 0 ㄐㄧˋ
+及 0 ㄐㄧˊ
+級 0 ㄐㄧˊ
+極 0 ㄐㄧˊ
+即 0 ㄐㄧˊ
+集 0 ㄐㄧˊ
+急 0 ㄐㄧˊ
+擊 0 ㄐㄧˊ
+疾 0 ㄐㄧˊ
+籍 0 ㄐㄧˊ
+吉 0 ㄐㄧˊ
+寂 0 ㄐㄧˊ
+輯 0 ㄐㄧˊ
+脊 0 ㄐㄧˊ
+圾 0 ㄐㄧˊ
+唧 0 ㄐㄧˊ
+嫉 0 ㄐㄧˊ
+汲 0 ㄐㄧˊ
+亟 0 ㄐㄧˊ
+吃 0 ㄐㄧˊ
+棘 0 ㄐㄧˊ
+藉 0 ㄐㄧˊ
+瘠 0 ㄐㄧˊ
+楫 0 ㄐㄧˊ
+岌 0 ㄐㄧˊ
+笈 0 ㄐㄧˊ
+鶺 0 ㄐㄧˊ
+戢 0 ㄐㄧˊ
+殛 0 ㄐㄧˊ
+蹐 0 ㄐㄧˊ
+伋 0 ㄐㄧˊ
+蒺 0 ㄐㄧˊ
+耤 0 ㄐㄧˊ
+芨 0 ㄐㄧˊ
+蕺 0 ㄐㄧˊ
+踖 0 ㄐㄧˊ
+鈒 0 ㄐㄧˊ
+佶 0 ㄐㄧˊ
+堲 0 ㄐㄧˊ
+姞 0 ㄐㄧˊ
+濈 0 ㄐㄧˊ
+襋 0 ㄐㄧˊ
+墼 0 ㄐㄧˊ
+潗 0 ㄐㄧˊ
+鴶 0 ㄐㄧˊ
+嶯 0 ㄐㄧˊ
+洁 0 ㄐㄧˊ
+忣 0 ㄐㄧˊ
+湒 0 ㄐㄧˊ
+极 0 ㄐㄧˊ
+銡 0 ㄐㄧˊ
+狤 0 ㄐㄧˊ
+鏶 0 ㄐㄧˊ
+蝍 0 ㄐㄧˊ
+衱 0 ㄐㄧˊ
+偮 0 ㄐㄧˊ
+庴 0 ㄐㄧˊ
+莋 0 ㄐㄧˊ
+塉 0 ㄐㄧˊ
+槉 0 ㄐㄧˊ
+漃 0 ㄐㄧˊ
+膌 0 ㄐㄧˊ
+蓻 0 ㄐㄧˊ
+橶 0 ㄐㄧˊ
+蕀 0 ㄐㄧˊ
+轚 0 ㄐㄧˊ
+霵 0 ㄐㄧˊ
+彶 0 ㄐㄧˊ
+揤 0 ㄐㄧˊ
+楖 0 ㄐㄧˊ
+秸 0 ㄐㄧˊ
+鞊 0 ㄐㄧˊ
+螏 0 ㄐㄧˊ
+觙 0 ㄐㄧˊ
+戕 0 ㄐㄧˊ
+革 0 ㄐㄧˊ
+戟 0 ㄐㄧˊ
+勣 0 ㄐㄧˊ
+詰 0 ㄐㄧˊ
+劇 0 ㄐㄧˊ
+緝 0 ㄐㄧˊ
+積 0 ㄐㄧˊ
+髻 0 ㄐㄧˊ
+擷 0 ㄐㄧˊ
+蹟 0 ㄐㄧˊ
+鯽 0 ㄐㄧˊ
+丮 0 ㄐㄧˊ
+岋 0 ㄐㄧˊ
+扱 0 ㄐㄧˊ
+昅 0 ㄐㄧˊ
+咭 0 ㄐㄧˊ
+茍 0 ㄐㄧˊ
+咠 0 ㄐㄧˊ
+恄 0 ㄐㄧˊ
+砐 0 ㄐㄧˊ
+迼 0 ㄐㄧˊ
+唶 0 ㄐㄧˊ
+硈 0 ㄐㄧˊ
+聐 0 ㄐㄧˊ
+蛣 0 ㄐㄧˊ
+趌 0 ㄐㄧˊ
+毄 0 ㄐㄧˊ
+憰 0 ㄐㄧˊ
+撠 0 ㄐㄧˊ
+墽 0 ㄐㄧˊ
+諿 0 ㄐㄧˊ
+鮚 0 ㄐㄧˊ
+蟿 0 ㄐㄧˊ
+鰿 0 ㄐㄧˊ
+鷑 0 ㄐㄧˊ
+躤 0 ㄐㄧˊ
+亼 0 ㄐㄧˊ
+皀 0 ㄐㄧˊ
+卽 0 ㄐㄧˊ
+垐 0 ㄐㄧˊ
+㘹 0 ㄐㄧˊ
+郆 0 ㄐㄧˊ
+剧 0 ㄐㄧˊ
+㭲 0 ㄐㄧˊ
+淁 0 ㄐㄧˊ
+焏 0 ㄐㄧˊ
+喞 0 ㄐㄧˊ
+㦸 0 ㄐㄧˊ
+愱 0 ㄐㄧˊ
+稭 0 ㄐㄧˊ
+撃 0 ㄐㄧˊ
+箿 0 ㄐㄧˊ
+䔛 0 ㄐㄧˊ
+瘷 0 ㄐㄧˊ
+檝 0 ㄐㄧˊ
+鍓 0 ㄐㄧˊ
+艥 0 ㄐㄧˊ
+雦 0 ㄐㄧˊ
+雧 0 ㄐㄧˊ
+皍 0 ㄐㄧˊ
+卙 0 ㄐㄧˊ
+脨 0 ㄐㄧˊ
+㗊 0 ㄐㄧˊ
+㗱 0 ㄐㄧˊ
+趞 0 ㄐㄧˊ
+㘍 0 ㄐㄧˊ
+䳭 0 ㄐㄧˊ
+家 0 ㄐㄧㄚ
+加 0 ㄐㄧㄚ
+嘉 0 ㄐㄧㄚ
+佳 0 ㄐㄧㄚ
+傢 0 ㄐㄧㄚ
+迦 0 ㄐㄧㄚ
+枷 0 ㄐㄧㄚ
+袈 0 ㄐㄧㄚ
+痂 0 ㄐㄧㄚ
+笳 0 ㄐㄧㄚ
+珈 0 ㄐㄧㄚ
+跏 0 ㄐㄧㄚ
+茄 0 ㄐㄧㄚ
+葭 0 ㄐㄧㄚ
+豭 0 ㄐㄧㄚ
+耞 0 ㄐㄧㄚ
+麚 0 ㄐㄧㄚ
+泇 0 ㄐㄧㄚ
+毠 0 ㄐㄧㄚ
+鎵 0 ㄐㄧㄚ
+鴐 0 ㄐㄧㄚ
+猳 0 ㄐㄧㄚ
+幏 0 ㄐㄧㄚ
+犌 0 ㄐㄧㄚ
+貑 0 ㄐㄧㄚ
+夾 0 ㄐㄧㄚ
+伽 0 ㄐㄧㄚ
+咖 0 ㄐㄧㄚ
+拁 0 ㄐㄧㄚ
+腵 0 ㄐㄧㄚ
+鉫 0 ㄐㄧㄚ
+擮 0 ㄐㄧㄚ
+䕒 0 ㄐㄧㄚ
+宊 0 ㄐㄧㄚ
+假 0 ㄐㄧㄚˇ
+甲 0 ㄐㄧㄚˇ
+賈 0 ㄐㄧㄚˇ
+鉀 0 ㄐㄧㄚˇ
+岬 0 ㄐㄧㄚˇ
+胛 0 ㄐㄧㄚˇ
+斝 0 ㄐㄧㄚˇ
+榎 0 ㄐㄧㄚˇ
+瘕 0 ㄐㄧㄚˇ
+檟 0 ㄐㄧㄚˇ
+婽 0 ㄐㄧㄚˇ
+玾 0 ㄐㄧㄚˇ
+徦 0 ㄐㄧㄚˇ
+椵 0 ㄐㄧㄚˇ
+夏 0 ㄐㄧㄚˇ
+柙 0 ㄐㄧㄚˇ
+瑕 0 ㄐㄧㄚˇ
+笚 0 ㄐㄧㄚˇ
+舺 0 ㄐㄧㄚˇ
+猳 0 ㄐㄧㄚˇ
+犌 0 ㄐㄧㄚˇ
+嘏 0 ㄐㄧㄚˇ
+碬 0 ㄐㄧㄚˇ
+貑 0 ㄐㄧㄚˇ
+赮 0 ㄐㄧㄚˇ
+魻 0 ㄐㄧㄚˇ
+鍜 0 ㄐㄧㄚˇ
+騢 0 ㄐㄧㄚˇ
+麚 0 ㄐㄧㄚˇ
+叚 0 ㄐㄧㄚˇ
+疨 0 ㄐㄧㄚˇ
+斚 0 ㄐㄧㄚˇ
+䘥 0 ㄐㄧㄚˇ
+夓 0 ㄐㄧㄚˇ
+價 0 ㄐㄧㄚˋ
+假 0 ㄐㄧㄚˋ
+架 0 ㄐㄧㄚˋ
+駕 0 ㄐㄧㄚˋ
+嫁 0 ㄐㄧㄚˋ
+賈 0 ㄐㄧㄚˋ
+稼 0 ㄐㄧㄚˋ
+价 0 ㄐㄧㄚˋ
+甲 0 ㄐㄧㄚˋ
+夾 0 ㄐㄧㄚˋ
+幏 0 ㄐㄧㄚˋ
+鴐 0 ㄐㄧㄚˋ
+価 0 ㄐㄧㄚˋ
+榢 0 ㄐㄧㄚˋ
+夾 0 ㄐㄧㄚˊ
+挾 0 ㄐㄧㄚˊ
+頰 0 ㄐㄧㄚˊ
+蛺 0 ㄐㄧㄚˊ
+莢 0 ㄐㄧㄚˊ
+浹 0 ㄐㄧㄚˊ
+戛 0 ㄐㄧㄚˊ
+郟 0 ㄐㄧㄚˊ
+恝 0 ㄐㄧㄚˊ
+袷 0 ㄐㄧㄚˊ
+筴 0 ㄐㄧㄚˊ
+裌 0 ㄐㄧㄚˊ
+鋏 0 ㄐㄧㄚˊ
+梜 0 ㄐㄧㄚˊ
+跲 0 ㄐㄧㄚˊ
+舺 0 ㄐㄧㄚˊ
+唊 0 ㄐㄧㄚˊ
+硈 0 ㄐㄧㄚˊ
+扴 0 ㄐㄧㄚˊ
+鞂 0 ㄐㄧㄚˊ
+鞈 0 ㄐㄧㄚˊ
+鵊 0 ㄐㄧㄚˊ
+狎 0 ㄐㄧㄚˊ
+俠 0 ㄐㄧㄚˊ
+頡 0 ㄐㄧㄚˊ
+祫 0 ㄐㄧㄚˊ
+秸 0 ㄐㄧㄚˊ
+脥 0 ㄐㄧㄚˊ
+猰 0 ㄐㄧㄚˊ
+硤 0 ㄐㄧㄚˊ
+翜 0 ㄐㄧㄚˊ
+鴶 0 ㄐㄧㄚˊ
+圿 0 ㄐㄧㄚˊ
+忦 0 ㄐㄧㄚˊ
+侠 0 ㄐㄧㄚˊ
+挟 0 ㄐㄧㄚˊ
+埉 0 ㄐㄧㄚˊ
+戞 0 ㄐㄧㄚˊ
+㮖 0 ㄐㄧㄚˊ
+稭 0 ㄐㄧㄚˊ
+浃 0 ㄐㄧㄚˊ
+䛟 0 ㄐㄧㄚˊ
+餄 0 ㄐㄧㄚˊ
+教 0 ㄐㄧㄠ
+交 0 ㄐㄧㄠ
+膠 0 ㄐㄧㄠ
+驕 0 ㄐㄧㄠ
+焦 0 ㄐㄧㄠ
+嬌 0 ㄐㄧㄠ
+郊 0 ㄐㄧㄠ
+跤 0 ㄐㄧㄠ
+澆 0 ㄐㄧㄠ
+蛟 0 ㄐㄧㄠ
+蕉 0 ㄐㄧㄠ
+礁 0 ㄐㄧㄠ
+椒 0 ㄐㄧㄠ
+茭 0 ㄐㄧㄠ
+姣 0 ㄐㄧㄠ
+鮫 0 ㄐㄧㄠ
+僬 0 ㄐㄧㄠ
+憍 0 ㄐㄧㄠ
+艽 0 ㄐㄧㄠ
+鷦 0 ㄐㄧㄠ
+燋 0 ㄐㄧㄠ
+詨 0 ㄐㄧㄠ
+鱎 0 ㄐㄧㄠ
+鐎 0 ㄐㄧㄠ
+鵁 0 ㄐㄧㄠ
+鷮 0 ㄐㄧㄠ
+嘄 0 ㄐㄧㄠ
+憿 0 ㄐㄧㄠ
+膲 0 ㄐㄧㄠ
+穚 0 ㄐㄧㄠ
+蟂 0 ㄐㄧㄠ
+鷍 0 ㄐㄧㄠ
+嶕 0 ㄐㄧㄠ
+蟭 0 ㄐㄧㄠ
+咬 0 ㄐㄧㄠ
+皎 0 ㄐㄧㄠ
+喬 0 ㄐㄧㄠ
+鉸 0 ㄐㄧㄠ
+憔 0 ㄐㄧㄠ
+恔 0 ㄐㄧㄠ
+挍 0 ㄐㄧㄠ
+洨 0 ㄐㄧㄠ
+俶 0 ㄐㄧㄠ
+珓 0 ㄐㄧㄠ
+琡 0 ㄐㄧㄠ
+筊 0 ㄐㄧㄠ
+劁 0 ㄐㄧㄠ
+摎 0 ㄐㄧㄠ
+嫶 0 ㄐㄧㄠ
+樛 0 ㄐㄧㄠ
+潐 0 ㄐㄧㄠ
+頝 0 ㄐㄧㄠ
+嬓 0 ㄐㄧㄠ
+徼 0 ㄐㄧㄠ
+燆 0 ㄐㄧㄠ
+犞 0 ㄐㄧㄠ
+穛 0 ㄐㄧㄠ
+簥 0 ㄐㄧㄠ
+趭 0 ㄐㄧㄠ
+譥 0 ㄐㄧㄠ
+鸄 0 ㄐㄧㄠ
+乔 0 ㄐㄧㄠ
+晈 0 ㄐㄧㄠ
+胶 0 ㄐㄧㄠ
+敎 0 ㄐㄧㄠ
+敫 0 ㄐㄧㄠ
+誟 0 ㄐㄧㄠ
+嶣 0 ㄐㄧㄠ
+癄 0 ㄐㄧㄠ
+譤 0 ㄐㄧㄠ
+顦 0 ㄐㄧㄠ
+齩 0 ㄐㄧㄠ
+䶧 0 ㄐㄧㄠ
+茮 0 ㄐㄧㄠ
+虠 0 ㄐㄧㄠ
+腳 0 ㄐㄧㄠˇ
+角 0 ㄐㄧㄠˇ
+繳 0 ㄐㄧㄠˇ
+攪 0 ㄐㄧㄠˇ
+勦 0 ㄐㄧㄠˇ
+矯 0 ㄐㄧㄠˇ
+絞 0 ㄐㄧㄠˇ
+姣 0 ㄐㄧㄠˇ
+佼 0 ㄐㄧㄠˇ
+餃 0 ㄐㄧㄠˇ
+皎 0 ㄐㄧㄠˇ
+僥 0 ㄐㄧㄠˇ
+剿 0 ㄐㄧㄠˇ
+較 0 ㄐㄧㄠˇ
+鉸 0 ㄐㄧㄠˇ
+狡 0 ㄐㄧㄠˇ
+皦 0 ㄐㄧㄠˇ
+儌 0 ㄐㄧㄠˇ
+筊 0 ㄐㄧㄠˇ
+蟜 0 ㄐㄧㄠˇ
+摷 0 ㄐㄧㄠˇ
+撟 0 ㄐㄧㄠˇ
+捁 0 ㄐㄧㄠˇ
+灚 0 ㄐㄧㄠˇ
+曒 0 ㄐㄧㄠˇ
+漅 0 ㄐㄧㄠˇ
+劋 0 ㄐㄧㄠˇ
+譑 0 ㄐㄧㄠˇ
+煍 0 ㄐㄧㄠˇ
+檄 0 ㄐㄧㄠˇ
+鮫 0 ㄐㄧㄠˇ
+覺 0 ㄐㄧㄠˇ
+唃 0 ㄐㄧㄠˇ
+捔 0 ㄐㄧㄠˇ
+桷 0 ㄐㄧㄠˇ
+湫 0 ㄐㄧㄠˇ
+确 0 ㄐㄧㄠˇ
+憢 0 ㄐㄧㄠˇ
+皛 0 ㄐㄧㄠˇ
+噭 0 ㄐㄧㄠˇ
+墽 0 ㄐㄧㄠˇ
+嬓 0 ㄐㄧㄠˇ
+徼 0 ㄐㄧㄠˇ
+憿 0 ㄐㄧㄠˇ
+撽 0 ㄐㄧㄠˇ
+敿 0 ㄐㄧㄠˇ
+獥 0 ㄐㄧㄠˇ
+礉 0 ㄐㄧㄠˇ
+覈 0 ㄐㄧㄠˇ
+蹻 0 ㄐㄧㄠˇ
+觷 0 ㄐㄧㄠˇ
+譥 0 ㄐㄧㄠˇ
+躈 0 ㄐㄧㄠˇ
+鱎 0 ㄐㄧㄠˇ
+㭂 0 ㄐㄧㄠˇ
+晈 0 ㄐㄧㄠˇ
+烄 0 ㄐㄧㄠˇ
+斍 0 ㄐㄧㄠˇ
+脚 0 ㄐㄧㄠˇ
+覚 0 ㄐㄧㄠˇ
+湬 0 ㄐㄧㄠˇ
+踋 0 ㄐㄧㄠˇ
+撹 0 ㄐㄧㄠˇ
+璬 0 ㄐㄧㄠˇ
+孂 0 ㄐㄧㄠˇ
+譤 0 ㄐㄧㄠˇ
+臫 0 ㄐㄧㄠˇ
+覐 0 ㄐㄧㄠˇ
+㡑 0 ㄐㄧㄠˇ
+暞 0 ㄐㄧㄠˇ
+賋 0 ㄐㄧㄠˇ
+教 0 ㄐㄧㄠˋ
+叫 0 ㄐㄧㄠˋ
+校 0 ㄐㄧㄠˋ
+較 0 ㄐㄧㄠˋ
+覺 0 ㄐㄧㄠˋ
+轎 0 ㄐㄧㄠˋ
+窖 0 ㄐㄧㄠˋ
+皭 0 ㄐㄧㄠˋ
+醮 0 ㄐㄧㄠˋ
+徼 0 ㄐㄧㄠˋ
+噭 0 ㄐㄧㄠˋ
+嶠 0 ㄐㄧㄠˋ
+挍 0 ㄐㄧㄠˋ
+斠 0 ㄐㄧㄠˋ
+珓 0 ㄐㄧㄠˋ
+釂 0 ㄐㄧㄠˋ
+滘 0 ㄐㄧㄠˋ
+窌 0 ㄐㄧㄠˋ
+嘂 0 ㄐㄧㄠˋ
+潐 0 ㄐㄧㄠˋ
+譥 0 ㄐㄧㄠˋ
+窟 0 ㄐㄧㄠˋ
+酵 0 ㄐㄧㄠˋ
+嚼 0 ㄐㄧㄠˋ
+蘸 0 ㄐㄧㄠˋ
+窔 0 ㄐㄧㄠˋ
+嘺 0 ㄐㄧㄠˋ
+撟 0 ㄐㄧㄠˋ
+嬓 0 ㄐㄧㄠˋ
+犞 0 ㄐㄧㄠˋ
+礄 0 ㄐㄧㄠˋ
+趭 0 ㄐㄧㄠˋ
+蹻 0 ㄐㄧㄠˋ
+灂 0 ㄐㄧㄠˋ
+呌 0 ㄐㄧㄠˋ
+泎 0 ㄐㄧㄠˋ
+訆 0 ㄐㄧㄠˋ
+敎 0 ㄐㄧㄠˋ
+斍 0 ㄐㄧㄠˋ
+覚 0 ㄐㄧㄠˋ
+敫 0 ㄐㄧㄠˋ
+嘦 0 ㄐㄧㄠˋ
+譤 0 ㄐㄧㄠˋ
+叽 0 ㄐㄧㄠˋ
+覐 0 ㄐㄧㄠˋ
+漖 0 ㄐㄧㄠˋ
+嚼 0 ㄐㄧㄠˊ
+今 0 ㄐㄧㄣ
+金 0 ㄐㄧㄣ
+禁 0 ㄐㄧㄣ
+津 0 ㄐㄧㄣ
+斤 0 ㄐㄧㄣ
+巾 0 ㄐㄧㄣ
+筋 0 ㄐㄧㄣ
+襟 0 ㄐㄧㄣ
+矜 0 ㄐㄧㄣ
+浸 0 ㄐㄧㄣ
+觔 0 ㄐㄧㄣ
+衿 0 ㄐㄧㄣ
+祲 0 ㄐㄧㄣ
+瑧 0 ㄐㄧㄣ
+菳 0 ㄐㄧㄣ
+珒 0 ㄐㄧㄣ
+埐 0 ㄐㄧㄣ
+紟 0 ㄐㄧㄣ
+嶜 0 ㄐㄧㄣ
+惍 0 ㄐㄧㄣ
+鈐 0 ㄐㄧㄣ
+伒 0 ㄐㄧㄣ
+坅 0 ㄐㄧㄣ
+岒 0 ㄐㄧㄣ
+庈 0 ㄐㄧㄣ
+忴 0 ㄐㄧㄣ
+扲 0 ㄐㄧㄣ
+昑 0 ㄐㄧㄣ
+肣 0 ㄐㄧㄣ
+蚙 0 ㄐㄧㄣ
+軡 0 ㄐㄧㄣ
+堻 0 ㄐㄧㄣ
+靳 0 ㄐㄧㄣ
+靲 0 ㄐㄧㄣ
+鬿 0 ㄐㄧㄣ
+斳 0 ㄐㄧㄣ
+鳹 0 ㄐㄧㄣ
+矝 0 ㄐㄧㄣ
+黅 0 ㄐㄧㄣ
+鵭 0 ㄐㄧㄣ
+兓 0 ㄐㄧㄣ
+荕 0 ㄐㄧㄣ
+濅 0 ㄐㄧㄣ
+䃸 0 ㄐㄧㄣ
+緊 0 ㄐㄧㄣˇ
+僅 0 ㄐㄧㄣˇ
+錦 0 ㄐㄧㄣˇ
+謹 0 ㄐㄧㄣˇ
+儘 0 ㄐㄧㄣˇ
+覲 0 ㄐㄧㄣˇ
+瑾 0 ㄐㄧㄣˇ
+饉 0 ㄐㄧㄣˇ
+槿 0 ㄐㄧㄣˇ
+墐 0 ㄐㄧㄣˇ
+殣 0 ㄐㄧㄣˇ
+堇 0 ㄐㄧㄣˇ
+慬 0 ㄐㄧㄣˇ
+菫 0 ㄐㄧㄣˇ
+巹 0 ㄐㄧㄣˇ
+婜 0 ㄐㄧㄣˇ
+掔 0 ㄐㄧㄣˇ
+廑 0 ㄐㄧㄣˇ
+蓳 0 ㄐㄧㄣˇ
+瘽 0 ㄐㄧㄣˇ
+嚍 0 ㄐㄧㄣˇ
+螼 0 ㄐㄧㄣˇ
+騹 0 ㄐㄧㄣˇ
+卺 0 ㄐㄧㄣˇ
+厪 0 ㄐㄧㄣˇ
+嫤 0 ㄐㄧㄣˇ
+漌 0 ㄐㄧㄣˇ
+懄 0 ㄐㄧㄣˇ
+䐶 0 ㄐㄧㄣˇ
+進 0 ㄐㄧㄣˋ
+近 0 ㄐㄧㄣˋ
+盡 0 ㄐㄧㄣˋ
+禁 0 ㄐㄧㄣˋ
+晉 0 ㄐㄧㄣˋ
+儘 0 ㄐㄧㄣˋ
+浸 0 ㄐㄧㄣˋ
+勁 0 ㄐㄧㄣˋ
+覲 0 ㄐㄧㄣˋ
+燼 0 ㄐㄧㄣˋ
+廑 0 ㄐㄧㄣˋ
+噤 0 ㄐㄧㄣˋ
+靳 0 ㄐㄧㄣˋ
+縉 0 ㄐㄧㄣˋ
+僅 0 ㄐㄧㄣˋ
+藎 0 ㄐㄧㄣˋ
+妗 0 ㄐㄧㄣˋ
+贐 0 ㄐㄧㄣˋ
+寖 0 ㄐㄧㄣˋ
+搢 0 ㄐㄧㄣˋ
+肵 0 ㄐㄧㄣˋ
+璡 0 ㄐㄧㄣˋ
+賮 0 ㄐㄧㄣˋ
+嬧 0 ㄐㄧㄣˋ
+榗 0 ㄐㄧㄣˋ
+僸 0 ㄐㄧㄣˋ
+蓳 0 ㄐㄧㄣˋ
+瘽 0 ㄐㄧㄣˋ
+嚍 0 ㄐㄧㄣˋ
+濜 0 ㄐㄧㄣˋ
+璶 0 ㄐㄧㄣˋ
+伒 0 ㄐㄧㄣˋ
+溍 0 ㄐㄧㄣˋ
+瑾 0 ㄐㄧㄣˋ
+饉 0 ㄐㄧㄣˋ
+坅 0 ㄐㄧㄣˋ
+昑 0 ㄐㄧㄣˋ
+枃 0 ㄐㄧㄣˋ
+肣 0 ㄐㄧㄣˋ
+埐 0 ㄐㄧㄣˋ
+蚙 0 ㄐㄧㄣˋ
+堇 0 ㄐㄧㄣˋ
+祲 0 ㄐㄧㄣˋ
+葝 0 ㄐㄧㄣˋ
+鄑 0 ㄐㄧㄣˋ
+靲 0 ㄐㄧㄣˋ
+墐 0 ㄐㄧㄣˋ
+戩 0 ㄐㄧㄣˋ
+殣 0 ㄐㄧㄣˋ
+澿 0 ㄐㄧㄣˋ
+尽 0 ㄐㄧㄣˋ
+晋 0 ㄐㄧㄣˋ
+唫 0 ㄐㄧㄣˋ
+厪 0 ㄐㄧㄣˋ
+嫤 0 ㄐㄧㄣˋ
+戬 0 ㄐㄧㄣˋ
+瑨 0 ㄐㄧㄣˋ
+馸 0 ㄐㄧㄣˋ
+凚 0 ㄐㄧㄣˋ
+歏 0 ㄐㄧㄣˋ
+㯲 0 ㄐㄧㄣˋ
+劤 0 ㄐㄧㄣˋ
+濅 0 ㄐㄧㄣˋ
+齽 0 ㄐㄧㄣˋ
+ㄋ 0 ㄋ
+啂 0 ㄋㄡˇ
+耨 0 ㄋㄡˋ
+鎒 0 ㄋㄡˋ
+嗕 0 ㄋㄡˋ
+弄 0 ㄋㄡˋ
+獳 0 ㄋㄡˋ
+挵 0 ㄋㄡˋ
+搙 0 ㄋㄡˋ
+槈 0 ㄋㄡˋ
+鐞 0 ㄋㄡˋ
+挊 0 ㄋㄡˋ
+譳 0 ㄋㄡˋ
+羺 0 ㄋㄡˊ
+獳 0 ㄋㄡˊ
+譨 0 ㄋㄡˊ
+𠹌 0 ㄋㄥˇ
+濘 0 ㄋㄥˋ
+弄 0 ㄋㄥˋ
+挵 0 ㄋㄥˋ
+挊 0 ㄋㄥˋ
+𤀑 0 ㄋㄥˋ
+能 0 ㄋㄥˊ
+薴 0 ㄋㄥˊ
+儜 0 ㄋㄥˊ
+膿 0 ㄋㄥˊ
+嬣 0 ㄋㄥˊ
+癑 0 ㄋㄥˊ
+曩 0 ㄋㄤˇ
+攮 0 ㄋㄤˇ
+灢 0 ㄋㄤˇ
+搑 0 ㄋㄤˇ
+饢 0 ㄋㄤˇ
+齉 0 ㄋㄤˋ
+儾 0 ㄋㄤˋ
+囊 0 ㄋㄤˊ
+搑 0 ㄋㄤˊ
+欜 0 ㄋㄤˊ
+乪 0 ㄋㄤˊ
+饢 0 ㄋㄤˊ
+囔 0 ㄋㄤ˙
+囡 0 ㄋㄢ
+赧 0 ㄋㄢˇ
+戁 0 ㄋㄢˇ
+蝻 0 ㄋㄢˇ
+湳 0 ㄋㄢˇ
+腩 0 ㄋㄢˇ
+揇 0 ㄋㄢˇ
+萳 0 ㄋㄢˇ
+罱 0 ㄋㄢˇ
+難 0 ㄋㄢˋ
+婻 0 ㄋㄢˋ
+戁 0 ㄋㄢˋ
+南 0 ㄋㄢˊ
+男 0 ㄋㄢˊ
+難 0 ㄋㄢˊ
+喃 0 ㄋㄢˊ
+楠 0 ㄋㄢˊ
+柟 0 ㄋㄢˊ
+暔 0 ㄋㄢˊ
+諵 0 ㄋㄢˊ
+奻 0 ㄋㄢˊ
+萳 0 ㄋㄢˊ
+莮 0 ㄋㄢˊ
+抩 0 ㄋㄢˊ
+蝻 0 ㄋㄢˊ
+攮 0 ㄋㄢˊ
+枏 0 ㄋㄢˊ
+畘 0 ㄋㄢˊ
+侽 0 ㄋㄢˊ
+那 0 ㄋㄚˇ
+哪 0 ㄋㄚˇ
+雫 0 ㄋㄚˇ
+㖠 0 ㄋㄚˇ
+那 0 ㄋㄚˋ
+納 0 ㄋㄚˋ
+吶 0 ㄋㄚˋ
+訥 0 ㄋㄚˋ
+鈉 0 ㄋㄚˋ
+捺 0 ㄋㄚˋ
+娜 0 ㄋㄚˋ
+肭 0 ㄋㄚˋ
+衲 0 ㄋㄚˋ
+軜 0 ㄋㄚˋ
+妠 0 ㄋㄚˋ
+豽 0 ㄋㄚˋ
+魶 0 ㄋㄚˋ
+笝 0 ㄋㄚˋ
+內 0 ㄋㄚˋ
+汭 0 ㄋㄚˋ
+枘 0 ㄋㄚˋ
+蚋 0 ㄋㄚˋ
+貀 0 ㄋㄚˋ
+内 0 ㄋㄚˋ
+呐 0 ㄋㄚˋ
+靹 0 ㄋㄚˋ
+蒳 0 ㄋㄚˋ
+蜹 0 ㄋㄚˋ
+䟜 0 ㄋㄚˋ
+拿 0 ㄋㄚˊ
+挐 0 ㄋㄚˊ
+拏 0 ㄋㄚˊ
+誽 0 ㄋㄚˊ
+南 0 ㄋㄚˊ
+掔 0 ㄋㄚˊ
+詉 0 ㄋㄚˊ
+那 0 ㄋㄚ˙
+哪 0 ㄋㄚ˙
+㖠 0 ㄋㄚ˙
+乃 0 ㄋㄞˇ
+奶 0 ㄋㄞˇ
+迺 0 ㄋㄞˇ
+氖 0 ㄋㄞˇ
+嬭 0 ㄋㄞˇ
+奈 0 ㄋㄞˇ
+氝 0 ㄋㄞˇ
+釢 0 ㄋㄞˇ
+艿 0 ㄋㄞˇ
+尕 0 ㄋㄞˇ
+妳 0 ㄋㄞˇ
+鼐 0 ㄋㄞˇ
+疓 0 ㄋㄞˇ
+廼 0 ㄋㄞˇ
+耐 0 ㄋㄞˋ
+奈 0 ㄋㄞˋ
+褦 0 ㄋㄞˋ
+鼐 0 ㄋㄞˋ
+柰 0 ㄋㄞˋ
+倷 0 ㄋㄞˋ
+螚 0 ㄋㄞˋ
+渿 0 ㄋㄞˋ
+錼 0 ㄋㄞˋ
+萘 0 ㄋㄞˋ
+孻 0 ㄋㄞˊ
+摨 0 ㄋㄞˊ
+腉 0 ㄋㄞˊ
+搱 0 ㄋㄞˊ
+熋 0 ㄋㄞˊ
+擃 0 ㄋㄨㄥˇ
+繷 0 ㄋㄨㄥˇ
+弄 0 ㄋㄨㄥˋ
+挵 0 ㄋㄨㄥˋ
+挊 0 ㄋㄨㄥˋ
+農 0 ㄋㄨㄥˊ
+濃 0 ㄋㄨㄥˊ
+膿 0 ㄋㄨㄥˊ
+儂 0 ㄋㄨㄥˊ
+噥 0 ㄋㄨㄥˊ
+穠 0 ㄋㄨㄥˊ
+襛 0 ㄋㄨㄥˊ
+醲 0 ㄋㄨㄥˊ
+齈 0 ㄋㄨㄥˊ
+鬞 0 ㄋㄨㄥˊ
+擃 0 ㄋㄨㄥˊ
+辳 0 ㄋㄨㄥˊ
+憹 0 ㄋㄨㄥˊ
+檂 0 ㄋㄨㄥˊ
+癑 0 ㄋㄨㄥˊ
+禯 0 ㄋㄨㄥˊ
+欁 0 ㄋㄨㄥˊ
+蕽 0 ㄋㄨㄥˊ
+弄 0 ㄋㄨㄥ˙
+暖 0 ㄋㄨㄢˇ
+餪 0 ㄋㄨㄢˇ
+煖 0 ㄋㄨㄢˇ
+渜 0 ㄋㄨㄢˇ
+煊 0 ㄋㄨㄢˇ
+煗 0 ㄋㄨㄢˇ
+努 0 ㄋㄨˇ
+弩 0 ㄋㄨˇ
+砮 0 ㄋㄨˇ
+駑 0 ㄋㄨˇ
+夯 0 ㄋㄨˇ
+孥 0 ㄋㄨˇ
+伮 0 ㄋㄨˇ
+怒 0 ㄋㄨˋ
+詉 0 ㄋㄨˋ
+搙 0 ㄋㄨˋ
+奴 0 ㄋㄨˊ
+駑 0 ㄋㄨˊ
+孥 0 ㄋㄨˊ
+笯 0 ㄋㄨˊ
+蒘 0 ㄋㄨˊ
+呶 0 ㄋㄨˊ
+帑 0 ㄋㄨˊ
+弩 0 ㄋㄨˊ
+拏 0 ㄋㄨˊ
+伖 0 ㄋㄨˊ
+橠 0 ㄋㄨㄛˇ
+娜 0 ㄋㄨㄛˇ
+諾 0 ㄋㄨㄛˋ
+懦 0 ㄋㄨㄛˋ
+糯 0 ㄋㄨㄛˋ
+搦 0 ㄋㄨㄛˋ
+逽 0 ㄋㄨㄛˋ
+懧 0 ㄋㄨㄛˋ
+糑 0 ㄋㄨㄛˋ
+那 0 ㄋㄨㄛˋ
+偌 0 ㄋㄨㄛˋ
+需 0 ㄋㄨㄛˋ
+喏 0 ㄋㄨㄛˋ
+愞 0 ㄋㄨㄛˋ
+掿 0 ㄋㄨㄛˋ
+搙 0 ㄋㄨㄛˋ
+搻 0 ㄋㄨㄛˋ
+榒 0 ㄋㄨㄛˋ
+稬 0 ㄋㄨㄛˋ
+蹃 0 ㄋㄨㄛˋ
+鍩 0 ㄋㄨㄛˋ
+穤 0 ㄋㄨㄛˋ
+糥 0 ㄋㄨㄛˋ
+挪 0 ㄋㄨㄛˊ
+娜 0 ㄋㄨㄛˊ
+儺 0 ㄋㄨㄛˊ
+捼 0 ㄋㄨㄛˊ
+梛 0 ㄋㄨㄛˊ
+那 0 ㄋㄨㄛˊ
+難 0 ㄋㄨㄛˊ
+挼 0 ㄋㄨㄛˊ
+郍 0 ㄋㄨㄛˊ
+嫩 0 ㄋㄨㄣˋ
+嫰 0 ㄋㄨㄣˋ
+黁 0 ㄋㄨㄣˊ
+呢 0 ㄋㄜ
+吶 0 ㄋㄜˋ
+那 0 ㄋㄜˋ
+訥 0 ㄋㄜˋ
+呐 0 ㄋㄜˋ
+抐 0 ㄋㄜˋ
+哪 0 ㄋㄜˊ
+㖠 0 ㄋㄜˊ
+呢 0 ㄋㄜ˙
+峱 0 ㄋㄠ
+撓 0 ㄋㄠ
+孬 0 ㄋㄠ
+嶩 0 ㄋㄠ
+腦 0 ㄋㄠˇ
+惱 0 ㄋㄠˇ
+瑙 0 ㄋㄠˇ
+恼 0 ㄋㄠˇ
+娚 0 ㄋㄠˇ
+悩 0 ㄋㄠˇ
+嫐 0 ㄋㄠˇ
+碯 0 ㄋㄠˇ
+憹 0 ㄋㄠˇ
+垴 0 ㄋㄠˇ
+匘 0 ㄋㄠˇ
+鬧 0 ㄋㄠˋ
+淖 0 ㄋㄠˋ
+臑 0 ㄋㄠˋ
+腝 0 ㄋㄠˋ
+閙 0 ㄋㄠˋ
+撓 0 ㄋㄠˊ
+鐃 0 ㄋㄠˊ
+橈 0 ㄋㄠˊ
+呶 0 ㄋㄠˊ
+猱 0 ㄋㄠˊ
+怓 0 ㄋㄠˊ
+譊 0 ㄋㄠˊ
+嶩 0 ㄋㄠˊ
+獶 0 ㄋㄠˊ
+繷 0 ㄋㄠˊ
+獿 0 ㄋㄠˊ
+夒 0 ㄋㄠˊ
+蟯 0 ㄋㄠˊ
+驍 0 ㄋㄠˊ
+峱 0 ㄋㄠˊ
+硇 0 ㄋㄠˊ
+詉 0 ㄋㄠˊ
+憹 0 ㄋㄠˊ
+巎 0 ㄋㄠˊ
+巙 0 ㄋㄠˊ
+虐 0 ㄋㄩㄝˋ
+瘧 0 ㄋㄩㄝˋ
+謔 0 ㄋㄩㄝˋ
+逽 0 ㄋㄩㄝˋ
+硸 0 ㄋㄩㄝˋ
+女 0 ㄋㄩˇ
+籹 0 ㄋㄩˇ
+釹 0 ㄋㄩˇ
+忸 0 ㄋㄩˋ
+恧 0 ㄋㄩˋ
+衄 0 ㄋㄩˋ
+朒 0 ㄋㄩˋ
+女 0 ㄋㄩˋ
+聏 0 ㄋㄩˋ
+沑 0 ㄋㄩˋ
+衂 0 ㄋㄩˋ
+䶊 0 ㄋㄩˋ
+餒 0 ㄋㄟˇ
+哪 0 ㄋㄟˇ
+腇 0 ㄋㄟˇ
+那 0 ㄋㄟˇ
+娞 0 ㄋㄟˇ
+㖠 0 ㄋㄟˇ
+鮾 0 ㄋㄟˇ
+鯘 0 ㄋㄟˇ
+內 0 ㄋㄟˋ
+那 0 ㄋㄟˋ
+汭 0 ㄋㄟˋ
+氝 0 ㄋㄟˋ
+内 0 ㄋㄟˋ
+㐻 0 ㄋㄟˋ
+嫩 0 ㄋㄣˋ
+腝 0 ㄋㄣˋ
+嫰 0 ㄋㄣˋ
+捏 0 ㄋㄧㄝ
+踗 0 ㄋㄧㄝ
+鑈 0 ㄋㄧㄝ
+捻 0 ㄋㄧㄝ
+揑 0 ㄋㄧㄝ
+孽 0 ㄋㄧㄝˋ
+鎳 0 ㄋㄧㄝˋ
+躡 0 ㄋㄧㄝˋ
+聶 0 ㄋㄧㄝˋ
+鑷 0 ㄋㄧㄝˋ
+涅 0 ㄋㄧㄝˋ
+囁 0 ㄋㄧㄝˋ
+囓 0 ㄋㄧㄝˋ
+臬 0 ㄋㄧㄝˋ
+乜 0 ㄋㄧㄝˋ
+嚙 0 ㄋㄧㄝˋ
+臲 0 ㄋㄧㄝˋ
+闑 0 ㄋㄧㄝˋ
+隉 0 ㄋㄧㄝˋ
+齧 0 ㄋㄧㄝˋ
+敜 0 ㄋㄧㄝˋ
+顳 0 ㄋㄧㄝˋ
+糱 0 ㄋㄧㄝˋ
+蘗 0 ㄋㄧㄝˋ
+疌 0 ㄋㄧㄝˋ
+嵲 0 ㄋㄧㄝˋ
+踂 0 ㄋㄧㄝˋ
+篞 0 ㄋㄧㄝˋ
+櫱 0 ㄋㄧㄝˋ
+蠥 0 ㄋㄧㄝˋ
+钀 0 ㄋㄧㄝˋ
+巕 0 ㄋㄧㄝˋ
+業 0 ㄋㄧㄝˋ
+懾 0 ㄋㄧㄝˋ
+攝 0 ㄋㄧㄝˋ
+羍 0 ㄋㄧㄝˋ
+嘄 0 ㄋㄧㄝˋ
+摰 0 ㄋㄧㄝˋ
+槷 0 ㄋㄧㄝˋ
+甈 0 ㄋㄧㄝˋ
+踙 0 ㄋㄧㄝˋ
+嶭 0 ㄋㄧㄝˋ
+鷍 0 ㄋㄧㄝˋ
+圼 0 ㄋㄧㄝˋ
+枿 0 ㄋㄧㄝˋ
+埝 0 ㄋㄧㄝˋ
+惗 0 ㄋㄧㄝˋ
+鈢 0 ㄋㄧㄝˋ
+暬 0 ㄋㄧㄝˋ
+錜 0 ㄋㄧㄝˋ
+褹 0 ㄋㄧㄝˋ
+孼 0 ㄋㄧㄝˋ
+籋 0 ㄋㄧㄝˋ
+蘖 0 ㄋㄧㄝˋ
+糵 0 ㄋㄧㄝˋ
+痆 0 ㄋㄧㄝˋ
+鉩 0 ㄋㄧㄝˋ
+蹑 0 ㄋㄧㄝˋ
+囐 0 ㄋㄧㄝˋ
+䯀 0 ㄋㄧㄝˋ
+帇 0 ㄋㄧㄝˋ
+苶 0 ㄋㄧㄝˊ
+妞 0 ㄋㄧㄡ
+紐 0 ㄋㄧㄡˇ
+扭 0 ㄋㄧㄡˇ
+鈕 0 ㄋㄧㄡˇ
+忸 0 ㄋㄧㄡˇ
+狃 0 ㄋㄧㄡˇ
+炄 0 ㄋㄧㄡˇ
+莥 0 ㄋㄧㄡˇ
+杻 0 ㄋㄧㄡˇ
+沑 0 ㄋㄧㄡˇ
+靵 0 ㄋㄧㄡˇ
+拗 0 ㄋㄧㄡˋ
+謬 0 ㄋㄧㄡˋ
+粈 0 ㄋㄧㄡˋ
+衄 0 ㄋㄧㄡˋ
+糅 0 ㄋㄧㄡˋ
+抝 0 ㄋㄧㄡˋ
+衂 0 ㄋㄧㄡˋ
+䋴 0 ㄋㄧㄡˋ
+牛 0 ㄋㄧㄡˊ
+汼 0 ㄋㄧㄡˊ
+擰 0 ㄋㄧㄥˇ
+橣 0 ㄋㄧㄥˇ
+矃 0 ㄋㄧㄥˇ
+濘 0 ㄋㄧㄥˋ
+佞 0 ㄋㄧㄥˋ
+寧 0 ㄋㄧㄥˋ
+擰 0 ㄋㄧㄥˋ
+獰 0 ㄋㄧㄥˋ
+甯 0 ㄋㄧㄥˋ
+寕 0 ㄋㄧㄥˋ
+寜 0 ㄋㄧㄥˋ
+寗 0 ㄋㄧㄥˋ
+䗿 0 ㄋㄧㄥˋ
+寧 0 ㄋㄧㄥˊ
+凝 0 ㄋㄧㄥˊ
+獰 0 ㄋㄧㄥˊ
+嚀 0 ㄋㄧㄥˊ
+檸 0 ㄋㄧㄥˊ
+甯 0 ㄋㄧㄥˊ
+擰 0 ㄋㄧㄥˊ
+鸋 0 ㄋㄧㄥˊ
+鑏 0 ㄋㄧㄥˊ
+寍 0 ㄋㄧㄥˊ
+聹 0 ㄋㄧㄥˊ
+嬣 0 ㄋㄧㄥˊ
+冰 0 ㄋㄧㄥˊ
+薴 0 ㄋㄧㄥˊ
+仌 0 ㄋㄧㄥˊ
+氷 0 ㄋㄧㄥˊ
+寕 0 ㄋㄧㄥˊ
+寜 0 ㄋㄧㄥˊ
+寗 0 ㄋㄧㄥˊ
+鬡 0 ㄋㄧㄥˊ
+釀 0 ㄋㄧㄤˋ
+娘 0 ㄋㄧㄤˊ
+孃 0 ㄋㄧㄤˊ
+釀 0 ㄋㄧㄤˊ
+嬢 0 ㄋㄧㄤˊ
+捻 0 ㄋㄧㄢˇ
+撚 0 ㄋㄧㄢˇ
+攆 0 ㄋㄧㄢˇ
+拈 0 ㄋㄧㄢˇ
+輦 0 ㄋㄧㄢˇ
+碾 0 ㄋㄧㄢˇ
+輾 0 ㄋㄧㄢˇ
+涊 0 ㄋㄧㄢˇ
+簐 0 ㄋㄧㄢˇ
+跈 0 ㄋㄧㄢˇ
+躎 0 ㄋㄧㄢˇ
+稔 0 ㄋㄧㄢˇ
+淰 0 ㄋㄧㄢˇ
+棯 0 ㄋㄧㄢˇ
+腍 0 ㄋㄧㄢˇ
+諗 0 ㄋㄧㄢˇ
+蹍 0 ㄋㄧㄢˇ
+菍 0 ㄋㄧㄢˇ
+蹨 0 ㄋㄧㄢˇ
+念 0 ㄋㄧㄢˋ
+唸 0 ㄋㄧㄢˋ
+淰 0 ㄋㄧㄢˋ
+廿 0 ㄋㄧㄢˋ
+鼰 0 ㄋㄧㄢˋ
+廾 0 ㄋㄧㄢˋ
+卄 0 ㄋㄧㄢˋ
+埝 0 ㄋㄧㄢˋ
+年 0 ㄋㄧㄢˊ
+黏 0 ㄋㄧㄢˊ
+粘 0 ㄋㄧㄢˊ
+姩 0 ㄋㄧㄢˊ
+哖 0 ㄋㄧㄢˊ
+拈 0 ㄋㄧㄢˊ
+撚 0 ㄋㄧㄢˊ
+溓 0 ㄋㄧㄢˊ
+鯰 0 ㄋㄧㄢˊ
+秊 0 ㄋㄧㄢˊ
+秥 0 ㄋㄧㄢˊ
+䴴 0 ㄋㄧㄢˊ
+你 0 ㄋㄧˇ
+妳 0 ㄋㄧˇ
+擬 0 ㄋㄧˇ
+禰 0 ㄋㄧˇ
+儗 0 ㄋㄧˇ
+旎 0 ㄋㄧˇ
+昵 0 ㄋㄧˇ
+坭 0 ㄋㄧˇ
+柅 0 ㄋㄧˇ
+薿 0 ㄋㄧˇ
+檷 0 ㄋㄧˇ
+抳 0 ㄋㄧˇ
+苨 0 ㄋㄧˇ
+馜 0 ㄋㄧˇ
+隬 0 ㄋㄧˇ
+譺 0 ㄋㄧˇ
+尼 0 ㄋㄧˇ
+泥 0 ㄋㄧˇ
+狔 0 ㄋㄧˇ
+掜 0 ㄋㄧˇ
+薾 0 ㄋㄧˇ
+鑈 0 ㄋㄧˇ
+伲 0 ㄋㄧˇ
+伱 0 ㄋㄧˇ
+拟 0 ㄋㄧˇ
+祢 0 ㄋㄧˇ
+埿 0 ㄋㄧˇ
+孴 0 ㄋㄧˇ
+聻 0 ㄋㄧˇ
+䛏 0 ㄋㄧˇ
+鉨 0 ㄋㄧˇ
+㘈 0 ㄋㄧˇ
+逆 0 ㄋㄧˋ
+溺 0 ㄋㄧˋ
+匿 0 ㄋㄧˋ
+膩 0 ㄋㄧˋ
+泥 0 ㄋㄧˋ
+睨 0 ㄋㄧˋ
+暱 0 ㄋㄧˋ
+惄 0 ㄋㄧˋ
+嫟 0 ㄋㄧˋ
+縌 0 ㄋㄧˋ
+迡 0 ㄋㄧˋ
+堄 0 ㄋㄧˋ
+慝 0 ㄋㄧˋ
+昵 0 ㄋㄧˋ
+衵 0 ㄋㄧˋ
+掜 0 ㄋㄧˋ
+搦 0 ㄋㄧˋ
+鈮 0 ㄋㄧˋ
+糑 0 ㄋㄧˋ
+嶷 0 ㄋㄧˋ
+氼 0 ㄋㄧˋ
+胒 0 ㄋㄧˋ
+埿 0 ㄋㄧˋ
+掿 0 ㄋㄧˋ
+搻 0 ㄋㄧˋ
+懝 0 ㄋㄧˋ
+嬺 0 ㄋㄧˋ
+屰 0 ㄋㄧˋ
+孨 0 ㄋㄧˋ
+痆 0 ㄋㄧˋ
+愵 0 ㄋㄧˋ
+䁥 0 ㄋㄧˋ
+泥 0 ㄋㄧˊ
+尼 0 ㄋㄧˊ
+妮 0 ㄋㄧˊ
+倪 0 ㄋㄧˊ
+霓 0 ㄋㄧˊ
+怩 0 ㄋㄧˊ
+猊 0 ㄋㄧˊ
+蜺 0 ㄋㄧˊ
+輗 0 ㄋㄧˊ
+郳 0 ㄋㄧˊ
+麑 0 ㄋㄧˊ
+鯢 0 ㄋㄧˊ
+齯 0 ㄋㄧˊ
+臡 0 ㄋㄧˊ
+秜 0 ㄋㄧˊ
+狋 0 ㄋㄧˊ
+觬 0 ㄋㄧˊ
+婗 0 ㄋㄧˊ
+淣 0 ㄋㄧˊ
+呢 0 ㄋㄧˊ
+狔 0 ㄋㄧˊ
+屔 0 ㄋㄧˊ
+跜 0 ㄋㄧˊ
+鈮 0 ㄋㄧˊ
+兒 0 ㄋㄧˊ
+旎 0 ㄋㄧˊ
+擬 0 ㄋㄧˊ
+堄 0 ㄋㄧˊ
+鬩 0 ㄋㄧˊ
+麛 0 ㄋㄧˊ
+児 0 ㄋㄧˊ
+㞾 0 ㄋㄧˊ
+拟 0 ㄋㄧˊ
+埿 0 ㄋㄧˊ
+棿 0 ㄋㄧˊ
+腝 0 ㄋㄧˊ
+貎 0 ㄋㄧˊ
+䦧 0 ㄋㄧˊ
+蚭 0 ㄋㄧˊ
+䛏 0 ㄋㄧˊ
+娘 0 ㄋㄧㄚˊ
+孃 0 ㄋㄧㄚˊ
+嬢 0 ㄋㄧㄚˊ
+鳥 0 ㄋㄧㄠˇ
+裊 0 ㄋㄧㄠˇ
+嬲 0 ㄋㄧㄠˇ
+嬝 0 ㄋㄧㄠˇ
+嫋 0 ㄋㄧㄠˇ
+蔦 0 ㄋㄧㄠˇ
+褭 0 ㄋㄧㄠˇ
+樢 0 ㄋㄧㄠˇ
+茮 0 ㄋㄧㄠˇ
+尿 0 ㄋㄧㄠˋ
+溺 0 ㄋㄧㄠˋ
+氼 0 ㄋㄧㄠˋ
+脲 0 ㄋㄧㄠˋ
+拰 0 ㄋㄧㄣˇ
+您 0 ㄋㄧㄣˊ
+恁 0 ㄋㄧㄣˊ
+忹 0 ㄋㄧㄣˊ
+䋻 0 ㄋㄧㄣˊ
+囜 0 ㄋㄧㄣˊ
+吃 0 ㄔ
+蚩 0 ㄔ
+癡 0 ㄔ
+痴 0 ㄔ
+嗤 0 ㄔ
+喫 0 ㄔ
+ㄔ 0 ㄔ
+郗 0 ㄔ
+魑 0 ㄔ
+笞 0 ㄔ
+絺 0 ㄔ
+鴟 0 ㄔ
+媸 0 ㄔ
+摛 0 ㄔ
+瓻 0 ㄔ
+螭 0 ㄔ
+眵 0 ㄔ
+齝 0 ㄔ
+离 0 ㄔ
+貾 0 ㄔ
+誺 0 ㄔ
+瞝 0 ㄔ
+齹 0 ㄔ
+黐 0 ㄔ
+麶 0 ㄔ
+盵 0 ㄔ
+哧 0 ㄔ
+妛 0 ㄔ
+粚 0 ㄔ
+脪 0 ㄔ
+訵 0 ㄔ
+噄 0 ㄔ
+鵄 0 ㄔ
+彲 0 ㄔ
+呞 0 ㄔ
+卨 0 ㄔ
+抽 0 ㄔㄡ
+瘳 0 ㄔㄡ
+搊 0 ㄔㄡ
+篘 0 ㄔㄡ
+犨 0 ㄔㄡ
+婤 0 ㄔㄡ
+紬 0 ㄔㄡ
+搐 0 ㄔㄡ
+㨨 0 ㄔㄡ
+犫 0 ㄔㄡ
+丑 0 ㄔㄡˇ
+醜 0 ㄔㄡˇ
+瞅 0 ㄔㄡˇ
+杻 0 ㄔㄡˇ
+杽 0 ㄔㄡˇ
+吜 0 ㄔㄡˇ
+莥 0 ㄔㄡˇ
+偢 0 ㄔㄡˇ
+矁 0 ㄔㄡˇ
+魗 0 ㄔㄡˇ
+丒 0 ㄔㄡˇ
+䪮 0 ㄔㄡˇ
+臭 0 ㄔㄡˋ
+簉 0 ㄔㄡˋ
+溴 0 ㄔㄡˋ
+殠 0 ㄔㄡˋ
+憱 0 ㄔㄡˋ
+狊 0 ㄔㄡˋ
+糗 0 ㄔㄡˋ
+遚 0 ㄔㄡˋ
+臰 0 ㄔㄡˋ
+愁 0 ㄔㄡˊ
+仇 0 ㄔㄡˊ
+籌 0 ㄔㄡˊ
+綢 0 ㄔㄡˊ
+酬 0 ㄔㄡˊ
+稠 0 ㄔㄡˊ
+紬 0 ㄔㄡˊ
+躊 0 ㄔㄡˊ
+疇 0 ㄔㄡˊ
+惆 0 ㄔㄡˊ
+裯 0 ㄔㄡˊ
+儔 0 ㄔㄡˊ
+讎 0 ㄔㄡˊ
+幬 0 ㄔㄡˊ
+鯈 0 ㄔㄡˊ
+薵 0 ㄔㄡˊ
+嬦 0 ㄔㄡˊ
+椆 0 ㄔㄡˊ
+絒 0 ㄔㄡˊ
+菗 0 ㄔㄡˊ
+懤 0 ㄔㄡˊ
+詶 0 ㄔㄡˊ
+雔 0 ㄔㄡˊ
+燽 0 ㄔㄡˊ
+栦 0 ㄔㄡˊ
+圳 0 ㄔㄡˊ
+鯛 0 ㄔㄡˊ
+氿 0 ㄔㄡˊ
+犰 0 ㄔㄡˊ
+朹 0 ㄔㄡˊ
+釚 0 ㄔㄡˊ
+僽 0 ㄔㄡˊ
+鼽 0 ㄔㄡˊ
+皗 0 ㄔㄡˊ
+筹 0 ㄔㄡˊ
+酧 0 ㄔㄡˊ
+鮋 0 ㄔㄡˊ
+鮉 0 ㄔㄡˊ
+醻 0 ㄔㄡˊ
+讐 0 ㄔㄡˊ
+稱 0 ㄔㄥ
+撐 0 ㄔㄥ
+瞠 0 ㄔㄥ
+蟶 0 ㄔㄥ
+偁 0 ㄔㄥ
+檉 0 ㄔㄥ
+赬 0 ㄔㄥ
+琤 0 ㄔㄥ
+橕 0 ㄔㄥ
+鏿 0 ㄔㄥ
+浾 0 ㄔㄥ
+埥 0 ㄔㄥ
+棦 0 ㄔㄥ
+牚 0 ㄔㄥ
+竀 0 ㄔㄥ
+崝 0 ㄔㄥ
+饓 0 ㄔㄥ
+槍 0 ㄔㄥ
+鎗 0 ㄔㄥ
+鐺 0 ㄔㄥ
+噌 0 ㄔㄥ
+樘 0 ㄔㄥ
+㣔 0 ㄔㄥ
+泟 0 ㄔㄥ
+阷 0 ㄔㄥ
+称 0 ㄔㄥ
+㛵 0 ㄔㄥ
+僜 0 ㄔㄥ
+憆 0 ㄔㄥ
+撑 0 ㄔㄥ
+緽 0 ㄔㄥ
+頳 0 ㄔㄥ
+穪 0 ㄔㄥ
+鏳 0 ㄔㄥ
+爯 0 ㄔㄥ
+逞 0 ㄔㄥˇ
+騁 0 ㄔㄥˇ
+悜 0 ㄔㄥˇ
+庱 0 ㄔㄥˇ
+塣 0 ㄔㄥˇ
+懲 0 ㄔㄥˇ
+梬 0 ㄔㄥˇ
+侱 0 ㄔㄥˇ
+徎 0 ㄔㄥˇ
+惩 0 ㄔㄥˇ
+睈 0 ㄔㄥˇ
+稱 0 ㄔㄥˋ
+秤 0 ㄔㄥˋ
+偁 0 ㄔㄥˋ
+牚 0 ㄔㄥˋ
+称 0 ㄔㄥˋ
+穪 0 ㄔㄥˋ
+靗 0 ㄔㄥˋ
+成 0 ㄔㄥˊ
+程 0 ㄔㄥˊ
+承 0 ㄔㄥˊ
+盛 0 ㄔㄥˊ
+乘 0 ㄔㄥˊ
+誠 0 ㄔㄥˊ
+呈 0 ㄔㄥˊ
+城 0 ㄔㄥˊ
+懲 0 ㄔㄥˊ
+澄 0 ㄔㄥˊ
+橙 0 ㄔㄥˊ
+丞 0 ㄔㄥˊ
+澂 0 ㄔㄥˊ
+棖 0 ㄔㄥˊ
+酲 0 ㄔㄥˊ
+宬 0 ㄔㄥˊ
+晟 0 ㄔㄥˊ
+裎 0 ㄔㄥˊ
+郕 0 ㄔㄥˊ
+埕 0 ㄔㄥˊ
+掁 0 ㄔㄥˊ
+湞 0 ㄔㄥˊ
+珵 0 ㄔㄥˊ
+荿 0 ㄔㄥˊ
+騬 0 ㄔㄥˊ
+脀 0 ㄔㄥˊ
+脭 0 ㄔㄥˊ
+揨 0 ㄔㄥˊ
+峸 0 ㄔㄥˊ
+鋮 0 ㄔㄥˊ
+塍 0 ㄔㄥˊ
+崢 0 ㄔㄥˊ
+傖 0 ㄔㄥˊ
+氶 0 ㄔㄥˊ
+巹 0 ㄔㄥˊ
+浧 0 ㄔㄥˊ
+崝 0 ㄔㄥˊ
+臹 0 ㄔㄥˊ
+溗 0 ㄔㄥˊ
+撜 0 ㄔㄥˊ
+卺 0 ㄔㄥˊ
+乗 0 ㄔㄥˊ
+娍 0 ㄔㄥˊ
+峥 0 ㄔㄥˊ
+洆 0 ㄔㄥˊ
+挰 0 ㄔㄥˊ
+晠 0 ㄔㄥˊ
+珹 0 ㄔㄥˊ
+窚 0 ㄔㄥˊ
+堘 0 ㄔㄥˊ
+惩 0 ㄔㄥˊ
+椉 0 ㄔㄥˊ
+筬 0 ㄔㄥˊ
+絾 0 ㄔㄥˊ
+塖 0 ㄔㄥˊ
+憕 0 ㄔㄥˊ
+瀓 0 ㄔㄥˊ
+畻 0 ㄔㄥˊ
+昌 0 ㄔㄤ
+倡 0 ㄔㄤ
+猖 0 ㄔㄤ
+娼 0 ㄔㄤ
+閶 0 ㄔㄤ
+菖 0 ㄔㄤ
+鯧 0 ㄔㄤ
+倀 0 ㄔㄤ
+鼚 0 ㄔㄤ
+錩 0 ㄔㄤ
+淐 0 ㄔㄤ
+琩 0 ㄔㄤ
+裮 0 ㄔㄤ
+晿 0 ㄔㄤ
+䮖 0 ㄔㄤ
+䱽 0 ㄔㄤ
+鱂 0 ㄔㄤ
+場 0 ㄔㄤˇ
+廠 0 ㄔㄤˇ
+敞 0 ㄔㄤˇ
+氅 0 ㄔㄤˇ
+昶 0 ㄔㄤˇ
+鋹 0 ㄔㄤˇ
+惝 0 ㄔㄤˇ
+僘 0 ㄔㄤˇ
+厰 0 ㄔㄤˇ
+塲 0 ㄔㄤˇ
+唱 0 ㄔㄤˋ
+倡 0 ㄔㄤˋ
+暢 0 ㄔㄤˋ
+悵 0 ㄔㄤˋ
+鬯 0 ㄔㄤˋ
+韔 0 ㄔㄤˋ
+瑒 0 ㄔㄤˋ
+誯 0 ㄔㄤˋ
+畼 0 ㄔㄤˋ
+長 0 ㄔㄤˊ
+常 0 ㄔㄤˊ
+場 0 ㄔㄤˊ
+嘗 0 ㄔㄤˊ
+裳 0 ㄔㄤˊ
+償 0 ㄔㄤˊ
+腸 0 ㄔㄤˊ
+嫦 0 ㄔㄤˊ
+鱨 0 ㄔㄤˊ
+徜 0 ㄔㄤˊ
+嚐 0 ㄔㄤˊ
+萇 0 ㄔㄤˊ
+鋿 0 ㄔㄤˊ
+粻 0 ㄔㄤˊ
+仧 0 ㄔㄤˊ
+甞 0 ㄔㄤˊ
+塲 0 ㄔㄤˊ
+瑺 0 ㄔㄤˊ
+膓 0 ㄔㄤˊ
+鏛 0 ㄔㄤˊ
+兏 0 ㄔㄤˊ
+镸 0 ㄔㄤˊ
+瓺 0 ㄔㄤˊ
+摻 0 ㄔㄢ
+攙 0 ㄔㄢ
+梴 0 ㄔㄢ
+襜 0 ㄔㄢ
+辿 0 ㄔㄢ
+鋓 0 ㄔㄢ
+惉 0 ㄔㄢ
+嬓 0 ㄔㄢ
+裧 0 ㄔㄢ
+幨 0 ㄔㄢ
+掺 0 ㄔㄢ
+袩 0 ㄔㄢ
+撡 0 ㄔㄢ
+脠 0 ㄔㄢ
+產 0 ㄔㄢˇ
+鏟 0 ㄔㄢˇ
+闡 0 ㄔㄢˇ
+剷 0 ㄔㄢˇ
+蕆 0 ㄔㄢˇ
+嘽 0 ㄔㄢˇ
+囅 0 ㄔㄢˇ
+丳 0 ㄔㄢˇ
+嵼 0 ㄔㄢˇ
+燀 0 ㄔㄢˇ
+諂 0 ㄔㄢˇ
+驏 0 ㄔㄢˇ
+幝 0 ㄔㄢˇ
+繟 0 ㄔㄢˇ
+滻 0 ㄔㄢˇ
+簅 0 ㄔㄢˇ
+灛 0 ㄔㄢˇ
+旵 0 ㄔㄢˇ
+譂 0 ㄔㄢˇ
+剗 0 ㄔㄢˇ
+産 0 ㄔㄢˇ
+摌 0 ㄔㄢˇ
+閳 0 ㄔㄢˇ
+讇 0 ㄔㄢˇ
+醦 0 ㄔㄢˇ
+懺 0 ㄔㄢˋ
+羼 0 ㄔㄢˋ
+儳 0 ㄔㄢˋ
+顫 0 ㄔㄢˋ
+讖 0 ㄔㄢˋ
+丳 0 ㄔㄢˋ
+嚵 0 ㄔㄢˋ
+硟 0 ㄔㄢˋ
+韂 0 ㄔㄢˋ
+纏 0 ㄔㄢˊ
+蟬 0 ㄔㄢˊ
+禪 0 ㄔㄢˊ
+饞 0 ㄔㄢˊ
+讒 0 ㄔㄢˊ
+潺 0 ㄔㄢˊ
+蟾 0 ㄔㄢˊ
+巉 0 ㄔㄢˊ
+嬋 0 ㄔㄢˊ
+單 0 ㄔㄢˊ
+澶 0 ㄔㄢˊ
+廛 0 ㄔㄢˊ
+孱 0 ㄔㄢˊ
+劖 0 ㄔㄢˊ
+毚 0 ㄔㄢˊ
+瀍 0 ㄔㄢˊ
+瀺 0 ㄔㄢˊ
+躔 0 ㄔㄢˊ
+鑱 0 ㄔㄢˊ
+磛 0 ㄔㄢˊ
+艬 0 ㄔㄢˊ
+僝 0 ㄔㄢˊ
+棎 0 ㄔㄢˊ
+湹 0 ㄔㄢˊ
+鋋 0 ㄔㄢˊ
+煘 0 ㄔㄢˊ
+獑 0 ㄔㄢˊ
+繵 0 ㄔㄢˊ
+酁 0 ㄔㄢˊ
+嶄 0 ㄔㄢˊ
+厘 0 ㄔㄢˊ
+儃 0 ㄔㄢˊ
+樼 0 ㄔㄢˊ
+虥 0 ㄔㄢˊ
+蟺 0 ㄔㄢˊ
+轏 0 ㄔㄢˊ
+欃 0 ㄔㄢˊ
+单 0 ㄔㄢˊ
+単 0 ㄔㄢˊ
+婵 0 ㄔㄢˊ
+嶃 0 ㄔㄢˊ
+潹 0 ㄔㄢˊ
+緾 0 ㄔㄢˊ
+蟮 0 ㄔㄢˊ
+鄽 0 ㄔㄢˊ
+鏩 0 ㄔㄢˊ
+纒 0 ㄔㄢˊ
+誗 0 ㄔㄢˊ
+尺 0 ㄔˇ
+齒 0 ㄔˇ
+恥 0 ㄔˇ
+呎 0 ㄔˇ
+侈 0 ㄔˇ
+褫 0 ㄔˇ
+欼 0 ㄔˇ
+搋 0 ㄔˇ
+蚇 0 ㄔˇ
+恀 0 ㄔˇ
+拸 0 ㄔˇ
+姼 0 ㄔˇ
+傂 0 ㄔˇ
+誃 0 ㄔˇ
+鉹 0 ㄔˇ
+伬 0 ㄔˇ
+咫 0 ㄔˇ
+豉 0 ㄔˇ
+奓 0 ㄔˇ
+胣 0 ㄔˇ
+趍 0 ㄔˇ
+擨 0 ㄔˇ
+肔 0 ㄔˇ
+垑 0 ㄔˇ
+䊼 0 ㄔˇ
+耻 0 ㄔˇ
+歯 0 ㄔˇ
+誀 0 ㄔˇ
+裭 0 ㄔˇ
+㶴 0 ㄔˇ
+袳 0 ㄔˇ
+赤 0 ㄔˋ
+翅 0 ㄔˋ
+斥 0 ㄔˋ
+飭 0 ㄔˋ
+叱 0 ㄔˋ
+熾 0 ㄔˋ
+啻 0 ㄔˋ
+傺 0 ㄔˋ
+敕 0 ㄔˋ
+眙 0 ㄔˋ
+抶 0 ㄔˋ
+饎 0 ㄔˋ
+栻 0 ㄔˋ
+遫 0 ㄔˋ
+彳 0 ㄔˋ
+跮 0 ㄔˋ
+踅 0 ㄔˋ
+鷘 0 ㄔˋ
+乿 0 ㄔˋ
+瘛 0 ㄔˋ
+鉓 0 ㄔˋ
+哧 0 ㄔˋ
+淔 0 ㄔˋ
+痸 0 ㄔˋ
+懘 0 ㄔˋ
+戠 0 ㄔˋ
+摰 0 ㄔˋ
+吒 0 ㄔˋ
+柝 0 ㄔˋ
+赫 0 ㄔˋ
+幟 0 ㄔˋ
+乇 0 ㄔˋ
+虴 0 ㄔˋ
+捇 0 ㄔˋ
+湁 0 ㄔˋ
+觢 0 ㄔˋ
+赩 0 ㄔˋ
+趐 0 ㄔˋ
+鶒 0 ㄔˋ
+杘 0 ㄔˋ
+灻 0 ㄔˋ
+卶 0 ㄔˋ
+呹 0 ㄔˋ
+勅 0 ㄔˋ
+咤 0 ㄔˋ
+恜 0 ㄔˋ
+勑 0 ㄔˋ
+翄 0 ㄔˋ
+烾 0 ㄔˋ
+痓 0 ㄔˋ
+雴 0 ㄔˋ
+慗 0 ㄔˋ
+憏 0 ㄔˋ
+慸 0 ㄔˋ
+爀 0 ㄔˋ
+糦 0 ㄔˋ
+趩 0 ㄔˋ
+侙 0 ㄔˋ
+卙 0 ㄔˋ
+旘 0 ㄔˋ
+翤 0 ㄔˋ
+持 0 ㄔˊ
+池 0 ㄔˊ
+遲 0 ㄔˊ
+馳 0 ㄔˊ
+匙 0 ㄔˊ
+弛 0 ㄔˊ
+墀 0 ㄔˊ
+坻 0 ㄔˊ
+踟 0 ㄔˊ
+箎 0 ㄔˊ
+茬 0 ㄔˊ
+蚳 0 ㄔˊ
+篪 0 ㄔˊ
+蚔 0 ㄔˊ
+茌 0 ㄔˊ
+痄 0 ㄔˊ
+忯 0 ㄔˊ
+汦 0 ㄔˊ
+荎 0 ㄔˊ
+栘 0 ㄔˊ
+歭 0 ㄔˊ
+耛 0 ㄔˊ
+貾 0 ㄔˊ
+趍 0 ㄔˊ
+箈 0 ㄔˊ
+徲 0 ㄔˊ
+謘 0 ㄔˊ
+徥 0 ㄔˊ
+尺 0 ㄔˊ
+治 0 ㄔˊ
+泜 0 ㄔˊ
+痴 0 ㄔˊ
+彽 0 ㄔˊ
+阺 0 ㄔˊ
+乿 0 ㄔˊ
+跢 0 ㄔˊ
+鍉 0 ㄔˊ
+坘 0 ㄔˊ
+岻 0 ㄔˊ
+竾 0 ㄔˊ
+俿 0 ㄔˊ
+赿 0 ㄔˊ
+筂 0 ㄔˊ
+遅 0 ㄔˊ
+遟 0 ㄔˊ
+差 0 ㄔㄚ
+插 0 ㄔㄚ
+叉 0 ㄔㄚ
+喳 0 ㄔㄚ
+艖 0 ㄔㄚ
+嗏 0 ㄔㄚ
+扠 0 ㄔㄚ
+杈 0 ㄔㄚ
+偛 0 ㄔㄚ
+疀 0 ㄔㄚ
+鎈 0 ㄔㄚ
+臿 0 ㄔㄚ
+溠 0 ㄔㄚ
+槎 0 ㄔㄚ
+鍤 0 ㄔㄚ
+芆 0 ㄔㄚ
+挿 0 ㄔㄚ
+訍 0 ㄔㄚ
+揷 0 ㄔㄚ
+肞 0 ㄔㄚ
+銟 0 ㄔㄚ
+餷 0 ㄔㄚ
+蹅 0 ㄔㄚˇ
+叉 0 ㄔㄚˇ
+鑔 0 ㄔㄚˇ
+詫 0 ㄔㄚˋ
+岔 0 ㄔㄚˋ
+剎 0 ㄔㄚˋ
+差 0 ㄔㄚˋ
+汊 0 ㄔㄚˋ
+衩 0 ㄔㄚˋ
+蜡 0 ㄔㄚˋ
+侘 0 ㄔㄚˋ
+奼 0 ㄔㄚˋ
+紁 0 ㄔㄚˋ
+杈 0 ㄔㄚˋ
+刹 0 ㄔㄚˋ
+姹 0 ㄔㄚˋ
+訍 0 ㄔㄚˋ
+仛 0 ㄔㄚˋ
+䟕 0 ㄔㄚˋ
+查 0 ㄔㄚˊ
+察 0 ㄔㄚˊ
+茶 0 ㄔㄚˊ
+搽 0 ㄔㄚˊ
+槎 0 ㄔㄚˊ
+鍤 0 ㄔㄚˊ
+碴 0 ㄔㄚˊ
+臿 0 ㄔㄚˊ
+垞 0 ㄔㄚˊ
+秅 0 ㄔㄚˊ
+叉 0 ㄔㄚˊ
+岔 0 ㄔㄚˊ
+楂 0 ㄔㄚˊ
+蹅 0 ㄔㄚˊ
+嚓 0 ㄔㄚˊ
+査 0 ㄔㄚˊ
+詧 0 ㄔㄚˊ
+摖 0 ㄔㄚˊ
+檫 0 ㄔㄚˊ
+櫒 0 ㄔㄚˊ
+褨 0 ㄔㄚˊ
+䠡 0 ㄔㄚˊ
+茬 0 ㄔㄚˊ
+拆 0 ㄔㄞ
+釵 0 ㄔㄞ
+差 0 ㄔㄞ
+偨 0 ㄔㄞ
+靫 0 ㄔㄞ
+冊 0 ㄔㄞˇ
+册 0 ㄔㄞˇ
+茝 0 ㄔㄞˇ
+笧 0 ㄔㄞˇ
+蠆 0 ㄔㄞˋ
+袃 0 ㄔㄞˋ
+囆 0 ㄔㄞˋ
+瘥 0 ㄔㄞˋ
+訍 0 ㄔㄞˋ
+差 0 ㄔㄞˋ
+柴 0 ㄔㄞˊ
+豺 0 ㄔㄞˊ
+儕 0 ㄔㄞˊ
+祡 0 ㄔㄞˊ
+喍 0 ㄔㄞˊ
+茈 0 ㄔㄞˊ
+砦 0 ㄔㄞˊ
+釮 0 ㄔㄞˊ
+犲 0 ㄔㄞˊ
+出 0 ㄔㄨ
+初 0 ㄔㄨ
+齣 0 ㄔㄨ
+貙 0 ㄔㄨ
+趉 0 ㄔㄨ
+趎 0 ㄔㄨ
+犓 0 ㄔㄨ
+岀 0 ㄔㄨ
+摢 0 ㄔㄨ
+誳 0 ㄔㄨ
+出 0 ㄔㄨ˙
+充 0 ㄔㄨㄥ
+衝 0 ㄔㄨㄥ
+沖 0 ㄔㄨㄥ
+舂 0 ㄔㄨㄥ
+忡 0 ㄔㄨㄥ
+憧 0 ㄔㄨㄥ
+珫 0 ㄔㄨㄥ
+茺 0 ㄔㄨㄥ
+浺 0 ㄔㄨㄥ
+蹖 0 ㄔㄨㄥ
+祌 0 ㄔㄨㄥ
+翀 0 ㄔㄨㄥ
+憃 0 ㄔㄨㄥ
+罿 0 ㄔㄨㄥ
+冲 0 ㄔㄨㄥ
+嘃 0 ㄔㄨㄥ
+摏 0 ㄔㄨㄥ
+寵 0 ㄔㄨㄥˇ
+埫 0 ㄔㄨㄥˇ
+衝 0 ㄔㄨㄥˋ
+銃 0 ㄔㄨㄥˋ
+揰 0 ㄔㄨㄥˋ
+尰 0 ㄔㄨㄥˋ
+瘇 0 ㄔㄨㄥˋ
+重 0 ㄔㄨㄥˊ
+崇 0 ㄔㄨㄥˊ
+虫 0 ㄔㄨㄥˊ
+蟲 0 ㄔㄨㄥˊ
+种 0 ㄔㄨㄥˊ
+翀 0 ㄔㄨㄥˊ
+蝩 0 ㄔㄨㄥˊ
+隀 0 ㄔㄨㄥˊ
+茧 0 ㄔㄨㄥˊ
+痋 0 ㄔㄨㄥˊ
+蠱 0 ㄔㄨㄥˊ
+嫞 0 ㄔㄨㄥˊ
+爞 0 ㄔㄨㄥˊ
+烛 0 ㄔㄨㄥˊ
+崈 0 ㄔㄨㄥˊ
+漴 0 ㄔㄨㄥˊ
+蛊 0 ㄔㄨㄥˊ
+窗 0 ㄔㄨㄤ
+創 0 ㄔㄨㄤ
+瘡 0 ㄔㄨㄤ
+囪 0 ㄔㄨㄤ
+憃 0 ㄔㄨㄤ
+戧 0 ㄔㄨㄤ
+摐 0 ㄔㄨㄤ
+愴 0 ㄔㄨㄤ
+刱 0 ㄔㄨㄤ
+瑲 0 ㄔㄨㄤ
+刅 0 ㄔㄨㄤ
+囱 0 ㄔㄨㄤ
+剏 0 ㄔㄨㄤ
+剙 0 ㄔㄨㄤ
+窓 0 ㄔㄨㄤ
+牎 0 ㄔㄨㄤ
+牕 0 ㄔㄨㄤ
+窻 0 ㄔㄨㄤ
+刽 0 ㄔㄨㄤ
+闖 0 ㄔㄨㄤˇ
+搶 0 ㄔㄨㄤˇ
+漺 0 ㄔㄨㄤˇ
+傸 0 ㄔㄨㄤˇ
+磢 0 ㄔㄨㄤˇ
+摤 0 ㄔㄨㄤˇ
+創 0 ㄔㄨㄤˋ
+闖 0 ㄔㄨㄤˋ
+愴 0 ㄔㄨㄤˋ
+刱 0 ㄔㄨㄤˋ
+獊 0 ㄔㄨㄤˋ
+凔 0 ㄔㄨㄤˋ
+剏 0 ㄔㄨㄤˋ
+剙 0 ㄔㄨㄤˋ
+刽 0 ㄔㄨㄤˋ
+床 0 ㄔㄨㄤˊ
+幢 0 ㄔㄨㄤˊ
+撞 0 ㄔㄨㄤˊ
+橦 0 ㄔㄨㄤˊ
+疒 0 ㄔㄨㄤˊ
+牀 0 ㄔㄨㄤˊ
+漴 0 ㄔㄨㄤˊ
+噇 0 ㄔㄨㄤˊ
+穿 0 ㄔㄨㄢ
+川 0 ㄔㄨㄢ
+鐉 0 ㄔㄨㄢ
+氚 0 ㄔㄨㄢ
+瑏 0 ㄔㄨㄢ
+釧 0 ㄔㄨㄢ
+圌 0 ㄔㄨㄢ
+灥 0 ㄔㄨㄢ
+巛 0 ㄔㄨㄢ
+喘 0 ㄔㄨㄢˇ
+舛 0 ㄔㄨㄢˇ
+荈 0 ㄔㄨㄢˇ
+揣 0 ㄔㄨㄢˇ
+踹 0 ㄔㄨㄢˇ
+踳 0 ㄔㄨㄢˇ
+堾 0 ㄔㄨㄢˇ
+僢 0 ㄔㄨㄢˇ
+蝽 0 ㄔㄨㄢˇ
+串 0 ㄔㄨㄢˋ
+釧 0 ㄔㄨㄢˋ
+玔 0 ㄔㄨㄢˋ
+汌 0 ㄔㄨㄢˋ
+夼 0 ㄔㄨㄢˋ
+賗 0 ㄔㄨㄢˋ
+腨 0 ㄔㄨㄢˋ
+傳 0 ㄔㄨㄢˊ
+船 0 ㄔㄨㄢˊ
+遄 0 ㄔㄨㄢˊ
+椽 0 ㄔㄨㄢˊ
+歂 0 ㄔㄨㄢˊ
+諯 0 ㄔㄨㄢˊ
+暷 0 ㄔㄨㄢˊ
+輲 0 ㄔㄨㄢˊ
+猭 0 ㄔㄨㄢˊ
+椯 0 ㄔㄨㄢˊ
+縳 0 ㄔㄨㄢˊ
+餯 0 ㄔㄨㄢˊ
+舩 0 ㄔㄨㄢˊ
+篅 0 ㄔㄨㄢˊ
+處 0 ㄔㄨˇ
+楚 0 ㄔㄨˇ
+儲 0 ㄔㄨˇ
+礎 0 ㄔㄨˇ
+杵 0 ㄔㄨˇ
+褚 0 ㄔㄨˇ
+楮 0 ㄔㄨˇ
+濋 0 ㄔㄨˇ
+檚 0 ㄔㄨˇ
+貯 0 ㄔㄨˇ
+泞 0 ㄔㄨˇ
+儊 0 ㄔㄨˇ
+处 0 ㄔㄨˇ
+椘 0 ㄔㄨˇ
+禇 0 ㄔㄨˇ
+憷 0 ㄔㄨˇ
+齼 0 ㄔㄨˇ
+柠 0 ㄔㄨˇ
+齭 0 ㄔㄨˇ
+處 0 ㄔㄨˋ
+觸 0 ㄔㄨˋ
+畜 0 ㄔㄨˋ
+絀 0 ㄔㄨˋ
+矗 0 ㄔㄨˋ
+黜 0 ㄔㄨˋ
+俶 0 ㄔㄨˋ
+怵 0 ㄔㄨˋ
+搐 0 ㄔㄨˋ
+歜 0 ㄔㄨˋ
+詘 0 ㄔㄨˋ
+鄐 0 ㄔㄨˋ
+斶 0 ㄔㄨˋ
+亍 0 ㄔㄨˋ
+豖 0 ㄔㄨˋ
+泏 0 ㄔㄨˋ
+琡 0 ㄔㄨˋ
+踀 0 ㄔㄨˋ
+滀 0 ㄔㄨˋ
+儊 0 ㄔㄨˋ
+臅 0 ㄔㄨˋ
+敊 0 ㄔㄨˋ
+怷 0 ㄔㄨˋ
+眝 0 ㄔㄨˋ
+触 0 ㄔㄨˋ
+諔 0 ㄔㄨˋ
+擉 0 ㄔㄨˋ
+蠲 0 ㄔㄨˋ
+处 0 ㄔㄨˋ
+竌 0 ㄔㄨˋ
+炪 0 ㄔㄨˋ
+㙇 0 ㄔㄨˋ
+笜 0 ㄔㄨˋ
+傗 0 ㄔㄨˋ
+誳 0 ㄔㄨˋ
+閦 0 ㄔㄨˋ
+嘼 0 ㄔㄨˋ
+除 0 ㄔㄨˊ
+儲 0 ㄔㄨˊ
+廚 0 ㄔㄨˊ
+鋤 0 ㄔㄨˊ
+櫥 0 ㄔㄨˊ
+雛 0 ㄔㄨˊ
+芻 0 ㄔㄨˊ
+躇 0 ㄔㄨˊ
+滁 0 ㄔㄨˊ
+躕 0 ㄔㄨˊ
+篨 0 ㄔㄨˊ
+耡 0 ㄔㄨˊ
+蜍 0 ㄔㄨˊ
+鉏 0 ㄔㄨˊ
+蒢 0 ㄔㄨˊ
+跦 0 ㄔㄨˊ
+鶵 0 ㄔㄨˊ
+幮 0 ㄔㄨˊ
+貙 0 ㄔㄨˊ
+趎 0 ㄔㄨˊ
+犓 0 ㄔㄨˊ
+屠 0 ㄔㄨˊ
+媰 0 ㄔㄨˊ
+藸 0 ㄔㄨˊ
+耝 0 ㄔㄨˊ
+䟞 0 ㄔㄨˊ
+厨 0 ㄔㄨˊ
+豠 0 ㄔㄨˊ
+㕑 0 ㄔㄨˊ
+蒭 0 ㄔㄨˊ
+橱 0 ㄔㄨˊ
+蹰 0 ㄔㄨˊ
+雏 0 ㄔㄨˊ
+蕏 0 ㄔㄨˊ
+欻 0 ㄔㄨㄚ
+歘 0 ㄔㄨㄚ
+抓 0 ㄔㄨㄚˇ
+揣 0 ㄔㄨㄞˇ
+踹 0 ㄔㄨㄞˋ
+嘬 0 ㄔㄨㄞˋ
+欼 0 ㄔㄨㄞˋ
+膗 0 ㄔㄨㄞˊ
+戳 0 ㄔㄨㄛ
+綽 0 ㄔㄨㄛˋ
+輟 0 ㄔㄨㄛˋ
+齪 0 ㄔㄨㄛˋ
+婼 0 ㄔㄨㄛˋ
+啜 0 ㄔㄨㄛˋ
+惙 0 ㄔㄨㄛˋ
+歠 0 ㄔㄨㄛˋ
+醊 0 ㄔㄨㄛˋ
+婥 0 ㄔㄨㄛˋ
+畷 0 ㄔㄨㄛˋ
+逴 0 ㄔㄨㄛˋ
+娖 0 ㄔㄨㄛˋ
+吷 0 ㄔㄨㄛˋ
+珿 0 ㄔㄨㄛˋ
+磭 0 ㄔㄨㄛˋ
+腏 0 ㄔㄨㄛˋ
+趠 0 ㄔㄨㄛˋ
+擉 0 ㄔㄨㄛˋ
+嚽 0 ㄔㄨㄛˋ
+娕 0 ㄔㄨㄛˋ
+焯 0 ㄔㄨㄛˋ
+錣 0 ㄔㄨㄛˋ
+餟 0 ㄔㄨㄛˋ
+辵 0 ㄔㄨㄛˋ
+竐 0 ㄔㄨㄛˋ
+涰 0 ㄔㄨㄛˋ
+䓎 0 ㄔㄨㄛˋ
+酫 0 ㄔㄨㄛˋ
+諁 0 ㄔㄨㄛˋ
+鋜 0 ㄔㄨㄛˋ
+繛 0 ㄔㄨㄛˋ
+蠚 0 ㄔㄨㄛˋ
+鑡 0 ㄔㄨㄛˋ
+辶 0 ㄔㄨㄛˋ
+㲋 0 ㄔㄨㄛˋ
+遬 0 ㄔㄨㄛˋ
+吹 0 ㄔㄨㄟ
+炊 0 ㄔㄨㄟ
+磓 0 ㄔㄨㄟ
+龡 0 ㄔㄨㄟ
+吹 0 ㄔㄨㄟˋ
+炊 0 ㄔㄨㄟˋ
+諈 0 ㄔㄨㄟˋ
+龡 0 ㄔㄨㄟˋ
+垂 0 ㄔㄨㄟˊ
+鎚 0 ㄔㄨㄟˊ
+槌 0 ㄔㄨㄟˊ
+搥 0 ㄔㄨㄟˊ
+椎 0 ㄔㄨㄟˊ
+陲 0 ㄔㄨㄟˊ
+錘 0 ㄔㄨㄟˊ
+捶 0 ㄔㄨㄟˊ
+棰 0 ㄔㄨㄟˊ
+箠 0 ㄔㄨㄟˊ
+圌 0 ㄔㄨㄟˊ
+湷 0 ㄔㄨㄟˊ
+倕 0 ㄔㄨㄟˊ
+菙 0 ㄔㄨㄟˊ
+綞 0 ㄔㄨㄟˊ
+娷 0 ㄔㄨㄟˊ
+腄 0 ㄔㄨㄟˊ
+甀 0 ㄔㄨㄟˊ
+厜 0 ㄔㄨㄟˊ
+硾 0 ㄔㄨㄟˊ
+諈 0 ㄔㄨㄟˊ
+埀 0 ㄔㄨㄟˊ
+桘 0 ㄔㄨㄟˊ
+顀 0 ㄔㄨㄟˊ
+春 0 ㄔㄨㄣ
+椿 0 ㄔㄨㄣ
+杶 0 ㄔㄨㄣ
+輴 0 ㄔㄨㄣ
+焞 0 ㄔㄨㄣ
+鰆 0 ㄔㄨㄣ
+媋 0 ㄔㄨㄣ
+暙 0 ㄔㄨㄣ
+鶞 0 ㄔㄨㄣ
+湷 0 ㄔㄨㄣ
+橁 0 ㄔㄨㄣ
+旾 0 ㄔㄨㄣ
+萅 0 ㄔㄨㄣ
+櫄 0 ㄔㄨㄣ
+蠢 0 ㄔㄨㄣˇ
+惷 0 ㄔㄨㄣˇ
+踳 0 ㄔㄨㄣˇ
+偆 0 ㄔㄨㄣˇ
+萶 0 ㄔㄨㄣˇ
+㖺 0 ㄔㄨㄣˇ
+堾 0 ㄔㄨㄣˇ
+僢 0 ㄔㄨㄣˇ
+睶 0 ㄔㄨㄣˇ
+蝽 0 ㄔㄨㄣˇ
+箺 0 ㄔㄨㄣˇ
+純 0 ㄔㄨㄣˊ
+唇 0 ㄔㄨㄣˊ
+醇 0 ㄔㄨㄣˊ
+淳 0 ㄔㄨㄣˊ
+蓴 0 ㄔㄨㄣˊ
+鶉 0 ㄔㄨㄣˊ
+漘 0 ㄔㄨㄣˊ
+錞 0 ㄔㄨㄣˊ
+韕 0 ㄔㄨㄣˊ
+脣 0 ㄔㄨㄣˊ
+憌 0 ㄔㄨㄣˊ
+鯙 0 ㄔㄨㄣˊ
+屯 0 ㄔㄨㄣˊ
+焞 0 ㄔㄨㄣˊ
+浱 0 ㄔㄨㄣˊ
+陙 0 ㄔㄨㄣˊ
+湻 0 ㄔㄨㄣˊ
+滣 0 ㄔㄨㄣˊ
+蒓 0 ㄔㄨㄣˊ
+醕 0 ㄔㄨㄣˊ
+車 0 ㄔㄜ
+硨 0 ㄔㄜ
+莗 0 ㄔㄜ
+俥 0 ㄔㄜ
+唓 0 ㄔㄜ
+蛼 0 ㄔㄜ
+扯 0 ㄔㄜˇ
+撦 0 ㄔㄜˇ
+奲 0 ㄔㄜˇ
+尺 0 ㄔㄜˇ
+哆 0 ㄔㄜˇ
+拸 0 ㄔㄜˇ
+偖 0 ㄔㄜˇ
+徹 0 ㄔㄜˋ
+澈 0 ㄔㄜˋ
+轍 0 ㄔㄜˋ
+撤 0 ㄔㄜˋ
+掣 0 ㄔㄜˋ
+坼 0 ㄔㄜˋ
+屮 0 ㄔㄜˋ
+迠 0 ㄔㄜˋ
+硩 0 ㄔㄜˋ
+拆 0 ㄔㄜˋ
+呫 0 ㄔㄜˋ
+鮿 0 ㄔㄜˋ
+頙 0 ㄔㄜˋ
+爡 0 ㄔㄜˋ
+㿭 0 ㄔㄜˋ
+瞮 0 ㄔㄜˋ
+勶 0 ㄔㄜˋ
+抄 0 ㄔㄠ
+鈔 0 ㄔㄠ
+超 0 ㄔㄠ
+勦 0 ㄔㄠ
+弨 0 ㄔㄠ
+怊 0 ㄔㄠ
+訬 0 ㄔㄠ
+剿 0 ㄔㄠ
+罺 0 ㄔㄠ
+摷 0 ㄔㄠ
+欩 0 ㄔㄠ
+䫿 0 ㄔㄠ
+吵 0 ㄔㄠˇ
+炒 0 ㄔㄠˇ
+眧 0 ㄔㄠˇ
+赻 0 ㄔㄠˇ
+粆 0 ㄔㄠˇ
+煼 0 ㄔㄠˇ
+巐 0 ㄔㄠˇ
+㥮 0 ㄔㄠˇ
+麨 0 ㄔㄠˇ
+耖 0 ㄔㄠˋ
+鈔 0 ㄔㄠˋ
+趠 0 ㄔㄠˋ
+仦 0 ㄔㄠˋ
+仯 0 ㄔㄠˋ
+觘 0 ㄔㄠˋ
+䮓 0 ㄔㄠˋ
+朝 0 ㄔㄠˊ
+潮 0 ㄔㄠˊ
+巢 0 ㄔㄠˊ
+嘲 0 ㄔㄠˊ
+晁 0 ㄔㄠˊ
+樔 0 ㄔㄠˊ
+轈 0 ㄔㄠˊ
+鄛 0 ㄔㄠˊ
+啁 0 ㄔㄠˊ
+剿 0 ㄔㄠˊ
+勦 0 ㄔㄠˊ
+漅 0 ㄔㄠˊ
+璅 0 ㄔㄠˊ
+巣 0 ㄔㄠˊ
+鼂 0 ㄔㄠˊ
+謿 0 ㄔㄠˊ
+䄻 0 ㄔㄠˊ
+嗔 0 ㄔㄣ
+琛 0 ㄔㄣ
+瞋 0 ㄔㄣ
+郴 0 ㄔㄣ
+賝 0 ㄔㄣ
+棽 0 ㄔㄣ
+謓 0 ㄔㄣ
+諃 0 ㄔㄣ
+搷 0 ㄔㄣ
+堔 0 ㄔㄣ
+抻 0 ㄔㄣ
+捵 0 ㄔㄣ
+綝 0 ㄔㄣ
+捵 0 ㄔㄣˇ
+磣 0 ㄔㄣˇ
+鍖 0 ㄔㄣˇ
+裖 0 ㄔㄣˇ
+墋 0 ㄔㄣˇ
+踸 0 ㄔㄣˇ
+贂 0 ㄔㄣˇ
+祳 0 ㄔㄣˇ
+趻 0 ㄔㄣˇ
+硶 0 ㄔㄣˇ
+夦 0 ㄔㄣˇ
+謲 0 ㄔㄣˇ
+趁 0 ㄔㄣˋ
+稱 0 ㄔㄣˋ
+襯 0 ㄔㄣˋ
+櫬 0 ㄔㄣˋ
+讖 0 ㄔㄣˋ
+疢 0 ㄔㄣˋ
+齔 0 ㄔㄣˋ
+嚫 0 ㄔㄣˋ
+藽 0 ㄔㄣˋ
+儭 0 ㄔㄣˋ
+闖 0 ㄔㄣˋ
+称 0 ㄔㄣˋ
+趂 0 ㄔㄣˋ
+䚀 0 ㄔㄣˋ
+齓 0 ㄔㄣˋ
+穪 0 ㄔㄣˋ
+陳 0 ㄔㄣˊ
+沉 0 ㄔㄣˊ
+晨 0 ㄔㄣˊ
+臣 0 ㄔㄣˊ
+塵 0 ㄔㄣˊ
+辰 0 ㄔㄣˊ
+娠 0 ㄔㄣˊ
+忱 0 ㄔㄣˊ
+沈 0 ㄔㄣˊ
+宸 0 ㄔㄣˊ
+諶 0 ㄔㄣˊ
+煁 0 ㄔㄣˊ
+茞 0 ㄔㄣˊ
+蔯 0 ㄔㄣˊ
+樄 0 ㄔㄣˊ
+莐 0 ㄔㄣˊ
+愖 0 ㄔㄣˊ
+鈂 0 ㄔㄣˊ
+螴 0 ㄔㄣˊ
+麎 0 ㄔㄣˊ
+鷐 0 ㄔㄣˊ
+伔 0 ㄔㄣˊ
+敶 0 ㄔㄣˊ
+脤 0 ㄔㄣˊ
+蜃 0 ㄔㄣˊ
+橙 0 ㄔㄣˊ
+岒 0 ㄔㄣˊ
+抌 0 ㄔㄣˊ
+侲 0 ㄔㄣˊ
+挋 0 ㄔㄣˊ
+桭 0 ㄔㄣˊ
+梣 0 ㄔㄣˊ
+臦 0 ㄔㄣˊ
+蜄 0 ㄔㄣˊ
+誫 0 ㄔㄣˊ
+鋠 0 ㄔㄣˊ
+燛 0 ㄔㄣˊ
+尘 0 ㄔㄣˊ
+牨 0 ㄔㄣˊ
+迧 0 ㄔㄣˊ
+栕 0 ㄔㄣˊ
+莀 0 ㄔㄣˊ
+訦 0 ㄔㄣˊ
+軙 0 ㄔㄣˊ
+瘎 0 ㄔㄣˊ
+曟 0 ㄔㄣˊ
+敐 0 ㄔㄣˊ
+薼 0 ㄔㄣˊ
+霃 0 ㄔㄣˊ
+一 0 ㄧ
+壹 0 ㄧ
+衣 0 ㄧ
+依 0 ㄧ
+醫 0 ㄧ
+伊 0 ㄧ
+揖 0 ㄧ
+噫 0 ㄧ
+漪 0 ㄧ
+猗 0 ㄧ
+咿 0 ㄧ
+ㄧ 0 ㄧ
+禕 0 ㄧ
+繄 0 ㄧ
+黟 0 ㄧ
+曀 0 ㄧ
+銥 0 ㄧ
+泆 0 ㄧ
+鷖 0 ㄧ
+欹 0 ㄧ
+郼 0 ㄧ
+圪 0 ㄧ
+溰 0 ㄧ
+稦 0 ㄧ
+燚 0 ㄧ
+洢 0 ㄧ
+陭 0 ㄧ
+蛜 0 ㄧ
+嫛 0 ㄧ
+瑿 0 ㄧ
+檹 0 ㄧ
+毉 0 ㄧ
+黳 0 ㄧ
+嶬 0 ㄧ
+她 0 ㄧ
+椅 0 ㄧ
+翳 0 ㄧ
+弌 0 ㄧ
+医 0 ㄧ
+壱 0 ㄧ
+㛄 0 ㄧ
+㳖 0 ㄧ
+悘 0 ㄧ
+嬄 0 ㄧ
+夁 0 ㄧ
+䫑 0 ㄧ
+譩 0 ㄧ
+鎄 0 ㄧ
+耶 0 ㄧㄝ
+噎 0 ㄧㄝ
+蠮 0 ㄧㄝ
+掖 0 ㄧㄝ
+也 0 ㄧㄝˇ
+野 0 ㄧㄝˇ
+冶 0 ㄧㄝˇ
+埜 0 ㄧㄝˇ
+漜 0 ㄧㄝˇ
+壄 0 ㄧㄝˇ
+業 0 ㄧㄝˋ
+葉 0 ㄧㄝˋ
+頁 0 ㄧㄝˋ
+夜 0 ㄧㄝˋ
+咽 0 ㄧㄝˋ
+謁 0 ㄧㄝˋ
+拽 0 ㄧㄝˋ
+靨 0 ㄧㄝˋ
+鄴 0 ㄧㄝˋ
+燁 0 ㄧㄝˋ
+瞱 0 ㄧㄝˋ
+擫 0 ㄧㄝˋ
+射 0 ㄧㄝˋ
+曄 0 ㄧㄝˋ
+饁 0 ㄧㄝˋ
+煠 0 ㄧㄝˋ
+鍱 0 ㄧㄝˋ
+鐷 0 ㄧㄝˋ
+澲 0 ㄧㄝˋ
+鎑 0 ㄧㄝˋ
+偞 0 ㄧㄝˋ
+殗 0 ㄧㄝˋ
+嶪 0 ㄧㄝˋ
+擛 0 ㄧㄝˋ
+曳 0 ㄧㄝˋ
+掖 0 ㄧㄝˋ
+液 0 ㄧㄝˋ
+喝 0 ㄧㄝˋ
+腋 0 ㄧㄝˋ
+暍 0 ㄧㄝˋ
+噎 0 ㄧㄝˋ
+抴 0 ㄧㄝˋ
+焲 0 ㄧㄝˋ
+絏 0 ㄧㄝˋ
+楪 0 ㄧㄝˋ
+痷 0 ㄧㄝˋ
+裛 0 ㄧㄝˋ
+蝢 0 ㄧㄝˋ
+顉 0 ㄧㄝˋ
+韘 0 ㄧㄝˋ
+蠂 0 ㄧㄝˋ
+黦 0 ㄧㄝˋ
+譺 0 ㄧㄝˋ
+曵 0 ㄧㄝˋ
+亱 0 ㄧㄝˋ
+枼 0 ㄧㄝˋ
+洂 0 ㄧㄝˋ
+啘 0 ㄧㄝˋ
+殜 0 ㄧㄝˋ
+僷 0 ㄧㄝˋ
+墷 0 ㄧㄝˋ
+嶫 0 ㄧㄝˋ
+曅 0 ㄧㄝˋ
+餣 0 ㄧㄝˋ
+曗 0 ㄧㄝˋ
+皣 0 ㄧㄝˋ
+㒯 0 ㄧㄝˋ
+擪 0 ㄧㄝˋ
+瞸 0 ㄧㄝˋ
+鵺 0 ㄧㄝˋ
+爗 0 ㄧㄝˋ
+驜 0 ㄧㄝˋ
+鸈 0 ㄧㄝˋ
+枽 0 ㄧㄝˋ
+㖡 0 ㄧㄝˋ
+弽 0 ㄧㄝˋ
+牃 0 ㄧㄝˋ
+㗼 0 ㄧㄝˋ
+嚈 0 ㄧㄝˋ
+礏 0 ㄧㄝˋ
+爺 0 ㄧㄝˊ
+耶 0 ㄧㄝˊ
+椰 0 ㄧㄝˊ
+琊 0 ㄧㄝˊ
+揶 0 ㄧㄝˊ
+擨 0 ㄧㄝˊ
+邪 0 ㄧㄝˊ
+斜 0 ㄧㄝˊ
+峫 0 ㄧㄝˊ
+捓 0 ㄧㄝˊ
+衺 0 ㄧㄝˊ
+㖿 0 ㄧㄝˊ
+釾 0 ㄧㄝˊ
+瑘 0 ㄧㄝˊ
+鋣 0 ㄧㄝˊ
+鎁 0 ㄧㄝˊ
+吔 0 ㄧㄝ˙
+優 0 ㄧㄡ
+憂 0 ㄧㄡ
+幽 0 ㄧㄡ
+悠 0 ㄧㄡ
+呦 0 ㄧㄡ
+攸 0 ㄧㄡ
+耰 0 ㄧㄡ
+麀 0 ㄧㄡ
+櫌 0 ㄧㄡ
+鄾 0 ㄧㄡ
+懮 0 ㄧㄡ
+怮 0 ㄧㄡ
+嚘 0 ㄧㄡ
+瀀 0 ㄧㄡ
+纋 0 ㄧㄡ
+蚴 0 ㄧㄡ
+黝 0 ㄧㄡ
+优 0 ㄧㄡ
+泑 0 ㄧㄡ
+筱 0 ㄧㄡ
+忧 0 ㄧㄡ
+䥳 0 ㄧㄡ
+妋 0 ㄧㄡ
+有 0 ㄧㄡˇ
+友 0 ㄧㄡˇ
+酉 0 ㄧㄡˇ
+莠 0 ㄧㄡˇ
+牖 0 ㄧㄡˇ
+黝 0 ㄧㄡˇ
+羑 0 ㄧㄡˇ
+泑 0 ㄧㄡˇ
+銪 0 ㄧㄡˇ
+岰 0 ㄧㄡˇ
+庮 0 ㄧㄡˇ
+蒏 0 ㄧㄡˇ
+苃 0 ㄧㄡˇ
+聈 0 ㄧㄡˇ
+槱 0 ㄧㄡˇ
+卣 0 ㄧㄡˇ
+唒 0 ㄧㄡˇ
+栯 0 ㄧㄡˇ
+眑 0 ㄧㄡˇ
+莤 0 ㄧㄡˇ
+蚴 0 ㄧㄡˇ
+懮 0 ㄧㄡˇ
+㶭 0 ㄧㄡˇ
+梄 0 ㄧㄡˇ
+湵 0 ㄧㄡˇ
+禉 0 ㄧㄡˇ
+牗 0 ㄧㄡˇ
+丣 0 ㄧㄡˇ
+羐 0 ㄧㄡˇ
+蜏 0 ㄧㄡˇ
+又 0 ㄧㄡˋ
+右 0 ㄧㄡˋ
+幼 0 ㄧㄡˋ
+誘 0 ㄧㄡˋ
+佑 0 ㄧㄡˋ
+柚 0 ㄧㄡˋ
+釉 0 ㄧㄡˋ
+祐 0 ㄧㄡˋ
+有 0 ㄧㄡˋ
+莠 0 ㄧㄡˋ
+宥 0 ㄧㄡˋ
+侑 0 ㄧㄡˋ
+囿 0 ㄧㄡˋ
+鼬 0 ㄧㄡˋ
+卣 0 ㄧㄡˋ
+姷 0 ㄧㄡˋ
+狖 0 ㄧㄡˋ
+峟 0 ㄧㄡˋ
+貁 0 ㄧㄡˋ
+鴢 0 ㄧㄡˋ
+扰 0 ㄧㄡˋ
+牰 0 ㄧㄡˋ
+迶 0 ㄧㄡˋ
+岫 0 ㄧㄡˋ
+鈾 0 ㄧㄡˋ
+柪 0 ㄧㄡˋ
+珛 0 ㄧㄡˋ
+聈 0 ㄧㄡˋ
+袎 0 ㄧㄡˋ
+靿 0 ㄧㄡˋ
+褎 0 ㄧㄡˋ
+叹 0 ㄧㄡˋ
+唀 0 ㄧㄡˋ
+櫾 0 ㄧㄡˋ
+亴 0 ㄧㄡˋ
+酭 0 ㄧㄡˋ
+由 0 ㄧㄡˊ
+游 0 ㄧㄡˊ
+遊 0 ㄧㄡˊ
+尤 0 ㄧㄡˊ
+油 0 ㄧㄡˊ
+郵 0 ㄧㄡˊ
+猶 0 ㄧㄡˊ
+猷 0 ㄧㄡˊ
+鈾 0 ㄧㄡˊ
+輶 0 ㄧㄡˊ
+疣 0 ㄧㄡˊ
+蚰 0 ㄧㄡˊ
+蕕 0 ㄧㄡˊ
+斿 0 ㄧㄡˊ
+蝣 0 ㄧㄡˊ
+訧 0 ㄧㄡˊ
+逌 0 ㄧㄡˊ
+楢 0 ㄧㄡˊ
+魷 0 ㄧㄡˊ
+优 0 ㄧㄡˊ
+沋 0 ㄧㄡˊ
+浟 0 ㄧㄡˊ
+偤 0 ㄧㄡˊ
+秞 0 ㄧㄡˊ
+莤 0 ㄧㄡˊ
+酋 0 ㄧㄡˊ
+鯈 0 ㄧㄡˊ
+冘 0 ㄧㄡˊ
+囮 0 ㄧㄡˊ
+怞 0 ㄧㄡˊ
+苬 0 ㄧㄡˊ
+紌 0 ㄧㄡˊ
+崷 0 ㄧㄡˊ
+揄 0 ㄧㄡˊ
+煪 0 ㄧㄡˊ
+遒 0 ㄧㄡˊ
+緧 0 ㄧㄡˊ
+繇 0 ㄧㄡˊ
+蠤 0 ㄧㄡˊ
+㕱 0 ㄧㄡˊ
+犹 0 ㄧㄡˊ
+肬 0 ㄧㄡˊ
+怣 0 ㄧㄡˊ
+峳 0 ㄧㄡˊ
+逎 0 ㄧㄡˊ
+逰 0 ㄧㄡˊ
+滺 0 ㄧㄡˊ
+駀 0 ㄧㄡˊ
+鮋 0 ㄧㄡˊ
+鰌 0 ㄧㄡˊ
+櫾 0 ㄧㄡˊ
+邮 0 ㄧㄡˊ
+䣭 0 ㄧㄡˊ
+輏 0 ㄧㄡˊ
+醔 0 ㄧㄡˊ
+鞧 0 ㄧㄡˊ
+㘥 0 ㄧㄡˊ
+邎 0 ㄧㄡˊ
+應 0 ㄧㄥ
+英 0 ㄧㄥ
+鷹 0 ㄧㄥ
+嬰 0 ㄧㄥ
+鶯 0 ㄧㄥ
+櫻 0 ㄧㄥ
+膺 0 ㄧㄥ
+瑛 0 ㄧㄥ
+鸚 0 ㄧㄥ
+嚶 0 ㄧㄥ
+罌 0 ㄧㄥ
+纓 0 ㄧㄥ
+攖 0 ㄧㄥ
+瓔 0 ㄧㄥ
+嫈 0 ㄧㄥ
+甖 0 ㄧㄥ
+罃 0 ㄧㄥ
+煐 0 ㄧㄥ
+韺 0 ㄧㄥ
+甇 0 ㄧㄥ
+霙 0 ㄧㄥ
+碤 0 ㄧㄥ
+礯 0 ㄧㄥ
+朠 0 ㄧㄥ
+蝧 0 ㄧㄥ
+渶 0 ㄧㄥ
+褮 0 ㄧㄥ
+偀 0 ㄧㄥ
+霒 0 ㄧㄥ
+蘡 0 ㄧㄥ
+譻 0 ㄧㄥ
+蠳 0 ㄧㄥ
+鶧 0 ㄧㄥ
+薨 0 ㄧㄥ
+贗 0 ㄧㄥ
+賏 0 ㄧㄥ
+瀴 0 ㄧㄥ
+応 0 ㄧㄥ
+偐 0 ㄧㄥ
+啨 0 ㄧㄥ
+媖 0 ㄧㄥ
+䊔 0 ㄧㄥ
+噟 0 ㄧㄥ
+贋 0 ㄧㄥ
+鶑 0 ㄧㄥ
+孆 0 ㄧㄥ
+孾 0 ㄧㄥ
+譍 0 ㄧㄥ
+鑍 0 ㄧㄥ
+鸎 0 ㄧㄥ
+䣐 0 ㄧㄥ
+鷪 0 ㄧㄥ
+䇦 0 ㄧㄥ
+影 0 ㄧㄥˇ
+景 0 ㄧㄥˇ
+穎 0 ㄧㄥˇ
+潁 0 ㄧㄥˇ
+癭 0 ㄧㄥˇ
+郢 0 ㄧㄥˇ
+瀴 0 ㄧㄥˇ
+矨 0 ㄧㄥˇ
+梬 0 ㄧㄥˇ
+浧 0 ㄧㄥˇ
+熲 0 ㄧㄥˇ
+顈 0 ㄧㄥˇ
+廮 0 ㄧㄥˇ
+頴 0 ㄧㄥˇ
+巊 0 ㄧㄥˇ
+鐛 0 ㄧㄥˇ
+應 0 ㄧㄥˋ
+硬 0 ㄧㄥˋ
+映 0 ㄧㄥˋ
+媵 0 ㄧㄥˋ
+瀅 0 ㄧㄥˋ
+鎣 0 ㄧㄥˋ
+摬 0 ㄧㄥˋ
+賏 0 ㄧㄥˋ
+迎 0 ㄧㄥˋ
+瀴 0 ㄧㄥˋ
+応 0 ㄧㄥˋ
+暎 0 ㄧㄥˋ
+膡 0 ㄧㄥˋ
+噟 0 ㄧㄥˋ
+譍 0 ㄧㄥˋ
+鞕 0 ㄧㄥˋ
+營 0 ㄧㄥˊ
+迎 0 ㄧㄥˊ
+蠅 0 ㄧㄥˊ
+螢 0 ㄧㄥˊ
+贏 0 ㄧㄥˊ
+盈 0 ㄧㄥˊ
+瑩 0 ㄧㄥˊ
+縈 0 ㄧㄥˊ
+瀛 0 ㄧㄥˊ
+滎 0 ㄧㄥˊ
+嬴 0 ㄧㄥˊ
+塋 0 ㄧㄥˊ
+熒 0 ㄧㄥˊ
+楹 0 ㄧㄥˊ
+瀅 0 ㄧㄥˊ
+瀠 0 ㄧㄥˊ
+籯 0 ㄧㄥˊ
+瀯 0 ㄧㄥˊ
+謍 0 ㄧㄥˊ
+攍 0 ㄧㄥˊ
+巆 0 ㄧㄥˊ
+廮 0 ㄧㄥˊ
+藀 0 ㄧㄥˊ
+犖 0 ㄧㄥˊ
+嫈 0 ㄧㄥˊ
+禜 0 ㄧㄥˊ
+罃 0 ㄧㄥˊ
+褮 0 ㄧㄥˊ
+濴 0 ㄧㄥˊ
+覮 0 ㄧㄥˊ
+醟 0 ㄧㄥˊ
+鎣 0 ㄧㄥˊ
+㕲 0 ㄧㄥˊ
+盁 0 ㄧㄥˊ
+僌 0 ㄧㄥˊ
+萾 0 ㄧㄥˊ
+蝇 0 ㄧㄥˊ
+䋼 0 ㄧㄥˊ
+濙 0 ㄧㄥˊ
+濚 0 ㄧㄥˊ
+㶈 0 ㄧㄥˊ
+櫿 0 ㄧㄥˊ
+籝 0 ㄧㄥˊ
+耺 0 ㄧㄥˊ
+㜲 0 ㄧㄥˊ
+営 0 ㄧㄥˊ
+央 0 ㄧㄤ
+秧 0 ㄧㄤ
+殃 0 ㄧㄤ
+鴦 0 ㄧㄤ
+鞅 0 ㄧㄤ
+泱 0 ㄧㄤ
+坱 0 ㄧㄤ
+胦 0 ㄧㄤ
+柍 0 ㄧㄤ
+佒 0 ㄧㄤ
+姎 0 ㄧㄤ
+紻 0 ㄧㄤ
+鉠 0 ㄧㄤ
+雵 0 ㄧㄤ
+抰 0 ㄧㄤ
+咉 0 ㄧㄤ
+眏 0 ㄧㄤ
+䄃 0 ㄧㄤ
+楧 0 ㄧㄤ
+鍈 0 ㄧㄤ
+䱀 0 ㄧㄤ
+養 0 ㄧㄤˇ
+仰 0 ㄧㄤˇ
+氧 0 ㄧㄤˇ
+癢 0 ㄧㄤˇ
+鞅 0 ㄧㄤˇ
+卬 0 ㄧㄤˇ
+攁 0 ㄧㄤˇ
+岟 0 ㄧㄤˇ
+炴 0 ㄧㄤˇ
+抰 0 ㄧㄤˇ
+痒 0 ㄧㄤˇ
+懩 0 ㄧㄤˇ
+蝆 0 ㄧㄤˇ
+坱 0 ㄧㄤˇ
+蛘 0 ㄧㄤˇ
+瀁 0 ㄧㄤˇ
+慃 0 ㄧㄤˇ
+氱 0 ㄧㄤˇ
+駚 0 ㄧㄤˇ
+傟 0 ㄧㄤˇ
+詇 0 ㄧㄤˇ
+䬬 0 ㄧㄤˇ
+勜 0 ㄧㄤˇ
+樣 0 ㄧㄤˋ
+養 0 ㄧㄤˋ
+恙 0 ㄧㄤˋ
+漾 0 ㄧㄤˋ
+怏 0 ㄧㄤˋ
+煬 0 ㄧㄤˋ
+瀁 0 ㄧㄤˋ
+羕 0 ㄧㄤˋ
+様 0 ㄧㄤˋ
+諹 0 ㄧㄤˋ
+詇 0 ㄧㄤˋ
+楊 0 ㄧㄤˊ
+陽 0 ㄧㄤˊ
+揚 0 ㄧㄤˊ
+洋 0 ㄧㄤˊ
+羊 0 ㄧㄤˊ
+佯 0 ㄧㄤˊ
+烊 0 ㄧㄤˊ
+瘍 0 ㄧㄤˊ
+鍚 0 ㄧㄤˊ
+徉 0 ㄧㄤˊ
+颺 0 ㄧㄤˊ
+暘 0 ㄧㄤˊ
+煬 0 ㄧㄤˊ
+垟 0 ㄧㄤˊ
+昜 0 ㄧㄤˊ
+禓 0 ㄧㄤˊ
+蛘 0 ㄧㄤˊ
+瑒 0 ㄧㄤˊ
+珜 0 ㄧㄤˊ
+鐊 0 ㄧㄤˊ
+崵 0 ㄧㄤˊ
+鸉 0 ㄧㄤˊ
+眻 0 ㄧㄤˊ
+婸 0 ㄧㄤˊ
+吀 0 ㄧㄤˊ
+阦 0 ㄧㄤˊ
+阳 0 ㄧㄤˊ
+氜 0 ㄧㄤˊ
+羏 0 ㄧㄤˊ
+哶 0 ㄧㄤˊ
+样 0 ㄧㄤˊ
+敭 0 ㄧㄤˊ
+輰 0 ㄧㄤˊ
+霷 0 ㄧㄤˊ
+𦍌 0 ㄧㄤˊ
+𦍋 0 ㄧㄤˊ
+𢒑 0 ㄧㄤˊ
+鰑 0 ㄧㄤˊ
+劷 0 ㄧㄤˊ
+𦭵 0 ㄧㄤˊ
+𤋁 0 ㄧㄤˊ
+樣 0 ㄧㄤ˙
+煙 0 ㄧㄢ
+焉 0 ㄧㄢ
+淹 0 ㄧㄢ
+殷 0 ㄧㄢ
+醃 0 ㄧㄢ
+咽 0 ㄧㄢ
+胭 0 ㄧㄢ
+奄 0 ㄧㄢ
+湮 0 ㄧㄢ
+菸 0 ㄧㄢ
+嫣 0 ㄧㄢ
+燕 0 ㄧㄢ
+蔫 0 ㄧㄢ
+閹 0 ㄧㄢ
+厭 0 ㄧㄢ
+崦 0 ㄧㄢ
+臙 0 ㄧㄢ
+鄢 0 ㄧㄢ
+漹 0 ㄧㄢ
+猒 0 ㄧㄢ
+珚 0 ㄧㄢ
+偣 0 ㄧㄢ
+嬮 0 ㄧㄢ
+酀 0 ㄧㄢ
+腌 0 ㄧㄢ
+垔 0 ㄧㄢ
+凐 0 ㄧㄢ
+殗 0 ㄧㄢ
+傿 0 ㄧㄢ
+歅 0 ㄧㄢ
+嘕 0 ㄧㄢ
+禋 0 ㄧㄢ
+嬐 0 ㄧㄢ
+諲 0 ㄧㄢ
+閼 0 ㄧㄢ
+懨 0 ㄧㄢ
+黫 0 ㄧㄢ
+烟 0 ㄧㄢ
+陻 0 ㄧㄢ
+硽 0 ㄧㄢ
+嶖 0 ㄧㄢ
+㷼 0 ㄧㄢ
+篶 0 ㄧㄢ
+㤿 0 ㄧㄢ
+㥼 0 ㄧㄢ
+䅧 0 ㄧㄢ
+懕 0 ㄧㄢ
+眼 0 ㄧㄢˇ
+演 0 ㄧㄢˇ
+掩 0 ㄧㄢˇ
+衍 0 ㄧㄢˇ
+郾 0 ㄧㄢˇ
+偃 0 ㄧㄢˇ
+兗 0 ㄧㄢˇ
+齞 0 ㄧㄢˇ
+甗 0 ㄧㄢˇ
+儼 0 ㄧㄢˇ
+魘 0 ㄧㄢˇ
+剡 0 ㄧㄢˇ
+弇 0 ㄧㄢˇ
+罨 0 ㄧㄢˇ
+沇 0 ㄧㄢˇ
+巘 0 ㄧㄢˇ
+扊 0 ㄧㄢˇ
+揜 0 ㄧㄢˇ
+渰 0 ㄧㄢˇ
+蝘 0 ㄧㄢˇ
+黶 0 ㄧㄢˇ
+姶 0 ㄧㄢˇ
+戭 0 ㄧㄢˇ
+棪 0 ㄧㄢˇ
+鰋 0 ㄧㄢˇ
+鼴 0 ㄧㄢˇ
+琰 0 ㄧㄢˇ
+匽 0 ㄧㄢˇ
+厴 0 ㄧㄢˇ
+椼 0 ㄧㄢˇ
+抁 0 ㄧㄢˇ
+龑 0 ㄧㄢˇ
+酓 0 ㄧㄢˇ
+嵃 0 ㄧㄢˇ
+愝 0 ㄧㄢˇ
+萒 0 ㄧㄢˇ
+隒 0 ㄧㄢˇ
+裺 0 ㄧㄢˇ
+褗 0 ㄧㄢˇ
+鶠 0 ㄧㄢˇ
+黤 0 ㄧㄢˇ
+曮 0 ㄧㄢˇ
+惔 0 ㄧㄢˇ
+躽 0 ㄧㄢˇ
+馣 0 ㄧㄢˇ
+奄 0 ㄧㄢˇ
+堰 0 ㄧㄢˇ
+愆 0 ㄧㄢˇ
+縯 0 ㄧㄢˇ
+崦 0 ㄧㄢˇ
+郯 0 ㄧㄢˇ
+媕 0 ㄧㄢˇ
+晻 0 ㄧㄢˇ
+羡 0 ㄧㄢˇ
+馻 0 ㄧㄢˇ
+蔩 0 ㄧㄢˇ
+噞 0 ㄧㄢˇ
+餰 0 ㄧㄢˇ
+顩 0 ㄧㄢˇ
+齴 0 ㄧㄢˇ
+广 0 ㄧㄢˇ
+兖 0 ㄧㄢˇ
+埯 0 ㄧㄢˇ
+隌 0 ㄧㄢˇ
+隁 0 ㄧㄢˇ
+硽 0 ㄧㄢˇ
+遃 0 ㄧㄢˇ
+墕 0 ㄧㄢˇ
+嬊 0 ㄧㄢˇ
+嶖 0 ㄧㄢˇ
+諐 0 ㄧㄢˇ
+鮎 0 ㄧㄢˇ
+檿 0 ㄧㄢˇ
+鼹 0 ㄧㄢˇ
+夵 0 ㄧㄢˇ
+乵 0 ㄧㄢˇ
+渷 0 ㄧㄢˇ
+巚 0 ㄧㄢˇ
+驗 0 ㄧㄢˋ
+燕 0 ㄧㄢˋ
+厭 0 ㄧㄢˋ
+晏 0 ㄧㄢˋ
+雁 0 ㄧㄢˋ
+宴 0 ㄧㄢˋ
+淹 0 ㄧㄢˋ
+豔 0 ㄧㄢˋ
+燄 0 ㄧㄢˋ
+彥 0 ㄧㄢˋ
+堰 0 ㄧㄢˋ
+硯 0 ㄧㄢˋ
+咽 0 ㄧㄢˋ
+嚥 0 ㄧㄢˋ
+唁 0 ㄧㄢˋ
+饜 0 ㄧㄢˋ
+研 0 ㄧㄢˋ
+讌 0 ㄧㄢˋ
+諺 0 ㄧㄢˋ
+沿 0 ㄧㄢˋ
+讞 0 ㄧㄢˋ
+焱 0 ㄧㄢˋ
+釅 0 ㄧㄢˋ
+贗 0 ㄧㄢˋ
+喭 0 ㄧㄢˋ
+灩 0 ㄧㄢˋ
+爓 0 ㄧㄢˋ
+閆 0 ㄧㄢˋ
+鷃 0 ㄧㄢˋ
+嬿 0 ㄧㄢˋ
+鴳 0 ㄧㄢˋ
+醼 0 ㄧㄢˋ
+焰 0 ㄧㄢˋ
+牪 0 ㄧㄢˋ
+姲 0 ㄧㄢˋ
+鷰 0 ㄧㄢˋ
+椻 0 ㄧㄢˋ
+曣 0 ㄧㄢˋ
+婩 0 ㄧㄢˋ
+傿 0 ㄧㄢˋ
+鴈 0 ㄧㄢˋ
+噞 0 ㄧㄢˋ
+騴 0 ㄧㄢˋ
+觾 0 ㄧㄢˋ
+艷 0 ㄧㄢˋ
+驠 0 ㄧㄢˋ
+莚 0 ㄧㄢˋ
+敥 0 ㄧㄢˋ
+俺 0 ㄧㄢˋ
+涎 0 ㄧㄢˋ
+郾 0 ㄧㄢˋ
+筵 0 ㄧㄢˋ
+靨 0 ㄧㄢˋ
+魘 0 ㄧㄢˋ
+鹽 0 ㄧㄢˋ
+掞 0 ㄧㄢˋ
+淊 0 ㄧㄢˋ
+嵃 0 ㄧㄢˋ
+烻 0 ㄧㄢˋ
+猒 0 ㄧㄢˋ
+羡 0 ㄧㄢˋ
+楌 0 ㄧㄢˋ
+赩 0 ㄧㄢˋ
+靘 0 ㄧㄢˋ
+嬮 0 ㄧㄢˋ
+擫 0 ㄧㄢˋ
+酀 0 ㄧㄢˋ
+齴 0 ㄧㄢˋ
+妟 0 ㄧㄢˋ
+彦 0 ㄧㄢˋ
+偐 0 ㄧㄢˋ
+硏 0 ㄧㄢˋ
+隁 0 ㄧㄢˋ
+塩 0 ㄧㄢˋ
+鳫 0 ㄧㄢˋ
+墕 0 ㄧㄢˋ
+暥 0 ㄧㄢˋ
+嬊 0 ㄧㄢˋ
+㵪 0 ㄧㄢˋ
+㷼 0 ㄧㄢˋ
+曕 0 ㄧㄢˋ
+擪 0 ㄧㄢˋ
+騐 0 ㄧㄢˋ
+艶 0 ㄧㄢˋ
+贋 0 ㄧㄢˋ
+㬫 0 ㄧㄢˋ
+灔 0 ㄧㄢˋ
+灧 0 ㄧㄢˋ
+豓 0 ㄧㄢˋ
+覎 0 ㄧㄢˋ
+㷳 0 ㄧㄢˋ
+䢭 0 ㄧㄢˋ
+懕 0 ㄧㄢˋ
+囐 0 ㄧㄢˋ
+研 0 ㄧㄢˊ
+言 0 ㄧㄢˊ
+顏 0 ㄧㄢˊ
+嚴 0 ㄧㄢˊ
+延 0 ㄧㄢˊ
+沿 0 ㄧㄢˊ
+炎 0 ㄧㄢˊ
+癌 0 ㄧㄢˊ
+鹽 0 ㄧㄢˊ
+岩 0 ㄧㄢˊ
+筵 0 ㄧㄢˊ
+簷 0 ㄧㄢˊ
+閻 0 ㄧㄢˊ
+妍 0 ㄧㄢˊ
+蜒 0 ㄧㄢˊ
+檐 0 ㄧㄢˊ
+埏 0 ㄧㄢˊ
+喦 0 ㄧㄢˊ
+揅 0 ㄧㄢˊ
+碞 0 ㄧㄢˊ
+綖 0 ㄧㄢˊ
+郔 0 ㄧㄢˊ
+巖 0 ㄧㄢˊ
+孍 0 ㄧㄢˊ
+楌 0 ㄧㄢˊ
+礹 0 ㄧㄢˊ
+閰 0 ㄧㄢˊ
+娮 0 ㄧㄢˊ
+鈆 0 ㄧㄢˊ
+狿 0 ㄧㄢˊ
+虤 0 ㄧㄢˊ
+顃 0 ㄧㄢˊ
+壛 0 ㄧㄢˊ
+麙 0 ㄧㄢˊ
+壧 0 ㄧㄢˊ
+莚 0 ㄧㄢˊ
+嵒 0 ㄧㄢˊ
+焰 0 ㄧㄢˊ
+鉛 0 ㄧㄢˊ
+釅 0 ㄧㄢˊ
+厂 0 ㄧㄢˊ
+岍 0 ㄧㄢˊ
+汧 0 ㄧㄢˊ
+宕 0 ㄧㄢˊ
+阽 0 ㄧㄢˊ
+狺 0 ㄧㄢˊ
+唌 0 ㄧㄢˊ
+砦 0 ㄧㄢˊ
+豜 0 ㄧㄢˊ
+趼 0 ㄧㄢˊ
+閆 0 ㄧㄢˊ
+欻 0 ㄧㄢˊ
+琰 0 ㄧㄢˊ
+鈃 0 ㄧㄢˊ
+裧 0 ㄧㄢˊ
+誾 0 ㄧㄢˊ
+鳽 0 ㄧㄢˊ
+燅 0 ㄧㄢˊ
+燚 0 ㄧㄢˊ
+錟 0 ㄧㄢˊ
+鋋 0 ㄧㄢˊ
+盬 0 ㄧㄢˊ
+玁 0 ㄧㄢˊ
+炏 0 ㄧㄢˊ
+姸 0 ㄧㄢˊ
+娫 0 ㄧㄢˊ
+琂 0 ㄧㄢˊ
+硏 0 ㄧㄢˊ
+嵓 0 ㄧㄢˊ
+塩 0 ㄧㄢˊ
+詽 0 ㄧㄢˊ
+豣 0 ㄧㄢˊ
+膁 0 ㄧㄢˊ
+銒 0 ㄧㄢˊ
+蔅 0 ㄧㄢˊ
+歘 0 ㄧㄢˊ
+厳 0 ㄧㄢˊ
+顔 0 ㄧㄢˊ
+巌 0 ㄧㄢˊ
+櫩 0 ㄧㄢˊ
+巗 0 ㄧㄢˊ
+麣 0 ㄧㄢˊ
+厃 0 ㄧㄢˊ
+开 0 ㄧㄢˊ
+厈 0 ㄧㄢˊ
+昖 0 ㄧㄢˊ
+訮 0 ㄧㄢˊ
+以 0 ㄧˇ
+已 0 ㄧˇ
+乙 0 ㄧˇ
+倚 0 ㄧˇ
+椅 0 ㄧˇ
+矣 0 ㄧˇ
+蟻 0 ㄧˇ
+尾 0 ㄧˇ
+艤 0 ㄧˇ
+迤 0 ㄧˇ
+苡 0 ㄧˇ
+偯 0 ㄧˇ
+扆 0 ㄧˇ
+旖 0 ㄧˇ
+螘 0 ㄧˇ
+扡 0 ㄧˇ
+酏 0 ㄧˇ
+鳦 0 ㄧˇ
+釔 0 ㄧˇ
+齮 0 ㄧˇ
+顗 0 ㄧˇ
+檥 0 ㄧˇ
+鉯 0 ㄧˇ
+迆 0 ㄧˇ
+胣 0 ㄧˇ
+礒 0 ㄧˇ
+掜 0 ㄧˇ
+陭 0 ㄧˇ
+崺 0 ㄧˇ
+晲 0 ㄧˇ
+轙 0 ㄧˇ
+蛾 0 ㄧˇ
+佁 0 ㄧˇ
+衪 0 ㄧˇ
+娭 0 ㄧˇ
+猗 0 ㄧˇ
+銥 0 ㄧˇ
+踦 0 ㄧˇ
+嶬 0 ㄧˇ
+燨 0 ㄧˇ
+肔 0 ㄧˇ
+庡 0 ㄧˇ
+苢 0 ㄧˇ
+迱 0 ㄧˇ
+笖 0 ㄧˇ
+旑 0 ㄧˇ
+鈘 0 ㄧˇ
+裿 0 ㄧˇ
+輢 0 ㄧˇ
+嬟 0 ㄧˇ
+䧧 0 ㄧˇ
+䭲 0 ㄧˇ
+攺 0 ㄧˇ
+逘 0 ㄧˇ
+鎄 0 ㄧˇ
+意 0 ㄧˋ
+義 0 ㄧˋ
+易 0 ㄧˋ
+議 0 ㄧˋ
+亦 0 ㄧˋ
+益 0 ㄧˋ
+異 0 ㄧˋ
+藝 0 ㄧˋ
+億 0 ㄧˋ
+憶 0 ㄧˋ
+譯 0 ㄧˋ
+液 0 ㄧˋ
+役 0 ㄧˋ
+翼 0 ㄧˋ
+疫 0 ㄧˋ
+毅 0 ㄧˋ
+逸 0 ㄧˋ
+邑 0 ㄧˋ
+抑 0 ㄧˋ
+肄 0 ㄧˋ
+一 0 ㄧˋ
+誼 0 ㄧˋ
+繹 0 ㄧˋ
+溢 0 ㄧˋ
+縊 0 ㄧˋ
+軼 0 ㄧˋ
+詣 0 ㄧˋ
+屹 0 ㄧˋ
+佚 0 ㄧˋ
+翌 0 ㄧˋ
+羿 0 ㄧˋ
+驛 0 ㄧˋ
+掖 0 ㄧˋ
+懿 0 ㄧˋ
+裔 0 ㄧˋ
+臆 0 ㄧˋ
+曳 0 ㄧˋ
+奕 0 ㄧˋ
+蜴 0 ㄧˋ
+腋 0 ㄧˋ
+衣 0 ㄧˋ
+刈 0 ㄧˋ
+翳 0 ㄧˋ
+挹 0 ㄧˋ
+鎰 0 ㄧˋ
+囈 0 ㄧˋ
+弈 0 ㄧˋ
+佾 0 ㄧˋ
+乂 0 ㄧˋ
+弋 0 ㄧˋ
+艾 0 ㄧˋ
+懌 0 ㄧˋ
+劓 0 ㄧˋ
+圛 0 ㄧˋ
+斁 0 ㄧˋ
+薏 0 ㄧˋ
+悒 0 ㄧˋ
+瘞 0 ㄧˋ
+仡 0 ㄧˋ
+勩 0 ㄧˋ
+埸 0 ㄧˋ
+嶧 0 ㄧˋ
+帟 0 ㄧˋ
+曀 0 ㄧˋ
+杙 0 ㄧˋ
+枻 0 ㄧˋ
+殪 0 ㄧˋ
+浥 0 ㄧˋ
+熠 0 ㄧˋ
+艗 0 ㄧˋ
+襼 0 ㄧˋ
+饐 0 ㄧˋ
+黓 0 ㄧˋ
+亄 0 ㄧˋ
+唈 0 ㄧˋ
+燡 0 ㄧˋ
+藙 0 ㄧˋ
+豷 0 ㄧˋ
+寱 0 ㄧˋ
+阣 0 ㄧˋ
+熤 0 ㄧˋ
+劮 0 ㄧˋ
+檍 0 ㄧˋ
+嗌 0 ㄧˋ
+廙 0 ㄧˋ
+鐿 0 ㄧˋ
+醳 0 ㄧˋ
+醷 0 ㄧˋ
+翊 0 ㄧˋ
+肊 0 ㄧˋ
+异 0 ㄧˋ
+枍 0 ㄧˋ
+伿 0 ㄧˋ
+浂 0 ㄧˋ
+澺 0 ㄧˋ
+芅 0 ㄧˋ
+熼 0 ㄧˋ
+玴 0 ㄧˋ
+抴 0 ㄧˋ
+蘙 0 ㄧˋ
+俋 0 ㄧˋ
+焲 0 ㄧˋ
+燱 0 ㄧˋ
+晹 0 ㄧˋ
+垼 0 ㄧˋ
+釴 0 ㄧˋ
+捙 0 ㄧˋ
+欭 0 ㄧˋ
+埶 0 ㄧˋ
+羛 0 ㄧˋ
+隿 0 ㄧˋ
+殔 0 ㄧˋ
+跇 0 ㄧˋ
+裛 0 ㄧˋ
+嫕 0 ㄧˋ
+緆 0 ㄧˋ
+膉 0 ㄧˋ
+靾 0 ㄧˋ
+槷 0 ㄧˋ
+潩 0 ㄧˋ
+蓺 0 ㄧˋ
+墿 0 ㄧˋ
+瘱 0 ㄧˋ
+謚 0 ㄧˋ
+繶 0 ㄧˋ
+瀷 0 ㄧˋ
+帠 0 ㄧˋ
+槸 0 ㄧˋ
+霬 0 ㄧˋ
+鷾 0 ㄧˋ
+齸 0 ㄧˋ
+泄 0 ㄧˋ
+疙 0 ㄧˋ
+施 0 ㄧˋ
+洩 0 ㄧˋ
+食 0 ㄧˋ
+射 0 ㄧˋ
+睪 0 ㄧˋ
+噫 0 ㄧˋ
+圪 0 ㄧˋ
+泆 0 ㄧˋ
+昳 0 ㄧˋ
+栺 0 ㄧˋ
+詍 0 ㄧˋ
+詄 0 ㄧˋ
+鳦 0 ㄧˋ
+馹 0 ㄧˋ
+蓻 0 ㄧˋ
+誽 0 ㄧˋ
+燚 0 ㄧˋ
+鴩 0 ㄧˋ
+燨 0 ㄧˋ
+贀 0 ㄧˋ
+鶂 0 ㄧˋ
+鷁 0 ㄧˋ
+鷊 0 ㄧˋ
+鸅 0 ㄧˋ
+义 0 ㄧˋ
+阝 0 ㄧˋ
+弌 0 ㄧˋ
+㐹 0 ㄧˋ
+伇 0 ㄧˋ
+曵 0 ㄧˋ
+呭 0 ㄧˋ
+怈 0 ㄧˋ
+㳑 0 ㄧˋ
+炈 0 ㄧˋ
+秇 0 ㄧˋ
+洂 0 ㄧˋ
+栧 0 ㄧˋ
+浳 0 ㄧˋ
+袣 0 ㄧˋ
+訲 0 ㄧˋ
+豛 0 ㄧˋ
+幆 0 ㄧˋ
+敡 0 ㄧˋ
+棭 0 ㄧˋ
+湙 0 ㄧˋ
+萟 0 ㄧˋ
+蛡 0 ㄧˋ
+鈠 0 ㄧˋ
+竩 0 ㄧˋ
+䇼 0 ㄧˋ
+榏 0 ㄧˋ
+㦉 0 ㄧˋ
+撎 0 ㄧˋ
+嬟 0 ㄧˋ
+嬑 0 ㄧˋ
+㵩 0 ㄧˋ
+瞖 0 ㄧˋ
+穓 0 ㄧˋ
+曎 0 ㄧˋ
+歝 0 ㄧˋ
+褹 0 ㄧˋ
+貖 0 ㄧˋ
+鯣 0 ㄧˋ
+鶃 0 ㄧˋ
+虉 0 ㄧˋ
+讛 0 ㄧˋ
+㧒 0 ㄧˋ
+悥 0 ㄧˋ
+殹 0 ㄧˋ
+䓃 0 ㄧˋ
+豙 0 ㄧˋ
+㴒 0 ㄧˋ
+痬 0 ㄧˋ
+骮 0 ㄧˋ
+螠 0 ㄧˋ
+㘈 0 ㄧˋ
+癔 0 ㄧˋ
+䱛 0 ㄧˋ
+㦤 0 ㄧˋ
+䭞 0 ㄧˋ
+鷧 0 ㄧˋ
+㑊 0 ㄧˋ
+遺 0 ㄧˊ
+疑 0 ㄧˊ
+移 0 ㄧˊ
+宜 0 ㄧˊ
+怡 0 ㄧˊ
+姨 0 ㄧˊ
+儀 0 ㄧˊ
+夷 0 ㄧˊ
+一 0 ㄧˊ
+誼 0 ㄧˊ
+胰 0 ㄧˊ
+貽 0 ㄧˊ
+飴 0 ㄧˊ
+咦 0 ㄧˊ
+詒 0 ㄧˊ
+沂 0 ㄧˊ
+頤 0 ㄧˊ
+彞 0 ㄧˊ
+迤 0 ㄧˊ
+椸 0 ㄧˊ
+痍 0 ㄧˊ
+蛇 0 ㄧˊ
+圯 0 ㄧˊ
+嶷 0 ㄧˊ
+笫 0 ㄧˊ
+桋 0 ㄧˊ
+匜 0 ㄧˊ
+宧 0 ㄧˊ
+洟 0 ㄧˊ
+簃 0 ㄧˊ
+訑 0 ㄧˊ
+貤 0 ㄧˊ
+迻 0 ㄧˊ
+杝 0 ㄧˊ
+柂 0 ㄧˊ
+袲 0 ㄧˊ
+酏 0 ㄧˊ
+峓 0 ㄧˊ
+眱 0 ㄧˊ
+羠 0 ㄧˊ
+鈶 0 ㄧˊ
+寲 0 ㄧˊ
+侇 0 ㄧˊ
+珆 0 ㄧˊ
+衪 0 ㄧˊ
+銕 0 ㄧˊ
+呲 0 ㄧˊ
+恞 0 ㄧˊ
+萓 0 ㄧˊ
+沶 0 ㄧˊ
+栘 0 ㄧˊ
+瓵 0 ㄧˊ
+袘 0 ㄧˊ
+羡 0 ㄧˊ
+蛦 0 ㄧˊ
+暆 0 ㄧˊ
+跠 0 ㄧˊ
+歋 0 ㄧˊ
+熪 0 ㄧˊ
+箷 0 ㄧˊ
+螔 0 ㄧˊ
+顊 0 ㄧˊ
+謻 0 ㄧˊ
+觺 0 ㄧˊ
+鸃 0 ㄧˊ
+彝 0 ㄧˊ
+台 0 ㄧˊ
+圻 0 ㄧˊ
+迆 0 ㄧˊ
+益 0 ㄧˊ
+熙 0 ㄧˊ
+懿 0 ㄧˊ
+圮 0 ㄧˊ
+狋 0 ㄧˊ
+祂 0 ㄧˊ
+拸 0 ㄧˊ
+眙 0 ㄧˊ
+荑 0 ㄧˊ
+詑 0 ㄧˊ
+溰 0 ㄧˊ
+磑 0 ㄧˊ
+擨 0 ㄧˊ
+鏔 0 ㄧˊ
+弌 0 ㄧˊ
+冝 0 ㄧˊ
+狏 0 ㄧˊ
+虵 0 ㄧˊ
+迱 0 ㄧˊ
+扅 0 ㄧˊ
+眤 0 ㄧˊ
+焈 0 ㄧˊ
+竩 0 ㄧˊ
+熈 0 ㄧˊ
+㦉 0 ㄧˊ
+彛 0 ㄧˊ
+乁 0 ㄧˊ
+宐 0 ㄧˊ
+沵 0 ㄧˊ
+巸 0 ㄧˊ
+弬 0 ㄧˊ
+㺿 0 ㄧˊ
+頉 0 ㄧˊ
+頥 0 ㄧˊ
+鮧 0 ㄧˊ
+鴺 0 ㄧˊ
+㦤 0 ㄧˊ
+㰘 0 ㄧˊ
+讉 0 ㄧˊ
+呀 0 ㄧㄚ
+壓 0 ㄧㄚ
+鴉 0 ㄧㄚ
+鴨 0 ㄧㄚ
+押 0 ㄧㄚ
+丫 0 ㄧㄚ
+椏 0 ㄧㄚ
+孲 0 ㄧㄚ
+啞 0 ㄧㄚ
+雅 0 ㄧㄚ
+劜 0 ㄧㄚ
+压 0 ㄧㄚ
+庘 0 ㄧㄚ
+俹 0 ㄧㄚ
+瘂 0 ㄧㄚ
+鵶 0 ㄧㄚ
+圧 0 ㄧㄚ
+曱 0 ㄧㄚ
+唖 0 ㄧㄚ
+亞 0 ㄧㄚˇ
+啞 0 ㄧㄚˇ
+雅 0 ㄧㄚˇ
+掗 0 ㄧㄚˇ
+厊 0 ㄧㄚˇ
+庌 0 ㄧㄚˇ
+蕥 0 ㄧㄚˇ
+雃 0 ㄧㄚˇ
+疋 0 ㄧㄚˇ
+鴉 0 ㄧㄚˇ
+埡 0 ㄧㄚˇ
+錏 0 ㄧㄚˇ
+亜 0 ㄧㄚˇ
+瘂 0 ㄧㄚˇ
+鵶 0 ㄧㄚˇ
+鐚 0 ㄧㄚˇ
+唖 0 ㄧㄚˇ
+亞 0 ㄧㄚˋ
+訝 0 ㄧㄚˋ
+迓 0 ㄧㄚˋ
+砑 0 ㄧㄚˋ
+氬 0 ㄧㄚˋ
+婭 0 ㄧㄚˋ
+揠 0 ㄧㄚˋ
+錏 0 ㄧㄚˋ
+聐 0 ㄧㄚˋ
+軋 0 ㄧㄚˋ
+圠 0 ㄧㄚˋ
+襾 0 ㄧㄚˋ
+玡 0 ㄧㄚˋ
+猰 0 ㄧㄚˋ
+窫 0 ㄧㄚˋ
+齾 0 ㄧㄚˋ
+御 0 ㄧㄚˋ
+穵 0 ㄧㄚˋ
+岈 0 ㄧㄚˋ
+掗 0 ㄧㄚˋ
+椏 0 ㄧㄚˋ
+圔 0 ㄧㄚˋ
+亜 0 ㄧㄚˋ
+俹 0 ㄧㄚˋ
+谺 0 ㄧㄚˋ
+稏 0 ㄧㄚˋ
+鐚 0 ㄧㄚˋ
+豄 0 ㄧㄚˋ
+鼼 0 ㄧㄚˋ
+䰲 0 ㄧㄚˋ
+牙 0 ㄧㄚˊ
+芽 0 ㄧㄚˊ
+涯 0 ㄧㄚˊ
+衙 0 ㄧㄚˊ
+蚜 0 ㄧㄚˊ
+押 0 ㄧㄚˊ
+枒 0 ㄧㄚˊ
+犽 0 ㄧㄚˊ
+齖 0 ㄧㄚˊ
+伢 0 ㄧㄚˊ
+堐 0 ㄧㄚˊ
+崖 0 ㄧㄚˊ
+睚 0 ㄧㄚˊ
+岈 0 ㄧㄚˊ
+颬 0 ㄧㄚˊ
+厓 0 ㄧㄚˊ
+崕 0 ㄧㄚˊ
+猚 0 ㄧㄚˊ
+谺 0 ㄧㄚˊ
+漄 0 ㄧㄚˊ
+豄 0 ㄧㄚˊ
+笌 0 ㄧㄚˊ
+㾏 0 ㄧㄚˊ
+呀 0 ㄧㄚ˙
+崖 0 ㄧㄞˊ
+睚 0 ㄧㄞˊ
+啀 0 ㄧㄞˊ
+娾 0 ㄧㄞˊ
+厓 0 ㄧㄞˊ
+崕 0 ㄧㄞˊ
+嘊 0 ㄧㄞˊ
+唷 0 ㄧㄛ
+喲 0 ㄧㄛ
+嚛 0 ㄧㄛ˙
+要 0 ㄧㄠ
+腰 0 ㄧㄠ
+夭 0 ㄧㄠ
+妖 0 ㄧㄠ
+邀 0 ㄧㄠ
+么 0 ㄧㄠ
+吆 0 ㄧㄠ
+喲 0 ㄧㄠ
+喓 0 ㄧㄠ
+祅 0 ㄧㄠ
+葽 0 ㄧㄠ
+訞 0 ㄧㄠ
+凹 0 ㄧㄠ
+宎 0 ㄧㄠ
+殀 0 ㄧㄠ
+芺 0 ㄧㄠ
+徼 0 ㄧㄠ
+幺 0 ㄧㄠ
+枖 0 ㄧㄠ
+梎 0 ㄧㄠ
+楆 0 ㄧㄠ
+鴁 0 ㄧㄠ
+咬 0 ㄧㄠˇ
+窈 0 ㄧㄠˇ
+舀 0 ㄧㄠˇ
+夭 0 ㄧㄠˇ
+殀 0 ㄧㄠˇ
+杳 0 ㄧㄠˇ
+窅 0 ㄧㄠˇ
+窔 0 ㄧㄠˇ
+鷕 0 ㄧㄠˇ
+宎 0 ㄧㄠˇ
+抭 0 ㄧㄠˇ
+苭 0 ㄧㄠˇ
+眑 0 ㄧㄠˇ
+偠 0 ㄧㄠˇ
+溔 0 ㄧㄠˇ
+榚 0 ㄧㄠˇ
+騕 0 ㄧㄠˇ
+岆 0 ㄧㄠˇ
+嫍 0 ㄧㄠˇ
+蓔 0 ㄧㄠˇ
+嬈 0 ㄧㄠˇ
+柼 0 ㄧㄠˇ
+穾 0 ㄧㄠˇ
+仸 0 ㄧㄠˇ
+婹 0 ㄧㄠˇ
+崾 0 ㄧㄠˇ
+闄 0 ㄧㄠˇ
+齩 0 ㄧㄠˇ
+䶧 0 ㄧㄠˇ
+要 0 ㄧㄠˋ
+藥 0 ㄧㄠˋ
+耀 0 ㄧㄠˋ
+曜 0 ㄧㄠˋ
+鑰 0 ㄧㄠˋ
+樂 0 ㄧㄠˋ
+鷂 0 ㄧㄠˋ
+燿 0 ㄧㄠˋ
+袎 0 ㄧㄠˋ
+靿 0 ㄧㄠˋ
+艞 0 ㄧㄠˋ
+覞 0 ㄧㄠˋ
+穾 0 ㄧㄠˋ
+筄 0 ㄧㄠˋ
+葯 0 ㄧㄠˋ
+獟 0 ㄧㄠˋ
+趭 0 ㄧㄠˋ
+虐 0 ㄧㄠˋ
+腰 0 ㄧㄠˋ
+瘧 0 ㄧㄠˋ
+躍 0 ㄧㄠˋ
+瀹 0 ㄧㄠˋ
+爚 0 ㄧㄠˋ
+抝 0 ㄧㄠˋ
+敫 0 ㄧㄠˋ
+楽 0 ㄧㄠˋ
+熎 0 ㄧㄠˋ
+薬 0 ㄧㄠˋ
+矅 0 ㄧㄠˋ
+纅 0 ㄧㄠˋ
+爠 0 ㄧㄠˋ
+讑 0 ㄧㄠˋ
+鼼 0 ㄧㄠˋ
+搖 0 ㄧㄠˊ
+謠 0 ㄧㄠˊ
+堯 0 ㄧㄠˊ
+遙 0 ㄧㄠˊ
+姚 0 ㄧㄠˊ
+洮 0 ㄧㄠˊ
+瑤 0 ㄧㄠˊ
+僥 0 ㄧㄠˊ
+淆 0 ㄧㄠˊ
+餚 0 ㄧㄠˊ
+颻 0 ㄧㄠˊ
+傜 0 ㄧㄠˊ
+繇 0 ㄧㄠˊ
+嶢 0 ㄧㄠˊ
+徭 0 ㄧㄠˊ
+殽 0 ㄧㄠˊ
+猺 0 ㄧㄠˊ
+軺 0 ㄧㄠˊ
+爻 0 ㄧㄠˊ
+垚 0 ㄧㄠˊ
+崤 0 ㄧㄠˊ
+銚 0 ㄧㄠˊ
+珧 0 ㄧㄠˊ
+柼 0 ㄧㄠˊ
+猇 0 ㄧㄠˊ
+鰩 0 ㄧㄠˊ
+肴 0 ㄧㄠˊ
+媱 0 ㄧㄠˊ
+烑 0 ㄧㄠˊ
+窯 0 ㄧㄠˊ
+嗂 0 ㄧㄠˊ
+愮 0 ㄧㄠˊ
+榣 0 ㄧㄠˊ
+顤 0 ㄧㄠˊ
+陶 0 ㄧㄠˊ
+驍 0 ㄧㄠˊ
+郩 0 ㄧㄠˊ
+揄 0 ㄧㄠˊ
+筊 0 ㄧㄠˊ
+隃 0 ㄧㄠˊ
+嘵 0 ㄧㄠˊ
+墝 0 ㄧㄠˊ
+憢 0 ㄧㄠˊ
+膮 0 ㄧㄠˊ
+穘 0 ㄧㄠˊ
+倄 0 ㄧㄠˊ
+窑 0 ㄧㄠˊ
+䚻 0 ㄧㄠˊ
+摇 0 ㄧㄠˊ
+暚 0 ㄧㄠˊ
+瑶 0 ㄧㄠˊ
+餆 0 ㄧㄠˊ
+嶤 0 ㄧㄠˊ
+窰 0 ㄧㄠˊ
+㠙 0 ㄧㄠˊ
+鎐 0 ㄧㄠˊ
+䬙 0 ㄧㄠˊ
+蘨 0 ㄧㄠˊ
+鑃 0 ㄧㄠˊ
+揺 0 ㄧㄠˊ
+㑾 0 ㄧㄠˊ
+䔄 0 ㄧㄠˊ
+訤 0 ㄧㄠˊ
+因 0 ㄧㄣ
+音 0 ㄧㄣ
+陰 0 ㄧㄣ
+姻 0 ㄧㄣ
+殷 0 ㄧㄣ
+茵 0 ㄧㄣ
+慇 0 ㄧㄣ
+氤 0 ㄧㄣ
+瘖 0 ㄧㄣ
+喑 0 ㄧㄣ
+堙 0 ㄧㄣ
+湮 0 ㄧㄣ
+愔 0 ㄧㄣ
+禋 0 ㄧㄣ
+絪 0 ㄧㄣ
+裀 0 ㄧㄣ
+闉 0 ㄧㄣ
+駰 0 ㄧㄣ
+銦 0 ㄧㄣ
+蒑 0 ㄧㄣ
+諲 0 ㄧㄣ
+垔 0 ㄧㄣ
+韾 0 ㄧㄣ
+洇 0 ㄧㄣ
+凐 0 ㄧㄣ
+歅 0 ㄧㄣ
+噾 0 ㄧㄣ
+霠 0 ㄧㄣ
+黫 0 ㄧㄣ
+摿 0 ㄧㄣ
+欭 0 ㄧㄣ
+珚 0 ㄧㄣ
+偣 0 ㄧㄣ
+湆 0 ㄧㄣ
+霒 0 ㄧㄣ
+阴 0 ㄧㄣ
+侌 0 ㄧㄣ
+栶 0 ㄧㄣ
+婣 0 ㄧㄣ
+䄄 0 ㄧㄣ
+秵 0 ㄧㄣ
+筃 0 ㄧㄣ
+陻 0 ㄧㄣ
+隂 0 ㄧㄣ
+溵 0 ㄧㄣ
+潱 0 ㄧㄣ
+緸 0 ㄧㄣ
+鞇 0 ㄧㄣ
+囙 0 ㄧㄣ
+阥 0 ㄧㄣ
+㧢 0 ㄧㄣ
+磤 0 ㄧㄣ
+引 0 ㄧㄣˇ
+飲 0 ㄧㄣˇ
+隱 0 ㄧㄣˇ
+尹 0 ㄧㄣˇ
+癮 0 ㄧㄣˇ
+蚓 0 ㄧㄣˇ
+听 0 ㄧㄣˇ
+靷 0 ㄧㄣˇ
+紖 0 ㄧㄣˇ
+縯 0 ㄧㄣˇ
+讔 0 ㄧㄣˇ
+趛 0 ㄧㄣˇ
+螾 0 ㄧㄣˇ
+馻 0 ㄧㄣˇ
+鈏 0 ㄧㄣˇ
+檃 0 ㄧㄣˇ
+濦 0 ㄧㄣˇ
+蘟 0 ㄧㄣˇ
+粌 0 ㄧㄣˇ
+殷 0 ㄧㄣˇ
+戭 0 ㄧㄣˇ
+廴 0 ㄧㄣˇ
+吲 0 ㄧㄣˇ
+弞 0 ㄧㄣˇ
+赺 0 ㄧㄣˇ
+淾 0 ㄧㄣˇ
+隠 0 ㄧㄣˇ
+嶾 0 ㄧㄣˇ
+濥 0 ㄧㄣˇ
+檼 0 ㄧㄣˇ
+櫽 0 ㄧㄣˇ
+䘆 0 ㄧㄣˇ
+乚 0 ㄧㄣˇ
+磤 0 ㄧㄣˇ
+㶏 0 ㄧㄣˇ
+印 0 ㄧㄣˋ
+飲 0 ㄧㄣˋ
+隱 0 ㄧㄣˋ
+蔭 0 ㄧㄣˋ
+胤 0 ㄧㄣˋ
+廕 0 ㄧㄣˋ
+窨 0 ㄧㄣˋ
+憖 0 ㄧㄣˋ
+湚 0 ㄧㄣˋ
+垽 0 ㄧㄣˋ
+猌 0 ㄧㄣˋ
+朄 0 ㄧㄣˋ
+酳 0 ㄧㄣˋ
+音 0 ㄧㄣˋ
+陰 0 ㄧㄣˋ
+暈 0 ㄧㄣˋ
+阴 0 ㄧㄣˋ
+侌 0 ㄧㄣˋ
+洕 0 ㄧㄣˋ
+淾 0 ㄧㄣˋ
+隂 0 ㄧㄣˋ
+隠 0 ㄧㄣˋ
+憗 0 ㄧㄣˋ
+懚 0 ㄧㄣˋ
+鮣 0 ㄧㄣˋ
+乚 0 ㄧㄣˋ
+币 0 ㄧㄣˋ
+阥 0 ㄧㄣˋ
+茚 0 ㄧㄣˋ
+㥼 0 ㄧㄣˋ
+慭 0 ㄧㄣˋ
+䕃 0 ㄧㄣˋ
+癊 0 ㄧㄣˋ
+銀 0 ㄧㄣˊ
+吟 0 ㄧㄣˊ
+寅 0 ㄧㄣˊ
+淫 0 ㄧㄣˊ
+鄞 0 ㄧㄣˊ
+齦 0 ㄧㄣˊ
+霪 0 ㄧㄣˊ
+垠 0 ㄧㄣˊ
+夤 0 ㄧㄣˊ
+狺 0 ㄧㄣˊ
+嚚 0 ㄧㄣˊ
+崟 0 ㄧㄣˊ
+誾 0 ㄧㄣˊ
+蟫 0 ㄧㄣˊ
+婬 0 ㄧㄣˊ
+冘 0 ㄧㄣˊ
+苂 0 ㄧㄣˊ
+釿 0 ㄧㄣˊ
+圁 0 ㄧㄣˊ
+烎 0 ㄧㄣˊ
+凐 0 ㄧㄣˊ
+荶 0 ㄧㄣˊ
+殥 0 ㄧㄣˊ
+蔩 0 ㄧㄣˊ
+檭 0 ㄧㄣˊ
+鷣 0 ㄧㄣˊ
+鏔 0 ㄧㄣˊ
+言 0 ㄧㄣˊ
+粌 0 ㄧㄣˊ
+齗 0 ㄧㄣˊ
+犾 0 ㄧㄣˊ
+垦 0 ㄧㄣˊ
+泿 0 ㄧㄣˊ
+㖗 0 ㄧㄣˊ
+珢 0 ㄧㄣˊ
+崯 0 ㄧㄣˊ
+訡 0 ㄧㄣˊ
+滛 0 ㄧㄣˊ
+碒 0 ㄧㄣˊ
+噖 0 ㄧㄣˊ
+璌 0 ㄧㄣˊ
+峾 0 ㄧㄣˊ
+訔 0 ㄧㄣˊ
+鈝 0 ㄧㄣˊ
+ㄒ 0 ㄒ
+須 0 ㄒㄩ
+需 0 ㄒㄩ
+虛 0 ㄒㄩ
+鬚 0 ㄒㄩ
+噓 0 ㄒㄩ
+墟 0 ㄒㄩ
+戌 0 ㄒㄩ
+胥 0 ㄒㄩ
+訏 0 ㄒㄩ
+吁 0 ㄒㄩ
+歔 0 ㄒㄩ
+盱 0 ㄒㄩ
+嬃 0 ㄒㄩ
+繻 0 ㄒㄩ
+殈 0 ㄒㄩ
+旴 0 ㄒㄩ
+呴 0 ㄒㄩ
+楈 0 ㄒㄩ
+嬬 0 ㄒㄩ
+鑐 0 ㄒㄩ
+欨 0 ㄒㄩ
+倠 0 ㄒㄩ
+稰 0 ㄒㄩ
+縃 0 ㄒㄩ
+蝑 0 ㄒㄩ
+蕦 0 ㄒㄩ
+驉 0 ㄒㄩ
+魖 0 ㄒㄩ
+晇 0 ㄒㄩ
+幁 0 ㄒㄩ
+揟 0 ㄒㄩ
+糈 0 ㄒㄩ
+于 0 ㄒㄩ
+嘔 0 ㄒㄩ
+樨 0 ㄒㄩ
+謣 0 ㄒㄩ
+覷 0 ㄒㄩ
+鱋 0 ㄒㄩ
+亏 0 ㄒㄩ
+扝 0 ㄒㄩ
+偦 0 ㄒㄩ
+虚 0 ㄒㄩ
+虗 0 ㄒㄩ
+嘘 0 ㄒㄩ
+覰 0 ㄒㄩ
+譃 0 ㄒㄩ
+覻 0 ㄒㄩ
+薛 0 ㄒㄩㄝ
+靴 0 ㄒㄩㄝ
+噱 0 ㄒㄩㄝ
+嶨 0 ㄒㄩㄝ
+吙 0 ㄒㄩㄝ
+辥 0 ㄒㄩㄝ
+嚯 0 ㄒㄩㄝ
+鞾 0 ㄒㄩㄝ
+㖸 0 ㄒㄩㄝ
+㗾 0 ㄒㄩㄝ
+雪 0 ㄒㄩㄝˇ
+鱈 0 ㄒㄩㄝˇ
+血 0 ㄒㄩㄝˋ
+雪 0 ㄒㄩㄝˋ
+穴 0 ㄒㄩㄝˋ
+削 0 ㄒㄩㄝˋ
+趐 0 ㄒㄩㄝˋ
+泬 0 ㄒㄩㄝˋ
+謞 0 ㄒㄩㄝˋ
+岤 0 ㄒㄩㄝˋ
+袕 0 ㄒㄩㄝˋ
+屑 0 ㄒㄩㄝˋ
+吷 0 ㄒㄩㄝˋ
+狘 0 ㄒㄩㄝˋ
+穸 0 ㄒㄩㄝˋ
+箾 0 ㄒㄩㄝˋ
+桖 0 ㄒㄩㄝˋ
+㕰 0 ㄒㄩㄝˋ
+坹 0 ㄒㄩㄝˋ
+學 0 ㄒㄩㄝˊ
+穴 0 ㄒㄩㄝˊ
+鷽 0 ㄒㄩㄝˊ
+觷 0 ㄒㄩㄝˊ
+踅 0 ㄒㄩㄝˊ
+燢 0 ㄒㄩㄝˊ
+澩 0 ㄒㄩㄝˊ
+壆 0 ㄒㄩㄝˊ
+尋 0 ㄒㄩㄝˊ
+嶨 0 ㄒㄩㄝˊ
+斈 0 ㄒㄩㄝˊ
+斅 0 ㄒㄩㄝˊ
+雤 0 ㄒㄩㄝˊ
+乴 0 ㄒㄩㄝˊ
+学 0 ㄒㄩㄝˊ
+㶅 0 ㄒㄩㄝˊ
+兄 0 ㄒㄩㄥ
+兇 0 ㄒㄩㄥ
+胸 0 ㄒㄩㄥ
+凶 0 ㄒㄩㄥ
+匈 0 ㄒㄩㄥ
+洶 0 ㄒㄩㄥ
+忷 0 ㄒㄩㄥ
+哅 0 ㄒㄩㄥ
+恟 0 ㄒㄩㄥ
+酗 0 ㄒㄩㄥ
+勳 0 ㄒㄩㄥ
+芎 0 ㄒㄩㄥ
+汹 0 ㄒㄩㄥ
+胷 0 ㄒㄩㄥ
+訩 0 ㄒㄩㄥ
+詾 0 ㄒㄩㄥ
+敻 0 ㄒㄩㄥˋ
+詗 0 ㄒㄩㄥˋ
+焸 0 ㄒㄩㄥˋ
+夐 0 ㄒㄩㄥˋ
+雄 0 ㄒㄩㄥˊ
+熊 0 ㄒㄩㄥˊ
+赨 0 ㄒㄩㄥˊ
+熋 0 ㄒㄩㄥˊ
+宣 0 ㄒㄩㄢ
+軒 0 ㄒㄩㄢ
+喧 0 ㄒㄩㄢ
+瑄 0 ㄒㄩㄢ
+萱 0 ㄒㄩㄢ
+暄 0 ㄒㄩㄢ
+亘 0 ㄒㄩㄢ
+壎 0 ㄒㄩㄢ
+儇 0 ㄒㄩㄢ
+諼 0 ㄒㄩㄢ
+塤 0 ㄒㄩㄢ
+嬛 0 ㄒㄩㄢ
+揎 0 ㄒㄩㄢ
+翾 0 ㄒㄩㄢ
+諠 0 ㄒㄩㄢ
+愃 0 ㄒㄩㄢ
+晅 0 ㄒㄩㄢ
+鍹 0 ㄒㄩㄢ
+梋 0 ㄒㄩㄢ
+煖 0 ㄒㄩㄢ
+萲 0 ㄒㄩㄢ
+愋 0 ㄒㄩㄢ
+佡 0 ㄒㄩㄢ
+昍 0 ㄒㄩㄢ
+鋗 0 ㄒㄩㄢ
+媗 0 ㄒㄩㄢ
+禤 0 ㄒㄩㄢ
+蝖 0 ㄒㄩㄢ
+蠉 0 ㄒㄩㄢ
+矎 0 ㄒㄩㄢ
+渲 0 ㄒㄩㄢ
+暖 0 ㄒㄩㄢ
+仚 0 ㄒㄩㄢ
+搟 0 ㄒㄩㄢ
+楦 0 ㄒㄩㄢ
+蓒 0 ㄒㄩㄢ
+懁 0 ㄒㄩㄢ
+駽 0 ㄒㄩㄢ
+坃 0 ㄒㄩㄢ
+㘣 0 ㄒㄩㄢ
+弲 0 ㄒㄩㄢ
+煊 0 ㄒㄩㄢ
+煗 0 ㄒㄩㄢ
+睻 0 ㄒㄩㄢ
+箮 0 ㄒㄩㄢ
+翧 0 ㄒㄩㄢ
+蕿 0 ㄒㄩㄢ
+藼 0 ㄒㄩㄢ
+蘐 0 ㄒㄩㄢ
+壦 0 ㄒㄩㄢ
+暅 0 ㄒㄩㄢ
+譞 0 ㄒㄩㄢ
+選 0 ㄒㄩㄢˇ
+咺 0 ㄒㄩㄢˇ
+烜 0 ㄒㄩㄢˇ
+癬 0 ㄒㄩㄢˇ
+选 0 ㄒㄩㄢˇ
+炫 0 ㄒㄩㄢˋ
+絢 0 ㄒㄩㄢˋ
+漩 0 ㄒㄩㄢˋ
+眩 0 ㄒㄩㄢˋ
+泫 0 ㄒㄩㄢˋ
+渲 0 ㄒㄩㄢˋ
+旋 0 ㄒㄩㄢˋ
+眴 0 ㄒㄩㄢˋ
+楦 0 ㄒㄩㄢˋ
+敻 0 ㄒㄩㄢˋ
+鉉 0 ㄒㄩㄢˋ
+衒 0 ㄒㄩㄢˋ
+蔙 0 ㄒㄩㄢˋ
+駽 0 ㄒㄩㄢˋ
+鞙 0 ㄒㄩㄢˋ
+鏇 0 ㄒㄩㄢˋ
+昡 0 ㄒㄩㄢˋ
+楥 0 ㄒㄩㄢˋ
+袨 0 ㄒㄩㄢˋ
+縼 0 ㄒㄩㄢˋ
+讂 0 ㄒㄩㄢˋ
+贙 0 ㄒㄩㄢˋ
+陷 0 ㄒㄩㄢˋ
+琄 0 ㄒㄩㄢˋ
+怰 0 ㄒㄩㄢˋ
+姰 0 ㄒㄩㄢˋ
+䧟 0 ㄒㄩㄢˋ
+夐 0 ㄒㄩㄢˋ
+駨 0 ㄒㄩㄢˋ
+繏 0 ㄒㄩㄢˋ
+矎 0 ㄒㄩㄢˋ
+玄 0 ㄒㄩㄢˊ
+旋 0 ㄒㄩㄢˊ
+懸 0 ㄒㄩㄢˊ
+漩 0 ㄒㄩㄢˊ
+璇 0 ㄒㄩㄢˊ
+璿 0 ㄒㄩㄢˊ
+伭 0 ㄒㄩㄢˊ
+妶 0 ㄒㄩㄢˊ
+琁 0 ㄒㄩㄢˊ
+玹 0 ㄒㄩㄢˊ
+嫙 0 ㄒㄩㄢˊ
+誸 0 ㄒㄩㄢˊ
+還 0 ㄒㄩㄢˊ
+縣 0 ㄒㄩㄢˊ
+蜁 0 ㄒㄩㄢˊ
+弦 0 ㄒㄩㄢˊ
+絃 0 ㄒㄩㄢˊ
+舷 0 ㄒㄩㄢˊ
+盷 0 ㄒㄩㄢˊ
+胘 0 ㄒㄩㄢˊ
+娹 0 ㄒㄩㄢˊ
+惤 0 ㄒㄩㄢˊ
+蚿 0 ㄒㄩㄢˊ
+蔙 0 ㄒㄩㄢˊ
+縼 0 ㄒㄩㄢˊ
+还 0 ㄒㄩㄢˊ
+婱 0 ㄒㄩㄢˊ
+暶 0 ㄒㄩㄢˊ
+䁢 0 ㄒㄩㄢˊ
+檈 0 ㄒㄩㄢˊ
+䲂 0 ㄒㄩㄢˊ
+䴉 0 ㄒㄩㄢˊ
+許 0 ㄒㄩˇ
+栩 0 ㄒㄩˇ
+煦 0 ㄒㄩˇ
+咻 0 ㄒㄩˇ
+詡 0 ㄒㄩˇ
+冔 0 ㄒㄩˇ
+姁 0 ㄒㄩˇ
+湑 0 ㄒㄩˇ
+諝 0 ㄒㄩˇ
+醑 0 ㄒㄩˇ
+鄦 0 ㄒㄩˇ
+珝 0 ㄒㄩˇ
+喣 0 ㄒㄩˇ
+休 0 ㄒㄩˇ
+呴 0 ㄒㄩˇ
+沀 0 ㄒㄩˇ
+昫 0 ㄒㄩˇ
+祤 0 ㄒㄩˇ
+滸 0 ㄒㄩˇ
+糈 0 ㄒㄩˇ
+偦 0 ㄒㄩˇ
+綇 0 ㄒㄩˇ
+繏 0 ㄒㄩˇ
+盨 0 ㄒㄩˇ
+序 0 ㄒㄩˋ
+續 0 ㄒㄩˋ
+蓄 0 ㄒㄩˋ
+緒 0 ㄒㄩˋ
+敘 0 ㄒㄩˋ
+絮 0 ㄒㄩˋ
+旭 0 ㄒㄩˋ
+恤 0 ㄒㄩˋ
+卹 0 ㄒㄩˋ
+酗 0 ㄒㄩˋ
+婿 0 ㄒㄩˋ
+畜 0 ㄒㄩˋ
+洫 0 ㄒㄩˋ
+旮 0 ㄒㄩˋ
+侐 0 ㄒㄩˋ
+慉 0 ㄒㄩˋ
+漵 0 ㄒㄩˋ
+藚 0 ㄒㄩˋ
+頊 0 ㄒㄩˋ
+芧 0 ㄒㄩˋ
+藇 0 ㄒㄩˋ
+魆 0 ㄒㄩˋ
+勖 0 ㄒㄩˋ
+勗 0 ㄒㄩˋ
+訹 0 ㄒㄩˋ
+鱮 0 ㄒㄩˋ
+烅 0 ㄒㄩˋ
+怴 0 ㄒㄩˋ
+垿 0 ㄒㄩˋ
+窢 0 ㄒㄩˋ
+瞲 0 ㄒㄩˋ
+銊 0 ㄒㄩˋ
+沀 0 ㄒㄩˋ
+昫 0 ㄒㄩˋ
+瞁 0 ㄒㄩˋ
+戌 0 ㄒㄩˋ
+煦 0 ㄒㄩˋ
+殈 0 ㄒㄩˋ
+淢 0 ㄒㄩˋ
+揟 0 ㄒㄩˋ
+欻 0 ㄒㄩˋ
+鈙 0 ㄒㄩˋ
+獝 0 ㄒㄩˋ
+馘 0 ㄒㄩˋ
+伵 0 ㄒㄩˋ
+汿 0 ㄒㄩˋ
+叙 0 ㄒㄩˋ
+䘏 0 ㄒㄩˋ
+欰 0 ㄒㄩˋ
+珬 0 ㄒㄩˋ
+惐 0 ㄒㄩˋ
+敍 0 ㄒㄩˋ
+壻 0 ㄒㄩˋ
+賉 0 ㄒㄩˋ
+槒 0 ㄒㄩˋ
+潊 0 ㄒㄩˋ
+盢 0 ㄒㄩˋ
+聟 0 ㄒㄩˋ
+稸 0 ㄒㄩˋ
+緖 0 ㄒㄩˋ
+魣 0 ㄒㄩˋ
+歘 0 ㄒㄩˋ
+肷 0 ㄒㄩˋ
+㖅 0 ㄒㄩˋ
+溆 0 ㄒㄩˋ
+㜅 0 ㄒㄩˋ
+嘼 0 ㄒㄩˋ
+徐 0 ㄒㄩˊ
+余 0 ㄒㄩˊ
+邪 0 ㄒㄩˊ
+俆 0 ㄒㄩˊ
+衺 0 ㄒㄩˊ
+蒣 0 ㄒㄩˊ
+勳 0 ㄒㄩㄣ
+薰 0 ㄒㄩㄣ
+燻 0 ㄒㄩㄣ
+熏 0 ㄒㄩㄣ
+醺 0 ㄒㄩㄣ
+峋 0 ㄒㄩㄣ
+曛 0 ㄒㄩㄣ
+焄 0 ㄒㄩㄣ
+獯 0 ㄒㄩㄣ
+纁 0 ㄒㄩㄣ
+臐 0 ㄒㄩㄣ
+蔒 0 ㄒㄩㄣ
+勛 0 ㄒㄩㄣ
+矄 0 ㄒㄩㄣ
+勣 0 ㄒㄩㄣ
+葷 0 ㄒㄩㄣ
+壎 0 ㄒㄩㄣ
+塤 0 ㄒㄩㄣ
+窨 0 ㄒㄩㄣ
+坃 0 ㄒㄩㄣ
+姰 0 ㄒㄩㄣ
+勲 0 ㄒㄩㄣ
+薫 0 ㄒㄩㄣ
+爋 0 ㄒㄩㄣ
+蘍 0 ㄒㄩㄣ
+壦 0 ㄒㄩㄣ
+訊 0 ㄒㄩㄣˋ
+訓 0 ㄒㄩㄣˋ
+迅 0 ㄒㄩㄣˋ
+遜 0 ㄒㄩㄣˋ
+殉 0 ㄒㄩㄣˋ
+馴 0 ㄒㄩㄣˋ
+徇 0 ㄒㄩㄣˋ
+巽 0 ㄒㄩㄣˋ
+汛 0 ㄒㄩㄣˋ
+蕈 0 ㄒㄩㄣˋ
+噀 0 ㄒㄩㄣˋ
+侚 0 ㄒㄩㄣˋ
+潠 0 ㄒㄩㄣˋ
+迿 0 ㄒㄩㄣˋ
+孫 0 ㄒㄩㄣˋ
+丮 0 ㄒㄩㄣˋ
+阠 0 ㄒㄩㄣˋ
+熏 0 ㄒㄩㄣˋ
+伨 0 ㄒㄩㄣˋ
+巺 0 ㄒㄩㄣˋ
+狥 0 ㄒㄩㄣˋ
+訙 0 ㄒㄩㄣˋ
+奞 0 ㄒㄩㄣˋ
+殾 0 ㄒㄩㄣˋ
+賐 0 ㄒㄩㄣˋ
+爋 0 ㄒㄩㄣˋ
+顨 0 ㄒㄩㄣˋ
+鑂 0 ㄒㄩㄣˋ
+尋 0 ㄒㄩㄣˊ
+巡 0 ㄒㄩㄣˊ
+詢 0 ㄒㄩㄣˊ
+循 0 ㄒㄩㄣˊ
+旬 0 ㄒㄩㄣˊ
+馴 0 ㄒㄩㄣˊ
+潯 0 ㄒㄩㄣˊ
+珣 0 ㄒㄩㄣˊ
+蟳 0 ㄒㄩㄣˊ
+洵 0 ㄒㄩㄣˊ
+荀 0 ㄒㄩㄣˊ
+徇 0 ㄒㄩㄣˊ
+恂 0 ㄒㄩㄣˊ
+峋 0 ㄒㄩㄣˊ
+栒 0 ㄒㄩㄣˊ
+燖 0 ㄒㄩㄣˊ
+璿 0 ㄒㄩㄣˊ
+紃 0 ㄒㄩㄣˊ
+郇 0 ㄒㄩㄣˊ
+鱘 0 ㄒㄩㄣˊ
+槆 0 ㄒㄩㄣˊ
+撏 0 ㄒㄩㄣˊ
+枔 0 ㄒㄩㄣˊ
+咰 0 ㄒㄩㄣˊ
+璕 0 ㄒㄩㄣˊ
+橁 0 ㄒㄩㄣˊ
+蕁 0 ㄒㄩㄣˊ
+噚 0 ㄒㄩㄣˊ
+殉 0 ㄒㄩㄣˊ
+攳 0 ㄒㄩㄣˊ
+燅 0 ㄒㄩㄣˊ
+燂 0 ㄒㄩㄣˊ
+襑 0 ㄒㄩㄣˊ
+灥 0 ㄒㄩㄣˊ
+伨 0 ㄒㄩㄣˊ
+廵 0 ㄒㄩㄣˊ
+杊 0 ㄒㄩㄣˊ
+狥 0 ㄒㄩㄣˊ
+毥 0 ㄒㄩㄣˊ
+偱 0 ㄒㄩㄣˊ
+樳 0 ㄒㄩㄣˊ
+駨 0 ㄒㄩㄣˊ
+鱏 0 ㄒㄩㄣˊ
+畃 0 ㄒㄩㄣˊ
+㵌 0 ㄒㄩㄣˊ
+西 0 ㄒㄧ
+希 0 ㄒㄧ
+吸 0 ㄒㄧ
+攜 0 ㄒㄧ
+嘻 0 ㄒㄧ
+犧 0 ㄒㄧ
+稀 0 ㄒㄧ
+悉 0 ㄒㄧ
+溪 0 ㄒㄧ
+析 0 ㄒㄧ
+蟋 0 ㄒㄧ
+熙 0 ㄒㄧ
+禧 0 ㄒㄧ
+膝 0 ㄒㄧ
+棲 0 ㄒㄧ
+釐 0 ㄒㄧ
+嬉 0 ㄒㄧ
+兮 0 ㄒㄧ
+犀 0 ㄒㄧ
+晰 0 ㄒㄧ
+羲 0 ㄒㄧ
+畦 0 ㄒㄧ
+曦 0 ㄒㄧ
+僖 0 ㄒㄧ
+蜥 0 ㄒㄧ
+扱 0 ㄒㄧ
+熹 0 ㄒㄧ
+奚 0 ㄒㄧ
+盻 0 ㄒㄧ
+觿 0 ㄒㄧ
+譆 0 ㄒㄧ
+晞 0 ㄒㄧ
+欷 0 ㄒㄧ
+蹊 0 ㄒㄧ
+樨 0 ㄒㄧ
+巇 0 ㄒㄧ
+淅 0 ㄒㄧ
+皙 0 ㄒㄧ
+唏 0 ㄒㄧ
+烯 0 ㄒㄧ
+傒 0 ㄒㄧ
+徯 0 ㄒㄧ
+恓 0 ㄒㄧ
+窸 0 ㄒㄧ
+粞 0 ㄒㄧ
+豨 0 ㄒㄧ
+醯 0 ㄒㄧ
+鼷 0 ㄒㄧ
+氥 0 ㄒㄧ
+浠 0 ㄒㄧ
+燨 0 ㄒㄧ
+瓗 0 ㄒㄧ
+疧 0 ㄒㄧ
+酅 0 ㄒㄧ
+媐 0 ㄒㄧ
+巂 0 ㄒㄧ
+悕 0 ㄒㄧ
+睎 0 ㄒㄧ
+硒 0 ㄒㄧ
+蠵 0 ㄒㄧ
+鑴 0 ㄒㄧ
+榽 0 ㄒㄧ
+歖 0 ㄒㄧ
+爔 0 ㄒㄧ
+琋 0 ㄒㄧ
+螇 0 ㄒㄧ
+俙 0 ㄒㄧ
+徆 0 ㄒㄧ
+怷 0 ㄒㄧ
+娭 0 ㄒㄧ
+屖 0 ㄒㄧ
+谿 0 ㄒㄧ
+莃 0 ㄒㄧ
+菥 0 ㄒㄧ
+僁 0 ㄒㄧ
+橀 0 ㄒㄧ
+螝 0 ㄒㄧ
+豯 0 ㄒㄧ
+貕 0 ㄒㄧ
+鵗 0 ㄒㄧ
+騱 0 ㄒㄧ
+驨 0 ㄒㄧ
+郋 0 ㄒㄧ
+桸 0 ㄒㄧ
+惁 0 ㄒㄧ
+凞 0 ㄒㄧ
+誒 0 ㄒㄧ
+礂 0 ㄒㄧ
+屎 0 ㄒㄧ
+訢 0 ㄒㄧ
+萋 0 ㄒㄧ
+墀 0 ㄒㄧ
+撕 0 ㄒㄧ
+璽 0 ㄒㄧ
+恄 0 ㄒㄧ
+栖 0 ㄒㄧ
+狶 0 ㄒㄧ
+茜 0 ㄒㄧ
+梊 0 ㄒㄧ
+瓻 0 ㄒㄧ
+慀 0 ㄒㄧ
+磎 0 ㄒㄧ
+螅 0 ㄒㄧ
+蟢 0 ㄒㄧ
+孈 0 ㄒㄧ
+鸂 0 ㄒㄧ
+忚 0 ㄒㄧ
+吚 0 ㄒㄧ
+忾 0 ㄒㄧ
+㛓 0 ㄒㄧ
+牺 0 ㄒㄧ
+胿 0 ㄒㄧ
+捿 0 ㄒㄧ
+焁 0 ㄒㄧ
+焈 0 ㄒㄧ
+晳 0 ㄒㄧ
+焬 0 ㄒㄧ
+厀 0 ㄒㄧ
+嵠 0 ㄒㄧ
+携 0 ㄒㄧ
+熈 0 ㄒㄧ
+噏 0 ㄒㄧ
+嬆 0 ㄒㄧ
+蔳 0 ㄒㄧ
+㩗 0 ㄒㄧ
+擕 0 ㄒㄧ
+暿 0 ㄒㄧ
+熻 0 ㄒㄧ
+熺 0 ㄒㄧ
+壐 0 ㄒㄧ
+瞦 0 ㄒㄧ
+䁯 0 ㄒㄧ
+豀 0 ㄒㄧ
+㩦 0 ㄒㄧ
+黊 0 ㄒㄧ
+鏭 0 ㄒㄧ
+儶 0 ㄒㄧ
+㼇 0 ㄒㄧ
+隵 0 ㄒㄧ
+㰕 0 ㄒㄧ
+讗 0 ㄒㄧ
+卤 0 ㄒㄧ
+怸 0 ㄒㄧ
+玺 0 ㄒㄧ
+𠴭 0 ㄒㄧ
+唽 0 ㄒㄧ
+㓾 0 ㄒㄧ
+㗭 0 ㄒㄧ
+燍 0 ㄒㄧ
+㬢 0 ㄒㄧ
+繥 0 ㄒㄧ
+觹 0 ㄒㄧ
+鬹 0 ㄒㄧ
+觽 0 ㄒㄧ
+𢹂 0 ㄒㄧ
+𡾞 0 ㄒㄧ
+饎 0 ㄒㄧ
+西 0 ㄒㄧ˙
+些 0 ㄒㄧㄝ
+歇 0 ㄒㄧㄝ
+蠍 0 ㄒㄧㄝ
+蝎 0 ㄒㄧㄝ
+猲 0 ㄒㄧㄝ
+褉 0 ㄒㄧㄝ
+嗋 0 ㄒㄧㄝ
+楔 0 ㄒㄧㄝ
+碣 0 ㄒㄧㄝ
+羯 0 ㄒㄧㄝ
+燮 0 ㄒㄧㄝ
+偈 0 ㄒㄧㄝ
+堨 0 ㄒㄧㄝ
+揳 0 ㄒㄧㄝ
+毼 0 ㄒㄧㄝ
+㱔 0 ㄒㄧㄝ
+礍 0 ㄒㄧㄝ
+爕 0 ㄒㄧㄝ
+寫 0 ㄒㄧㄝˇ
+血 0 ㄒㄧㄝˇ
+蟹 0 ㄒㄧㄝˇ
+舄 0 ㄒㄧㄝˇ
+写 0 ㄒㄧㄝˇ
+舃 0 ㄒㄧㄝˇ
+藛 0 ㄒㄧㄝˇ
+蠏 0 ㄒㄧㄝˇ
+謝 0 ㄒㄧㄝˋ
+械 0 ㄒㄧㄝˋ
+洩 0 ㄒㄧㄝˋ
+屑 0 ㄒㄧㄝˋ
+瀉 0 ㄒㄧㄝˋ
+懈 0 ㄒㄧㄝˋ
+卸 0 ㄒㄧㄝˋ
+泄 0 ㄒㄧㄝˋ
+蟹 0 ㄒㄧㄝˋ
+解 0 ㄒㄧㄝˋ
+屜 0 ㄒㄧㄝˋ
+褻 0 ㄒㄧㄝˋ
+榭 0 ㄒㄧㄝˋ
+契 0 ㄒㄧㄝˋ
+駭 0 ㄒㄧㄝˋ
+廨 0 ㄒㄧㄝˋ
+渫 0 ㄒㄧㄝˋ
+邂 0 ㄒㄧㄝˋ
+燮 0 ㄒㄧㄝˋ
+楔 0 ㄒㄧㄝˋ
+絏 0 ㄒㄧㄝˋ
+薤 0 ㄒㄧㄝˋ
+紲 0 ㄒㄧㄝˋ
+媟 0 ㄒㄧㄝˋ
+嶰 0 ㄒㄧㄝˋ
+澥 0 ㄒㄧㄝˋ
+瀣 0 ㄒㄧㄝˋ
+獬 0 ㄒㄧㄝˋ
+躞 0 ㄒㄧㄝˋ
+灺 0 ㄒㄧㄝˋ
+疶 0 ㄒㄧㄝˋ
+鞢 0 ㄒㄧㄝˋ
+骱 0 ㄒㄧㄝˋ
+駴 0 ㄒㄧㄝˋ
+偰 0 ㄒㄧㄝˋ
+檞 0 ㄒㄧㄝˋ
+齘 0 ㄒㄧㄝˋ
+伳 0 ㄒㄧㄝˋ
+妎 0 ㄒㄧㄝˋ
+祄 0 ㄒㄧㄝˋ
+榍 0 ㄒㄧㄝˋ
+韰 0 ㄒㄧㄝˋ
+屧 0 ㄒㄧㄝˋ
+焎 0 ㄒㄧㄝˋ
+揳 0 ㄒㄧㄝˋ
+齥 0 ㄒㄧㄝˋ
+脅 0 ㄒㄧㄝˋ
+寫 0 ㄒㄧㄝˋ
+潟 0 ㄒㄧㄝˋ
+嗋 0 ㄒㄧㄝˋ
+愶 0 ㄒㄧㄝˋ
+熁 0 ㄒㄧㄝˋ
+燲 0 ㄒㄧㄝˋ
+薢 0 ㄒㄧㄝˋ
+齛 0 ㄒㄧㄝˋ
+写 0 ㄒㄧㄝˋ
+斺 0 ㄒㄧㄝˋ
+炨 0 ㄒㄧㄝˋ
+炧 0 ㄒㄧㄝˋ
+脇 0 ㄒㄧㄝˋ
+衸 0 ㄒㄧㄝˋ
+烲 0 ㄒㄧㄝˋ
+屟 0 ㄒㄧㄝˋ
+絬 0 ㄒㄧㄝˋ
+㻡 0 ㄒㄧㄝˋ
+觧 0 ㄒㄧㄝˋ
+暬 0 ㄒㄧㄝˋ
+緤 0 ㄒㄧㄝˋ
+噧 0 ㄒㄧㄝˋ
+爕 0 ㄒㄧㄝˋ
+蠏 0 ㄒㄧㄝˋ
+譮 0 ㄒㄧㄝˋ
+缷 0 ㄒㄧㄝˋ
+徢 0 ㄒㄧㄝˋ
+碿 0 ㄒㄧㄝˋ
+糏 0 ㄒㄧㄝˋ
+協 0 ㄒㄧㄝˊ
+鞋 0 ㄒㄧㄝˊ
+斜 0 ㄒㄧㄝˊ
+脅 0 ㄒㄧㄝˊ
+諧 0 ㄒㄧㄝˊ
+邪 0 ㄒㄧㄝˊ
+偕 0 ㄒㄧㄝˊ
+頡 0 ㄒㄧㄝˊ
+挾 0 ㄒㄧㄝˊ
+絜 0 ㄒㄧㄝˊ
+攜 0 ㄒㄧㄝˊ
+擷 0 ㄒㄧㄝˊ
+勰 0 ㄒㄧㄝˊ
+纈 0 ㄒㄧㄝˊ
+襭 0 ㄒㄧㄝˊ
+脥 0 ㄒㄧㄝˊ
+慀 0 ㄒㄧㄝˊ
+劦 0 ㄒㄧㄝˊ
+蝢 0 ㄒㄧㄝˊ
+垥 0 ㄒㄧㄝˊ
+拹 0 ㄒㄧㄝˊ
+籺 0 ㄒㄧㄝˊ
+奊 0 ㄒㄧㄝˊ
+龤 0 ㄒㄧㄝˊ
+愶 0 ㄒㄧㄝˊ
+搚 0 ㄒㄧㄝˊ
+瑎 0 ㄒㄧㄝˊ
+熁 0 ㄒㄧㄝˊ
+燲 0 ㄒㄧㄝˊ
+頁 0 ㄒㄧㄝˊ
+鮭 0 ㄒㄧㄝˊ
+蠍 0 ㄒㄧㄝˊ
+姭 0 ㄒㄧㄝˊ
+嗋 0 ㄒㄧㄝˊ
+緳 0 ㄒㄧㄝˊ
+叶 0 ㄒㄧㄝˊ
+协 0 ㄒㄧㄝˊ
+旪 0 ㄒㄧㄝˊ
+恊 0 ㄒㄧㄝˊ
+挟 0 ㄒㄧㄝˊ
+峫 0 ㄒㄧㄝˊ
+脇 0 ㄒㄧㄝˊ
+衺 0 ㄒㄧㄝˊ
+翓 0 ㄒㄧㄝˊ
+携 0 ㄒㄧㄝˊ
+綊 0 ㄒㄧㄝˊ
+綇 0 ㄒㄧㄝˊ
+㩗 0 ㄒㄧㄝˊ
+擕 0 ㄒㄧㄝˊ
+㩦 0 ㄒㄧㄝˊ
+鞵 0 ㄒㄧㄝˊ
+膎 0 ㄒㄧㄝˊ
+𦳃 0 ㄒㄧㄝˊ
+謝 0 ㄒㄧㄝ˙
+修 0 ㄒㄧㄡ
+休 0 ㄒㄧㄡ
+羞 0 ㄒㄧㄡ
+脩 0 ㄒㄧㄡ
+咻 0 ㄒㄧㄡ
+庥 0 ㄒㄧㄡ
+貅 0 ㄒㄧㄡ
+髹 0 ㄒㄧㄡ
+饈 0 ㄒㄧㄡ
+鵂 0 ㄒㄧㄡ
+滫 0 ㄒㄧㄡ
+樇 0 ㄒㄧㄡ
+臹 0 ㄒㄧㄡ
+茠 0 ㄒㄧㄡ
+銝 0 ㄒㄧㄡ
+蓨 0 ㄒㄧㄡ
+鎀 0 ㄒㄧㄡ
+潃 0 ㄒㄧㄡ
+恘 0 ㄒㄧㄡ
+烌 0 ㄒㄧㄡ
+蓚 0 ㄒㄧㄡ
+髤 0 ㄒㄧㄡ
+鏅 0 ㄒㄧㄡ
+飍 0 ㄒㄧㄡ
+俢 0 ㄒㄧㄡ
+㳜 0 ㄒㄧㄡ
+鱃 0 ㄒㄧㄡ
+朽 0 ㄒㄧㄡˇ
+宿 0 ㄒㄧㄡˇ
+糔 0 ㄒㄧㄡˇ
+休 0 ㄒㄧㄡˇ
+枵 0 ㄒㄧㄡˇ
+滫 0 ㄒㄧㄡˇ
+潃 0 ㄒㄧㄡˇ
+鴞 0 ㄒㄧㄡˇ
+秀 0 ㄒㄧㄡˋ
+繡 0 ㄒㄧㄡˋ
+鏽 0 ㄒㄧㄡˋ
+袖 0 ㄒㄧㄡˋ
+嗅 0 ㄒㄧㄡˋ
+宿 0 ㄒㄧㄡˋ
+臭 0 ㄒㄧㄡˋ
+銹 0 ㄒㄧㄡˋ
+琇 0 ㄒㄧㄡˋ
+溴 0 ㄒㄧㄡˋ
+岫 0 ㄒㄧㄡˋ
+珛 0 ㄒㄧㄡˋ
+玊 0 ㄒㄧㄡˋ
+殠 0 ㄒㄧㄡˋ
+褎 0 ㄒㄧㄡˋ
+螑 0 ㄒㄧㄡˋ
+綉 0 ㄒㄧㄡˋ
+璓 0 ㄒㄧㄡˋ
+褏 0 ㄒㄧㄡˋ
+繍 0 ㄒㄧㄡˋ
+鏅 0 ㄒㄧㄡˋ
+鏥 0 ㄒㄧㄡˋ
+齅 0 ㄒㄧㄡˋ
+臰 0 ㄒㄧㄡˋ
+嘼 0 ㄒㄧㄡˋ
+興 0 ㄒㄧㄥ
+星 0 ㄒㄧㄥ
+猩 0 ㄒㄧㄥ
+腥 0 ㄒㄧㄥ
+馨 0 ㄒㄧㄥ
+惺 0 ㄒㄧㄥ
+騂 0 ㄒㄧㄥ
+煋 0 ㄒㄧㄥ
+瑆 0 ㄒㄧㄥ
+胜 0 ㄒㄧㄥ
+垶 0 ㄒㄧㄥ
+蛵 0 ㄒㄧㄥ
+觲 0 ㄒㄧㄥ
+馫 0 ㄒㄧㄥ
+醒 0 ㄒㄧㄥ
+狌 0 ㄒㄧㄥ
+觪 0 ㄒㄧㄥ
+鮏 0 ㄒㄧㄥ
+曐 0 ㄒㄧㄥ
+嬹 0 ㄒㄧㄥ
+鯹 0 ㄒㄧㄥ
+篂 0 ㄒㄧㄥ
+皨 0 ㄒㄧㄥ
+省 0 ㄒㄧㄥˇ
+醒 0 ㄒㄧㄥˇ
+擤 0 ㄒㄧㄥˇ
+渻 0 ㄒㄧㄥˇ
+惺 0 ㄒㄧㄥˇ
+睲 0 ㄒㄧㄥˇ
+行 0 ㄒㄧㄥˋ
+興 0 ㄒㄧㄥˋ
+性 0 ㄒㄧㄥˋ
+幸 0 ㄒㄧㄥˋ
+姓 0 ㄒㄧㄥˋ
+杏 0 ㄒㄧㄥˋ
+倖 0 ㄒㄧㄥˋ
+悻 0 ㄒㄧㄥˋ
+荇 0 ㄒㄧㄥˋ
+婞 0 ㄒㄧㄥˋ
+莕 0 ㄒㄧㄥˋ
+涬 0 ㄒㄧㄥˋ
+啈 0 ㄒㄧㄥˋ
+矎 0 ㄒㄧㄥˋ
+緈 0 ㄒㄧㄥˋ
+嬹 0 ㄒㄧㄥˋ
+臖 0 ㄒㄧㄥˋ
+行 0 ㄒㄧㄥˊ
+形 0 ㄒㄧㄥˊ
+型 0 ㄒㄧㄥˊ
+刑 0 ㄒㄧㄥˊ
+邢 0 ㄒㄧㄥˊ
+陘 0 ㄒㄧㄥˊ
+硎 0 ㄒㄧㄥˊ
+鉶 0 ㄒㄧㄥˊ
+餳 0 ㄒㄧㄥˊ
+侀 0 ㄒㄧㄥˊ
+烆 0 ㄒㄧㄥˊ
+洐 0 ㄒㄧㄥˊ
+胻 0 ㄒㄧㄥˊ
+鋞 0 ㄒㄧㄥˊ
+濴 0 ㄒㄧㄥˊ
+娙 0 ㄒㄧㄥˊ
+絎 0 ㄒㄧㄥˊ
+鈃 0 ㄒㄧㄥˊ
+雃 0 ㄒㄧㄥˊ
+滎 0 ㄒㄧㄥˊ
+坓 0 ㄒㄧㄥˊ
+郉 0 ㄒㄧㄥˊ
+銒 0 ㄒㄧㄥˊ
+糃 0 ㄒㄧㄥˊ
+鄉 0 ㄒㄧㄤ
+相 0 ㄒㄧㄤ
+香 0 ㄒㄧㄤ
+箱 0 ㄒㄧㄤ
+湘 0 ㄒㄧㄤ
+襄 0 ㄒㄧㄤ
+鑲 0 ㄒㄧㄤ
+廂 0 ㄒㄧㄤ
+驤 0 ㄒㄧㄤ
+緗 0 ㄒㄧㄤ
+薌 0 ㄒㄧㄤ
+瓖 0 ㄒㄧㄤ
+纕 0 ㄒㄧㄤ
+欀 0 ㄒㄧㄤ
+葙 0 ㄒㄧㄤ
+忀 0 ㄒㄧㄤ
+曩 0 ㄒㄧㄤ
+舡 0 ㄒㄧㄤ
+萫 0 ㄒㄧㄤ
+曏 0 ㄒㄧㄤ
+膷 0 ㄒㄧㄤ
+勷 0 ㄒㄧㄤ
+皀 0 ㄒㄧㄤ
+啌 0 ㄒㄧㄤ
+郷 0 ㄒㄧㄤ
+鄊 0 ㄒㄧㄤ
+鄕 0 ㄒㄧㄤ
+麘 0 ㄒㄧㄤ
+想 0 ㄒㄧㄤˇ
+響 0 ㄒㄧㄤˇ
+享 0 ㄒㄧㄤˇ
+餉 0 ㄒㄧㄤˇ
+饗 0 ㄒㄧㄤˇ
+鯗 0 ㄒㄧㄤˇ
+饟 0 ㄒㄧㄤˇ
+晑 0 ㄒㄧㄤˇ
+晌 0 ㄒㄧㄤˇ
+嚮 0 ㄒㄧㄤˇ
+崞 0 ㄒㄧㄤˇ
+亯 0 ㄒㄧㄤˇ
+响 0 ㄒㄧㄤˇ
+銄 0 ㄒㄧㄤˇ
+鮝 0 ㄒㄧㄤˇ
+鑜 0 ㄒㄧㄤˇ
+鱶 0 ㄒㄧㄤˇ
+巷 0 ㄒㄧㄤˋ
+向 0 ㄒㄧㄤˋ
+相 0 ㄒㄧㄤˋ
+像 0 ㄒㄧㄤˋ
+項 0 ㄒㄧㄤˋ
+象 0 ㄒㄧㄤˋ
+橡 0 ㄒㄧㄤˋ
+嚮 0 ㄒㄧㄤˋ
+曏 0 ㄒㄧㄤˋ
+蠁 0 ㄒㄧㄤˋ
+萫 0 ㄒㄧㄤˋ
+闀 0 ㄒㄧㄤˋ
+蟓 0 ㄒㄧㄤˋ
+襐 0 ㄒㄧㄤˋ
+鐌 0 ㄒㄧㄤˋ
+鄉 0 ㄒㄧㄤˋ
+恦 0 ㄒㄧㄤˋ
+潒 0 ㄒㄧㄤˋ
+鱌 0 ㄒㄧㄤˋ
+餉 0 ㄒㄧㄤˋ
+樣 0 ㄒㄧㄤˋ
+姠 0 ㄒㄧㄤˋ
+晑 0 ㄒㄧㄤˋ
+缿 0 ㄒㄧㄤˋ
+銗 0 ㄒㄧㄤˋ
+澒 0 ㄒㄧㄤˋ
+珦 0 ㄒㄧㄤˋ
+郷 0 ㄒㄧㄤˋ
+鄊 0 ㄒㄧㄤˋ
+鄕 0 ㄒㄧㄤˋ
+銄 0 ㄒㄧㄤˋ
+嶑 0 ㄒㄧㄤˋ
+様 0 ㄒㄧㄤˋ
+闂 0 ㄒㄧㄤˋ
+鑜 0 ㄒㄧㄤˋ
+勨 0 ㄒㄧㄤˋ
+詳 0 ㄒㄧㄤˊ
+祥 0 ㄒㄧㄤˊ
+降 0 ㄒㄧㄤˊ
+翔 0 ㄒㄧㄤˊ
+庠 0 ㄒㄧㄤˊ
+羊 0 ㄒㄧㄤˊ
+吀 0 ㄒㄧㄤˊ
+夅 0 ㄒㄧㄤˊ
+佭 0 ㄒㄧㄤˊ
+哶 0 ㄒㄧㄤˊ
+栙 0 ㄒㄧㄤˊ
+絴 0 ㄒㄧㄤˊ
+跭 0 ㄒㄧㄤˊ
+鴹 0 ㄒㄧㄤˊ
+䜶 0 ㄒㄧㄤˊ
+先 0 ㄒㄧㄢ
+仙 0 ㄒㄧㄢ
+掀 0 ㄒㄧㄢ
+鮮 0 ㄒㄧㄢ
+纖 0 ㄒㄧㄢ
+暹 0 ㄒㄧㄢ
+姍 0 ㄒㄧㄢ
+孅 0 ㄒㄧㄢ
+憸 0 ㄒㄧㄢ
+躚 0 ㄒㄧㄢ
+銛 0 ㄒㄧㄢ
+秈 0 ㄒㄧㄢ
+韱 0 ㄒㄧㄢ
+枮 0 ㄒㄧㄢ
+氙 0 ㄒㄧㄢ
+馦 0 ㄒㄧㄢ
+嬐 0 ㄒㄧㄢ
+仚 0 ㄒㄧㄢ
+屳 0 ㄒㄧㄢ
+奾 0 ㄒㄧㄢ
+杴 0 ㄒㄧㄢ
+忺 0 ㄒㄧㄢ
+澖 0 ㄒㄧㄢ
+灦 0 ㄒㄧㄢ
+祆 0 ㄒㄧㄢ
+僊 0 ㄒㄧㄢ
+嘕 0 ㄒㄧㄢ
+蓒 0 ㄒㄧㄢ
+褼 0 ㄒㄧㄢ
+廯 0 ㄒㄧㄢ
+襳 0 ㄒㄧㄢ
+珗 0 ㄒㄧㄢ
+屾 0 ㄒㄧㄢ
+佡 0 ㄒㄧㄢ
+侁 0 ㄒㄧㄢ
+胘 0 ㄒㄧㄢ
+赻 0 ㄒㄧㄢ
+筅 0 ㄒㄧㄢ
+綅 0 ㄒㄧㄢ
+詵 0 ㄒㄧㄢ
+錟 0 ㄒㄧㄢ
+駪 0 ㄒㄧㄢ
+薟 0 ㄒㄧㄢ
+攕 0 ㄒㄧㄢ
+鶱 0 ㄒㄧㄢ
+虃 0 ㄒㄧㄢ
+彡 0 ㄒㄧㄢ
+姗 0 ㄒㄧㄢ
+欦 0 ㄒㄧㄢ
+籼 0 ㄒㄧㄢ
+苮 0 ㄒㄧㄢ
+箲 0 ㄒㄧㄢ
+韯 0 ㄒㄧㄢ
+嬜 0 ㄒㄧㄢ
+纎 0 ㄒㄧㄢ
+鱻 0 ㄒㄧㄢ
+酰 0 ㄒㄧㄢ
+銽 0 ㄒㄧㄢ
+蹮 0 ㄒㄧㄢ
+險 0 ㄒㄧㄢˇ
+顯 0 ㄒㄧㄢˇ
+鮮 0 ㄒㄧㄢˇ
+癬 0 ㄒㄧㄢˇ
+蘚 0 ㄒㄧㄢˇ
+銑 0 ㄒㄧㄢˇ
+燹 0 ㄒㄧㄢˇ
+跣 0 ㄒㄧㄢˇ
+嶮 0 ㄒㄧㄢˇ
+蜆 0 ㄒㄧㄢˇ
+姺 0 ㄒㄧㄢˇ
+尟 0 ㄒㄧㄢˇ
+譣 0 ㄒㄧㄢˇ
+幰 0 ㄒㄧㄢˇ
+獫 0 ㄒㄧㄢˇ
+獮 0 ㄒㄧㄢˇ
+玁 0 ㄒㄧㄢˇ
+筅 0 ㄒㄧㄢˇ
+韅 0 ㄒㄧㄢˇ
+毨 0 ㄒㄧㄢˇ
+烍 0 ㄒㄧㄢˇ
+鍌 0 ㄒㄧㄢˇ
+搟 0 ㄒㄧㄢˇ
+鼸 0 ㄒㄧㄢˇ
+齴 0 ㄒㄧㄢˇ
+赻 0 ㄒㄧㄢˇ
+攇 0 ㄒㄧㄢˇ
+禒 0 ㄒㄧㄢˇ
+洗 0 ㄒㄧㄢˇ
+冼 0 ㄒㄧㄢˇ
+暹 0 ㄒㄧㄢˇ
+洒 0 ㄒㄧㄢˇ
+珗 0 ㄒㄧㄢˇ
+兟 0 ㄒㄧㄢˇ
+鋧 0 ㄒㄧㄢˇ
+廯 0 ㄒㄧㄢˇ
+灦 0 ㄒㄧㄢˇ
+㧥 0 ㄒㄧㄢˇ
+㭠 0 ㄒㄧㄢˇ
+尠 0 ㄒㄧㄢˇ
+箲 0 ㄒㄧㄢˇ
+礆 0 ㄒㄧㄢˇ
+顕 0 ㄒㄧㄢˇ
+鱻 0 ㄒㄧㄢˇ
+㬎 0 ㄒㄧㄢˇ
+䥪 0 ㄒㄧㄢˇ
+縣 0 ㄒㄧㄢˋ
+現 0 ㄒㄧㄢˋ
+線 0 ㄒㄧㄢˋ
+限 0 ㄒㄧㄢˋ
+憲 0 ㄒㄧㄢˋ
+獻 0 ㄒㄧㄢˋ
+羨 0 ㄒㄧㄢˋ
+陷 0 ㄒㄧㄢˋ
+腺 0 ㄒㄧㄢˋ
+餡 0 ㄒㄧㄢˋ
+莧 0 ㄒㄧㄢˋ
+霰 0 ㄒㄧㄢˋ
+俔 0 ㄒㄧㄢˋ
+僩 0 ㄒㄧㄢˋ
+峴 0 ㄒㄧㄢˋ
+晛 0 ㄒㄧㄢˋ
+睍 0 ㄒㄧㄢˋ
+豏 0 ㄒㄧㄢˋ
+轞 0 ㄒㄧㄢˋ
+涀 0 ㄒㄧㄢˋ
+瀗 0 ㄒㄧㄢˋ
+粯 0 ㄒㄧㄢˋ
+娊 0 ㄒㄧㄢˋ
+撊 0 ㄒㄧㄢˋ
+錎 0 ㄒㄧㄢˋ
+姭 0 ㄒㄧㄢˋ
+先 0 ㄒㄧㄢˋ
+見 0 ㄒㄧㄢˋ
+賢 0 ㄒㄧㄢˋ
+埳 0 ㄒㄧㄢˋ
+淊 0 ㄒㄧㄢˋ
+硍 0 ㄒㄧㄢˋ
+羡 0 ㄒㄧㄢˋ
+萏 0 ㄒㄧㄢˋ
+窞 0 ㄒㄧㄢˋ
+蜭 0 ㄒㄧㄢˋ
+幰 0 ㄒㄧㄢˋ
+攇 0 ㄒㄧㄢˋ
+甗 0 ㄒㄧㄢˋ
+巘 0 ㄒㄧㄢˋ
+瓛 0 ㄒㄧㄢˋ
+讞 0 ㄒㄧㄢˋ
+咞 0 ㄒㄧㄢˋ
+哯 0 ㄒㄧㄢˋ
+垷 0 ㄒㄧㄢˋ
+悓 0 ㄒㄧㄢˋ
+軐 0 ㄒㄧㄢˋ
+唺 0 ㄒㄧㄢˋ
+絤 0 ㄒㄧㄢˋ
+塪 0 ㄒㄧㄢˋ
+献 0 ㄒㄧㄢˋ
+蛿 0 ㄒㄧㄢˋ
+䧟 0 ㄒㄧㄢˋ
+僴 0 ㄒㄧㄢˋ
+綫 0 ㄒㄧㄢˋ
+膁 0 ㄒㄧㄢˋ
+誢 0 ㄒㄧㄢˋ
+橌 0 ㄒㄧㄢˋ
+懢 0 ㄒㄧㄢˋ
+麲 0 ㄒㄧㄢˋ
+臔 0 ㄒㄧㄢˋ
+藖 0 ㄒㄧㄢˋ
+贒 0 ㄒㄧㄢˋ
+臽 0 ㄒㄧㄢˋ
+䱤 0 ㄒㄧㄢˋ
+櫶 0 ㄒㄧㄢˋ
+賢 0 ㄒㄧㄢˊ
+閒 0 ㄒㄧㄢˊ
+嫌 0 ㄒㄧㄢˊ
+咸 0 ㄒㄧㄢˊ
+鹹 0 ㄒㄧㄢˊ
+弦 0 ㄒㄧㄢˊ
+銜 0 ㄒㄧㄢˊ
+絃 0 ㄒㄧㄢˊ
+嫻 0 ㄒㄧㄢˊ
+嫺 0 ㄒㄧㄢˊ
+涎 0 ㄒㄧㄢˊ
+啣 0 ㄒㄧㄢˊ
+舷 0 ㄒㄧㄢˊ
+閑 0 ㄒㄧㄢˊ
+癇 0 ㄒㄧㄢˊ
+諴 0 ㄒㄧㄢˊ
+蚿 0 ㄒㄧㄢˊ
+憪 0 ㄒㄧㄢˊ
+鷴 0 ㄒㄧㄢˊ
+娹 0 ㄒㄧㄢˊ
+葴 0 ㄒㄧㄢˊ
+胘 0 ㄒㄧㄢˊ
+蛝 0 ㄒㄧㄢˊ
+羬 0 ㄒㄧㄢˊ
+燅 0 ㄒㄧㄢˊ
+礥 0 ㄒㄧㄢˊ
+鷳 0 ㄒㄧㄢˊ
+唌 0 ㄒㄧㄢˊ
+玄 0 ㄒㄧㄢˊ
+炫 0 ㄒㄧㄢˊ
+眩 0 ㄒㄧㄢˊ
+鉉 0 ㄒㄧㄢˊ
+僩 0 ㄒㄧㄢˊ
+箴 0 ㄒㄧㄢˊ
+伭 0 ㄒㄧㄢˊ
+妶 0 ㄒㄧㄢˊ
+泫 0 ㄒㄧㄢˊ
+昡 0 ㄒㄧㄢˊ
+玹 0 ㄒㄧㄢˊ
+惤 0 ㄒㄧㄢˊ
+袨 0 ㄒㄧㄢˊ
+嵅 0 ㄒㄧㄢˊ
+嗛 0 ㄒㄧㄢˊ
+瑊 0 ㄒㄧㄢˊ
+撊 0 ㄒㄧㄢˊ
+澖 0 ㄒㄧㄢˊ
+誸 0 ㄒㄧㄢˊ
+襉 0 ㄒㄧㄢˊ
+顑 0 ㄒㄧㄢˊ
+鰔 0 ㄒㄧㄢˊ
+麙 0 ㄒㄧㄢˊ
+痃 0 ㄒㄧㄢˊ
+婱 0 ㄒㄧㄢˊ
+衘 0 ㄒㄧㄢˊ
+詽 0 ㄒㄧㄢˊ
+僴 0 ㄒㄧㄢˊ
+甉 0 ㄒㄧㄢˊ
+㯗 0 ㄒㄧㄢˊ
+㵪 0 ㄒㄧㄢˊ
+輱 0 ㄒㄧㄢˊ
+醎 0 ㄒㄧㄢˊ
+癎 0 ㄒㄧㄢˊ
+簚 0 ㄒㄧㄢˊ
+藖 0 ㄒㄧㄢˊ
+贒 0 ㄒㄧㄢˊ
+鷼 0 ㄒㄧㄢˊ
+臤 0 ㄒㄧㄢˊ
+訮 0 ㄒㄧㄢˊ
+稴 0 ㄒㄧㄢˊ
+喜 0 ㄒㄧˇ
+洗 0 ㄒㄧˇ
+徙 0 ㄒㄧˇ
+璽 0 ㄒㄧˇ
+鰓 0 ㄒㄧˇ
+屣 0 ㄒㄧˇ
+蓰 0 ㄒㄧˇ
+囍 0 ㄒㄧˇ
+枲 0 ㄒㄧˇ
+蟢 0 ㄒㄧˇ
+縰 0 ㄒㄧˇ
+蹝 0 ㄒㄧˇ
+匚 0 ㄒㄧˇ
+狶 0 ㄒㄧˇ
+諰 0 ㄒㄧˇ
+簁 0 ㄒㄧˇ
+葸 0 ㄒㄧˇ
+漇 0 ㄒㄧˇ
+敼 0 ㄒㄧˇ
+僖 0 ㄒㄧˇ
+嬉 0 ㄒㄧˇ
+禧 0 ㄒㄧˇ
+譆 0 ㄒㄧˇ
+洒 0 ㄒㄧˇ
+歖 0 ㄒㄧˇ
+礂 0 ㄒㄧˇ
+褷 0 ㄒㄧˇ
+鍌 0 ㄒㄧˇ
+饎 0 ㄒㄧˇ
+匸 0 ㄒㄧˇ
+杫 0 ㄒㄧˇ
+愢 0 ㄒㄧˇ
+葈 0 ㄒㄧˇ
+憘 0 ㄒㄧˇ
+憙 0 ㄒㄧˇ
+壐 0 ㄒㄧˇ
+簛 0 ㄒㄧˇ
+糦 0 ㄒㄧˇ
+籭 0 ㄒㄧˇ
+躧 0 ㄒㄧˇ
+玺 0 ㄒㄧˇ
+鉩 0 ㄒㄧˇ
+細 0 ㄒㄧˋ
+戲 0 ㄒㄧˋ
+係 0 ㄒㄧˋ
+系 0 ㄒㄧˋ
+繫 0 ㄒㄧˋ
+夕 0 ㄒㄧˋ
+汐 0 ㄒㄧˋ
+隙 0 ㄒㄧˋ
+歙 0 ㄒㄧˋ
+鬩 0 ㄒㄧˋ
+翕 0 ㄒㄧˋ
+穸 0 ㄒㄧˋ
+咥 0 ㄒㄧˋ
+衋 0 ㄒㄧˋ
+屭 0 ㄒㄧˋ
+綌 0 ㄒㄧˋ
+肸 0 ㄒㄧˋ
+鄎 0 ㄒㄧˋ
+醯 0 ㄒㄧˋ
+餼 0 ㄒㄧˋ
+滊 0 ㄒㄧˋ
+褉 0 ㄒㄧˋ
+潟 0 ㄒㄧˋ
+舄 0 ㄒㄧˋ
+矽 0 ㄒㄧˋ
+鑴 0 ㄒㄧˋ
+卌 0 ㄒㄧˋ
+怬 0 ㄒㄧˋ
+釸 0 ㄒㄧˋ
+鎎 0 ㄒㄧˋ
+釳 0 ㄒㄧˋ
+赩 0 ㄒㄧˋ
+郤 0 ㄒㄧˋ
+熂 0 ㄒㄧˋ
+覤 0 ㄒㄧˋ
+蕮 0 ㄒㄧˋ
+黖 0 ㄒㄧˋ
+謑 0 ㄒㄧˋ
+虩 0 ㄒㄧˋ
+忥 0 ㄒㄧˋ
+恄 0 ㄒㄧˋ
+摡 0 ㄒㄧˋ
+禊 0 ㄒㄧˋ
+齂 0 ㄒㄧˋ
+愾 0 ㄒㄧˋ
+扢 0 ㄒㄧˋ
+妎 0 ㄒㄧˋ
+呬 0 ㄒㄧˋ
+盻 0 ㄒㄧˋ
+籺 0 ㄒㄧˋ
+傒 0 ㄒㄧˋ
+塈 0 ㄒㄧˋ
+慀 0 ㄒㄧˋ
+緆 0 ㄒㄧˋ
+獡 0 ㄒㄧˋ
+罊 0 ㄒㄧˋ
+霫 0 ㄒㄧˋ
+闟 0 ㄒㄧˋ
+蘻 0 ㄒㄧˋ
+戏 0 ㄒㄧˋ
+欪 0 ㄒㄧˋ
+郄 0 ㄒㄧˋ
+屓 0 ㄒㄧˋ
+赥 0 ㄒㄧˋ
+椞 0 ㄒㄧˋ
+翖 0 ㄒㄧˋ
+舃 0 ㄒㄧˋ
+嘅 0 ㄒㄧˋ
+墍 0 ㄒㄧˋ
+犔 0 ㄒㄧˋ
+蒵 0 ㄒㄧˋ
+隟 0 ㄒㄧˋ
+戯 0 ㄒㄧˋ
+戱 0 ㄒㄧˋ
+䦧 0 ㄒㄧˋ
+嚊 0 ㄒㄧˋ
+韢 0 ㄒㄧˋ
+霼 0 ㄒㄧˋ
+肹 0 ㄒㄧˋ
+稧 0 ㄒㄧˋ
+縘 0 ㄒㄧˋ
+磶 0 ㄒㄧˋ
+䮎 0 ㄒㄧˋ
+嚱 0 ㄒㄧˋ
+潝 0 ㄒㄧˋ
+習 0 ㄒㄧˊ
+昔 0 ㄒㄧˊ
+息 0 ㄒㄧˊ
+席 0 ㄒㄧˊ
+惜 0 ㄒㄧˊ
+媳 0 ㄒㄧˊ
+錫 0 ㄒㄧˊ
+襲 0 ㄒㄧˊ
+熄 0 ㄒㄧˊ
+蓆 0 ㄒㄧˊ
+褶 0 ㄒㄧˊ
+檄 0 ㄒㄧˊ
+覡 0 ㄒㄧˊ
+濕 0 ㄒㄧˊ
+隰 0 ㄒㄧˊ
+裼 0 ㄒㄧˊ
+嶍 0 ㄒㄧˊ
+螅 0 ㄒㄧˊ
+鰼 0 ㄒㄧˊ
+腊 0 ㄒㄧˊ
+槢 0 ㄒㄧˊ
+焟 0 ㄒㄧˊ
+謵 0 ㄒㄧˊ
+鎴 0 ㄒㄧˊ
+欯 0 ㄒㄧˊ
+棤 0 ㄒㄧˊ
+蒠 0 ㄒㄧˊ
+瘜 0 ㄒㄧˊ
+獥 0 ㄒㄧˊ
+薂 0 ㄒㄧˊ
+霫 0 ㄒㄧˊ
+飁 0 ㄒㄧˊ
+騽 0 ㄒㄧˊ
+蝷 0 ㄒㄧˊ
+夕 0 ㄒㄧˊ
+汐 0 ㄒㄧˊ
+矽 0 ㄒㄧˊ
+悉 0 ㄒㄧˊ
+憩 0 ㄒㄧˊ
+郋 0 ㄒㄧˊ
+唶 0 ㄒㄧˊ
+庴 0 ㄒㄧˊ
+釸 0 ㄒㄧˊ
+僁 0 ㄒㄧˊ
+慴 0 ㄒㄧˊ
+緆 0 ㄒㄧˊ
+踖 0 ㄒㄧˊ
+褯 0 ㄒㄧˊ
+雭 0 ㄒㄧˊ
+漝 0 ㄒㄧˊ
+蒵 0 ㄒㄧˊ
+趘 0 ㄒㄧˊ
+憇 0 ㄒㄧˊ
+齚 0 ㄒㄧˊ
+怸 0 ㄒㄧˊ
+椺 0 ㄒㄧˊ
+趞 0 ㄒㄧˊ
+瞎 0 ㄒㄧㄚ
+蝦 0 ㄒㄧㄚ
+岈 0 ㄒㄧㄚ
+颬 0 ㄒㄧㄚ
+鍜 0 ㄒㄧㄚ
+呀 0 ㄒㄧㄚ
+嗐 0 ㄒㄧㄚ
+磍 0 ㄒㄧㄚ
+谺 0 ㄒㄧㄚ
+㗇 0 ㄒㄧㄚ
+閕 0 ㄒㄧㄚ
+鰕 0 ㄒㄧㄚ
+豄 0 ㄒㄧㄚ
+傄 0 ㄒㄧㄚ
+敮 0 ㄒㄧㄚ
+閜 0 ㄒㄧㄚˇ
+下 0 ㄒㄧㄚˋ
+夏 0 ㄒㄧㄚˋ
+嚇 0 ㄒㄧㄚˋ
+廈 0 ㄒㄧㄚˋ
+暇 0 ㄒㄧㄚˋ
+煆 0 ㄒㄧㄚˋ
+罅 0 ㄒㄧㄚˋ
+芐 0 ㄒㄧㄚˋ
+欱 0 ㄒㄧㄚˋ
+鏬 0 ㄒㄧㄚˋ
+鶷 0 ㄒㄧㄚˋ
+磍 0 ㄒㄧㄚˋ
+諕 0 ㄒㄧㄚˋ
+縖 0 ㄒㄧㄚˋ
+丅 0 ㄒㄧㄚˋ
+吓 0 ㄒㄧㄚˋ
+㙈 0 ㄒㄧㄚˋ
+厦 0 ㄒㄧㄚˋ
+睱 0 ㄒㄧㄚˋ
+疜 0 ㄒㄧㄚˋ
+㰰 0 ㄒㄧㄚˋ
+懗 0 ㄒㄧㄚˋ
+夓 0 ㄒㄧㄚˋ
+暇 0 ㄒㄧㄚˊ
+峽 0 ㄒㄧㄚˊ
+轄 0 ㄒㄧㄚˊ
+霞 0 ㄒㄧㄚˊ
+俠 0 ㄒㄧㄚˊ
+狹 0 ㄒㄧㄚˊ
+挾 0 ㄒㄧㄚˊ
+匣 0 ㄒㄧㄚˊ
+呷 0 ㄒㄧㄚˊ
+遐 0 ㄒㄧㄚˊ
+硤 0 ㄒㄧㄚˊ
+狎 0 ㄒㄧㄚˊ
+瑕 0 ㄒㄧㄚˊ
+斜 0 ㄒㄧㄚˊ
+黠 0 ㄒㄧㄚˊ
+柙 0 ㄒㄧㄚˊ
+祫 0 ㄒㄧㄚˊ
+洽 0 ㄒㄧㄚˊ
+舝 0 ㄒㄧㄚˊ
+碬 0 ㄒㄧㄚˊ
+騢 0 ㄒㄧㄚˊ
+搳 0 ㄒㄧㄚˊ
+烚 0 ㄒㄧㄚˊ
+冾 0 ㄒㄧㄚˊ
+笚 0 ㄒㄧㄚˊ
+縖 0 ㄒㄧㄚˊ
+珨 0 ㄒㄧㄚˊ
+陜 0 ㄒㄧㄚˊ
+磍 0 ㄒㄧㄚˊ
+赮 0 ㄒㄧㄚˊ
+魻 0 ㄒㄧㄚˊ
+蕸 0 ㄒㄧㄚˊ
+邪 0 ㄒㄧㄚˊ
+恰 0 ㄒㄧㄚˊ
+陝 0 ㄒㄧㄚˊ
+愜 0 ㄒㄧㄚˊ
+脥 0 ㄒㄧㄚˊ
+鍜 0 ㄒㄧㄚˊ
+侠 0 ㄒㄧㄚˊ
+叚 0 ㄒㄧㄚˊ
+峡 0 ㄒㄧㄚˊ
+挟 0 ㄒㄧㄚˊ
+炠 0 ㄒㄧㄚˊ
+狭 0 ㄒㄧㄚˊ
+衺 0 ㄒㄧㄚˊ
+捾 0 ㄒㄧㄚˊ
+㭱 0 ㄒㄧㄚˊ
+陿 0 ㄒㄧㄚˊ
+睱 0 ㄒㄧㄚˊ
+縀 0 ㄒㄧㄚˊ
+鎋 0 ㄒㄧㄚˊ
+䕸 0 ㄒㄧㄚˊ
+陕 0 ㄒㄧㄚˊ
+翈 0 ㄒㄧㄚˊ
+筪 0 ㄒㄧㄚˊ
+消 0 ㄒㄧㄠ
+銷 0 ㄒㄧㄠ
+蕭 0 ㄒㄧㄠ
+瀟 0 ㄒㄧㄠ
+宵 0 ㄒㄧㄠ
+逍 0 ㄒㄧㄠ
+囂 0 ㄒㄧㄠ
+簫 0 ㄒㄧㄠ
+削 0 ㄒㄧㄠ
+硝 0 ㄒㄧㄠ
+霄 0 ㄒㄧㄠ
+哮 0 ㄒㄧㄠ
+驍 0 ㄒㄧㄠ
+梟 0 ㄒㄧㄠ
+蠨 0 ㄒㄧㄠ
+枵 0 ㄒㄧㄠ
+魈 0 ㄒㄧㄠ
+鴞 0 ㄒㄧㄠ
+嘵 0 ㄒㄧㄠ
+綃 0 ㄒㄧㄠ
+嘐 0 ㄒㄧㄠ
+歊 0 ㄒㄧㄠ
+潚 0 ㄒㄧㄠ
+烋 0 ㄒㄧㄠ
+獢 0 ㄒㄧㄠ
+虓 0 ㄒㄧㄠ
+蛸 0 ㄒㄧㄠ
+痚 0 ㄒㄧㄠ
+憢 0 ㄒㄧㄠ
+灱 0 ㄒㄧㄠ
+呺 0 ㄒㄧㄠ
+穘 0 ㄒㄧㄠ
+洨 0 ㄒㄧㄠ
+涍 0 ㄒㄧㄠ
+痟 0 ㄒㄧㄠ
+萷 0 ㄒㄧㄠ
+踃 0 ㄒㄧㄠ
+膮 0 ㄒㄧㄠ
+藃 0 ㄒㄧㄠ
+櫹 0 ㄒㄧㄠ
+髇 0 ㄒㄧㄠ
+毊 0 ㄒㄧㄠ
+虈 0 ㄒㄧㄠ
+庨 0 ㄒㄧㄠ
+啋 0 ㄒㄧㄠ
+窙 0 ㄒㄧㄠ
+顤 0 ㄒㄧㄠ
+謼 0 ㄒㄧㄠ
+肖 0 ㄒㄧㄠ
+屑 0 ㄒㄧㄠ
+猇 0 ㄒㄧㄠ
+揱 0 ㄒㄧㄠ
+翛 0 ㄒㄧㄠ
+榍 0 ㄒㄧㄠ
+鄡 0 ㄒㄧㄠ
+箾 0 ㄒㄧㄠ
+橚 0 ㄒㄧㄠ
+熽 0 ㄒㄧㄠ
+蟂 0 ㄒㄧㄠ
+髐 0 ㄒㄧㄠ
+灲 0 ㄒㄧㄠ
+侾 0 ㄒㄧㄠ
+奞 0 ㄒㄧㄠ
+婋 0 ㄒㄧㄠ
+焇 0 ㄒㄧㄠ
+硣 0 ㄒㄧㄠ
+嘋 0 ㄒㄧㄠ
+鄥 0 ㄒㄧㄠ
+撨 0 ㄒㄧㄠ
+䲷 0 ㄒㄧㄠ
+簘 0 ㄒㄧㄠ
+鴵 0 ㄒㄧㄠ
+蟰 0 ㄒㄧㄠ
+嚻 0 ㄒㄧㄠ
+宯 0 ㄒㄧㄠ
+彇 0 ㄒㄧㄠ
+㩋 0 ㄒㄧㄠ
+小 0 ㄒㄧㄠˇ
+曉 0 ㄒㄧㄠˇ
+筱 0 ㄒㄧㄠˇ
+篠 0 ㄒㄧㄠˇ
+謏 0 ㄒㄧㄠˇ
+暁 0 ㄒㄧㄠˇ
+皢 0 ㄒㄧㄠˇ
+校 0 ㄒㄧㄠˋ
+笑 0 ㄒㄧㄠˋ
+孝 0 ㄒㄧㄠˋ
+效 0 ㄒㄧㄠˋ
+酵 0 ㄒㄧㄠˋ
+嘯 0 ㄒㄧㄠˋ
+肖 0 ㄒㄧㄠˋ
+傚 0 ㄒㄧㄠˋ
+恔 0 ㄒㄧㄠˋ
+熽 0 ㄒㄧㄠˋ
+踍 0 ㄒㄧㄠˋ
+哮 0 ㄒㄧㄠˋ
+挍 0 ㄒㄧㄠˋ
+庨 0 ㄒㄧㄠˋ
+涍 0 ㄒㄧㄠˋ
+痚 0 ㄒㄧㄠˋ
+窙 0 ㄒㄧㄠˋ
+効 0 ㄒㄧㄠˋ
+咲 0 ㄒㄧㄠˋ
+俲 0 ㄒㄧㄠˋ
+㗛 0 ㄒㄧㄠˋ
+嘨 0 ㄒㄧㄠˋ
+撨 0 ㄒㄧㄠˋ
+歗 0 ㄒㄧㄠˋ
+关 0 ㄒㄧㄠˋ
+娎 0 ㄒㄧㄠˋ
+藠 0 ㄒㄧㄠˋ
+洨 0 ㄒㄧㄠˊ
+笅 0 ㄒㄧㄠˊ
+郩 0 ㄒㄧㄠˊ
+爻 0 ㄒㄧㄠˊ
+肴 0 ㄒㄧㄠˊ
+餚 0 ㄒㄧㄠˊ
+斈 0 ㄒㄧㄠˊ
+胶 0 ㄒㄧㄠˊ
+誵 0 ㄒㄧㄠˊ
+斅 0 ㄒㄧㄠˊ
+心 0 ㄒㄧㄣ
+新 0 ㄒㄧㄣ
+辛 0 ㄒㄧㄣ
+薪 0 ㄒㄧㄣ
+欣 0 ㄒㄧㄣ
+鋅 0 ㄒㄧㄣ
+馨 0 ㄒㄧㄣ
+鑫 0 ㄒㄧㄣ
+莘 0 ㄒㄧㄣ
+炘 0 ㄒㄧㄣ
+歆 0 ㄒㄧㄣ
+芯 0 ㄒㄧㄣ
+昕 0 ㄒㄧㄣ
+訢 0 ㄒㄧㄣ
+鈊 0 ㄒㄧㄣ
+盺 0 ㄒㄧㄣ
+兟 0 ㄒㄧㄣ
+廞 0 ㄒㄧㄣ
+忻 0 ㄒㄧㄣ
+妡 0 ㄒㄧㄣ
+噷 0 ㄒㄧㄣ
+掀 0 ㄒㄧㄣ
+伈 0 ㄒㄧㄣ
+伒 0 ㄒㄧㄣ
+忥 0 ㄒㄧㄣ
+杺 0 ㄒㄧㄣ
+斪 0 ㄒㄧㄣ
+惢 0 ㄒㄧㄣ
+焮 0 ㄒㄧㄣ
+騂 0 ㄒㄧㄣ
+邤 0 ㄒㄧㄣ
+俽 0 ㄒㄧㄣ
+惞 0 ㄒㄧㄣ
+忄 0 ㄒㄧㄣ
+㣺 0 ㄒㄧㄣ
+伈 0 ㄒㄧㄣˇ
+信 0 ㄒㄧㄣˋ
+釁 0 ㄒㄧㄣˋ
+芯 0 ㄒㄧㄣˋ
+焮 0 ㄒㄧㄣˋ
+舋 0 ㄒㄧㄣˋ
+膷 0 ㄒㄧㄣˋ
+囟 0 ㄒㄧㄣˋ
+妡 0 ㄒㄧㄣˋ
+煡 0 ㄒㄧㄣˋ
+阠 0 ㄒㄧㄣˋ
+蕈 0 ㄒㄧㄣˋ
+庍 0 ㄒㄧㄣˋ
+杋 0 ㄒㄧㄣˋ
+訄 0 ㄒㄧㄣˋ
+衅 0 ㄒㄧㄣˋ
+訫 0 ㄒㄧㄣˋ
+馸 0 ㄒㄧㄣˋ
+顖 0 ㄒㄧㄣˋ
+卂 0 ㄒㄧㄣˋ
+尋 0 ㄒㄧㄣˊ
+鄩 0 ㄒㄧㄣˊ
+杺 0 ㄒㄧㄣˊ
+攳 0 ㄒㄧㄣˊ
+襑 0 ㄒㄧㄣˊ
+鬵 0 ㄒㄧㄣˊ
+ㄊ 0 ㄊ
+偷 0 ㄊㄡ
+媮 0 ㄊㄡ
+偸 0 ㄊㄡ
+婾 0 ㄊㄡ
+鍮 0 ㄊㄡ
+黈 0 ㄊㄡˇ
+妵 0 ㄊㄡˇ
+紏 0 ㄊㄡˇ
+鈄 0 ㄊㄡˇ
+蘣 0 ㄊㄡˇ
+敨 0 ㄊㄡˇ
+斢 0 ㄊㄡˇ
+飳 0 ㄊㄡˇ
+透 0 ㄊㄡˋ
+斢 0 ㄊㄡˋ
+頭 0 ㄊㄡˊ
+投 0 ㄊㄡˊ
+牏 0 ㄊㄡˊ
+酘 0 ㄊㄡˊ
+骰 0 ㄊㄡˊ
+緰 0 ㄊㄡˊ
+头 0 ㄊㄡˊ
+坄 0 ㄊㄡˊ
+頭 0 ㄊㄡ˙
+头 0 ㄊㄡ˙
+疼 0 ㄊㄥˊ
+騰 0 ㄊㄥˊ
+藤 0 ㄊㄥˊ
+籐 0 ㄊㄥˊ
+謄 0 ㄊㄥˊ
+滕 0 ㄊㄥˊ
+螣 0 ㄊㄥˊ
+縢 0 ㄊㄥˊ
+邆 0 ㄊㄥˊ
+漛 0 ㄊㄥˊ
+駦 0 ㄊㄥˊ
+儯 0 ㄊㄥˊ
+籘 0 ㄊㄥˊ
+驣 0 ㄊㄥˊ
+幐 0 ㄊㄥˊ
+鰧 0 ㄊㄥˊ
+湯 0 ㄊㄤ
+鏜 0 ㄊㄤ
+鼞 0 ㄊㄤ
+蹚 0 ㄊㄤ
+蝪 0 ㄊㄤ
+薚 0 ㄊㄤ
+鐋 0 ㄊㄤ
+䠀 0 ㄊㄤ
+鞺 0 ㄊㄤ
+倘 0 ㄊㄤˇ
+躺 0 ㄊㄤˇ
+儻 0 ㄊㄤˇ
+淌 0 ㄊㄤˇ
+帑 0 ㄊㄤˇ
+惝 0 ㄊㄤˇ
+钂 0 ㄊㄤˇ
+鎲 0 ㄊㄤˇ
+戃 0 ㄊㄤˇ
+曭 0 ㄊㄤˇ
+爣 0 ㄊㄤˇ
+矘 0 ㄊㄤˇ
+徜 0 ㄊㄤˇ
+伖 0 ㄊㄤˇ
+偒 0 ㄊㄤˇ
+耥 0 ㄊㄤˇ
+趟 0 ㄊㄤˋ
+燙 0 ㄊㄤˋ
+摥 0 ㄊㄤˋ
+盪 0 ㄊㄤˋ
+䠀 0 ㄊㄤˋ
+堂 0 ㄊㄤˊ
+糖 0 ㄊㄤˊ
+唐 0 ㄊㄤˊ
+塘 0 ㄊㄤˊ
+膛 0 ㄊㄤˊ
+螳 0 ㄊㄤˊ
+棠 0 ㄊㄤˊ
+醣 0 ㄊㄤˊ
+搪 0 ㄊㄤˊ
+鏜 0 ㄊㄤˊ
+溏 0 ㄊㄤˊ
+螗 0 ㄊㄤˊ
+瑭 0 ㄊㄤˊ
+赯 0 ㄊㄤˊ
+榶 0 ㄊㄤˊ
+樘 0 ㄊㄤˊ
+漟 0 ㄊㄤˊ
+煻 0 ㄊㄤˊ
+鎕 0 ㄊㄤˊ
+闛 0 ㄊㄤˊ
+橖 0 ㄊㄤˊ
+蓎 0 ㄊㄤˊ
+磄 0 ㄊㄤˊ
+踼 0 ㄊㄤˊ
+薚 0 ㄊㄤˊ
+鶶 0 ㄊㄤˊ
+瞠 0 ㄊㄤˊ
+嵣 0 ㄊㄤˊ
+餳 0 ㄊㄤˊ
+坣 0 ㄊㄤˊ
+傏 0 ㄊㄤˊ
+啺 0 ㄊㄤˊ
+㭻 0 ㄊㄤˊ
+㑽 0 ㄊㄤˊ
+㜍 0 ㄊㄤˊ
+鄌 0 ㄊㄤˊ
+憆 0 ㄊㄤˊ
+禟 0 ㄊㄤˊ
+糃 0 ㄊㄤˊ
+糛 0 ㄊㄤˊ
+餹 0 ㄊㄤˊ
+饄 0 ㄊㄤˊ
+摚 0 ㄊㄤˊ
+膅 0 ㄊㄤˊ
+隚 0 ㄊㄤˊ
+篖 0 ㄊㄤˊ
+貪 0 ㄊㄢ
+灘 0 ㄊㄢ
+攤 0 ㄊㄢ
+癱 0 ㄊㄢ
+坍 0 ㄊㄢ
+怹 0 ㄊㄢ
+抩 0 ㄊㄢ
+舑 0 ㄊㄢ
+緂 0 ㄊㄢ
+探 0 ㄊㄢ
+嘽 0 ㄊㄢ
+橝 0 ㄊㄢ
+滩 0 ㄊㄢ
+噒 0 ㄊㄢ
+擹 0 ㄊㄢ
+坦 0 ㄊㄢˇ
+毯 0 ㄊㄢˇ
+袒 0 ㄊㄢˇ
+襢 0 ㄊㄢˇ
+忐 0 ㄊㄢˇ
+禫 0 ㄊㄢˇ
+菼 0 ㄊㄢˇ
+嗿 0 ㄊㄢˇ
+膻 0 ㄊㄢˇ
+憳 0 ㄊㄢˇ
+醓 0 ㄊㄢˇ
+裧 0 ㄊㄢˇ
+怛 0 ㄊㄢˇ
+氈 0 ㄊㄢˇ
+緂 0 ㄊㄢˇ
+儃 0 ㄊㄢˇ
+黮 0 ㄊㄢˇ
+氍 0 ㄊㄢˇ
+毡 0 ㄊㄢˇ
+憻 0 ㄊㄢˇ
+氊 0 ㄊㄢˇ
+璮 0 ㄊㄢˇ
+䏙 0 ㄊㄢˇ
+探 0 ㄊㄢˋ
+嘆 0 ㄊㄢˋ
+歎 0 ㄊㄢˋ
+碳 0 ㄊㄢˋ
+炭 0 ㄊㄢˋ
+賧 0 ㄊㄢˋ
+埮 0 ㄊㄢˋ
+湠 0 ㄊㄢˋ
+羰 0 ㄊㄢˋ
+撢 0 ㄊㄢˋ
+舕 0 ㄊㄢˋ
+憛 0 ㄊㄢˋ
+䑙 0 ㄊㄢˋ
+舚 0 ㄊㄢˋ
+䗊 0 ㄊㄢˋ
+談 0 ㄊㄢˊ
+彈 0 ㄊㄢˊ
+痰 0 ㄊㄢˊ
+潭 0 ㄊㄢˊ
+譚 0 ㄊㄢˊ
+檀 0 ㄊㄢˊ
+壇 0 ㄊㄢˊ
+曇 0 ㄊㄢˊ
+罈 0 ㄊㄢˊ
+覃 0 ㄊㄢˊ
+郯 0 ㄊㄢˊ
+錟 0 ㄊㄢˊ
+餤 0 ㄊㄢˊ
+鐔 0 ㄊㄢˊ
+倓 0 ㄊㄢˊ
+醰 0 ㄊㄢˊ
+貚 0 ㄊㄢˊ
+婒 0 ㄊㄢˊ
+憛 0 ㄊㄢˊ
+藫 0 ㄊㄢˊ
+橝 0 ㄊㄢˊ
+鷤 0 ㄊㄢˊ
+澹 0 ㄊㄢˊ
+惔 0 ㄊㄢˊ
+嘾 0 ㄊㄢˊ
+曋 0 ㄊㄢˊ
+燂 0 ㄊㄢˊ
+蕁 0 ㄊㄢˊ
+瞫 0 ㄊㄢˊ
+邅 0 ㄊㄢˊ
+皽 0 ㄊㄢˊ
+蟫 0 ㄊㄢˊ
+饘 0 ㄊㄢˊ
+鷣 0 ㄊㄢˊ
+弹 0 ㄊㄢˊ
+聅 0 ㄊㄢˊ
+弾 0 ㄊㄢˊ
+墵 0 ㄊㄢˊ
+墰 0 ㄊㄢˊ
+醈 0 ㄊㄢˊ
+壜 0 ㄊㄢˊ
+罎 0 ㄊㄢˊ
+它 0 ㄊㄚ
+他 0 ㄊㄚ
+她 0 ㄊㄚ
+牠 0 ㄊㄚ
+塌 0 ㄊㄚ
+褟 0 ㄊㄚ
+祂 0 ㄊㄚ
+禢 0 ㄊㄚ
+灺 0 ㄊㄚ
+趿 0 ㄊㄚ
+搨 0 ㄊㄚ
+鉈 0 ㄊㄚ
+靸 0 ㄊㄚ
+禤 0 ㄊㄚ
+炨 0 ㄊㄚ
+炧 0 ㄊㄚ
+溻 0 ㄊㄚ
+鉇 0 ㄊㄚ
+佗 0 ㄊㄚ
+塔 0 ㄊㄚˇ
+榙 0 ㄊㄚˇ
+鎝 0 ㄊㄚˇ
+獺 0 ㄊㄚˇ
+嗒 0 ㄊㄚˇ
+溚 0 ㄊㄚˇ
+墖 0 ㄊㄚˇ
+㗳 0 ㄊㄚˇ
+踏 0 ㄊㄚˋ
+榻 0 ㄊㄚˋ
+蹋 0 ㄊㄚˋ
+塌 0 ㄊㄚˋ
+獺 0 ㄊㄚˋ
+搨 0 ㄊㄚˋ
+遢 0 ㄊㄚˋ
+嚃 0 ㄊㄚˋ
+躂 0 ㄊㄚˋ
+沓 0 ㄊㄚˋ
+嗒 0 ㄊㄚˋ
+撻 0 ㄊㄚˋ
+遝 0 ㄊㄚˋ
+闥 0 ㄊㄚˋ
+鎉 0 ㄊㄚˋ
+闒 0 ㄊㄚˋ
+錔 0 ㄊㄚˋ
+鞜 0 ㄊㄚˋ
+鞳 0 ㄊㄚˋ
+鰨 0 ㄊㄚˋ
+羍 0 ㄊㄚˋ
+涾 0 ㄊㄚˋ
+傝 0 ㄊㄚˋ
+毾 0 ㄊㄚˋ
+誻 0 ㄊㄚˋ
+鑉 0 ㄊㄚˋ
+漯 0 ㄊㄚˋ
+迖 0 ㄊㄚˋ
+濌 0 ㄊㄚˋ
+龘 0 ㄊㄚˋ
+拓 0 ㄊㄚˋ
+達 0 ㄊㄚˋ
+呇 0 ㄊㄚˋ
+褟 0 ㄊㄚˋ
+闟 0 ㄊㄚˋ
+达 0 ㄊㄚˋ
+迏 0 ㄊㄚˋ
+狧 0 ㄊㄚˋ
+崉 0 ㄊㄚˋ
+㳫 0 ㄊㄚˋ
+㭼 0 ㄊㄚˋ
+㒓 0 ㄊㄚˋ
+澾 0 ㄊㄚˋ
+橽 0 ㄊㄚˋ
+鮙 0 ㄊㄚˋ
+爡 0 ㄊㄚˋ
+躢 0 ㄊㄚˋ
+眔 0 ㄊㄚˋ
+𠴲 0 ㄊㄚˋ
+㛥 0 ㄊㄚˋ
+䂿 0 ㄊㄚˋ
+㿹 0 ㄊㄚˋ
+蹹 0 ㄊㄚˋ
+譶 0 ㄊㄚˋ
+龖 0 ㄊㄚˋ
+𪘁 0 ㄊㄚˋ
+胎 0 ㄊㄞ
+苔 0 ㄊㄞ
+台 0 ㄊㄞ
+囼 0 ㄊㄞ
+孡 0 ㄊㄞ
+𧉟 0 ㄊㄞ
+太 0 ㄊㄞˋ
+態 0 ㄊㄞˋ
+泰 0 ㄊㄞˋ
+汰 0 ㄊㄞˋ
+鈦 0 ㄊㄞˋ
+燤 0 ㄊㄞˋ
+溙 0 ㄊㄞˋ
+呔 0 ㄊㄞˋ
+肽 0 ㄊㄞˋ
+酞 0 ㄊㄞˋ
+大 0 ㄊㄞˋ
+忕 0 ㄊㄞˋ
+釱 0 ㄊㄞˋ
+亣 0 ㄊㄞˋ
+忲 0 ㄊㄞˋ
+鉪 0 ㄊㄞˋ
+曃 0 ㄊㄞˋ
+冭 0 ㄊㄞˋ
+夳 0 ㄊㄞˋ
+舦 0 ㄊㄞˋ
+台 0 ㄊㄞˊ
+臺 0 ㄊㄞˊ
+抬 0 ㄊㄞˊ
+颱 0 ㄊㄞˊ
+苔 0 ㄊㄞˊ
+邰 0 ㄊㄞˊ
+跆 0 ㄊㄞˊ
+檯 0 ㄊㄞˊ
+薹 0 ㄊㄞˊ
+炱 0 ㄊㄞˊ
+駘 0 ㄊㄞˊ
+鮐 0 ㄊㄞˊ
+儓 0 ㄊㄞˊ
+嬯 0 ㄊㄞˊ
+籉 0 ㄊㄞˊ
+旲 0 ㄊㄞˊ
+秮 0 ㄊㄞˊ
+殆 0 ㄊㄞˊ
+笞 0 ㄊㄞˊ
+鈶 0 ㄊㄞˊ
+齝 0 ㄊㄞˊ
+坮 0 ㄊㄞˊ
+枱 0 ㄊㄞˊ
+炲 0 ㄊㄞˊ
+菭 0 ㄊㄞˊ
+擡 0 ㄊㄞˊ
+呞 0 ㄊㄞˊ
+䔶 0 ㄊㄞˊ
+㘆 0 ㄊㄞˊ
+禿 0 ㄊㄨ
+凸 0 ㄊㄨ
+鵚 0 ㄊㄨ
+涋 0 ㄊㄨ
+捸 0 ㄊㄨ
+嶀 0 ㄊㄨ
+廜 0 ㄊㄨ
+秃 0 ㄊㄨ
+庩 0 ㄊㄨ
+痜 0 ㄊㄨ
+通 0 ㄊㄨㄥ
+恫 0 ㄊㄨㄥ
+蓪 0 ㄊㄨㄥ
+痌 0 ㄊㄨㄥ
+炵 0 ㄊㄨㄥ
+熥 0 ㄊㄨㄥ
+狪 0 ㄊㄨㄥ
+囲 0 ㄊㄨㄥ
+樋 0 ㄊㄨㄥ
+統 0 ㄊㄨㄥˇ
+筒 0 ㄊㄨㄥˇ
+桶 0 ㄊㄨㄥˇ
+捅 0 ㄊㄨㄥˇ
+垌 0 ㄊㄨㄥˇ
+筩 0 ㄊㄨㄥˇ
+姛 0 ㄊㄨㄥˇ
+痛 0 ㄊㄨㄥˋ
+衕 0 ㄊㄨㄥˋ
+慟 0 ㄊㄨㄥˋ
+蘳 0 ㄊㄨㄥˋ
+疼 0 ㄊㄨㄥˋ
+憅 0 ㄊㄨㄥˋ
+同 0 ㄊㄨㄥˊ
+童 0 ㄊㄨㄥˊ
+銅 0 ㄊㄨㄥˊ
+桐 0 ㄊㄨㄥˊ
+潼 0 ㄊㄨㄥˊ
+瞳 0 ㄊㄨㄥˊ
+砼 0 ㄊㄨㄥˊ
+彤 0 ㄊㄨㄥˊ
+佟 0 ㄊㄨㄥˊ
+僮 0 ㄊㄨㄥˊ
+峒 0 ㄊㄨㄥˊ
+侗 0 ㄊㄨㄥˊ
+艟 0 ㄊㄨㄥˊ
+曈 0 ㄊㄨㄥˊ
+膧 0 ㄊㄨㄥˊ
+穜 0 ㄊㄨㄥˊ
+罿 0 ㄊㄨㄥˊ
+硐 0 ㄊㄨㄥˊ
+橦 0 ㄊㄨㄥˊ
+氃 0 ㄊㄨㄥˊ
+獞 0 ㄊㄨㄥˊ
+茼 0 ㄊㄨㄥˊ
+烔 0 ㄊㄨㄥˊ
+浵 0 ㄊㄨㄥˊ
+鉖 0 ㄊㄨㄥˊ
+餇 0 ㄊㄨㄥˊ
+仝 0 ㄊㄨㄥˊ
+酮 0 ㄊㄨㄥˊ
+迵 0 ㄊㄨㄥˊ
+粡 0 ㄊㄨㄥˊ
+絧 0 ㄊㄨㄥˊ
+朣 0 ㄊㄨㄥˊ
+犝 0 ㄊㄨㄥˊ
+蕫 0 ㄊㄨㄥˊ
+鮦 0 ㄊㄨㄥˊ
+鼨 0 ㄊㄨㄥˊ
+爞 0 ㄊㄨㄥˊ
+哃 0 ㄊㄨㄥˊ
+詷 0 ㄊㄨㄥˊ
+洞 0 ㄊㄨㄥˊ
+胴 0 ㄊㄨㄥˊ
+筒 0 ㄊㄨㄥˊ
+炵 0 ㄊㄨㄥˊ
+戙 0 ㄊㄨㄥˊ
+筩 0 ㄊㄨㄥˊ
+赨 0 ㄊㄨㄥˊ
+庝 0 ㄊㄨㄥˊ
+峝 0 ㄊㄨㄥˊ
+晍 0 ㄊㄨㄥˊ
+蚒 0 ㄊㄨㄥˊ
+秱 0 ㄊㄨㄥˊ
+勭 0 ㄊㄨㄥˊ
+燑 0 ㄊㄨㄥˊ
+眮 0 ㄊㄨㄥˊ
+硧 0 ㄊㄨㄥˊ
+鉵 0 ㄊㄨㄥˊ
+㼿 0 ㄊㄨㄥˊ
+湍 0 ㄊㄨㄢ
+煓 0 ㄊㄨㄢ
+貒 0 ㄊㄨㄢ
+遄 0 ㄊㄨㄢ
+猯 0 ㄊㄨㄢ
+䝎 0 ㄊㄨㄢ
+畽 0 ㄊㄨㄢˇ
+疃 0 ㄊㄨㄢˇ
+彖 0 ㄊㄨㄢˋ
+褖 0 ㄊㄨㄢˋ
+湪 0 ㄊㄨㄢˋ
+團 0 ㄊㄨㄢˊ
+摶 0 ㄊㄨㄢˊ
+糰 0 ㄊㄨㄢˊ
+漙 0 ㄊㄨㄢˊ
+剸 0 ㄊㄨㄢˊ
+慱 0 ㄊㄨㄢˊ
+鏄 0 ㄊㄨㄢˊ
+鷻 0 ㄊㄨㄢˊ
+槫 0 ㄊㄨㄢˊ
+湍 0 ㄊㄨㄢˊ
+剬 0 ㄊㄨㄢˊ
+篿 0 ㄊㄨㄢˊ
+鷒 0 ㄊㄨㄢˊ
+団 0 ㄊㄨㄢˊ
+檲 0 ㄊㄨㄢˊ
+土 0 ㄊㄨˇ
+吐 0 ㄊㄨˇ
+釷 0 ㄊㄨˇ
+芏 0 ㄊㄨˇ
+唋 0 ㄊㄨˇ
+圡 0 ㄊㄨˇ
+兔 0 ㄊㄨˋ
+吐 0 ㄊㄨˋ
+菟 0 ㄊㄨˋ
+鵵 0 ㄊㄨˋ
+堍 0 ㄊㄨˋ
+唾 0 ㄊㄨˋ
+兎 0 ㄊㄨˋ
+迌 0 ㄊㄨˋ
+圖 0 ㄊㄨˊ
+途 0 ㄊㄨˊ
+突 0 ㄊㄨˊ
+徒 0 ㄊㄨˊ
+塗 0 ㄊㄨˊ
+屠 0 ㄊㄨˊ
+凸 0 ㄊㄨˊ
+荼 0 ㄊㄨˊ
+涂 0 ㄊㄨˊ
+余 0 ㄊㄨˊ
+酴 0 ㄊㄨˊ
+瘏 0 ㄊㄨˊ
+稌 0 ㄊㄨˊ
+腯 0 ㄊㄨˊ
+峹 0 ㄊㄨˊ
+葖 0 ㄊㄨˊ
+捈 0 ㄊㄨˊ
+怢 0 ㄊㄨˊ
+鍎 0 ㄊㄨˊ
+跿 0 ㄊㄨˊ
+梌 0 ㄊㄨˊ
+湥 0 ㄊㄨˊ
+筡 0 ㄊㄨˊ
+蒤 0 ㄊㄨˊ
+瑹 0 ㄊㄨˊ
+駼 0 ㄊㄨˊ
+鶟 0 ㄊㄨˊ
+鷋 0 ㄊㄨˊ
+鼵 0 ㄊㄨˊ
+嵞 0 ㄊㄨˊ
+廜 0 ㄊㄨˊ
+潳 0 ㄊㄨˊ
+鷵 0 ㄊㄨˊ
+陡 0 ㄊㄨˊ
+徙 0 ㄊㄨˊ
+菟 0 ㄊㄨˊ
+唋 0 ㄊㄨˊ
+悇 0 ㄊㄨˊ
+蓗 0 ㄊㄨˊ
+鵌 0 ㄊㄨˊ
+図 0 ㄊㄨˊ
+阧 0 ㄊㄨˊ
+凃 0 ㄊㄨˊ
+鈯 0 ㄊㄨˊ
+圗 0 ㄊㄨˊ
+摕 0 ㄊㄨˊ
+宊 0 ㄊㄨˊ
+㻌 0 ㄊㄨˊ
+堗 0 ㄊㄨˊ
+揬 0 ㄊㄨˊ
+䣝 0 ㄊㄨˊ
+䠈 0 ㄊㄨˊ
+馟 0 ㄊㄨˊ
+脫 0 ㄊㄨㄛ
+拖 0 ㄊㄨㄛ
+托 0 ㄊㄨㄛ
+託 0 ㄊㄨㄛ
+堶 0 ㄊㄨㄛ
+侂 0 ㄊㄨㄛ
+挩 0 ㄊㄨㄛ
+扥 0 ㄊㄨㄛ
+矺 0 ㄊㄨㄛ
+沰 0 ㄊㄨㄛ
+馲 0 ㄊㄨㄛ
+侻 0 ㄊㄨㄛ
+詑 0 ㄊㄨㄛ
+魠 0 ㄊㄨㄛ
+他 0 ㄊㄨㄛ
+它 0 ㄊㄨㄛ
+佗 0 ㄊㄨㄛ
+牠 0 ㄊㄨㄛ
+扡 0 ㄊㄨㄛ
+灺 0 ㄊㄨㄛ
+虴 0 ㄊㄨㄛ
+袘 0 ㄊㄨㄛ
+飥 0 ㄊㄨㄛ
+汑 0 ㄊㄨㄛ
+杔 0 ㄊㄨㄛ
+拕 0 ㄊㄨㄛ
+炨 0 ㄊㄨㄛ
+炧 0 ㄊㄨㄛ
+捝 0 ㄊㄨㄛ
+脱 0 ㄊㄨㄛ
+涶 0 ㄊㄨㄛ
+咃 0 ㄊㄨㄛ
+驝 0 ㄊㄨㄛ
+妥 0 ㄊㄨㄛˇ
+橢 0 ㄊㄨㄛˇ
+撱 0 ㄊㄨㄛˇ
+庹 0 ㄊㄨㄛˇ
+嫷 0 ㄊㄨㄛˇ
+脫 0 ㄊㄨㄛˇ
+脱 0 ㄊㄨㄛˇ
+媠 0 ㄊㄨㄛˇ
+楕 0 ㄊㄨㄛˇ
+鋖 0 ㄊㄨㄛˇ
+鵎 0 ㄊㄨㄛˇ
+㨊 0 ㄊㄨㄛˇ
+鰖 0 ㄊㄨㄛˇ
+拓 0 ㄊㄨㄛˋ
+唾 0 ㄊㄨㄛˋ
+柝 0 ㄊㄨㄛˋ
+籜 0 ㄊㄨㄛˋ
+蘀 0 ㄊㄨㄛˋ
+跅 0 ㄊㄨㄛˋ
+毻 0 ㄊㄨㄛˋ
+毤 0 ㄊㄨㄛˋ
+魄 0 ㄊㄨㄛˋ
+沰 0 ㄊㄨㄛˋ
+柘 0 ㄊㄨㄛˋ
+莌 0 ㄊㄨㄛˋ
+袥 0 ㄊㄨㄛˋ
+駝 0 ㄊㄨㄛˊ
+陀 0 ㄊㄨㄛˊ
+馱 0 ㄊㄨㄛˊ
+沱 0 ㄊㄨㄛˊ
+佗 0 ㄊㄨㄛˊ
+鴕 0 ㄊㄨㄛˊ
+跎 0 ㄊㄨㄛˊ
+橐 0 ㄊㄨㄛˊ
+坨 0 ㄊㄨㄛˊ
+紽 0 ㄊㄨㄛˊ
+酡 0 ㄊㄨㄛˊ
+砣 0 ㄊㄨㄛˊ
+阤 0 ㄊㄨㄛˊ
+鮀 0 ㄊㄨㄛˊ
+岮 0 ㄊㄨㄛˊ
+碢 0 ㄊㄨㄛˊ
+鞁 0 ㄊㄨㄛˊ
+驒 0 ㄊㄨㄛˊ
+鼉 0 ㄊㄨㄛˊ
+鉈 0 ㄊㄨㄛˊ
+袉 0 ㄊㄨㄛˊ
+飥 0 ㄊㄨㄛˊ
+柁 0 ㄊㄨㄛˊ
+堶 0 ㄊㄨㄛˊ
+詑 0 ㄊㄨㄛˊ
+沲 0 ㄊㄨㄛˊ
+陁 0 ㄊㄨㄛˊ
+砤 0 ㄊㄨㄛˊ
+槖 0 ㄊㄨㄛˊ
+䭾 0 ㄊㄨㄛˊ
+駄 0 ㄊㄨㄛˊ
+駞 0 ㄊㄨㄛˊ
+踻 0 ㄊㄨㄛˊ
+鼧 0 ㄊㄨㄛˊ
+彵 0 ㄊㄨㄛˊ
+鉇 0 ㄊㄨㄛˊ
+推 0 ㄊㄨㄟ
+蓷 0 ㄊㄨㄟ
+藬 0 ㄊㄨㄟ
+太 0 ㄊㄨㄟ
+蘈 0 ㄊㄨㄟ
+㷟 0 ㄊㄨㄟ
+煺 0 ㄊㄨㄟ
+腿 0 ㄊㄨㄟˇ
+俀 0 ㄊㄨㄟˇ
+僓 0 ㄊㄨㄟˇ
+聉 0 ㄊㄨㄟˇ
+脮 0 ㄊㄨㄟˇ
+蹆 0 ㄊㄨㄟˇ
+骽 0 ㄊㄨㄟˇ
+退 0 ㄊㄨㄟˋ
+蛻 0 ㄊㄨㄟˋ
+駾 0 ㄊㄨㄟˋ
+螁 0 ㄊㄨㄟˋ
+褪 0 ㄊㄨㄟˋ
+裉 0 ㄊㄨㄟˋ
+裞 0 ㄊㄨㄟˋ
+蜕 0 ㄊㄨㄟˋ
+褃 0 ㄊㄨㄟˋ
+娧 0 ㄊㄨㄟˋ
+頹 0 ㄊㄨㄟˊ
+穨 0 ㄊㄨㄟˊ
+隤 0 ㄊㄨㄟˊ
+魋 0 ㄊㄨㄟˊ
+橔 0 ㄊㄨㄟˊ
+僓 0 ㄊㄨㄟˊ
+蹪 0 ㄊㄨㄟˊ
+弚 0 ㄊㄨㄟˊ
+墤 0 ㄊㄨㄟˊ
+頺 0 ㄊㄨㄟˊ
+頽 0 ㄊㄨㄟˊ
+謉 0 ㄊㄨㄟˊ
+㿗 0 ㄊㄨㄟˊ
+尵 0 ㄊㄨㄟˊ
+吞 0 ㄊㄨㄣ
+暾 0 ㄊㄨㄣ
+啍 0 ㄊㄨㄣ
+涒 0 ㄊㄨㄣ
+旽 0 ㄊㄨㄣ
+昋 0 ㄊㄨㄣ
+呑 0 ㄊㄨㄣ
+噋 0 ㄊㄨㄣ
+黗 0 ㄊㄨㄣ
+朜 0 ㄊㄨㄣ
+汆 0 ㄊㄨㄣˇ
+吨 0 ㄊㄨㄣˇ
+畽 0 ㄊㄨㄣˇ
+疃 0 ㄊㄨㄣˇ
+褪 0 ㄊㄨㄣˋ
+螁 0 ㄊㄨㄣˋ
+屯 0 ㄊㄨㄣˊ
+囤 0 ㄊㄨㄣˊ
+豚 0 ㄊㄨㄣˊ
+飩 0 ㄊㄨㄣˊ
+臀 0 ㄊㄨㄣˊ
+軘 0 ㄊㄨㄣˊ
+魨 0 ㄊㄨㄣˊ
+忳 0 ㄊㄨㄣˊ
+芚 0 ㄊㄨㄣˊ
+吨 0 ㄊㄨㄣˊ
+拵 0 ㄊㄨㄣˊ
+肫 0 ㄊㄨㄣˊ
+坉 0 ㄊㄨㄣˊ
+庉 0 ㄊㄨㄣˊ
+杶 0 ㄊㄨㄣˊ
+炖 0 ㄊㄨㄣˊ
+烼 0 ㄊㄨㄣˊ
+棆 0 ㄊㄨㄣˊ
+遯 0 ㄊㄨㄣˊ
+豘 0 ㄊㄨㄣˊ
+踲 0 ㄊㄨㄣˊ
+霕 0 ㄊㄨㄣˊ
+櫄 0 ㄊㄨㄣˊ
+䐁 0 ㄊㄨㄣˊ
+臋 0 ㄊㄨㄣˊ
+特 0 ㄊㄜˋ
+慝 0 ㄊㄜˋ
+忒 0 ㄊㄜˋ
+忑 0 ㄊㄜˋ
+鋱 0 ㄊㄜˋ
+貣 0 ㄊㄜˋ
+蟘 0 ㄊㄜˋ
+貸 0 ㄊㄜˋ
+螣 0 ㄊㄜˋ
+蚮 0 ㄊㄜˋ
+脦 0 ㄊㄜˋ
+掏 0 ㄊㄠ
+濤 0 ㄊㄠ
+滔 0 ㄊㄠ
+饕 0 ㄊㄠ
+韜 0 ㄊㄠ
+弢 0 ㄊㄠ
+絛 0 ㄊㄠ
+縚 0 ㄊㄠ
+搯 0 ㄊㄠ
+慆 0 ㄊㄠ
+槄 0 ㄊㄠ
+幍 0 ㄊㄠ
+翢 0 ㄊㄠ
+嫍 0 ㄊㄠ
+蜪 0 ㄊㄠ
+叨 0 ㄊㄠ
+挑 0 ㄊㄠ
+夲 0 ㄊㄠ
+涛 0 ㄊㄠ
+瑫 0 ㄊㄠ
+飸 0 ㄊㄠ
+縧 0 ㄊㄠ
+謟 0 ㄊㄠ
+轁 0 ㄊㄠ
+䤾 0 ㄊㄠ
+饀 0 ㄊㄠ
+鞱 0 ㄊㄠ
+夵 0 ㄊㄠ
+㫞 0 ㄊㄠ
+䄻 0 ㄊㄠ
+詜 0 ㄊㄠ
+討 0 ㄊㄠˇ
+䵚 0 ㄊㄠˇ
+套 0 ㄊㄠˋ
+逃 0 ㄊㄠˊ
+桃 0 ㄊㄠˊ
+陶 0 ㄊㄠˊ
+萄 0 ㄊㄠˊ
+淘 0 ㄊㄠˊ
+濤 0 ㄊㄠˊ
+啕 0 ㄊㄠˊ
+洮 0 ㄊㄠˊ
+燾 0 ㄊㄠˊ
+檮 0 ㄊㄠˊ
+匋 0 ㄊㄠˊ
+咷 0 ㄊㄠˊ
+綯 0 ㄊㄠˊ
+鞀 0 ㄊㄠˊ
+醄 0 ㄊㄠˊ
+騊 0 ㄊㄠˊ
+錭 0 ㄊㄠˊ
+駣 0 ㄊㄠˊ
+祹 0 ㄊㄠˊ
+鋾 0 ㄊㄠˊ
+掏 0 ㄊㄠˊ
+滔 0 ㄊㄠˊ
+蜪 0 ㄊㄠˊ
+翿 0 ㄊㄠˊ
+迯 0 ㄊㄠˊ
+涛 0 ㄊㄠˊ
+裪 0 ㄊㄠˊ
+鞉 0 ㄊㄠˊ
+饀 0 ㄊㄠˊ
+鼗 0 ㄊㄠˊ
+萄 0 ㄊㄠ˙
+梯 0 ㄊㄧ
+踢 0 ㄊㄧ
+剔 0 ㄊㄧ
+焍 0 ㄊㄧ
+掦 0 ㄊㄧ
+貼 0 ㄊㄧㄝ
+帖 0 ㄊㄧㄝ
+怗 0 ㄊㄧㄝ
+鐵 0 ㄊㄧㄝˇ
+帖 0 ㄊㄧㄝˇ
+驖 0 ㄊㄧㄝˇ
+僣 0 ㄊㄧㄝˇ
+銕 0 ㄊㄧㄝˇ
+鉄 0 ㄊㄧㄝˇ
+帖 0 ㄊㄧㄝˋ
+餮 0 ㄊㄧㄝˋ
+蛈 0 ㄊㄧㄝˋ
+飻 0 ㄊㄧㄝˋ
+聽 0 ㄊㄧㄥ
+廳 0 ㄊㄧㄥ
+汀 0 ㄊㄧㄥ
+桯 0 ㄊㄧㄥ
+艼 0 ㄊㄧㄥ
+耵 0 ㄊㄧㄥ
+听 0 ㄊㄧㄥ
+朾 0 ㄊㄧㄥ
+烴 0 ㄊㄧㄥ
+綎 0 ㄊㄧㄥ
+庁 0 ㄊㄧㄥ
+鞓 0 ㄊㄧㄥ
+聴 0 ㄊㄧㄥ
+廰 0 ㄊㄧㄥ
+聼 0 ㄊㄧㄥ
+耓 0 ㄊㄧㄥ
+挺 0 ㄊㄧㄥˇ
+艇 0 ㄊㄧㄥˇ
+町 0 ㄊㄧㄥˇ
+梃 0 ㄊㄧㄥˇ
+頲 0 ㄊㄧㄥˇ
+珽 0 ㄊㄧㄥˇ
+脡 0 ㄊㄧㄥˇ
+鋌 0 ㄊㄧㄥˇ
+烶 0 ㄊㄧㄥˇ
+圢 0 ㄊㄧㄥˇ
+侹 0 ㄊㄧㄥˇ
+娗 0 ㄊㄧㄥˇ
+侱 0 ㄊㄧㄥˇ
+涏 0 ㄊㄧㄥˇ
+誔 0 ㄊㄧㄥˇ
+𡈼 0 ㄊㄧㄥˇ
+聽 0 ㄊㄧㄥˋ
+庭 0 ㄊㄧㄥˋ
+聴 0 ㄊㄧㄥˋ
+聼 0 ㄊㄧㄥˋ
+停 0 ㄊㄧㄥˊ
+庭 0 ㄊㄧㄥˊ
+廷 0 ㄊㄧㄥˊ
+亭 0 ㄊㄧㄥˊ
+蜓 0 ㄊㄧㄥˊ
+霆 0 ㄊㄧㄥˊ
+婷 0 ㄊㄧㄥˊ
+渟 0 ㄊㄧㄥˊ
+莛 0 ㄊㄧㄥˊ
+朾 0 ㄊㄧㄥˊ
+筳 0 ㄊㄧㄥˊ
+蝏 0 ㄊㄧㄥˊ
+聤 0 ㄊㄧㄥˊ
+葶 0 ㄊㄧㄥˊ
+鼮 0 ㄊㄧㄥˊ
+楟 0 ㄊㄧㄥˊ
+榳 0 ㄊㄧㄥˊ
+閮 0 ㄊㄧㄥˊ
+嵉 0 ㄊㄧㄥˊ
+綎 0 ㄊㄧㄥˊ
+邒 0 ㄊㄧㄥˊ
+㨩 0 ㄊㄧㄥˊ
+葕 0 ㄊㄧㄥˊ
+諪 0 ㄊㄧㄥˊ
+天 0 ㄊㄧㄢ
+添 0 ㄊㄧㄢ
+倎 0 ㄊㄧㄢ
+屇 0 ㄊㄧㄢ
+酟 0 ㄊㄧㄢ
+婖 0 ㄊㄧㄢ
+兲 0 ㄊㄧㄢ
+沗 0 ㄊㄧㄢ
+詽 0 ㄊㄧㄢ
+靝 0 ㄊㄧㄢ
+訮 0 ㄊㄧㄢ
+黇 0 ㄊㄧㄢ
+舔 0 ㄊㄧㄢˇ
+忝 0 ㄊㄧㄢˇ
+殄 0 ㄊㄧㄢˇ
+腆 0 ㄊㄧㄢˇ
+靦 0 ㄊㄧㄢˇ
+淟 0 ㄊㄧㄢˇ
+餂 0 ㄊㄧㄢˇ
+賟 0 ㄊㄧㄢˇ
+悿 0 ㄊㄧㄢˇ
+蚕 0 ㄊㄧㄢˇ
+晪 0 ㄊㄧㄢˇ
+痶 0 ㄊㄧㄢˇ
+恬 0 ㄊㄧㄢˇ
+倎 0 ㄊㄧㄢˇ
+琠 0 ㄊㄧㄢˇ
+跈 0 ㄊㄧㄢˇ
+銛 0 ㄊㄧㄢˇ
+錪 0 ㄊㄧㄢˇ
+㙉 0 ㄊㄧㄢˇ
+睓 0 ㄊㄧㄢˇ
+覥 0 ㄊㄧㄢˇ
+鍩 0 ㄊㄧㄢˇ
+㥏 0 ㄊㄧㄢˇ
+銽 0 ㄊㄧㄢˇ
+掭 0 ㄊㄧㄢˋ
+煔 0 ㄊㄧㄢˋ
+瑱 0 ㄊㄧㄢˋ
+蚺 0 ㄊㄧㄢˋ
+蚦 0 ㄊㄧㄢˋ
+㐁 0 ㄊㄧㄢˋ
+田 0 ㄊㄧㄢˊ
+甜 0 ㄊㄧㄢˊ
+填 0 ㄊㄧㄢˊ
+恬 0 ㄊㄧㄢˊ
+闐 0 ㄊㄧㄢˊ
+畋 0 ㄊㄧㄢˊ
+窴 0 ㄊㄧㄢˊ
+沺 0 ㄊㄧㄢˊ
+盷 0 ㄊㄧㄢˊ
+湉 0 ㄊㄧㄢˊ
+菾 0 ㄊㄧㄢˊ
+磌 0 ㄊㄧㄢˊ
+佃 0 ㄊㄧㄢˊ
+滇 0 ㄊㄧㄢˊ
+鈿 0 ㄊㄧㄢˊ
+屇 0 ㄊㄧㄢˊ
+搷 0 ㄊㄧㄢˊ
+鷏 0 ㄊㄧㄢˊ
+胋 0 ㄊㄧㄢˊ
+甛 0 ㄊㄧㄢˊ
+塡 0 ㄊㄧㄢˊ
+璳 0 ㄊㄧㄢˊ
+體 0 ㄊㄧˇ
+体 0 ㄊㄧˇ
+綈 0 ㄊㄧˇ
+挮 0 ㄊㄧˇ
+躰 0 ㄊㄧˇ
+骵 0 ㄊㄧˇ
+軆 0 ㄊㄧˇ
+替 0 ㄊㄧˋ
+惕 0 ㄊㄧˋ
+涕 0 ㄊㄧˋ
+屜 0 ㄊㄧˋ
+悌 0 ㄊㄧˋ
+剃 0 ㄊㄧˋ
+銻 0 ㄊㄧˋ
+嚏 0 ㄊㄧˋ
+倜 0 ㄊㄧˋ
+薙 0 ㄊㄧˋ
+殢 0 ㄊㄧˋ
+裼 0 ㄊㄧˋ
+揥 0 ㄊㄧˋ
+籊 0 ㄊㄧˋ
+鬄 0 ㄊㄧˋ
+悐 0 ㄊㄧˋ
+褅 0 ㄊㄧˋ
+逖 0 ㄊㄧˋ
+弟 0 ㄊㄧˋ
+娣 0 ㄊㄧˋ
+啻 0 ㄊㄧˋ
+棣 0 ㄊㄧˋ
+迖 0 ㄊㄧˋ
+俶 0 ㄊㄧˋ
+睇 0 ㄊㄧˋ
+疐 0 ㄊㄧˋ
+懥 0 ㄊㄧˋ
+擿 0 ㄊㄧˋ
+趯 0 ㄊㄧˋ
+戻 0 ㄊㄧˋ
+达 0 ㄊㄧˋ
+屉 0 ㄊㄧˋ
+迏 0 ㄊㄧˋ
+惖 0 ㄊㄧˋ
+逷 0 ㄊㄧˋ
+髢 0 ㄊㄧˋ
+歒 0 ㄊㄧˋ
+䞶 0 ㄊㄧˋ
+鬀 0 ㄊㄧˋ
+嚔 0 ㄊㄧˋ
+鐟 0 ㄊㄧˋ
+髰 0 ㄊㄧˋ
+䶑 0 ㄊㄧˋ
+題 0 ㄊㄧˊ
+提 0 ㄊㄧˊ
+啼 0 ㄊㄧˊ
+堤 0 ㄊㄧˊ
+蹄 0 ㄊㄧˊ
+醍 0 ㄊㄧˊ
+禔 0 ㄊㄧˊ
+稊 0 ㄊㄧˊ
+緹 0 ㄊㄧˊ
+荑 0 ㄊㄧˊ
+騠 0 ㄊㄧˊ
+隄 0 ㄊㄧˊ
+鶗 0 ㄊㄧˊ
+惿 0 ㄊㄧˊ
+厗 0 ㄊㄧˊ
+鍗 0 ㄊㄧˊ
+偍 0 ㄊㄧˊ
+趧 0 ㄊㄧˊ
+謕 0 ㄊㄧˊ
+鶙 0 ㄊㄧˊ
+崹 0 ㄊㄧˊ
+睼 0 ㄊㄧˊ
+蝭 0 ㄊㄧˊ
+蕛 0 ㄊㄧˊ
+鷤 0 ㄊㄧˊ
+鯷 0 ㄊㄧˊ
+鵜 0 ㄊㄧˊ
+珶 0 ㄊㄧˊ
+媞 0 ㄊㄧˊ
+蛦 0 ㄊㄧˊ
+綈 0 ㄊㄧˊ
+褆 0 ㄊㄧˊ
+鍉 0 ㄊㄧˊ
+鷈 0 ㄊㄧˊ
+鼶 0 ㄊㄧˊ
+埞 0 ㄊㄧˊ
+嗁 0 ㄊㄧˊ
+瑅 0 ㄊㄧˊ
+遆 0 ㄊㄧˊ
+碮 0 ㄊㄧˊ
+漽 0 ㄊㄧˊ
+蹏 0 ㄊㄧˊ
+禵 0 ㄊㄧˊ
+罤 0 ㄊㄧˊ
+䬫 0 ㄊㄧˊ
+䔶 0 ㄊㄧˊ
+鴺 0 ㄊㄧˊ
+鮷 0 ㄊㄧˊ
+鷉 0 ㄊㄧˊ
+挑 0 ㄊㄧㄠ
+祧 0 ㄊㄧㄠ
+恌 0 ㄊㄧㄠ
+庣 0 ㄊㄧㄠ
+鮡 0 ㄊㄧㄠ
+佻 0 ㄊㄧㄠ
+趒 0 ㄊㄧㄠ
+蓨 0 ㄊㄧㄠ
+旫 0 ㄊㄧㄠ
+聎 0 ㄊㄧㄠ
+蓚 0 ㄊㄧㄠ
+䄻 0 ㄊㄧㄠ
+挑 0 ㄊㄧㄠˇ
+窕 0 ㄊㄧㄠˇ
+誂 0 ㄊㄧㄠˇ
+宨 0 ㄊㄧㄠˇ
+嬥 0 ㄊㄧㄠˇ
+窱 0 ㄊㄧㄠˇ
+晀 0 ㄊㄧㄠˇ
+䠷 0 ㄊㄧㄠˇ
+跳 0 ㄊㄧㄠˋ
+眺 0 ㄊㄧㄠˋ
+糶 0 ㄊㄧㄠˋ
+朓 0 ㄊㄧㄠˋ
+覜 0 ㄊㄧㄠˋ
+頫 0 ㄊㄧㄠˋ
+絩 0 ㄊㄧㄠˋ
+窱 0 ㄊㄧㄠˋ
+脁 0 ㄊㄧㄠˋ
+佻 0 ㄊㄧㄠˋ
+趒 0 ㄊㄧㄠˋ
+艞 0 ㄊㄧㄠˋ
+粜 0 ㄊㄧㄠˋ
+條 0 ㄊㄧㄠˊ
+調 0 ㄊㄧㄠˊ
+笤 0 ㄊㄧㄠˊ
+佻 0 ㄊㄧㄠˊ
+迢 0 ㄊㄧㄠˊ
+蜩 0 ㄊㄧㄠˊ
+髫 0 ㄊㄧㄠˊ
+岧 0 ㄊㄧㄠˊ
+苕 0 ㄊㄧㄠˊ
+齠 0 ㄊㄧㄠˊ
+鰷 0 ㄊㄧㄠˊ
+鞗 0 ㄊㄧㄠˊ
+芀 0 ㄊㄧㄠˊ
+鎥 0 ㄊㄧㄠˊ
+趒 0 ㄊㄧㄠˊ
+祒 0 ㄊㄧㄠˊ
+窕 0 ㄊㄧㄠˊ
+絛 0 ㄊㄧㄠˊ
+滌 0 ㄊㄧㄠˊ
+篠 0 ㄊㄧㄠˊ
+朷 0 ㄊㄧㄠˊ
+条 0 ㄊㄧㄠˊ
+岹 0 ㄊㄧㄠˊ
+㨄 0 ㄊㄧㄠˊ
+萔 0 ㄊㄧㄠˊ
+樤 0 ㄊㄧㄠˊ
+鋚 0 ㄊㄧㄠˊ
+縧 0 ㄊㄧㄠˊ
+ㄌ 0 ㄌ
+摟 0 ㄌㄡ
+瞜 0 ㄌㄡ
+簍 0 ㄌㄡˇ
+摟 0 ㄌㄡˇ
+塿 0 ㄌㄡˇ
+嶁 0 ㄌㄡˇ
+嘍 0 ㄌㄡˇ
+甊 0 ㄌㄡˇ
+㪹 0 ㄌㄡˇ
+漏 0 ㄌㄡˋ
+陋 0 ㄌㄡˋ
+露 0 ㄌㄡˋ
+鏤 0 ㄌㄡˋ
+瘺 0 ㄌㄡˋ
+屚 0 ㄌㄡˋ
+樓 0 ㄌㄡˊ
+嘍 0 ㄌㄡˊ
+婁 0 ㄌㄡˊ
+螻 0 ㄌㄡˊ
+髏 0 ㄌㄡˊ
+僂 0 ㄌㄡˊ
+蔞 0 ㄌㄡˊ
+廔 0 ㄌㄡˊ
+漊 0 ㄌㄡˊ
+耬 0 ㄌㄡˊ
+熡 0 ㄌㄡˊ
+謱 0 ㄌㄡˊ
+艛 0 ㄌㄡˊ
+鞻 0 ㄌㄡˊ
+鷜 0 ㄌㄡˊ
+瞜 0 ㄌㄡˊ
+摟 0 ㄌㄡˊ
+鏤 0 ㄌㄡˊ
+寠 0 ㄌㄡˊ
+慺 0 ㄌㄡˊ
+窶 0 ㄌㄡˊ
+貗 0 ㄌㄡˊ
+剅 0 ㄌㄡˊ
+娄 0 ㄌㄡˊ
+偻 0 ㄌㄡˊ
+楼 0 ㄌㄡˊ
+遱 0 ㄌㄡˊ
+瘻 0 ㄌㄡˊ
+軁 0 ㄌㄡˊ
+蝼 0 ㄌㄡˊ
+䝏 0 ㄌㄡˊ
+嘍 0 ㄌㄡ˙
+冷 0 ㄌㄥˇ
+泠 0 ㄌㄥˇ
+愣 0 ㄌㄥˋ
+踜 0 ㄌㄥˋ
+楞 0 ㄌㄥˋ
+怔 0 ㄌㄥˋ
+佂 0 ㄌㄥˋ
+稜 0 ㄌㄥˊ
+崚 0 ㄌㄥˊ
+棱 0 ㄌㄥˊ
+薐 0 ㄌㄥˊ
+蔆 0 ㄌㄥˊ
+倰 0 ㄌㄥˊ
+楞 0 ㄌㄥˊ
+碐 0 ㄌㄥˊ
+祾 0 ㄌㄥˊ
+蓤 0 ㄌㄥˊ
+䔖 0 ㄌㄥˊ
+掕 0 ㄌㄥˊ
+塄 0 ㄌㄥˊ
+啷 0 ㄌㄤ
+朗 0 ㄌㄤˇ
+閬 0 ㄌㄤˇ
+硠 0 ㄌㄤˇ
+峎 0 ㄌㄤˇ
+悢 0 ㄌㄤˇ
+誏 0 ㄌㄤˇ
+烺 0 ㄌㄤˇ
+塱 0 ㄌㄤˇ
+崀 0 ㄌㄤˇ
+朖 0 ㄌㄤˇ
+朤 0 ㄌㄤˇ
+㫰 0 ㄌㄤˇ
+浪 0 ㄌㄤˋ
+埌 0 ㄌㄤˋ
+蒗 0 ㄌㄤˋ
+莨 0 ㄌㄤˋ
+閬 0 ㄌㄤˋ
+郎 0 ㄌㄤˊ
+狼 0 ㄌㄤˊ
+廊 0 ㄌㄤˊ
+螂 0 ㄌㄤˊ
+瑯 0 ㄌㄤˊ
+琅 0 ㄌㄤˊ
+榔 0 ㄌㄤˊ
+稂 0 ㄌㄤˊ
+莨 0 ㄌㄤˊ
+蜋 0 ㄌㄤˊ
+桹 0 ㄌㄤˊ
+筤 0 ㄌㄤˊ
+鋃 0 ㄌㄤˊ
+俍 0 ㄌㄤˊ
+崀 0 ㄌㄤˊ
+欴 0 ㄌㄤˊ
+浪 0 ㄌㄤˊ
+羹 0 ㄌㄤˊ
+硠 0 ㄌㄤˊ
+踉 0 ㄌㄤˊ
+駺 0 ㄌㄤˊ
+哴 0 ㄌㄤˊ
+郞 0 ㄌㄤˊ
+嫏 0 ㄌㄤˊ
+蓈 0 ㄌㄤˊ
+躴 0 ㄌㄤˊ
+羮 0 ㄌㄤˊ
+勆 0 ㄌㄤˊ
+艆 0 ㄌㄤˊ
+樃 0 ㄌㄤˊ
+螂 0 ㄌㄤ˙
+覽 0 ㄌㄢˇ
+懶 0 ㄌㄢˇ
+攬 0 ㄌㄢˇ
+欖 0 ㄌㄢˇ
+纜 0 ㄌㄢˇ
+壈 0 ㄌㄢˇ
+爦 0 ㄌㄢˇ
+灠 0 ㄌㄢˇ
+醂 0 ㄌㄢˇ
+嬾 0 ㄌㄢˇ
+顲 0 ㄌㄢˇ
+浨 0 ㄌㄢˇ
+卵 0 ㄌㄢˇ
+嵐 0 ㄌㄢˇ
+濫 0 ㄌㄢˇ
+㛦 0 ㄌㄢˇ
+覧 0 ㄌㄢˇ
+㩜 0 ㄌㄢˇ
+燣 0 ㄌㄢˇ
+擥 0 ㄌㄢˇ
+攋 0 ㄌㄢˇ
+孄 0 ㄌㄢˇ
+孏 0 ㄌㄢˇ
+漤 0 ㄌㄢˇ
+䌫 0 ㄌㄢˇ
+爛 0 ㄌㄢˋ
+濫 0 ㄌㄢˋ
+纜 0 ㄌㄢˋ
+爁 0 ㄌㄢˋ
+壏 0 ㄌㄢˋ
+婪 0 ㄌㄢˋ
+亂 0 ㄌㄢˋ
+瀾 0 ㄌㄢˋ
+僋 0 ㄌㄢˋ
+嚂 0 ㄌㄢˋ
+糷 0 ㄌㄢˋ
+乱 0 ㄌㄢˋ
+釠 0 ㄌㄢˋ
+瓓 0 ㄌㄢˋ
+爤 0 ㄌㄢˋ
+钄 0 ㄌㄢˋ
+㜮 0 ㄌㄢˋ
+燗 0 ㄌㄢˋ
+䌫 0 ㄌㄢˋ
+蘭 0 ㄌㄢˊ
+籃 0 ㄌㄢˊ
+藍 0 ㄌㄢˊ
+欄 0 ㄌㄢˊ
+攔 0 ㄌㄢˊ
+瀾 0 ㄌㄢˊ
+襤 0 ㄌㄢˊ
+婪 0 ㄌㄢˊ
+嵐 0 ㄌㄢˊ
+闌 0 ㄌㄢˊ
+鑭 0 ㄌㄢˊ
+襴 0 ㄌㄢˊ
+讕 0 ㄌㄢˊ
+斕 0 ㄌㄢˊ
+籣 0 ㄌㄢˊ
+欗 0 ㄌㄢˊ
+糷 0 ㄌㄢˊ
+灆 0 ㄌㄢˊ
+灡 0 ㄌㄢˊ
+譋 0 ㄌㄢˊ
+躝 0 ㄌㄢˊ
+瑯 0 ㄌㄢˊ
+欖 0 ㄌㄢˊ
+惏 0 ㄌㄢˊ
+灠 0 ㄌㄢˊ
+啉 0 ㄌㄢˊ
+葻 0 ㄌㄢˊ
+厱 0 ㄌㄢˊ
+儖 0 ㄌㄢˊ
+懢 0 ㄌㄢˊ
+璼 0 ㄌㄢˊ
+繿 0 ㄌㄢˊ
+蘫 0 ㄌㄢˊ
+囒 0 ㄌㄢˊ
+襽 0 ㄌㄢˊ
+韊 0 ㄌㄢˊ
+㜮 0 ㄌㄢˊ
+礛 0 ㄌㄢˊ
+拉 0 ㄌㄚ
+啦 0 ㄌㄚ
+喇 0 ㄌㄚ
+柆 0 ㄌㄚ
+邋 0 ㄌㄚ
+鞡 0 ㄌㄚ
+翋 0 ㄌㄚ
+菈 0 ㄌㄚ
+剌 0 ㄌㄚ
+磖 0 ㄌㄚ
+喇 0 ㄌㄚˇ
+藞 0 ㄌㄚˇ
+拉 0 ㄌㄚˇ
+臘 0 ㄌㄚˋ
+蠟 0 ㄌㄚˋ
+鑞 0 ㄌㄚˋ
+辣 0 ㄌㄚˋ
+剌 0 ㄌㄚˋ
+腊 0 ㄌㄚˋ
+落 0 ㄌㄚˋ
+鬎 0 ㄌㄚˋ
+瘌 0 ㄌㄚˋ
+揧 0 ㄌㄚˋ
+楋 0 ㄌㄚˋ
+喇 0 ㄌㄚˋ
+棘 0 ㄌㄚˋ
+菈 0 ㄌㄚˋ
+搚 0 ㄌㄚˋ
+擸 0 ㄌㄚˋ
+襋 0 ㄌㄚˋ
+辢 0 ㄌㄚˋ
+臈 0 ㄌㄚˋ
+攋 0 ㄌㄚˋ
+瓎 0 ㄌㄚˋ
+鯻 0 ㄌㄚˋ
+蝲 0 ㄌㄚˋ
+爉 0 ㄌㄚˋ
+鱲 0 ㄌㄚˋ
+剌 0 ㄌㄚˊ
+邋 0 ㄌㄚˊ
+旯 0 ㄌㄚˊ
+拉 0 ㄌㄚˊ
+喇 0 ㄌㄚˊ
+揦 0 ㄌㄚˊ
+啦 0 ㄌㄚ˙
+藍 0 ㄌㄚ˙
+瘌 0 ㄌㄚ˙
+攋 0 ㄌㄞˇ
+賴 0 ㄌㄞˋ
+癩 0 ㄌㄞˋ
+瀨 0 ㄌㄞˋ
+籟 0 ㄌㄞˋ
+睞 0 ㄌㄞˋ
+賚 0 ㄌㄞˋ
+藾 0 ㄌㄞˋ
+娕 0 ㄌㄞˋ
+來 0 ㄌㄞˋ
+徠 0 ㄌㄞˋ
+厲 0 ㄌㄞˋ
+獺 0 ㄌㄞˋ
+誺 0 ㄌㄞˋ
+厉 0 ㄌㄞˋ
+倈 0 ㄌㄞˋ
+頼 0 ㄌㄞˋ
+鵣 0 ㄌㄞˋ
+攋 0 ㄌㄞˋ
+瀬 0 ㄌㄞˋ
+櫴 0 ㄌㄞˋ
+来 0 ㄌㄞˋ
+襰 0 ㄌㄞˋ
+來 0 ㄌㄞˊ
+萊 0 ㄌㄞˊ
+徠 0 ㄌㄞˊ
+淶 0 ㄌㄞˊ
+騋 0 ㄌㄞˊ
+箂 0 ㄌㄞˊ
+崍 0 ㄌㄞˊ
+郲 0 ㄌㄞˊ
+錸 0 ㄌㄞˊ
+鯠 0 ㄌㄞˊ
+棶 0 ㄌㄞˊ
+庲 0 ㄌㄞˊ
+鶆 0 ㄌㄞˊ
+唻 0 ㄌㄞˊ
+賚 0 ㄌㄞˊ
+倈 0 ㄌㄞˊ
+婡 0 ㄌㄞˊ
+琜 0 ㄌㄞˊ
+逨 0 ㄌㄞˊ
+来 0 ㄌㄞˊ
+顂 0 ㄌㄞˊ
+麳 0 ㄌㄞˊ
+咯 0 ㄌㄛ˙
+嚕 0 ㄌㄨ
+氌 0 ㄌㄨ
+蘆 0 ㄌㄨ˙
+隴 0 ㄌㄨㄥˇ
+攏 0 ㄌㄨㄥˇ
+壟 0 ㄌㄨㄥˇ
+龍 0 ㄌㄨㄥˇ
+籠 0 ㄌㄨㄥˇ
+儱 0 ㄌㄨㄥˇ
+竜 0 ㄌㄨㄥˇ
+篭 0 ㄌㄨㄥˇ
+壠 0 ㄌㄨㄥˇ
+竉 0 ㄌㄨㄥˇ
+龓 0 ㄌㄨㄥˇ
+䡁 0 ㄌㄨㄥˇ
+㡣 0 ㄌㄨㄥˇ
+衖 0 ㄌㄨㄥˋ
+哢 0 ㄌㄨㄥˋ
+徿 0 ㄌㄨㄥˋ
+梇 0 ㄌㄨㄥˋ
+弄 0 ㄌㄨㄥˋ
+咔 0 ㄌㄨㄥˋ
+挵 0 ㄌㄨㄥˋ
+硦 0 ㄌㄨㄥˋ
+贚 0 ㄌㄨㄥˋ
+挊 0 ㄌㄨㄥˋ
+㟖 0 ㄌㄨㄥˋ
+龍 0 ㄌㄨㄥˊ
+隆 0 ㄌㄨㄥˊ
+籠 0 ㄌㄨㄥˊ
+嚨 0 ㄌㄨㄥˊ
+聾 0 ㄌㄨㄥˊ
+瓏 0 ㄌㄨㄥˊ
+朧 0 ㄌㄨㄥˊ
+窿 0 ㄌㄨㄥˊ
+瀧 0 ㄌㄨㄥˊ
+癃 0 ㄌㄨㄥˊ
+櫳 0 ㄌㄨㄥˊ
+礱 0 ㄌㄨㄥˊ
+曨 0 ㄌㄨㄥˊ
+巃 0 ㄌㄨㄥˊ
+矓 0 ㄌㄨㄥˊ
+蘢 0 ㄌㄨㄥˊ
+躘 0 ㄌㄨㄥˊ
+豅 0 ㄌㄨㄥˊ
+鏧 0 ㄌㄨㄥˊ
+鑨 0 ㄌㄨㄥˊ
+靇 0 ㄌㄨㄥˊ
+蠪 0 ㄌㄨㄥˊ
+襱 0 ㄌㄨㄥˊ
+鸗 0 ㄌㄨㄥˊ
+儱 0 ㄌㄨㄥˊ
+龒 0 ㄌㄨㄥˊ
+蠬 0 ㄌㄨㄥˊ
+壟 0 ㄌㄨㄥˊ
+攏 0 ㄌㄨㄥˊ
+屸 0 ㄌㄨㄥˊ
+竜 0 ㄌㄨㄥˊ
+湰 0 ㄌㄨㄥˊ
+滝 0 ㄌㄨㄥˊ
+嶐 0 ㄌㄨㄥˊ
+漋 0 ㄌㄨㄥˊ
+篭 0 ㄌㄨㄥˊ
+壠 0 ㄌㄨㄥˊ
+巄 0 ㄌㄨㄥˊ
+㰍 0 ㄌㄨㄥˊ
+爖 0 ㄌㄨㄥˊ
+霳 0 ㄌㄨㄥˊ
+礲 0 ㄌㄨㄥˊ
+龓 0 ㄌㄨㄥˊ
+驡 0 ㄌㄨㄥˊ
+㡣 0 ㄌㄨㄥˊ
+卵 0 ㄌㄨㄢˇ
+亂 0 ㄌㄨㄢˋ
+薍 0 ㄌㄨㄢˋ
+乱 0 ㄌㄨㄢˋ
+釠 0 ㄌㄨㄢˋ
+灓 0 ㄌㄨㄢˋ
+巒 0 ㄌㄨㄢˊ
+鑾 0 ㄌㄨㄢˊ
+鸞 0 ㄌㄨㄢˊ
+孿 0 ㄌㄨㄢˊ
+灤 0 ㄌㄨㄢˊ
+臠 0 ㄌㄨㄢˊ
+圞 0 ㄌㄨㄢˊ
+欒 0 ㄌㄨㄢˊ
+曫 0 ㄌㄨㄢˊ
+羉 0 ㄌㄨㄢˊ
+癵 0 ㄌㄨㄢˊ
+孌 0 ㄌㄨㄢˊ
+峦 0 ㄌㄨㄢˊ
+栾 0 ㄌㄨㄢˊ
+脔 0 ㄌㄨㄢˊ
+滦 0 ㄌㄨㄢˊ
+銮 0 ㄌㄨㄢˊ
+圝 0 ㄌㄨㄢˊ
+灓 0 ㄌㄨㄢˊ
+魯 0 ㄌㄨˇ
+虜 0 ㄌㄨˇ
+擄 0 ㄌㄨˇ
+滷 0 ㄌㄨˇ
+鹵 0 ㄌㄨˇ
+櫓 0 ㄌㄨˇ
+艣 0 ㄌㄨˇ
+磠 0 ㄌㄨˇ
+鐪 0 ㄌㄨˇ
+蓾 0 ㄌㄨˇ
+擼 0 ㄌㄨˇ
+塷 0 ㄌㄨˇ
+樐 0 ㄌㄨˇ
+瀂 0 ㄌㄨˇ
+艪 0 ㄌㄨˇ
+鑥 0 ㄌㄨˇ
+路 0 ㄌㄨˋ
+陸 0 ㄌㄨˋ
+錄 0 ㄌㄨˋ
+鹿 0 ㄌㄨˋ
+露 0 ㄌㄨˋ
+賂 0 ㄌㄨˋ
+祿 0 ㄌㄨˋ
+碌 0 ㄌㄨˋ
+氯 0 ㄌㄨˋ
+麓 0 ㄌㄨˋ
+鷺 0 ㄌㄨˋ
+戮 0 ㄌㄨˋ
+轆 0 ㄌㄨˋ
+蓼 0 ㄌㄨˋ
+逯 0 ㄌㄨˋ
+漉 0 ㄌㄨˋ
+輅 0 ㄌㄨˋ
+僇 0 ㄌㄨˋ
+潞 0 ㄌㄨˋ
+籙 0 ㄌㄨˋ
+璐 0 ㄌㄨˋ
+甪 0 ㄌㄨˋ
+稑 0 ㄌㄨˋ
+穋 0 ㄌㄨˋ
+簏 0 ㄌㄨˋ
+醁 0 ㄌㄨˋ
+騄 0 ㄌㄨˋ
+淥 0 ㄌㄨˋ
+琭 0 ㄌㄨˋ
+盝 0 ㄌㄨˋ
+磟 0 ㄌㄨˋ
+彔 0 ㄌㄨˋ
+菉 0 ㄌㄨˋ
+蔍 0 ㄌㄨˋ
+錴 0 ㄌㄨˋ
+垏 0 ㄌㄨˋ
+鏕 0 ㄌㄨˋ
+鯥 0 ㄌㄨˋ
+摝 0 ㄌㄨˋ
+硉 0 ㄌㄨˋ
+睩 0 ㄌㄨˋ
+廘 0 ㄌㄨˋ
+熝 0 ㄌㄨˋ
+踛 0 ㄌㄨˋ
+蕗 0 ㄌㄨˋ
+螰 0 ㄌㄨˋ
+鵱 0 ㄌㄨˋ
+淕 0 ㄌㄨˋ
+塶 0 ㄌㄨˋ
+蹗 0 ㄌㄨˋ
+六 0 ㄌㄨˋ
+角 0 ㄌㄨˋ
+綠 0 ㄌㄨˋ
+坴 0 ㄌㄨˋ
+翏 0 ㄌㄨˋ
+觻 0 ㄌㄨˋ
+侓 0 ㄌㄨˋ
+录 0 ㄌㄨˋ
+峍 0 ㄌㄨˋ
+勎 0 ㄌㄨˋ
+娽 0 ㄌㄨˋ
+渌 0 ㄌㄨˋ
+椂 0 ㄌㄨˋ
+禄 0 ㄌㄨˋ
+剹 0 ㄌㄨˋ
+勠 0 ㄌㄨˋ
+箓 0 ㄌㄨˋ
+緑 0 ㄌㄨˋ
+樚 0 ㄌㄨˋ
+膔 0 ㄌㄨˋ
+觮 0 ㄌㄨˋ
+趢 0 ㄌㄨˋ
+録 0 ㄌㄨˋ
+簵 0 ㄌㄨˋ
+鵦 0 ㄌㄨˋ
+鏴 0 ㄌㄨˋ
+騼 0 ㄌㄨˋ
+虂 0 ㄌㄨˋ
+龣 0 ㄌㄨˋ
+圥 0 ㄌㄨˋ
+䐂 0 ㄌㄨˋ
+粶 0 ㄌㄨˋ
+䟿 0 ㄌㄨˋ
+㯝 0 ㄌㄨˋ
+鴼 0 ㄌㄨˋ
+簶 0 ㄌㄨˋ
+䱚 0 ㄌㄨˋ
+盧 0 ㄌㄨˊ
+蘆 0 ㄌㄨˊ
+廬 0 ㄌㄨˊ
+臚 0 ㄌㄨˊ
+爐 0 ㄌㄨˊ
+顱 0 ㄌㄨˊ
+瀘 0 ㄌㄨˊ
+鱸 0 ㄌㄨˊ
+轤 0 ㄌㄨˊ
+壚 0 ㄌㄨˊ
+鸕 0 ㄌㄨˊ
+玈 0 ㄌㄨˊ
+罏 0 ㄌㄨˊ
+艫 0 ㄌㄨˊ
+鑪 0 ㄌㄨˊ
+籚 0 ㄌㄨˊ
+櫨 0 ㄌㄨˊ
+嚧 0 ㄌㄨˊ
+攎 0 ㄌㄨˊ
+蠦 0 ㄌㄨˊ
+纑 0 ㄌㄨˊ
+璷 0 ㄌㄨˊ
+庐 0 ㄌㄨˊ
+炉 0 ㄌㄨˊ
+芦 0 ㄌㄨˊ
+魲 0 ㄌㄨˊ
+瓐 0 ㄌㄨˊ
+矑 0 ㄌㄨˊ
+髗 0 ㄌㄨˊ
+皶 0 ㄌㄨˊ
+獹 0 ㄌㄨˊ
+黸 0 ㄌㄨˊ
+囉 0 ㄌㄨㄛ
+捋 0 ㄌㄨㄛ
+寽 0 ㄌㄨㄛ
+裸 0 ㄌㄨㄛˇ
+瘰 0 ㄌㄨㄛˇ
+臝 0 ㄌㄨㄛˇ
+蠃 0 ㄌㄨㄛˇ
+蓏 0 ㄌㄨㄛˇ
+鎯 0 ㄌㄨㄛˇ
+卵 0 ㄌㄨㄛˇ
+虜 0 ㄌㄨㄛˇ
+擄 0 ㄌㄨㄛˇ
+砢 0 ㄌㄨㄛˇ
+祼 0 ㄌㄨㄛˇ
+倮 0 ㄌㄨㄛˇ
+躶 0 ㄌㄨㄛˇ
+攞 0 ㄌㄨㄛˇ
+曪 0 ㄌㄨㄛˇ
+攭 0 ㄌㄨㄛˇ
+落 0 ㄌㄨㄛˋ
+駱 0 ㄌㄨㄛˋ
+洛 0 ㄌㄨㄛˋ
+絡 0 ㄌㄨㄛˋ
+雒 0 ㄌㄨㄛˋ
+烙 0 ㄌㄨㄛˋ
+酪 0 ㄌㄨㄛˋ
+濼 0 ㄌㄨㄛˋ
+犖 0 ㄌㄨㄛˋ
+咯 0 ㄌㄨㄛˋ
+珞 0 ㄌㄨㄛˋ
+纙 0 ㄌㄨㄛˋ
+袼 0 ㄌㄨㄛˋ
+硌 0 ㄌㄨㄛˋ
+鮥 0 ㄌㄨㄛˋ
+鵅 0 ㄌㄨㄛˋ
+峈 0 ㄌㄨㄛˋ
+貉 0 ㄌㄨㄛˋ
+賂 0 ㄌㄨㄛˋ
+輅 0 ㄌㄨㄛˋ
+躒 0 ㄌㄨㄛˋ
+鱳 0 ㄌㄨㄛˋ
+狢 0 ㄌㄨㄛˋ
+洜 0 ㄌㄨㄛˋ
+貈 0 ㄌㄨㄛˋ
+笿 0 ㄌㄨㄛˋ
+嗠 0 ㄌㄨㄛˋ
+羅 0 ㄌㄨㄛˊ
+螺 0 ㄌㄨㄛˊ
+蘿 0 ㄌㄨㄛˊ
+鑼 0 ㄌㄨㄛˊ
+邏 0 ㄌㄨㄛˊ
+籮 0 ㄌㄨㄛˊ
+騾 0 ㄌㄨㄛˊ
+囉 0 ㄌㄨㄛˊ
+玀 0 ㄌㄨㄛˊ
+儸 0 ㄌㄨㄛˊ
+覶 0 ㄌㄨㄛˊ
+摞 0 ㄌㄨㄛˊ
+欏 0 ㄌㄨㄛˊ
+蔂 0 ㄌㄨㄛˊ
+鏍 0 ㄌㄨㄛˊ
+鸁 0 ㄌㄨㄛˊ
+剆 0 ㄌㄨㄛˊ
+漯 0 ㄌㄨㄛˊ
+縲 0 ㄌㄨㄛˊ
+腡 0 ㄌㄨㄛˊ
+蠃 0 ㄌㄨㄛˊ
+逻 0 ㄌㄨㄛˊ
+頱 0 ㄌㄨㄛˊ
+覼 0 ㄌㄨㄛˊ
+攞 0 ㄌㄨㄛˊ
+驘 0 ㄌㄨㄛˊ
+纝 0 ㄌㄨㄛˊ
+饠 0 ㄌㄨㄛˊ
+掄 0 ㄌㄨㄣ
+輪 0 ㄌㄨㄣ
+稐 0 ㄌㄨㄣˇ
+耣 0 ㄌㄨㄣˇ
+論 0 ㄌㄨㄣˋ
+溣 0 ㄌㄨㄣˋ
+惀 0 ㄌㄨㄣˋ
+碖 0 ㄌㄨㄣˋ
+倫 0 ㄌㄨㄣˊ
+論 0 ㄌㄨㄣˊ
+輪 0 ㄌㄨㄣˊ
+淪 0 ㄌㄨㄣˊ
+崙 0 ㄌㄨㄣˊ
+侖 0 ㄌㄨㄣˊ
+綸 0 ㄌㄨㄣˊ
+掄 0 ㄌㄨㄣˊ
+圇 0 ㄌㄨㄣˊ
+碖 0 ㄌㄨㄣˊ
+錀 0 ㄌㄨㄣˊ
+惀 0 ㄌㄨㄣˊ
+陯 0 ㄌㄨㄣˊ
+菕 0 ㄌㄨㄣˊ
+踚 0 ㄌㄨㄣˊ
+棆 0 ㄌㄨㄣˊ
+蜦 0 ㄌㄨㄣˊ
+埨 0 ㄌㄨㄣˊ
+婨 0 ㄌㄨㄣˊ
+崘 0 ㄌㄨㄣˊ
+㷍 0 ㄌㄨㄣˊ
+腀 0 ㄌㄨㄣˊ
+鯩 0 ㄌㄨㄣˊ
+樂 0 ㄌㄜˋ
+垃 0 ㄌㄜˋ
+勒 0 ㄌㄜˋ
+肋 0 ㄌㄜˋ
+泐 0 ㄌㄜˋ
+埒 0 ㄌㄜˋ
+叻 0 ㄌㄜˋ
+仂 0 ㄌㄜˋ
+捋 0 ㄌㄜˋ
+扐 0 ㄌㄜˋ
+阞 0 ㄌㄜˋ
+砳 0 ㄌㄜˋ
+鰳 0 ㄌㄜˋ
+氻 0 ㄌㄜˋ
+哷 0 ㄌㄜˋ
+竻 0 ㄌㄜˋ
+落 0 ㄌㄜˋ
+牞 0 ㄌㄜˋ
+礐 0 ㄌㄜˋ
+礜 0 ㄌㄜˋ
+忇 0 ㄌㄜˋ
+玏 0 ㄌㄜˋ
+艻 0 ㄌㄜˋ
+寽 0 ㄌㄜˋ
+楽 0 ㄌㄜˋ
+㦡 0 ㄌㄜˋ
+埓 0 ㄌㄜˋ
+㿭 0 ㄌㄜˋ
+韷 0 ㄌㄜˋ
+簕 0 ㄌㄜˋ
+皬 0 ㄌㄜˋ
+了 0 ㄌㄜ˙
+嘞 0 ㄌㄜ˙
+撈 0 ㄌㄠ
+嘮 0 ㄌㄠ
+哰 0 ㄌㄠ
+老 0 ㄌㄠˇ
+姥 0 ㄌㄠˇ
+佬 0 ㄌㄠˇ
+鐒 0 ㄌㄠˇ
+栳 0 ㄌㄠˇ
+狫 0 ㄌㄠˇ
+轑 0 ㄌㄠˇ
+咾 0 ㄌㄠˇ
+橑 0 ㄌㄠˇ
+銠 0 ㄌㄠˇ
+恅 0 ㄌㄠˇ
+荖 0 ㄌㄠˇ
+耋 0 ㄌㄠˇ
+潦 0 ㄌㄠˇ
+㧯 0 ㄌㄠˇ
+耊 0 ㄌㄠˇ
+䇭 0 ㄌㄠˇ
+蛯 0 ㄌㄠˇ
+勞 0 ㄌㄠˋ
+絡 0 ㄌㄠˋ
+烙 0 ㄌㄠˋ
+酪 0 ㄌㄠˋ
+嫪 0 ㄌㄠˋ
+軂 0 ㄌㄠˋ
+橯 0 ㄌㄠˋ
+僗 0 ㄌㄠˋ
+落 0 ㄌㄠˋ
+樂 0 ㄌㄠˋ
+潦 0 ㄌㄠˋ
+澇 0 ㄌㄠˋ
+醪 0 ㄌㄠˋ
+労 0 ㄌㄠˋ
+劳 0 ㄌㄠˋ
+楽 0 ㄌㄠˋ
+憦 0 ㄌㄠˋ
+耮 0 ㄌㄠˋ
+髝 0 ㄌㄠˋ
+勞 0 ㄌㄠˊ
+牢 0 ㄌㄠˊ
+癆 0 ㄌㄠˊ
+澇 0 ㄌㄠˊ
+嘮 0 ㄌㄠˊ
+醪 0 ㄌㄠˊ
+浶 0 ㄌㄠˊ
+簩 0 ㄌㄠˊ
+蟧 0 ㄌㄠˊ
+嶗 0 ㄌㄠˊ
+犖 0 ㄌㄠˊ
+撈 0 ㄌㄠˊ
+僗 0 ㄌㄠˊ
+轑 0 ㄌㄠˊ
+顟 0 ㄌㄠˊ
+労 0 ㄌㄠˊ
+劳 0 ㄌㄠˊ
+窂 0 ㄌㄠˊ
+哰 0 ㄌㄠˊ
+磱 0 ㄌㄠˊ
+髝 0 ㄌㄠˊ
+憥 0 ㄌㄠˊ
+略 0 ㄌㄩㄝˋ
+掠 0 ㄌㄩㄝˋ
+鋝 0 ㄌㄩㄝˋ
+撂 0 ㄌㄩㄝˋ
+擽 0 ㄌㄩㄝˋ
+婛 0 ㄌㄩㄝˋ
+弶 0 ㄌㄩㄝˋ
+剠 0 ㄌㄩㄝˋ
+畧 0 ㄌㄩㄝˋ
+摾 0 ㄌㄩㄝˋ
+鋢 0 ㄌㄩㄝˋ
+孌 0 ㄌㄩㄢˇ
+臠 0 ㄌㄩㄢˇ
+脔 0 ㄌㄩㄢˇ
+攣 0 ㄌㄩㄢˊ
+孿 0 ㄌㄩㄢˊ
+癵 0 ㄌㄩㄢˊ
+孪 0 ㄌㄩㄢˊ
+挛 0 ㄌㄩㄢˊ
+虊 0 ㄌㄩㄢˊ
+癴 0 ㄌㄩㄢˊ
+呂 0 ㄌㄩˇ
+旅 0 ㄌㄩˇ
+履 0 ㄌㄩˇ
+侶 0 ㄌㄩˇ
+鋁 0 ㄌㄩˇ
+屢 0 ㄌㄩˇ
+縷 0 ㄌㄩˇ
+褸 0 ㄌㄩˇ
+婁 0 ㄌㄩˇ
+膂 0 ㄌㄩˇ
+漊 0 ㄌㄩˇ
+穭 0 ㄌㄩˇ
+梠 0 ㄌㄩˇ
+郘 0 ㄌㄩˇ
+挔 0 ㄌㄩˇ
+絽 0 ㄌㄩˇ
+儢 0 ㄌㄩˇ
+祣 0 ㄌㄩˇ
+莒 0 ㄌㄩˇ
+閭 0 ㄌㄩˇ
+櫚 0 ㄌㄩˇ
+鏤 0 ㄌㄩˇ
+捋 0 ㄌㄩˇ
+筥 0 ㄌㄩˇ
+寠 0 ㄌㄩˇ
+貗 0 ㄌㄩˇ
+吕 0 ㄌㄩˇ
+寽 0 ㄌㄩˇ
+侣 0 ㄌㄩˇ
+娄 0 ㄌㄩˇ
+捛 0 ㄌㄩˇ
+屡 0 ㄌㄩˇ
+鋶 0 ㄌㄩˇ
+褛 0 ㄌㄩˇ
+㜢 0 ㄌㄩˇ
+膐 0 ㄌㄩˇ
+稆 0 ㄌㄩˇ
+律 0 ㄌㄩˋ
+綠 0 ㄌㄩˋ
+率 0 ㄌㄩˋ
+慮 0 ㄌㄩˋ
+濾 0 ㄌㄩˋ
+氯 0 ㄌㄩˋ
+嵂 0 ㄌㄩˋ
+膟 0 ㄌㄩˋ
+鑢 0 ㄌㄩˋ
+菉 0 ㄌㄩˋ
+葎 0 ㄌㄩˋ
+勴 0 ㄌㄩˋ
+壘 0 ㄌㄩˋ
+珒 0 ㄌㄩˋ
+繂 0 ㄌㄩˋ
+緑 0 ㄌㄩˋ
+爈 0 ㄌㄩˋ
+箻 0 ㄌㄩˋ
+櫖 0 ㄌㄩˋ
+卛 0 ㄌㄩˋ
+驢 0 ㄌㄩˊ
+閭 0 ㄌㄩˊ
+櫚 0 ㄌㄩˊ
+藘 0 ㄌㄩˊ
+慺 0 ㄌㄩˊ
+氀 0 ㄌㄩˊ
+膢 0 ㄌㄩˊ
+婁 0 ㄌㄩˊ
+娄 0 ㄌㄩˊ
+馿 0 ㄌㄩˊ
+爈 0 ㄌㄩˊ
+曥 0 ㄌㄩˊ
+㠠 0 ㄌㄩˊ
+䕡 0 ㄌㄩˊ
+勒 0 ㄌㄟ
+累 0 ㄌㄟˇ
+壘 0 ㄌㄟˇ
+儡 0 ㄌㄟˇ
+漯 0 ㄌㄟˇ
+耒 0 ㄌㄟˇ
+磊 0 ㄌㄟˇ
+蕾 0 ㄌㄟˇ
+誄 0 ㄌㄟˇ
+藟 0 ㄌㄟˇ
+樏 0 ㄌㄟˇ
+癗 0 ㄌㄟˇ
+礌 0 ㄌㄟˇ
+絫 0 ㄌㄟˇ
+磥 0 ㄌㄟˇ
+鑸 0 ㄌㄟˇ
+瘣 0 ㄌㄟˇ
+櫑 0 ㄌㄟˇ
+櫐 0 ㄌㄟˇ
+礨 0 ㄌㄟˇ
+灅 0 ㄌㄟˇ
+讄 0 ㄌㄟˇ
+鸓 0 ㄌㄟˇ
+頛 0 ㄌㄟˇ
+礧 0 ㄌㄟˇ
+蘲 0 ㄌㄟˇ
+嫘 0 ㄌㄟˇ
+羸 0 ㄌㄟˇ
+蜼 0 ㄌㄟˇ
+儽 0 ㄌㄟˇ
+欙 0 ㄌㄟˇ
+垒 0 ㄌㄟˇ
+洡 0 ㄌㄟˇ
+腂 0 ㄌㄟˇ
+傫 0 ㄌㄟˇ
+蕌 0 ㄌㄟˇ
+蘽 0 ㄌㄟˇ
+厽 0 ㄌㄟˇ
+㵽 0 ㄌㄟˇ
+類 0 ㄌㄟˋ
+淚 0 ㄌㄟˋ
+累 0 ㄌㄟˋ
+擂 0 ㄌㄟˋ
+纇 0 ㄌㄟˋ
+酹 0 ㄌㄟˋ
+銇 0 ㄌㄟˋ
+儽 0 ㄌㄟˋ
+蘱 0 ㄌㄟˋ
+禷 0 ㄌㄟˋ
+肋 0 ㄌㄟˋ
+戾 0 ㄌㄟˋ
+唳 0 ㄌㄟˋ
+捩 0 ㄌㄟˋ
+礌 0 ㄌㄟˋ
+礧 0 ㄌㄟˋ
+泪 0 ㄌㄟˋ
+类 0 ㄌㄟˋ
+涙 0 ㄌㄟˋ
+頪 0 ㄌㄟˋ
+錑 0 ㄌㄟˋ
+䢮 0 ㄌㄟˋ
+攂 0 ㄌㄟˋ
+䉪 0 ㄌㄟˋ
+雷 0 ㄌㄟˊ
+累 0 ㄌㄟˊ
+纍 0 ㄌㄟˊ
+擂 0 ㄌㄟˊ
+嫘 0 ㄌㄟˊ
+鐳 0 ㄌㄟˊ
+羸 0 ㄌㄟˊ
+縲 0 ㄌㄟˊ
+罍 0 ㄌㄟˊ
+檑 0 ㄌㄟˊ
+畾 0 ㄌㄟˊ
+櫑 0 ㄌㄟˊ
+瓃 0 ㄌㄟˊ
+蠝 0 ㄌㄟˊ
+轠 0 ㄌㄟˊ
+壨 0 ㄌㄟˊ
+蔂 0 ㄌㄟˊ
+蘲 0 ㄌㄟˊ
+虆 0 ㄌㄟˊ
+㵢 0 ㄌㄟˊ
+靁 0 ㄌㄟˊ
+錑 0 ㄌㄟˊ
+攂 0 ㄌㄟˊ
+鑘 0 ㄌㄟˊ
+纝 0 ㄌㄟˊ
+鼺 0 ㄌㄟˊ
+哩 0 ㄌㄧ
+咧 0 ㄌㄧㄝ
+咧 0 ㄌㄧㄝˇ
+忚 0 ㄌㄧㄝˇ
+列 0 ㄌㄧㄝˋ
+烈 0 ㄌㄧㄝˋ
+劣 0 ㄌㄧㄝˋ
+裂 0 ㄌㄧㄝˋ
+獵 0 ㄌㄧㄝˋ
+捩 0 ㄌㄧㄝˋ
+冽 0 ㄌㄧㄝˋ
+鬣 0 ㄌㄧㄝˋ
+躐 0 ㄌㄧㄝˋ
+洌 0 ㄌㄧㄝˋ
+茢 0 ㄌㄧㄝˋ
+睙 0 ㄌㄧㄝˋ
+擸 0 ㄌㄧㄝˋ
+趔 0 ㄌㄧㄝˋ
+姴 0 ㄌㄧㄝˋ
+迾 0 ㄌㄧㄝˋ
+脟 0 ㄌㄧㄝˋ
+蛚 0 ㄌㄧㄝˋ
+蛶 0 ㄌㄧㄝˋ
+颲 0 ㄌㄧㄝˋ
+儠 0 ㄌㄧㄝˋ
+鮤 0 ㄌㄧㄝˋ
+鴷 0 ㄌㄧㄝˋ
+犣 0 ㄌㄧㄝˋ
+戾 0 ㄌㄧㄝˋ
+唳 0 ㄌㄧㄝˋ
+邋 0 ㄌㄧㄝˋ
+浖 0 ㄌㄧㄝˋ
+烮 0 ㄌㄧㄝˋ
+猎 0 ㄌㄧㄝˋ
+煭 0 ㄌㄧㄝˋ
+聗 0 ㄌㄧㄝˋ
+巤 0 ㄌㄧㄝˋ
+巁 0 ㄌㄧㄝˋ
+爄 0 ㄌㄧㄝˋ
+劽 0 ㄌㄧㄝˋ
+挒 0 ㄌㄧㄝˋ
+鬛 0 ㄌㄧㄝˋ
+咧 0 ㄌㄧㄝˊ
+溜 0 ㄌㄧㄡ
+蹓 0 ㄌㄧㄡ
+澑 0 ㄌㄧㄡ
+柳 0 ㄌㄧㄡˇ
+綹 0 ㄌㄧㄡˇ
+罶 0 ㄌㄧㄡˇ
+飹 0 ㄌㄧㄡˇ
+珋 0 ㄌㄧㄡˇ
+嬼 0 ㄌㄧㄡˇ
+栁 0 ㄌㄧㄡˇ
+桺 0 ㄌㄧㄡˇ
+熮 0 ㄌㄧㄡˇ
+橮 0 ㄌㄧㄡˇ
+羀 0 ㄌㄧㄡˇ
+六 0 ㄌㄧㄡˋ
+陸 0 ㄌㄧㄡˋ
+溜 0 ㄌㄧㄡˋ
+餾 0 ㄌㄧㄡˋ
+霤 0 ㄌㄧㄡˋ
+坴 0 ㄌㄧㄡˋ
+翏 0 ㄌㄧㄡˋ
+雡 0 ㄌㄧㄡˋ
+廇 0 ㄌㄧㄡˋ
+塯 0 ㄌㄧㄡˋ
+蹓 0 ㄌㄧㄡˋ
+遛 0 ㄌㄧㄡˋ
+窌 0 ㄌㄧㄡˋ
+飂 0 ㄌㄧㄡˋ
+飉 0 ㄌㄧㄡˋ
+鷚 0 ㄌㄧㄡˋ
+澑 0 ㄌㄧㄡˋ
+鬸 0 ㄌㄧㄡˋ
+䄂 0 ㄌㄧㄡˋ
+劉 0 ㄌㄧㄡˊ
+流 0 ㄌㄧㄡˊ
+留 0 ㄌㄧㄡˊ
+硫 0 ㄌㄧㄡˊ
+琉 0 ㄌㄧㄡˊ
+榴 0 ㄌㄧㄡˊ
+瀏 0 ㄌㄧㄡˊ
+瘤 0 ㄌㄧㄡˊ
+遛 0 ㄌㄧㄡˊ
+旒 0 ㄌㄧㄡˊ
+騮 0 ㄌㄧㄡˊ
+鏐 0 ㄌㄧㄡˊ
+飀 0 ㄌㄧㄡˊ
+鶹 0 ㄌㄧㄡˊ
+懰 0 ㄌㄧㄡˊ
+鎏 0 ㄌㄧㄡˊ
+鎦 0 ㄌㄧㄡˊ
+媹 0 ㄌㄧㄡˊ
+嬼 0 ㄌㄧㄡˊ
+嵧 0 ㄌㄧㄡˊ
+藰 0 ㄌㄧㄡˊ
+裗 0 ㄌㄧㄡˊ
+麍 0 ㄌㄧㄡˊ
+鷎 0 ㄌㄧㄡˊ
+蓅 0 ㄌㄧㄡˊ
+鰡 0 ㄌㄧㄡˊ
+巰 0 ㄌㄧㄡˊ
+餾 0 ㄌㄧㄡˊ
+塯 0 ㄌㄧㄡˊ
+摎 0 ㄌㄧㄡˊ
+橀 0 ㄌㄧㄡˊ
+蟉 0 ㄌㄧㄡˊ
+刘 0 ㄌㄧㄡˊ
+沠 0 ㄌㄧㄡˊ
+畄 0 ㄌㄧㄡˊ
+畱 0 ㄌㄧㄡˊ
+瑬 0 ㄌㄧㄡˊ
+瑠 0 ㄌㄧㄡˊ
+蒥 0 ㄌㄧㄡˊ
+磂 0 ㄌㄧㄡˊ
+駠 0 ㄌㄧㄡˊ
+橊 0 ㄌㄧㄡˊ
+璢 0 ㄌㄧㄡˊ
+疁 0 ㄌㄧㄡˊ
+癅 0 ㄌㄧㄡˊ
+駵 0 ㄌㄧㄡˊ
+嚠 0 ㄌㄧㄡˊ
+鐂 0 ㄌㄧㄡˊ
+驑 0 ㄌㄧㄡˊ
+旈 0 ㄌㄧㄡˊ
+綂 0 ㄌㄧㄡˊ
+𩗩 0 ㄌㄧㄡˊ
+䶉 0 ㄌㄧㄡˊ
+溜 0 ㄌㄧㄡ˙
+榴 0 ㄌㄧㄡ˙
+橊 0 ㄌㄧㄡ˙
+拎 0 ㄌㄧㄥ
+昤 0 ㄌㄧㄥ
+領 0 ㄌㄧㄥˇ
+嶺 0 ㄌㄧㄥˇ
+彾 0 ㄌㄧㄥˇ
+阾 0 ㄌㄧㄥˇ
+袊 0 ㄌㄧㄥˇ
+𦊓 0 ㄌㄧㄥˇ
+令 0 ㄌㄧㄥˋ
+另 0 ㄌㄧㄥˋ
+炩 0 ㄌㄧㄥˋ
+旌 0 ㄌㄧㄥˋ
+櫺 0 ㄌㄧㄥˋ
+旍 0 ㄌㄧㄥˋ
+零 0 ㄌㄧㄥˊ
+玲 0 ㄌㄧㄥˊ
+靈 0 ㄌㄧㄥˊ
+鈴 0 ㄌㄧㄥˊ
+齡 0 ㄌㄧㄥˊ
+陵 0 ㄌㄧㄥˊ
+凌 0 ㄌㄧㄥˊ
+菱 0 ㄌㄧㄥˊ
+聆 0 ㄌㄧㄥˊ
+羚 0 ㄌㄧㄥˊ
+苓 0 ㄌㄧㄥˊ
+伶 0 ㄌㄧㄥˊ
+綾 0 ㄌㄧㄥˊ
+淩 0 ㄌㄧㄥˊ
+翎 0 ㄌㄧㄥˊ
+鴒 0 ㄌㄧㄥˊ
+囹 0 ㄌㄧㄥˊ
+蛉 0 ㄌㄧㄥˊ
+瓴 0 ㄌㄧㄥˊ
+泠 0 ㄌㄧㄥˊ
+舲 0 ㄌㄧㄥˊ
+酃 0 ㄌㄧㄥˊ
+軨 0 ㄌㄧㄥˊ
+錂 0 ㄌㄧㄥˊ
+櫺 0 ㄌㄧㄥˊ
+柃 0 ㄌㄧㄥˊ
+欞 0 ㄌㄧㄥˊ
+睖 0 ㄌㄧㄥˊ
+砱 0 ㄌㄧㄥˊ
+詅 0 ㄌㄧㄥˊ
+輘 0 ㄌㄧㄥˊ
+霝 0 ㄌㄧㄥˊ
+鯪 0 ㄌㄧㄥˊ
+醽 0 ㄌㄧㄥˊ
+岭 0 ㄌㄧㄥˊ
+昤 0 ㄌㄧㄥˊ
+澪 0 ㄌㄧㄥˊ
+呬 0 ㄌㄧㄥˊ
+坽 0 ㄌㄧㄥˊ
+夌 0 ㄌㄧㄥˊ
+姈 0 ㄌㄧㄥˊ
+狑 0 ㄌㄧㄥˊ
+皊 0 ㄌㄧㄥˊ
+呤 0 ㄌㄧㄥˊ
+琌 0 ㄌㄧㄥˊ
+笭 0 ㄌㄧㄥˊ
+裬 0 ㄌㄧㄥˊ
+蘦 0 ㄌㄧㄥˊ
+怜 0 ㄌㄧㄥˊ
+婈 0 ㄌㄧㄥˊ
+駖 0 ㄌㄧㄥˊ
+蕶 0 ㄌㄧㄥˊ
+爧 0 ㄌㄧㄥˊ
+堎 0 ㄌㄧㄥˊ
+令 0 ㄌㄧㄥˊ
+稷 0 ㄌㄧㄥˊ
+蔆 0 ㄌㄧㄥˊ
+磷 0 ㄌㄧㄥˊ
+仱 0 ㄌㄧㄥˊ
+彾 0 ㄌㄧㄥˊ
+耹 0 ㄌㄧㄥˊ
+灵 0 ㄌㄧㄥˊ
+岺 0 ㄌㄧㄥˊ
+朎 0 ㄌㄧㄥˊ
+秢 0 ㄌㄧㄥˊ
+竛 0 ㄌㄧㄥˊ
+紷 0 ㄌㄧㄥˊ
+跉 0 ㄌㄧㄥˊ
+祾 0 ㄌㄧㄥˊ
+蓤 0 ㄌㄧㄥˊ
+䔖 0 ㄌㄧㄥˊ
+霊 0 ㄌㄧㄥˊ
+霗 0 ㄌㄧㄥˊ
+燯 0 ㄌㄧㄥˊ
+霛 0 ㄌㄧㄥˊ
+䕘 0 ㄌㄧㄥˊ
+麢 0 ㄌㄧㄥˊ
+龗 0 ㄌㄧㄥˊ
+刢 0 ㄌㄧㄥˊ
+掕 0 ㄌㄧㄥˊ
+衑 0 ㄌㄧㄥˊ
+閝 0 ㄌㄧㄥˊ
+魿 0 ㄌㄧㄥˊ
+孁 0 ㄌㄧㄥˊ
+䴇 0 ㄌㄧㄥˊ
+䖅 0 ㄌㄧㄥˊ
+鹷 0 ㄌㄧㄥˊ
+〇 0 ㄌㄧㄥˊ
+兩 0 ㄌㄧㄤˇ
+倆 0 ㄌㄧㄤˇ
+魎 0 ㄌㄧㄤˇ
+緉 0 ㄌㄧㄤˇ
+裲 0 ㄌㄧㄤˇ
+啢 0 ㄌㄧㄤˇ
+両 0 ㄌㄧㄤˇ
+两 0 ㄌㄧㄤˇ
+蜽 0 ㄌㄧㄤˇ
+魉 0 ㄌㄧㄤˇ
+俩 0 ㄌㄧㄤˇ
+掚 0 ㄌㄧㄤˇ
+脼 0 ㄌㄧㄤˇ
+量 0 ㄌㄧㄤˋ
+亮 0 ㄌㄧㄤˋ
+諒 0 ㄌㄧㄤˋ
+輛 0 ㄌㄧㄤˋ
+喨 0 ㄌㄧㄤˋ
+晾 0 ㄌㄧㄤˋ
+涼 0 ㄌㄧㄤˋ
+啢 0 ㄌㄧㄤˋ
+踉 0 ㄌㄧㄤˋ
+湸 0 ㄌㄧㄤˋ
+悢 0 ㄌㄧㄤˋ
+兩 0 ㄌㄧㄤˋ
+倞 0 ㄌㄧㄤˋ
+両 0 ㄌㄧㄤˋ
+两 0 ㄌㄧㄤˋ
+凉 0 ㄌㄧㄤˋ
+良 0 ㄌㄧㄤˊ
+梁 0 ㄌㄧㄤˊ
+量 0 ㄌㄧㄤˊ
+糧 0 ㄌㄧㄤˊ
+涼 0 ㄌㄧㄤˊ
+粱 0 ㄌㄧㄤˊ
+樑 0 ㄌㄧㄤˊ
+椋 0 ㄌㄧㄤˊ
+綡 0 ㄌㄧㄤˊ
+輬 0 ㄌㄧㄤˊ
+踉 0 ㄌㄧㄤˊ
+駺 0 ㄌㄧㄤˊ
+亮 0 ㄌㄧㄤˊ
+螂 0 ㄌㄧㄤˊ
+諒 0 ㄌㄧㄤˊ
+俍 0 ㄌㄧㄤˊ
+惊 0 ㄌㄧㄤˊ
+莨 0 ㄌㄧㄤˊ
+蜋 0 ㄌㄧㄤˊ
+凉 0 ㄌㄧㄤˊ
+粮 0 ㄌㄧㄤˊ
+槺 0 ㄌㄧㄤˊ
+墚 0 ㄌㄧㄤˊ
+臉 0 ㄌㄧㄢˇ
+鄻 0 ㄌㄧㄢˇ
+膦 0 ㄌㄧㄢˇ
+摙 0 ㄌㄧㄢˇ
+僆 0 ㄌㄧㄢˇ
+羷 0 ㄌㄧㄢˇ
+斂 0 ㄌㄧㄢˇ
+溓 0 ㄌㄧㄢˇ
+槤 0 ㄌㄧㄢˇ
+璉 0 ㄌㄧㄢˇ
+㯬 0 ㄌㄧㄢˇ
+稴 0 ㄌㄧㄢˇ
+醶 0 ㄌㄧㄢˇ
+練 0 ㄌㄧㄢˋ
+鍊 0 ㄌㄧㄢˋ
+戀 0 ㄌㄧㄢˋ
+煉 0 ㄌㄧㄢˋ
+鏈 0 ㄌㄧㄢˋ
+殮 0 ㄌㄧㄢˋ
+斂 0 ㄌㄧㄢˋ
+瀲 0 ㄌㄧㄢˋ
+楝 0 ㄌㄧㄢˋ
+襝 0 ㄌㄧㄢˋ
+湅 0 ㄌㄧㄢˋ
+澰 0 ㄌㄧㄢˋ
+蘞 0 ㄌㄧㄢˋ
+歛 0 ㄌㄧㄢˋ
+薟 0 ㄌㄧㄢˋ
+萰 0 ㄌㄧㄢˋ
+堜 0 ㄌㄧㄢˋ
+攣 0 ㄌㄧㄢˋ
+僆 0 ㄌㄧㄢˋ
+恋 0 ㄌㄧㄢˋ
+挛 0 ㄌㄧㄢˋ
+媡 0 ㄌㄧㄢˋ
+㜃 0 ㄌㄧㄢˋ
+瑓 0 ㄌㄧㄢˋ
+錬 0 ㄌㄧㄢˋ
+㶑 0 ㄌㄧㄢˋ
+鰊 0 ㄌㄧㄢˋ
+蘝 0 ㄌㄧㄢˋ
+纞 0 ㄌㄧㄢˋ
+稴 0 ㄌㄧㄢˋ
+連 0 ㄌㄧㄢˊ
+聯 0 ㄌㄧㄢˊ
+憐 0 ㄌㄧㄢˊ
+廉 0 ㄌㄧㄢˊ
+蓮 0 ㄌㄧㄢˊ
+漣 0 ㄌㄧㄢˊ
+簾 0 ㄌㄧㄢˊ
+鐮 0 ㄌㄧㄢˊ
+鰱 0 ㄌㄧㄢˊ
+奩 0 ㄌㄧㄢˊ
+璉 0 ㄌㄧㄢˊ
+帘 0 ㄌㄧㄢˊ
+褳 0 ㄌㄧㄢˊ
+嗹 0 ㄌㄧㄢˊ
+鎌 0 ㄌㄧㄢˊ
+鬑 0 ㄌㄧㄢˊ
+溓 0 ㄌㄧㄢˊ
+蠊 0 ㄌㄧㄢˊ
+槤 0 ㄌㄧㄢˊ
+縺 0 ㄌㄧㄢˊ
+謰 0 ㄌㄧㄢˊ
+覝 0 ㄌㄧㄢˊ
+磏 0 ㄌㄧㄢˊ
+鏀 0 ㄌㄧㄢˊ
+濂 0 ㄌㄧㄢˊ
+翴 0 ㄌㄧㄢˊ
+薕 0 ㄌㄧㄢˊ
+蹥 0 ㄌㄧㄢˊ
+譧 0 ㄌㄧㄢˊ
+奱 0 ㄌㄧㄢˊ
+嬚 0 ㄌㄧㄢˊ
+零 0 ㄌㄧㄢˊ
+殮 0 ㄌㄧㄢˊ
+瞼 0 ㄌㄧㄢˊ
+怜 0 ㄌㄧㄢˊ
+轋 0 ㄌㄧㄢˊ
+蘞 0 ㄌㄧㄢˊ
+亷 0 ㄌㄧㄢˊ
+匲 0 ㄌㄧㄢˊ
+慩 0 ㄌㄧㄢˊ
+熑 0 ㄌㄧㄢˊ
+劆 0 ㄌㄧㄢˊ
+匳 0 ㄌㄧㄢˊ
+嫾 0 ㄌㄧㄢˊ
+聨 0 ㄌㄧㄢˊ
+聫 0 ㄌㄧㄢˊ
+濓 0 ㄌㄧㄢˊ
+聮 0 ㄌㄧㄢˊ
+螊 0 ㄌㄧㄢˊ
+霗 0 ㄌㄧㄢˊ
+燫 0 ㄌㄧㄢˊ
+櫣 0 ㄌㄧㄢˊ
+蘝 0 ㄌㄧㄢˊ
+䥥 0 ㄌㄧㄢˊ
+籢 0 ㄌㄧㄢˊ
+䙺 0 ㄌㄧㄢˊ
+臁 0 ㄌㄧㄢˊ
+李 0 ㄌㄧˇ
+里 0 ㄌㄧˇ
+裡 0 ㄌㄧˇ
+理 0 ㄌㄧˇ
+禮 0 ㄌㄧˇ
+裏 0 ㄌㄧˇ
+哩 0 ㄌㄧˇ
+浬 0 ㄌㄧˇ
+鯉 0 ㄌㄧˇ
+娌 0 ㄌㄧˇ
+俚 0 ㄌㄧˇ
+澧 0 ㄌㄧˇ
+邐 0 ㄌㄧˇ
+醴 0 ㄌㄧˇ
+蠡 0 ㄌㄧˇ
+鱧 0 ㄌㄧˇ
+鋰 0 ㄌㄧˇ
+粴 0 ㄌㄧˇ
+豊 0 ㄌㄧˇ
+峛 0 ㄌㄧˇ
+欚 0 ㄌㄧˇ
+履 0 ㄌㄧˇ
+悝 0 ㄌㄧˇ
+捚 0 ㄌㄧˇ
+褁 0 ㄌㄧˇ
+礼 0 ㄌㄧˇ
+峢 0 ㄌㄧˇ
+蟸 0 ㄌㄧˇ
+峲 0 ㄌㄧˇ
+喱 0 ㄌㄧˇ
+力 0 ㄌㄧˋ
+立 0 ㄌㄧˋ
+利 0 ㄌㄧˋ
+麗 0 ㄌㄧˋ
+歷 0 ㄌㄧˋ
+壢 0 ㄌㄧˋ
+例 0 ㄌㄧˋ
+曆 0 ㄌㄧˋ
+莉 0 ㄌㄧˋ
+厲 0 ㄌㄧˋ
+勵 0 ㄌㄧˋ
+礪 0 ㄌㄧˋ
+粒 0 ㄌㄧˋ
+蒞 0 ㄌㄧˋ
+靂 0 ㄌㄧˋ
+瀝 0 ㄌㄧˋ
+儷 0 ㄌㄧˋ
+隸 0 ㄌㄧˋ
+礫 0 ㄌㄧˋ
+吏 0 ㄌㄧˋ
+荔 0 ㄌㄧˋ
+栗 0 ㄌㄧˋ
+慄 0 ㄌㄧˋ
+俐 0 ㄌㄧˋ
+痢 0 ㄌㄧˋ
+癘 0 ㄌㄧˋ
+笠 0 ㄌㄧˋ
+戾 0 ㄌㄧˋ
+唳 0 ㄌㄧˋ
+酈 0 ㄌㄧˋ
+琍 0 ㄌㄧˋ
+詈 0 ㄌㄧˋ
+嚦 0 ㄌㄧˋ
+溧 0 ㄌㄧˋ
+蠣 0 ㄌㄧˋ
+櫪 0 ㄌㄧˋ
+沴 0 ㄌㄧˋ
+糲 0 ㄌㄧˋ
+櫟 0 ㄌㄧˋ
+轢 0 ㄌㄧˋ
+瓅 0 ㄌㄧˋ
+鬁 0 ㄌㄧˋ
+猁 0 ㄌㄧˋ
+盭 0 ㄌㄧˋ
+篥 0 ㄌㄧˋ
+苙 0 ㄌㄧˋ
+唎 0 ㄌㄧˋ
+屴 0 ㄌㄧˋ
+躒 0 ㄌㄧˋ
+釙 0 ㄌㄧˋ
+鬲 0 ㄌㄧˋ
+皪 0 ㄌㄧˋ
+秝 0 ㄌㄧˋ
+瑮 0 ㄌㄧˋ
+轣 0 ㄌㄧˋ
+岦 0 ㄌㄧˋ
+朸 0 ㄌㄧˋ
+欐 0 ㄌㄧˋ
+禲 0 ㄌㄧˋ
+赲 0 ㄌㄧˋ
+鴗 0 ㄌㄧˋ
+砅 0 ㄌㄧˋ
+濿 0 ㄌㄧˋ
+砬 0 ㄌㄧˋ
+悷 0 ㄌㄧˋ
+蚸 0 ㄌㄧˋ
+厤 0 ㄌㄧˋ
+筣 0 ㄌㄧˋ
+綟 0 ㄌㄧˋ
+蜧 0 ㄌㄧˋ
+磿 0 ㄌㄧˋ
+犡 0 ㄌㄧˋ
+藶 0 ㄌㄧˋ
+蠫 0 ㄌㄧˋ
+鷅 0 ㄌㄧˋ
+麜 0 ㄌㄧˋ
+攦 0 ㄌㄧˋ
+觻 0 ㄌㄧˋ
+鷑 0 ㄌㄧˋ
+攭 0 ㄌㄧˋ
+鱳 0 ㄌㄧˋ
+靋 0 ㄌㄧˋ
+栵 0 ㄌㄧˋ
+浰 0 ㄌㄧˋ
+塛 0 ㄌㄧˋ
+搮 0 ㄌㄧˋ
+蝷 0 ㄌㄧˋ
+儮 0 ㄌㄧˋ
+曞 0 ㄌㄧˋ
+讈 0 ㄌㄧˋ
+瓥 0 ㄌㄧˋ
+鱱 0 ㄌㄧˋ
+娳 0 ㄌㄧˋ
+叻 0 ㄌㄧˋ
+捩 0 ㄌㄧˋ
+棣 0 ㄌㄧˋ
+蜊 0 ㄌㄧˋ
+罹 0 ㄌㄧˋ
+鎘 0 ㄌㄧˋ
+邐 0 ㄌㄧˋ
+仂 0 ㄌㄧˋ
+夯 0 ㄌㄧˋ
+牞 0 ㄌㄧˋ
+蒚 0 ㄌㄧˋ
+擽 0 ㄌㄧˋ
+齂 0 ㄌㄧˋ
+襹 0 ㄌㄧˋ
+鸝 0 ㄌㄧˋ
+历 0 ㄌㄧˋ
+厉 0 ㄌㄧˋ
+丽 0 ㄌㄧˋ
+㕸 0 ㄌㄧˋ
+悧 0 ㄌㄧˋ
+栛 0 ㄌㄧˋ
+涖 0 ㄌㄧˋ
+珕 0 ㄌㄧˋ
+茘 0 ㄌㄧˋ
+婯 0 ㄌㄧˋ
+莅 0 ㄌㄧˋ
+傈 0 ㄌㄧˋ
+凓 0 ㄌㄧˋ
+鉝 0 ㄌㄧˋ
+鳨 0 ㄌㄧˋ
+暦 0 ㄌㄧˋ
+歴 0 ㄌㄧˋ
+䔉 0 ㄌㄧˋ
+㷴 0 ㄌㄧˋ
+隷 0 ㄌㄧˋ
+檪 0 ㄌㄧˋ
+鬴 0 ㄌㄧˋ
+巁 0 ㄌㄧˋ
+攊 0 ㄌㄧˋ
+櫔 0 ㄌㄧˋ
+爄 0 ㄌㄧˋ
+蠇 0 ㄌㄧˋ
+爏 0 ㄌㄧˋ
+瓑 0 ㄌㄧˋ
+癧 0 ㄌㄧˋ
+礰 0 ㄌㄧˋ
+纅 0 ㄌㄧˋ
+囇 0 ㄌㄧˋ
+励 0 ㄌㄧˋ
+沵 0 ㄌㄧˋ
+㾐 0 ㄌㄧˋ
+粝 0 ㄌㄧˋ
+棙 0 ㄌㄧˋ
+䓞 0 ㄌㄧˋ
+蛠 0 ㄌㄧˋ
+厯 0 ㄌㄧˋ
+㻺 0 ㄌㄧˋ
+矖 0 ㄌㄧˋ
+離 0 ㄌㄧˊ
+璃 0 ㄌㄧˊ
+黎 0 ㄌㄧˊ
+梨 0 ㄌㄧˊ
+籬 0 ㄌㄧˊ
+釐 0 ㄌㄧˊ
+犛 0 ㄌㄧˊ
+罹 0 ㄌㄧˊ
+貍 0 ㄌㄧˊ
+驪 0 ㄌㄧˊ
+犁 0 ㄌㄧˊ
+漓 0 ㄌㄧˊ
+灕 0 ㄌㄧˊ
+狸 0 ㄌㄧˊ
+藜 0 ㄌㄧˊ
+蜊 0 ㄌㄧˊ
+蠡 0 ㄌㄧˊ
+鸝 0 ㄌㄧˊ
+釃 0 ㄌㄧˊ
+斄 0 ㄌㄧˊ
+嫠 0 ㄌㄧˊ
+褵 0 ㄌㄧˊ
+黧 0 ㄌㄧˊ
+梩 0 ㄌㄧˊ
+漦 0 ㄌㄧˊ
+縭 0 ㄌㄧˊ
+蔾 0 ㄌㄧˊ
+氂 0 ㄌㄧˊ
+厘 0 ㄌㄧˊ
+蘺 0 ㄌㄧˊ
+剺 0 ㄌㄧˊ
+喱 0 ㄌㄧˊ
+篱 0 ㄌㄧˊ
+醨 0 ㄌㄧˊ
+鱺 0 ㄌㄧˊ
+劙 0 ㄌㄧˊ
+孋 0 ㄌㄧˊ
+廲 0 ㄌㄧˊ
+騹 0 ㄌㄧˊ
+孷 0 ㄌㄧˊ
+樆 0 ㄌㄧˊ
+謧 0 ㄌㄧˊ
+鯬 0 ㄌㄧˊ
+鵹 0 ㄌㄧˊ
+攡 0 ㄌㄧˊ
+麗 0 ㄌㄧˊ
+菞 0 ㄌㄧˊ
+鑗 0 ㄌㄧˊ
+粍 0 ㄌㄧˊ
+麶 0 ㄌㄧˊ
+俚 0 ㄌㄧˊ
+魑 0 ㄌㄧˊ
+霾 0 ㄌㄧˊ
+离 0 ㄌㄧˊ
+詈 0 ㄌㄧˊ
+筣 0 ㄌㄧˊ
+螭 0 ㄌㄧˊ
+蠫 0 ㄌㄧˊ
+刕 0 ㄌㄧˊ
+丽 0 ㄌㄧˊ
+剓 0 ㄌㄧˊ
+婯 0 ㄌㄧˊ
+悡 0 ㄌㄧˊ
+梸 0 ㄌㄧˊ
+荲 0 ㄌㄧˊ
+棃 0 ㄌㄧˊ
+犂 0 ㄌㄧˊ
+㴝 0 ㄌㄧˊ
+睝 0 ㄌㄧˊ
+鋫 0 ㄌㄧˊ
+錅 0 ㄌㄧˊ
+蟍 0 ㄌㄧˊ
+嚟 0 ㄌㄧˊ
+瓈 0 ㄌㄧˊ
+蟸 0 ㄌㄧˊ
+鏫 0 ㄌㄧˊ
+彲 0 ㄌㄧˊ
+穲 0 ㄌㄧˊ
+卨 0 ㄌㄧˊ
+猍 0 ㄌㄧˊ
+艃 0 ㄌㄧˊ
+盠 0 ㄌㄧˊ
+邌 0 ㄌㄧˊ
+㦒 0 ㄌㄧˊ
+哩 0 ㄌㄧ˙
+裡 0 ㄌㄧ˙
+娌 0 ㄌㄧ˙
+倆 0 ㄌㄧㄚˇ
+俩 0 ㄌㄧㄚˇ
+撩 0 ㄌㄧㄠ
+了 0 ㄌㄧㄠˇ
+瞭 0 ㄌㄧㄠˇ
+蓼 0 ㄌㄧㄠˇ
+憭 0 ㄌㄧㄠˇ
+釕 0 ㄌㄧㄠˇ
+暸 0 ㄌㄧㄠˇ
+鄝 0 ㄌㄧㄠˇ
+蟟 0 ㄌㄧㄠˇ
+燎 0 ㄌㄧㄠˇ
+繚 0 ㄌㄧㄠˇ
+镽 0 ㄌㄧㄠˇ
+尞 0 ㄌㄧㄠˇ
+嘞 0 ㄌㄧㄠˇ
+爒 0 ㄌㄧㄠˇ
+廖 0 ㄌㄧㄠˋ
+料 0 ㄌㄧㄠˋ
+瞭 0 ㄌㄧㄠˋ
+燎 0 ㄌㄧㄠˋ
+尥 0 ㄌㄧㄠˋ
+撂 0 ㄌㄧㄠˋ
+炓 0 ㄌㄧㄠˋ
+蟉 0 ㄌㄧㄠˋ
+窲 0 ㄌㄧㄠˋ
+療 0 ㄌㄧㄠˋ
+釕 0 ㄌㄧㄠˋ
+鄝 0 ㄌㄧㄠˋ
+璆 0 ㄌㄧㄠˋ
+瘳 0 ㄌㄧㄠˋ
+鐐 0 ㄌㄧㄠˋ
+尞 0 ㄌㄧㄠˋ
+爒 0 ㄌㄧㄠˋ
+聊 0 ㄌㄧㄠˊ
+寮 0 ㄌㄧㄠˊ
+遼 0 ㄌㄧㄠˊ
+療 0 ㄌㄧㄠˊ
+寥 0 ㄌㄧㄠˊ
+撩 0 ㄌㄧㄠˊ
+僚 0 ㄌㄧㄠˊ
+燎 0 ㄌㄧㄠˊ
+潦 0 ㄌㄧㄠˊ
+嘹 0 ㄌㄧㄠˊ
+繚 0 ㄌㄧㄠˊ
+鐐 0 ㄌㄧㄠˊ
+嫽 0 ㄌㄧㄠˊ
+獠 0 ㄌㄧㄠˊ
+鷯 0 ㄌㄧㄠˊ
+屪 0 ㄌㄧㄠˊ
+膋 0 ㄌㄧㄠˊ
+漻 0 ㄌㄧㄠˊ
+摎 0 ㄌㄧㄠˊ
+豂 0 ㄌㄧㄠˊ
+嵺 0 ㄌㄧㄠˊ
+憀 0 ㄌㄧㄠˊ
+嶚 0 ㄌㄧㄠˊ
+敹 0 ㄌㄧㄠˊ
+窷 0 ㄌㄧㄠˊ
+膫 0 ㄌㄧㄠˊ
+簝 0 ㄌㄧㄠˊ
+镽 0 ㄌㄧㄠˊ
+飂 0 ㄌㄧㄠˊ
+飉 0 ㄌㄧㄠˊ
+顟 0 ㄌㄧㄠˊ
+佬 0 ㄌㄧㄠˊ
+窌 0 ㄌㄧㄠˊ
+翏 0 ㄌㄧㄠˊ
+憭 0 ㄌㄧㄠˊ
+蟟 0 ㄌㄧㄠˊ
+醪 0 ㄌㄧㄠˊ
+尞 0 ㄌㄧㄠˊ
+嶛 0 ㄌㄧㄠˊ
+熮 0 ㄌㄧㄠˊ
+竂 0 ㄌㄧㄠˊ
+蹘 0 ㄌㄧㄠˊ
+髎 0 ㄌㄧㄠˊ
+璙 0 ㄌㄧㄠˊ
+廫 0 ㄌㄧㄠˊ
+賿 0 ㄌㄧㄠˊ
+凜 0 ㄌㄧㄣˇ
+懍 0 ㄌㄧㄣˇ
+廩 0 ㄌㄧㄣˇ
+檁 0 ㄌㄧㄣˇ
+菻 0 ㄌㄧㄣˇ
+亃 0 ㄌㄧㄣˇ
+綝 0 ㄌㄧㄣˇ
+榃 0 ㄌㄧㄣˇ
+稟 0 ㄌㄧㄣˇ
+僯 0 ㄌㄧㄣˇ
+顲 0 ㄌㄧㄣˇ
+禀 0 ㄌㄧㄣˇ
+凛 0 ㄌㄧㄣˇ
+撛 0 ㄌㄧㄣˇ
+廪 0 ㄌㄧㄣˇ
+澟 0 ㄌㄧㄣˇ
+癛 0 ㄌㄧㄣˇ
+㨆 0 ㄌㄧㄣˇ
+吝 0 ㄌㄧㄣˋ
+躪 0 ㄌㄧㄣˋ
+藺 0 ㄌㄧㄣˋ
+賃 0 ㄌㄧㄣˋ
+橉 0 ㄌㄧㄣˋ
+閵 0 ㄌㄧㄣˋ
+焛 0 ㄌㄧㄣˋ
+淋 0 ㄌㄧㄣˋ
+痳 0 ㄌㄧㄣˋ
+遴 0 ㄌㄧㄣˋ
+磷 0 ㄌㄧㄣˋ
+臨 0 ㄌㄧㄣˋ
+甐 0 ㄌㄧㄣˋ
+鏻 0 ㄌㄧㄣˋ
+恡 0 ㄌㄧㄣˋ
+悋 0 ㄌㄧㄣˋ
+林 0 ㄌㄧㄣˊ
+臨 0 ㄌㄧㄣˊ
+鄰 0 ㄌㄧㄣˊ
+淋 0 ㄌㄧㄣˊ
+鱗 0 ㄌㄧㄣˊ
+麟 0 ㄌㄧㄣˊ
+霖 0 ㄌㄧㄣˊ
+磷 0 ㄌㄧㄣˊ
+琳 0 ㄌㄧㄣˊ
+遴 0 ㄌㄧㄣˊ
+嶙 0 ㄌㄧㄣˊ
+燐 0 ㄌㄧㄣˊ
+璘 0 ㄌㄧㄣˊ
+粼 0 ㄌㄧㄣˊ
+轔 0 ㄌㄧㄣˊ
+潾 0 ㄌㄧㄣˊ
+痳 0 ㄌㄧㄣˊ
+疄 0 ㄌㄧㄣˊ
+瞵 0 ㄌㄧㄣˊ
+惏 0 ㄌㄧㄣˊ
+暽 0 ㄌㄧㄣˊ
+罧 0 ㄌㄧㄣˊ
+驎 0 ㄌㄧㄣˊ
+碄 0 ㄌㄧㄣˊ
+箖 0 ㄌㄧㄣˊ
+甐 0 ㄌㄧㄣˊ
+繗 0 ㄌㄧㄣˊ
+僯 0 ㄌㄧㄣˊ
+翷 0 ㄌㄧㄣˊ
+蹸 0 ㄌㄧㄣˊ
+壣 0 ㄌㄧㄣˊ
+鏻 0 ㄌㄧㄣˊ
+藺 0 ㄌㄧㄣˊ
+亃 0 ㄌㄧㄣˊ
+榃 0 ㄌㄧㄣˊ
+吅 0 ㄌㄧㄣˊ
+玪 0 ㄌㄧㄣˊ
+崊 0 ㄌㄧㄣˊ
+晽 0 ㄌㄧㄣˊ
+粦 0 ㄌㄧㄣˊ
+隣 0 ㄌㄧㄣˊ
+麐 0 ㄌㄧㄣˊ
+瀶 0 ㄌㄧㄣˊ
+躙 0 ㄌㄧㄣˊ
+轥 0 ㄌㄧㄣˊ
+厸 0 ㄌㄧㄣˊ
+杮 0 ㄌㄧㄣˊ
+枾 0 ㄌㄧㄣˊ
+㔂 0 ㄌㄧㄣˊ
+獜 0 ㄌㄧㄣˊ
+斴 0 ㄌㄧㄣˊ
+魿 0 ㄌㄧㄣˊ
+資 0 ㄗ
+茲 0 ㄗ
+滋 0 ㄗ
+吱 0 ㄗ
+姿 0 ㄗ
+咨 0 ㄗ
+孜 0 ㄗ
+諮 0 ㄗ
+貲 0 ㄗ
+玆 0 ㄗ
+ㄗ 0 ㄗ
+輜 0 ㄗ
+淄 0 ㄗ
+齜 0 ㄗ
+緇 0 ㄗ
+孳 0 ㄗ
+粢 0 ㄗ
+髭 0 ㄗ
+嵫 0 ㄗ
+菑 0 ㄗ
+鎡 0 ㄗ
+鼒 0 ㄗ
+孖 0 ㄗ
+澬 0 ㄗ
+甾 0 ㄗ
+鄑 0 ㄗ
+鯔 0 ㄗ
+錙 0 ㄗ
+趑 0 ㄗ
+椔 0 ㄗ
+鈭 0 ㄗ
+鶅 0 ㄗ
+齍 0 ㄗ
+栥 0 ㄗ
+紎 0 ㄗ
+崰 0 ㄗ
+秶 0 ㄗ
+蠀 0 ㄗ
+仔 0 ㄗ
+次 0 ㄗ
+恣 0 ㄗ
+訾 0 ㄗ
+齊 0 ㄗ
+茬 0 ㄗ
+絘 0 ㄗ
+觜 0 ㄗ
+薋 0 ㄗ
+齐 0 ㄗ
+亝 0 ㄗ
+斉 0 ㄗ
+姕 0 ㄗ
+兹 0 ㄗ
+赼 0 ㄗ
+嗞 0 ㄗ
+孶 0 ㄗ
+葘 0 ㄗ
+趦 0 ㄗ
+鍿 0 ㄗ
+頿 0 ㄗ
+茊 0 ㄗ
+斊 0 ㄗ
+湽 0 ㄗ
+稵 0 ㄗ
+䨏 0 ㄗ
+頾 0 ㄗ
+鰦 0 ㄗ
+鷀 0 ㄗ
+禌 0 ㄗ
+輺 0 ㄗ
+鄒 0 ㄗㄡ
+謅 0 ㄗㄡ
+鄹 0 ㄗㄡ
+諏 0 ㄗㄡ
+啁 0 ㄗㄡ
+掫 0 ㄗㄡ
+菆 0 ㄗㄡ
+陬 0 ㄗㄡ
+騶 0 ㄗㄡ
+鯫 0 ㄗㄡ
+棸 0 ㄗㄡ
+緅 0 ㄗㄡ
+棷 0 ㄗㄡ
+郰 0 ㄗㄡ
+媰 0 ㄗㄡ
+黀 0 ㄗㄡ
+齱 0 ㄗㄡ
+齺 0 ㄗㄡ
+娵 0 ㄗㄡ
+邹 0 ㄗㄡ
+箃 0 ㄗㄡ
+走 0 ㄗㄡˇ
+赱 0 ㄗㄡˇ
+奏 0 ㄗㄡˋ
+驟 0 ㄗㄡˋ
+揍 0 ㄗㄡˋ
+楱 0 ㄗㄡˋ
+㵵 0 ㄗㄡˋ
+曾 0 ㄗㄥ
+增 0 ㄗㄥ
+憎 0 ㄗㄥ
+罾 0 ㄗㄥ
+繒 0 ㄗㄥ
+矰 0 ㄗㄥ
+橧 0 ㄗㄥ
+磳 0 ㄗㄥ
+驓 0 ㄗㄥ
+璔 0 ㄗㄥ
+僧 0 ㄗㄥ
+噌 0 ㄗㄥ
+潧 0 ㄗㄥ
+鬙 0 ㄗㄥ
+増 0 ㄗㄥ
+熷 0 ㄗㄥ
+譄 0 ㄗㄥ
+贈 0 ㄗㄥˋ
+甑 0 ㄗㄥˋ
+繒 0 ㄗㄥˋ
+罾 0 ㄗㄥˋ
+髒 0 ㄗㄤ
+贓 0 ㄗㄤ
+臢 0 ㄗㄤ
+牂 0 ㄗㄤ
+臧 0 ㄗㄤ
+賍 0 ㄗㄤ
+贜 0 ㄗㄤ
+匨 0 ㄗㄤ
+羘 0 ㄗㄤ
+駔 0 ㄗㄤˇ
+髒 0 ㄗㄤˇ
+驡 0 ㄗㄤˇ
+藏 0 ㄗㄤˋ
+臟 0 ㄗㄤˋ
+葬 0 ㄗㄤˋ
+奘 0 ㄗㄤˋ
+塟 0 ㄗㄤˋ
+蔵 0 ㄗㄤˋ
+銺 0 ㄗㄤˋ
+簪 0 ㄗㄢ
+鐕 0 ㄗㄢ
+撍 0 ㄗㄢ
+簮 0 ㄗㄢ
+鐟 0 ㄗㄢ
+兂 0 ㄗㄢ
+䐶 0 ㄗㄢ
+拶 0 ㄗㄢˇ
+攢 0 ㄗㄢˇ
+寁 0 ㄗㄢˇ
+昝 0 ㄗㄢˇ
+禶 0 ㄗㄢˇ
+喒 0 ㄗㄢˇ
+儹 0 ㄗㄢˇ
+揝 0 ㄗㄢˇ
+礸 0 ㄗㄢˇ
+噆 0 ㄗㄢˇ
+趲 0 ㄗㄢˇ
+㳫 0 ㄗㄢˇ
+撍 0 ㄗㄢˇ
+儧 0 ㄗㄢˇ
+攅 0 ㄗㄢˇ
+贊 0 ㄗㄢˋ
+暫 0 ㄗㄢˋ
+讚 0 ㄗㄢˋ
+鏨 0 ㄗㄢˋ
+瓚 0 ㄗㄢˋ
+酇 0 ㄗㄢˋ
+灒 0 ㄗㄢˋ
+囋 0 ㄗㄢˋ
+臢 0 ㄗㄢˋ
+劗 0 ㄗㄢˋ
+禶 0 ㄗㄢˋ
+賛 0 ㄗㄢˋ
+濽 0 ㄗㄢˋ
+鄼 0 ㄗㄢˋ
+櫕 0 ㄗㄢˋ
+瓉 0 ㄗㄢˋ
+鏩 0 ㄗㄢˋ
+讃 0 ㄗㄢˋ
+穳 0 ㄗㄢˋ
+襸 0 ㄗㄢˋ
+㔆 0 ㄗㄢˋ
+㜺 0 ㄗㄢˋ
+咱 0 ㄗㄢˊ
+偺 0 ㄗㄢˊ
+糌 0 ㄗㄢˊ
+喒 0 ㄗㄢˊ
+㑑 0 ㄗㄢˊ
+子 0 ㄗˇ
+仔 0 ㄗˇ
+紫 0 ㄗˇ
+梓 0 ㄗˇ
+籽 0 ㄗˇ
+滓 0 ㄗˇ
+耔 0 ㄗˇ
+訾 0 ㄗˇ
+笫 0 ㄗˇ
+秭 0 ㄗˇ
+胏 0 ㄗˇ
+茈 0 ㄗˇ
+吇 0 ㄗˇ
+杍 0 ㄗˇ
+芓 0 ㄗˇ
+呰 0 ㄗˇ
+矷 0 ㄗˇ
+釨 0 ㄗˇ
+訿 0 ㄗˇ
+姊 0 ㄗˇ
+㺭 0 ㄗˇ
+姉 0 ㄗˇ
+秄 0 ㄗˇ
+虸 0 ㄗˇ
+啙 0 ㄗˇ
+榟 0 ㄗˇ
+自 0 ㄗˋ
+字 0 ㄗˋ
+恣 0 ㄗˋ
+漬 0 ㄗˋ
+眥 0 ㄗˋ
+孳 0 ㄗˋ
+剚 0 ㄗˋ
+胔 0 ㄗˋ
+胾 0 ㄗˋ
+扻 0 ㄗˋ
+倳 0 ㄗˋ
+牸 0 ㄗˋ
+磧 0 ㄗˋ
+芓 0 ㄗˋ
+絘 0 ㄗˋ
+茡 0 ㄗˋ
+㹀 0 ㄗˋ
+眦 0 ㄗˋ
+髊 0 ㄗˋ
+子 0 ㄗ˙
+紮 0 ㄗㄚ
+匝 0 ㄗㄚ
+咂 0 ㄗㄚ
+唼 0 ㄗㄚ
+嘁 0 ㄗㄚ
+抸 0 ㄗㄚ
+鉔 0 ㄗㄚ
+臢 0 ㄗㄚ
+帀 0 ㄗㄚ
+沞 0 ㄗㄚ
+迊 0 ㄗㄚ
+紥 0 ㄗㄚ
+鮺 0 ㄗㄚˇ
+雜 0 ㄗㄚˊ
+咱 0 ㄗㄚˊ
+砸 0 ㄗㄚˊ
+偺 0 ㄗㄚˊ
+雥 0 ㄗㄚˊ
+磼 0 ㄗㄚˊ
+拶 0 ㄗㄚˊ
+喒 0 ㄗㄚˊ
+嘁 0 ㄗㄚˊ
+巀 0 ㄗㄚˊ
+㑑 0 ㄗㄚˊ
+雑 0 ㄗㄚˊ
+嶻 0 ㄗㄚˊ
+襍 0 ㄗㄚˊ
+韴 0 ㄗㄚˊ
+囐 0 ㄗㄚˊ
+災 0 ㄗㄞ
+栽 0 ㄗㄞ
+哉 0 ㄗㄞ
+渽 0 ㄗㄞ
+賳 0 ㄗㄞ
+菑 0 ㄗㄞ
+灾 0 ㄗㄞ
+烖 0 ㄗㄞ
+睵 0 ㄗㄞ
+仔 0 ㄗㄞˇ
+宰 0 ㄗㄞˇ
+崽 0 ㄗㄞˇ
+載 0 ㄗㄞˇ
+縡 0 ㄗㄞˇ
+滓 0 ㄗㄞˇ
+儎 0 ㄗㄞˇ
+䏁 0 ㄗㄞˇ
+在 0 ㄗㄞˋ
+再 0 ㄗㄞˋ
+載 0 ㄗㄞˋ
+饡 0 ㄗㄞˋ
+扗 0 ㄗㄞˋ
+洅 0 ㄗㄞˋ
+儎 0 ㄗㄞˋ
+在 0 ㄗㄞ˙
+租 0 ㄗㄨ
+蒩 0 ㄗㄨ
+宗 0 ㄗㄨㄥ
+蹤 0 ㄗㄨㄥ
+縱 0 ㄗㄨㄥ
+綜 0 ㄗㄨㄥ
+棕 0 ㄗㄨㄥ
+鬃 0 ㄗㄨㄥ
+豵 0 ㄗㄨㄥ
+騣 0 ㄗㄨㄥ
+鬷 0 ㄗㄨㄥ
+翪 0 ㄗㄨㄥ
+熧 0 ㄗㄨㄥ
+倧 0 ㄗㄨㄥ
+惾 0 ㄗㄨㄥ
+猣 0 ㄗㄨㄥ
+稯 0 ㄗㄨㄥ
+艐 0 ㄗㄨㄥ
+嵕 0 ㄗㄨㄥ
+蝬 0 ㄗㄨㄥ
+從 0 ㄗㄨㄥ
+淙 0 ㄗㄨㄥ
+琮 0 ㄗㄨㄥ
+朡 0 ㄗㄨㄥ
+嵷 0 ㄗㄨㄥ
+賨 0 ㄗㄨㄥ
+鍐 0 ㄗㄨㄥ
+从 0 ㄗㄨㄥ
+従 0 ㄗㄨㄥ
+嵏 0 ㄗㄨㄥ
+椶 0 ㄗㄨㄥ
+嵸 0 ㄗㄨㄥ
+賩 0 ㄗㄨㄥ
+踪 0 ㄗㄨㄥ
+踨 0 ㄗㄨㄥ
+磫 0 ㄗㄨㄥ
+縦 0 ㄗㄨㄥ
+騌 0 ㄗㄨㄥ
+鬉 0 ㄗㄨㄥ
+鯮 0 ㄗㄨㄥ
+鯼 0 ㄗㄨㄥ
+苁 0 ㄗㄨㄥ
+㚇 0 ㄗㄨㄥ
+堫 0 ㄗㄨㄥ
+葼 0 ㄗㄨㄥ
+㙡 0 ㄗㄨㄥ
+䁓 0 ㄗㄨㄥ
+緃 0 ㄗㄨㄥ
+總 0 ㄗㄨㄥˇ
+摠 0 ㄗㄨㄥˇ
+傯 0 ㄗㄨㄥˇ
+熜 0 ㄗㄨㄥˇ
+朡 0 ㄗㄨㄥˇ
+蓗 0 ㄗㄨㄥˇ
+縱 0 ㄗㄨㄥˇ
+偬 0 ㄗㄨㄥˇ
+捴 0 ㄗㄨㄥˇ
+惣 0 ㄗㄨㄥˇ
+愡 0 ㄗㄨㄥˇ
+焧 0 ㄗㄨㄥˇ
+㷓 0 ㄗㄨㄥˇ
+憁 0 ㄗㄨㄥˇ
+総 0 ㄗㄨㄥˇ
+縂 0 ㄗㄨㄥˇ
+縦 0 ㄗㄨㄥˇ
+燪 0 ㄗㄨㄥˇ
+㧾 0 ㄗㄨㄥˇ
+揔 0 ㄗㄨㄥˇ
+縱 0 ㄗㄨㄥˋ
+粽 0 ㄗㄨㄥˋ
+綜 0 ㄗㄨㄥˋ
+從 0 ㄗㄨㄥˋ
+瘲 0 ㄗㄨㄥˋ
+昮 0 ㄗㄨㄥˋ
+錝 0 ㄗㄨㄥˋ
+从 0 ㄗㄨㄥˋ
+従 0 ㄗㄨㄥˋ
+碂 0 ㄗㄨㄥˋ
+糉 0 ㄗㄨㄥˋ
+縦 0 ㄗㄨㄥˋ
+苁 0 ㄗㄨㄥˋ
+倊 0 ㄗㄨㄥˋ
+猔 0 ㄗㄨㄥˋ
+䝋 0 ㄗㄨㄥˋ
+鑽 0 ㄗㄨㄢ
+躦 0 ㄗㄨㄢ
+劗 0 ㄗㄨㄢ
+鑚 0 ㄗㄨㄢ
+纂 0 ㄗㄨㄢˇ
+鑽 0 ㄗㄨㄢˇ
+纘 0 ㄗㄨㄢˇ
+籫 0 ㄗㄨㄢˇ
+篹 0 ㄗㄨㄢˇ
+纉 0 ㄗㄨㄢˇ
+鑚 0 ㄗㄨㄢˇ
+賺 0 ㄗㄨㄢˋ
+鑽 0 ㄗㄨㄢˋ
+攥 0 ㄗㄨㄢˋ
+揝 0 ㄗㄨㄢˋ
+櫕 0 ㄗㄨㄢˋ
+鑚 0 ㄗㄨㄢˋ
+組 0 ㄗㄨˇ
+祖 0 ㄗㄨˇ
+阻 0 ㄗㄨˇ
+俎 0 ㄗㄨˇ
+詛 0 ㄗㄨˇ
+珇 0 ㄗㄨˇ
+靻 0 ㄗㄨˇ
+咀 0 ㄗㄨˇ
+沮 0 ㄗㄨˇ
+狙 0 ㄗㄨˇ
+砠 0 ㄗㄨˇ
+齟 0 ㄗㄨˇ
+岨 0 ㄗㄨˇ
+抯 0 ㄗㄨˇ
+柤 0 ㄗㄨˇ
+苴 0 ㄗㄨˇ
+袓 0 ㄗㄨˇ
+菹 0 ㄗㄨˇ
+跙 0 ㄗㄨˇ
+麆 0 ㄗㄨˇ
+爼 0 ㄗㄨˇ
+䔃 0 ㄗㄨˇ
+駔 0 ㄗㄨˋ
+錊 0 ㄗㄨˋ
+足 0 ㄗㄨˊ
+族 0 ㄗㄨˊ
+卒 0 ㄗㄨˊ
+嗾 0 ㄗㄨˊ
+捽 0 ㄗㄨˊ
+崒 0 ㄗㄨˊ
+踿 0 ㄗㄨˊ
+哫 0 ㄗㄨˊ
+傶 0 ㄗㄨˊ
+踤 0 ㄗㄨˊ
+鏃 0 ㄗㄨˊ
+娖 0 ㄗㄨˊ
+珿 0 ㄗㄨˊ
+蓗 0 ㄗㄨˊ
+踀 0 ㄗㄨˊ
+鷟 0 ㄗㄨˊ
+卆 0 ㄗㄨˊ
+崪 0 ㄗㄨˊ
+鎐 0 ㄗㄨˊ
+稡 0 ㄗㄨˊ
+鉃 0 ㄗㄨˊ
+左 0 ㄗㄨㄛˇ
+佐 0 ㄗㄨㄛˇ
+繓 0 ㄗㄨㄛˇ
+撮 0 ㄗㄨㄛˇ
+做 0 ㄗㄨㄛˋ
+作 0 ㄗㄨㄛˋ
+嘬 0 ㄗㄨㄛˋ
+坐 0 ㄗㄨㄛˋ
+座 0 ㄗㄨㄛˋ
+酢 0 ㄗㄨㄛˋ
+祚 0 ㄗㄨㄛˋ
+鑿 0 ㄗㄨㄛˋ
+柞 0 ㄗㄨㄛˋ
+怍 0 ㄗㄨㄛˋ
+胙 0 ㄗㄨㄛˋ
+阼 0 ㄗㄨㄛˋ
+葄 0 ㄗㄨㄛˋ
+夎 0 ㄗㄨㄛˋ
+醋 0 ㄗㄨㄛˋ
+迮 0 ㄗㄨㄛˋ
+袏 0 ㄗㄨㄛˋ
+飵 0 ㄗㄨㄛˋ
+糳 0 ㄗㄨㄛˋ
+䟭 0 ㄗㄨㄛˋ
+昨 0 ㄗㄨㄛˊ
+作 0 ㄗㄨㄛˊ
+椊 0 ㄗㄨㄛˊ
+筰 0 ㄗㄨㄛˊ
+稓 0 ㄗㄨㄛˊ
+葃 0 ㄗㄨㄛˊ
+撮 0 ㄗㄨㄛˊ
+岝 0 ㄗㄨㄛˊ
+苲 0 ㄗㄨㄛˊ
+捽 0 ㄗㄨㄛˊ
+莋 0 ㄗㄨㄛˊ
+繓 0 ㄗㄨㄛˊ
+岞 0 ㄗㄨㄛˊ
+秨 0 ㄗㄨㄛˊ
+鈼 0 ㄗㄨㄛˊ
+嘬 0 ㄗㄨㄛ
+作 0 ㄗㄨㄛ
+厜 0 ㄗㄨㄟ
+羧 0 ㄗㄨㄟ
+嶉 0 ㄗㄨㄟ
+纗 0 ㄗㄨㄟ
+朘 0 ㄗㄨㄟ
+脧 0 ㄗㄨㄟ
+嗺 0 ㄗㄨㄟ
+欈 0 ㄗㄨㄟ
+垖 0 ㄗㄨㄟ
+塠 0 ㄗㄨㄟ
+樶 0 ㄗㄨㄟ
+蟕 0 ㄗㄨㄟ
+嘴 0 ㄗㄨㄟˇ
+璻 0 ㄗㄨㄟˇ
+觜 0 ㄗㄨㄟˇ
+嶊 0 ㄗㄨㄟˇ
+噿 0 ㄗㄨㄟˇ
+濢 0 ㄗㄨㄟˇ
+嶉 0 ㄗㄨㄟˇ
+臎 0 ㄗㄨㄟˇ
+最 0 ㄗㄨㄟˋ
+罪 0 ㄗㄨㄟˋ
+醉 0 ㄗㄨㄟˋ
+檇 0 ㄗㄨㄟˋ
+蕞 0 ㄗㄨㄟˋ
+晬 0 ㄗㄨㄟˋ
+檌 0 ㄗㄨㄟˋ
+絊 0 ㄗㄨㄟˋ
+祽 0 ㄗㄨㄟˋ
+鋷 0 ㄗㄨㄟˋ
+墬 0 ㄗㄨㄟˋ
+嶵 0 ㄗㄨㄟˋ
+撮 0 ㄗㄨㄟˋ
+嘬 0 ㄗㄨㄟˋ
+蕝 0 ㄗㄨㄟˋ
+繓 0 ㄗㄨㄟˋ
+欈 0 ㄗㄨㄟˋ
+栬 0 ㄗㄨㄟˋ
+酔 0 ㄗㄨㄟˋ
+辠 0 ㄗㄨㄟˋ
+酻 0 ㄗㄨㄟˋ
+錊 0 ㄗㄨㄟˋ
+尊 0 ㄗㄨㄣ
+遵 0 ㄗㄨㄣ
+樽 0 ㄗㄨㄣ
+墫 0 ㄗㄨㄣ
+鐏 0 ㄗㄨㄣ
+嶟 0 ㄗㄨㄣ
+繜 0 ㄗㄨㄣ
+鷷 0 ㄗㄨㄣ
+壿 0 ㄗㄨㄣ
+燇 0 ㄗㄨㄣ
+譐 0 ㄗㄨㄣ
+鱒 0 ㄗㄨㄣ
+罇 0 ㄗㄨㄣ
+撙 0 ㄗㄨㄣˇ
+噂 0 ㄗㄨㄣˇ
+墫 0 ㄗㄨㄣˇ
+僔 0 ㄗㄨㄣˇ
+譐 0 ㄗㄨㄣˇ
+䔿 0 ㄗㄨㄣˇ
+俊 0 ㄗㄨㄣˋ
+圳 0 ㄗㄨㄣˋ
+捘 0 ㄗㄨㄣˋ
+鱒 0 ㄗㄨㄣˋ
+銌 0 ㄗㄨㄣˋ
+燇 0 ㄗㄨㄣˋ
+甽 0 ㄗㄨㄣˋ
+晙 0 ㄗㄨㄣˋ
+焌 0 ㄗㄨㄣˋ
+畯 0 ㄗㄨㄣˋ
+餕 0 ㄗㄨㄣˋ
+㑺 0 ㄗㄨㄣˋ
+儁 0 ㄗㄨㄣˋ
+鵕 0 ㄗㄨㄣˋ
+怎 0 ㄗㄜˇ
+仄 0 ㄗㄜˋ
+側 0 ㄗㄜˋ
+昃 0 ㄗㄜˋ
+庂 0 ㄗㄜˋ
+稄 0 ㄗㄜˋ
+唶 0 ㄗㄜˋ
+崱 0 ㄗㄜˋ
+汄 0 ㄗㄜˋ
+昗 0 ㄗㄜˋ
+諎 0 ㄗㄜˋ
+夨 0 ㄗㄜˋ
+歵 0 ㄗㄜˋ
+則 0 ㄗㄜˊ
+責 0 ㄗㄜˊ
+擇 0 ㄗㄜˊ
+澤 0 ㄗㄜˊ
+嘖 0 ㄗㄜˊ
+窄 0 ㄗㄜˊ
+舴 0 ㄗㄜˊ
+咋 0 ㄗㄜˊ
+幘 0 ㄗㄜˊ
+笮 0 ㄗㄜˊ
+賾 0 ㄗㄜˊ
+迮 0 ㄗㄜˊ
+齰 0 ㄗㄜˊ
+崱 0 ㄗㄜˊ
+萴 0 ㄗㄜˊ
+謮 0 ㄗㄜˊ
+蠌 0 ㄗㄜˊ
+賊 0 ㄗㄜˊ
+蠈 0 ㄗㄜˊ
+柞 0 ㄗㄜˊ
+磧 0 ㄗㄜˊ
+伬 0 ㄗㄜˊ
+岝 0 ㄗㄜˊ
+捑 0 ㄗㄜˊ
+樍 0 ㄗㄜˊ
+檡 0 ㄗㄜˊ
+簀 0 ㄗㄜˊ
+鍘 0 ㄗㄜˊ
+鸅 0 ㄗㄜˊ
+岅 0 ㄗㄜˊ
+択 0 ㄗㄜˊ
+沢 0 ㄗㄜˊ
+岞 0 ㄗㄜˊ
+飵 0 ㄗㄜˊ
+嫧 0 ㄗㄜˊ
+耫 0 ㄗㄜˊ
+鰂 0 ㄗㄜˊ
+鱡 0 ㄗㄜˊ
+戝 0 ㄗㄜˊ
+溭 0 ㄗㄜˊ
+皟 0 ㄗㄜˊ
+瞔 0 ㄗㄜˊ
+襗 0 ㄗㄜˊ
+遭 0 ㄗㄠ
+糟 0 ㄗㄠ
+蹧 0 ㄗㄠ
+傮 0 ㄗㄠ
+慒 0 ㄗㄠ
+鰽 0 ㄗㄠ
+㷮 0 ㄗㄠ
+醩 0 ㄗㄠ
+早 0 ㄗㄠˇ
+棗 0 ㄗㄠˇ
+澡 0 ㄗㄠˇ
+藻 0 ㄗㄠˇ
+蚤 0 ㄗㄠˇ
+璪 0 ㄗㄠˇ
+繰 0 ㄗㄠˇ
+慅 0 ㄗㄠˇ
+溞 0 ㄗㄠˇ
+瑵 0 ㄗㄠˇ
+璅 0 ㄗㄠˇ
+瘙 0 ㄗㄠˇ
+糔 0 ㄗㄠˇ
+鄵 0 ㄗㄠˇ
+枣 0 ㄗㄠˇ
+薻 0 ㄗㄠˇ
+造 0 ㄗㄠˋ
+皂 0 ㄗㄠˋ
+燥 0 ㄗㄠˋ
+噪 0 ㄗㄠˋ
+慥 0 ㄗㄠˋ
+譟 0 ㄗㄠˋ
+灶 0 ㄗㄠˋ
+躁 0 ㄗㄠˋ
+皁 0 ㄗㄠˋ
+趮 0 ㄗㄠˋ
+矂 0 ㄗㄠˋ
+漕 0 ㄗㄠˋ
+糙 0 ㄗㄠˋ
+喿 0 ㄗㄠˋ
+劋 0 ㄗㄠˋ
+幧 0 ㄗㄠˋ
+懆 0 ㄗㄠˋ
+氉 0 ㄗㄠˋ
+簉 0 ㄗㄠˋ
+鐰 0 ㄗㄠˋ
+艁 0 ㄗㄠˋ
+謲 0 ㄗㄠˋ
+竈 0 ㄗㄠˋ
+唕 0 ㄗㄠˋ
+鑿 0 ㄗㄠˊ
+賊 0 ㄗㄟˊ
+戝 0 ㄗㄟˊ
+怎 0 ㄗㄣˇ
+譖 0 ㄗㄣˋ
+ㄈ 0 ㄈ
+不 0 ㄈㄡ
+否 0 ㄈㄡˇ
+缶 0 ㄈㄡˇ
+殕 0 ㄈㄡˇ
+缹 0 ㄈㄡˇ
+鴀 0 ㄈㄡˇ
+不 0 ㄈㄡˇ
+缻 0 ㄈㄡˇ
+雬 0 ㄈㄡˇ
+復 0 ㄈㄡˋ
+复 0 ㄈㄡˋ
+罘 0 ㄈㄡˊ
+芣 0 ㄈㄡˊ
+紑 0 ㄈㄡˊ
+剻 0 ㄈㄡˊ
+浮 0 ㄈㄡˊ
+鴀 0 ㄈㄡˊ
+風 0 ㄈㄥ
+蜂 0 ㄈㄥ
+封 0 ㄈㄥ
+豐 0 ㄈㄥ
+瘋 0 ㄈㄥ
+峰 0 ㄈㄥ
+鋒 0 ㄈㄥ
+丰 0 ㄈㄥ
+烽 0 ㄈㄥ
+楓 0 ㄈㄥ
+諷 0 ㄈㄥ
+酆 0 ㄈㄥ
+葑 0 ㄈㄥ
+灃 0 ㄈㄥ
+犎 0 ㄈㄥ
+捀 0 ㄈㄥ
+桻 0 ㄈㄥ
+妦 0 ㄈㄥ
+檒 0 ㄈㄥ
+偑 0 ㄈㄥ
+崶 0 ㄈㄥ
+蘴 0 ㄈㄥ
+飌 0 ㄈㄥ
+麷 0 ㄈㄥ
+猦 0 ㄈㄥ
+豊 0 ㄈㄥ
+仹 0 ㄈㄥ
+凨 0 ㄈㄥ
+凬 0 ㄈㄥ
+盽 0 ㄈㄥ
+㛔 0 ㄈㄥ
+峯 0 ㄈㄥ
+堼 0 ㄈㄥ
+湗 0 ㄈㄥ
+碸 0 ㄈㄥ
+僼 0 ㄈㄥ
+熢 0 ㄈㄥ
+鄷 0 ㄈㄥ
+鏠 0 ㄈㄥ
+㒥 0 ㄈㄥ
+寷 0 ㄈㄥ
+蠭 0 ㄈㄥ
+凮 0 ㄈㄥ
+䒠 0 ㄈㄥ
+篈 0 ㄈㄥ
+靊 0 ㄈㄥ
+唪 0 ㄈㄥˇ
+覂 0 ㄈㄥˇ
+泛 0 ㄈㄥˇ
+諷 0 ㄈㄥˇ
+奉 0 ㄈㄥˋ
+鳳 0 ㄈㄥˋ
+俸 0 ㄈㄥˋ
+諷 0 ㄈㄥˋ
+縫 0 ㄈㄥˋ
+賵 0 ㄈㄥˋ
+焨 0 ㄈㄥˋ
+風 0 ㄈㄥˋ
+凤 0 ㄈㄥˋ
+凨 0 ㄈㄥˋ
+凬 0 ㄈㄥˋ
+煈 0 ㄈㄥˋ
+綘 0 ㄈㄥˋ
+鳯 0 ㄈㄥˋ
+鴌 0 ㄈㄥˋ
+凮 0 ㄈㄥˋ
+逢 0 ㄈㄥˊ
+縫 0 ㄈㄥˊ
+馮 0 ㄈㄥˊ
+夆 0 ㄈㄥˊ
+渢 0 ㄈㄥˊ
+堸 0 ㄈㄥˊ
+艂 0 ㄈㄥˊ
+摓 0 ㄈㄥˊ
+捀 0 ㄈㄥˊ
+浲 0 ㄈㄥˊ
+莑 0 ㄈㄥˊ
+綘 0 ㄈㄥˊ
+葻 0 ㄈㄥˊ
+漨 0 ㄈㄥˊ
+㵯 0 ㄈㄥˊ
+方 0 ㄈㄤ
+芳 0 ㄈㄤ
+坊 0 ㄈㄤ
+枋 0 ㄈㄤ
+邡 0 ㄈㄤ
+淓 0 ㄈㄤ
+鈁 0 ㄈㄤ
+匚 0 ㄈㄤ
+汸 0 ㄈㄤ
+妨 0 ㄈㄤ
+肪 0 ㄈㄤ
+舫 0 ㄈㄤ
+閍 0 ㄈㄤ
+牥 0 ㄈㄤ
+蚄 0 ㄈㄤ
+趽 0 ㄈㄤ
+訪 0 ㄈㄤˇ
+彷 0 ㄈㄤˇ
+仿 0 ㄈㄤˇ
+紡 0 ㄈㄤˇ
+倣 0 ㄈㄤˇ
+舫 0 ㄈㄤˇ
+昉 0 ㄈㄤˇ
+瓬 0 ㄈㄤˇ
+髣 0 ㄈㄤˇ
+鶭 0 ㄈㄤˇ
+坊 0 ㄈㄤˇ
+妨 0 ㄈㄤˇ
+放 0 ㄈㄤˇ
+㕫 0 ㄈㄤˇ
+昘 0 ㄈㄤˇ
+旊 0 ㄈㄤˇ
+眆 0 ㄈㄤˇ
+鴋 0 ㄈㄤˇ
+放 0 ㄈㄤˋ
+房 0 ㄈㄤˊ
+防 0 ㄈㄤˊ
+妨 0 ㄈㄤˊ
+肪 0 ㄈㄤˊ
+坊 0 ㄈㄤˊ
+魴 0 ㄈㄤˊ
+埅 0 ㄈㄤˊ
+鰟 0 ㄈㄤˊ
+坊 0 ㄈㄤ˙
+番 0 ㄈㄢ
+翻 0 ㄈㄢ
+蕃 0 ㄈㄢ
+繙 0 ㄈㄢ
+幡 0 ㄈㄢ
+帆 0 ㄈㄢ
+旛 0 ㄈㄢ
+籓 0 ㄈㄢ
+僠 0 ㄈㄢ
+嬏 0 ㄈㄢ
+轓 0 ㄈㄢ
+鱕 0 ㄈㄢ
+反 0 ㄈㄢ
+藩 0 ㄈㄢ
+柉 0 ㄈㄢ
+皤 0 ㄈㄢ
+仮 0 ㄈㄢ
+㠶 0 ㄈㄢ
+忛 0 ㄈㄢ
+畨 0 ㄈㄢ
+憣 0 ㄈㄢ
+飜 0 ㄈㄢ
+噃 0 ㄈㄢ
+䑺 0 ㄈㄢ
+反 0 ㄈㄢˇ
+返 0 ㄈㄢˇ
+魬 0 ㄈㄢˇ
+皈 0 ㄈㄢˇ
+橎 0 ㄈㄢˇ
+仮 0 ㄈㄢˇ
+㽹 0 ㄈㄢˇ
+範 0 ㄈㄢˋ
+范 0 ㄈㄢˋ
+犯 0 ㄈㄢˋ
+氾 0 ㄈㄢˋ
+汎 0 ㄈㄢˋ
+飯 0 ㄈㄢˋ
+販 0 ㄈㄢˋ
+泛 0 ㄈㄢˋ
+梵 0 ㄈㄢˋ
+畈 0 ㄈㄢˋ
+笵 0 ㄈㄢˋ
+鄤 0 ㄈㄢˋ
+奿 0 ㄈㄢˋ
+軓 0 ㄈㄢˋ
+軬 0 ㄈㄢˋ
+滼 0 ㄈㄢˋ
+嬔 0 ㄈㄢˋ
+反 0 ㄈㄢˋ
+汛 0 ㄈㄢˋ
+皈 0 ㄈㄢˋ
+汳 0 ㄈㄢˋ
+仮 0 ㄈㄢˋ
+盕 0 ㄈㄢˋ
+飰 0 ㄈㄢˋ
+輽 0 ㄈㄢˋ
+㽹 0 ㄈㄢˋ
+訉 0 ㄈㄢˋ
+凡 0 ㄈㄢˊ
+煩 0 ㄈㄢˊ
+繁 0 ㄈㄢˊ
+帆 0 ㄈㄢˊ
+蕃 0 ㄈㄢˊ
+礬 0 ㄈㄢˊ
+藩 0 ㄈㄢˊ
+樊 0 ㄈㄢˊ
+蘩 0 ㄈㄢˊ
+璠 0 ㄈㄢˊ
+籵 0 ㄈㄢˊ
+墦 0 ㄈㄢˊ
+燔 0 ㄈㄢˊ
+膰 0 ㄈㄢˊ
+蠜 0 ㄈㄢˊ
+蹯 0 ㄈㄢˊ
+颿 0 ㄈㄢˊ
+笲 0 ㄈㄢˊ
+釩 0 ㄈㄢˊ
+瀿 0 ㄈㄢˊ
+鐇 0 ㄈㄢˊ
+勫 0 ㄈㄢˊ
+橎 0 ㄈㄢˊ
+薠 0 ㄈㄢˊ
+羳 0 ㄈㄢˊ
+鷭 0 ㄈㄢˊ
+杋 0 ㄈㄢˊ
+柉 0 ㄈㄢˊ
+瀪 0 ㄈㄢˊ
+氾 0 ㄈㄢˊ
+梵 0 ㄈㄢˊ
+幡 0 ㄈㄢˊ
+芃 0 ㄈㄢˊ
+袢 0 ㄈㄢˊ
+旛 0 ㄈㄢˊ
+凢 0 ㄈㄢˊ
+凣 0 ㄈㄢˊ
+㠶 0 ㄈㄢˊ
+忛 0 ㄈㄢˊ
+匥 0 ㄈㄢˊ
+舤 0 ㄈㄢˊ
+舧 0 ㄈㄢˊ
+棥 0 ㄈㄢˊ
+襎 0 ㄈㄢˊ
+䑺 0 ㄈㄢˊ
+䪤 0 ㄈㄢˊ
+發 0 ㄈㄚ
+伐 0 ㄈㄚ
+瞂 0 ㄈㄚ
+法 0 ㄈㄚ
+筏 0 ㄈㄚ
+閥 0 ㄈㄚ
+栰 0 ㄈㄚ
+彂 0 ㄈㄚ
+灋 0 ㄈㄚ
+佱 0 ㄈㄚ
+傠 0 ㄈㄚ
+法 0 ㄈㄚˇ
+髮 0 ㄈㄚˇ
+砝 0 ㄈㄚˇ
+琺 0 ㄈㄚˇ
+珐 0 ㄈㄚˇ
+髪 0 ㄈㄚˇ
+鍅 0 ㄈㄚˇ
+灋 0 ㄈㄚˇ
+佱 0 ㄈㄚˇ
+法 0 ㄈㄚˋ
+琺 0 ㄈㄚˋ
+珐 0 ㄈㄚˋ
+灋 0 ㄈㄚˋ
+佱 0 ㄈㄚˋ
+乏 0 ㄈㄚˊ
+伐 0 ㄈㄚˊ
+罰 0 ㄈㄚˊ
+閥 0 ㄈㄚˊ
+筏 0 ㄈㄚˊ
+砝 0 ㄈㄚˊ
+茷 0 ㄈㄚˊ
+法 0 ㄈㄚˊ
+疺 0 ㄈㄚˊ
+藅 0 ㄈㄚˊ
+眨 0 ㄈㄚˊ
+窆 0 ㄈㄚˊ
+瞂 0 ㄈㄚˊ
+姂 0 ㄈㄚˊ
+垡 0 ㄈㄚˊ
+栰 0 ㄈㄚˊ
+罸 0 ㄈㄚˊ
+橃 0 ㄈㄚˊ
+灋 0 ㄈㄚˊ
+佱 0 ㄈㄚˊ
+坺 0 ㄈㄚˊ
+佛 0 ㄈㄛˊ
+坲 0 ㄈㄛˊ
+仏 0 ㄈㄛˊ
+夫 0 ㄈㄨ
+膚 0 ㄈㄨ
+敷 0 ㄈㄨ
+孵 0 ㄈㄨ
+伕 0 ㄈㄨ
+麩 0 ㄈㄨ
+跗 0 ㄈㄨ
+趺 0 ㄈㄨ
+柎 0 ㄈㄨ
+砆 0 ㄈㄨ
+鄜 0 ㄈㄨ
+鈇 0 ㄈㄨ
+箙 0 ㄈㄨ
+罦 0 ㄈㄨ
+衭 0 ㄈㄨ
+稃 0 ㄈㄨ
+邞 0 ㄈㄨ
+泭 0 ㄈㄨ
+怤 0 ㄈㄨ
+尃 0 ㄈㄨ
+荴 0 ㄈㄨ
+綒 0 ㄈㄨ
+鳺 0 ㄈㄨ
+姇 0 ㄈㄨ
+糐 0 ㄈㄨ
+璷 0 ㄈㄨ
+紨 0 ㄈㄨ
+不 0 ㄈㄨ
+孚 0 ㄈㄨ
+芙 0 ㄈㄨ
+枹 0 ㄈㄨ
+胕 0 ㄈㄨ
+荂 0 ㄈㄨ
+蚨 0 ㄈㄨ
+呋 0 ㄈㄨ
+玞 0 ㄈㄨ
+肤 0 ㄈㄨ
+旉 0 ㄈㄨ
+粰 0 ㄈㄨ
+麬 0 ㄈㄨ
+麱 0 ㄈㄨ
+妋 0 ㄈㄨ
+㠸 0 ㄈㄨ
+娐 0 ㄈㄨ
+筟 0 ㄈㄨ
+懯 0 ㄈㄨ
+甮 0 ㄈㄨㄥˋ
+府 0 ㄈㄨˇ
+腐 0 ㄈㄨˇ
+撫 0 ㄈㄨˇ
+輔 0 ㄈㄨˇ
+甫 0 ㄈㄨˇ
+斧 0 ㄈㄨˇ
+俯 0 ㄈㄨˇ
+釜 0 ㄈㄨˇ
+脯 0 ㄈㄨˇ
+腑 0 ㄈㄨˇ
+莆 0 ㄈㄨˇ
+滏 0 ㄈㄨˇ
+嘸 0 ㄈㄨˇ
+拊 0 ㄈㄨˇ
+黼 0 ㄈㄨˇ
+簠 0 ㄈㄨˇ
+頫 0 ㄈㄨˇ
+郙 0 ㄈㄨˇ
+弣 0 ㄈㄨˇ
+鯆 0 ㄈㄨˇ
+暊 0 ㄈㄨˇ
+冹 0 ㄈㄨˇ
+蜅 0 ㄈㄨˇ
+蚥 0 ㄈㄨˇ
+軵 0 ㄈㄨˇ
+父 0 ㄈㄨˇ
+阜 0 ㄈㄨˇ
+哺 0 ㄈㄨˇ
+腹 0 ㄈㄨˇ
+嫵 0 ㄈㄨˇ
+膚 0 ㄈㄨˇ
+俛 0 ㄈㄨˇ
+逋 0 ㄈㄨˇ
+幠 0 ㄈㄨˇ
+黻 0 ㄈㄨˇ
+㕶 0 ㄈㄨˇ
+肤 0 ㄈㄨˇ
+俌 0 ㄈㄨˇ
+凂 0 ㄈㄨˇ
+娬 0 ㄈㄨˇ
+捬 0 ㄈㄨˇ
+焤 0 ㄈㄨˇ
+盙 0 ㄈㄨˇ
+秿 0 ㄈㄨˇ
+跔 0 ㄈㄨˇ
+抚 0 ㄈㄨˇ
+呒 0 ㄈㄨˇ
+父 0 ㄈㄨˋ
+負 0 ㄈㄨˋ
+婦 0 ㄈㄨˋ
+付 0 ㄈㄨˋ
+附 0 ㄈㄨˋ
+富 0 ㄈㄨˋ
+復 0 ㄈㄨˋ
+副 0 ㄈㄨˋ
+傅 0 ㄈㄨˋ
+覆 0 ㄈㄨˋ
+複 0 ㄈㄨˋ
+腹 0 ㄈㄨˋ
+咐 0 ㄈㄨˋ
+赴 0 ㄈㄨˋ
+賦 0 ㄈㄨˋ
+駙 0 ㄈㄨˋ
+阜 0 ㄈㄨˋ
+訃 0 ㄈㄨˋ
+馥 0 ㄈㄨˋ
+賻 0 ㄈㄨˋ
+蝮 0 ㄈㄨˋ
+鮒 0 ㄈㄨˋ
+祔 0 ㄈㄨˋ
+偩 0 ㄈㄨˋ
+輹 0 ㄈㄨˋ
+鰒 0 ㄈㄨˋ
+鍑 0 ㄈㄨˋ
+榑 0 ㄈㄨˋ
+复 0 ㄈㄨˋ
+胕 0 ㄈㄨˋ
+蚹 0 ㄈㄨˋ
+萯 0 ㄈㄨˋ
+蝜 0 ㄈㄨˋ
+褔 0 ㄈㄨˋ
+姇 0 ㄈㄨˋ
+峊 0 ㄈㄨˋ
+蛗 0 ㄈㄨˋ
+緮 0 ㄈㄨˋ
+蕧 0 ㄈㄨˋ
+仆 0 ㄈㄨˋ
+愎 0 ㄈㄨˋ
+怀 0 ㄈㄨˋ
+洑 0 ㄈㄨˋ
+紨 0 ㄈㄨˋ
+嬔 0 ㄈㄨˋ
+仅 0 ㄈㄨˋ
+坿 0 ㄈㄨˋ
+冨 0 ㄈㄨˋ
+婏 0 ㄈㄨˋ
+陚 0 ㄈㄨˋ
+媍 0 ㄈㄨˋ
+詂 0 ㄈㄨˋ
+雬 0 ㄈㄨˋ
+椱 0 ㄈㄨˋ
+稪 0 ㄈㄨˋ
+嬎 0 ㄈㄨˋ
+鍢 0 ㄈㄨˋ
+㤔 0 ㄈㄨˋ
+竎 0 ㄈㄨˋ
+袝 0 ㄈㄨˋ
+㷆 0 ㄈㄨˋ
+圑 0 ㄈㄨˋ
+癁 0 ㄈㄨˋ
+疈 0 ㄈㄨˋ
+䪖 0 ㄈㄨˋ
+服 0 ㄈㄨˊ
+福 0 ㄈㄨˊ
+扶 0 ㄈㄨˊ
+浮 0 ㄈㄨˊ
+符 0 ㄈㄨˊ
+伏 0 ㄈㄨˊ
+彿 0 ㄈㄨˊ
+縛 0 ㄈㄨˊ
+幅 0 ㄈㄨˊ
+俘 0 ㄈㄨˊ
+拂 0 ㄈㄨˊ
+苻 0 ㄈㄨˊ
+弗 0 ㄈㄨˊ
+孚 0 ㄈㄨˊ
+袱 0 ㄈㄨˊ
+芙 0 ㄈㄨˊ
+輻 0 ㄈㄨˊ
+蝠 0 ㄈㄨˊ
+匐 0 ㄈㄨˊ
+蜉 0 ㄈㄨˊ
+罘 0 ㄈㄨˊ
+涪 0 ㄈㄨˊ
+夫 0 ㄈㄨˊ
+郛 0 ㄈㄨˊ
+莩 0 ㄈㄨˊ
+怫 0 ㄈㄨˊ
+蚨 0 ㄈㄨˊ
+桴 0 ㄈㄨˊ
+紼 0 ㄈㄨˊ
+茯 0 ㄈㄨˊ
+菔 0 ㄈㄨˊ
+紱 0 ㄈㄨˊ
+咈 0 ㄈㄨˊ
+洑 0 ㄈㄨˊ
+綍 0 ㄈㄨˊ
+艴 0 ㄈㄨˊ
+芾 0 ㄈㄨˊ
+茀 0 ㄈㄨˊ
+艀 0 ㄈㄨˊ
+刜 0 ㄈㄨˊ
+帗 0 ㄈㄨˊ
+笰 0 ㄈㄨˊ
+葍 0 ㄈㄨˊ
+袚 0 ㄈㄨˊ
+氟 0 ㄈㄨˊ
+棴 0 ㄈㄨˊ
+澓 0 ㄈㄨˊ
+烰 0 ㄈㄨˊ
+枹 0 ㄈㄨˊ
+玸 0 ㄈㄨˊ
+岪 0 ㄈㄨˊ
+枎 0 ㄈㄨˊ
+垘 0 ㄈㄨˊ
+昲 0 ㄈㄨˊ
+柫 0 ㄈㄨˊ
+琈 0 ㄈㄨˊ
+虙 0 ㄈㄨˊ
+踾 0 ㄈㄨˊ
+鳧 0 ㄈㄨˊ
+巿 0 ㄈㄨˊ
+沷 0 ㄈㄨˊ
+祓 0 ㄈㄨˊ
+翇 0 ㄈㄨˊ
+韍 0 ㄈㄨˊ
+諨 0 ㄈㄨˊ
+鴔 0 ㄈㄨˊ
+黻 0 ㄈㄨˊ
+鵩 0 ㄈㄨˊ
+鶝 0 ㄈㄨˊ
+佛 0 ㄈㄨˊ
+沸 0 ㄈㄨˊ
+趺 0 ㄈㄨˊ
+孵 0 ㄈㄨˊ
+敷 0 ㄈㄨˊ
+冹 0 ㄈㄨˊ
+坲 0 ㄈㄨˊ
+宓 0 ㄈㄨˊ
+泭 0 ㄈㄨˊ
+狒 0 ㄈㄨˊ
+垺 0 ㄈㄨˊ
+罦 0 ㄈㄨˊ
+萉 0 ㄈㄨˊ
+榑 0 ㄈㄨˊ
+箙 0 ㄈㄨˊ
+仏 0 ㄈㄨˊ
+呋 0 ㄈㄨˊ
+炥 0 ㄈㄨˊ
+畉 0 ㄈㄨˊ
+畐 0 ㄈㄨˊ
+郍 0 ㄈㄨˊ
+鳬 0 ㄈㄨˊ
+哹 0 ㄈㄨˊ
+畗 0 ㄈㄨˊ
+旉 0 ㄈㄨˊ
+鉜 0 ㄈㄨˊ
+箁 0 ㄈㄨˊ
+酻 0 ㄈㄨˊ
+髴 0 ㄈㄨˊ
+鮄 0 ㄈㄨˊ
+鞴 0 ㄈㄨˊ
+乀 0 ㄈㄨˊ
+甶 0 ㄈㄨˊ
+栿 0 ㄈㄨˊ
+絥 0 ㄈㄨˊ
+鉘 0 ㄈㄨˊ
+颫 0 ㄈㄨˊ
+韛 0 ㄈㄨˊ
+非 0 ㄈㄟ
+飛 0 ㄈㄟ
+菲 0 ㄈㄟ
+扉 0 ㄈㄟ
+啡 0 ㄈㄟ
+妃 0 ㄈㄟ
+緋 0 ㄈㄟ
+霏 0 ㄈㄟ
+馡 0 ㄈㄟ
+騑 0 ㄈㄟ
+騛 0 ㄈㄟ
+婓 0 ㄈㄟ
+裶 0 ㄈㄟ
+斐 0 ㄈㄟ
+腓 0 ㄈㄟ
+蜚 0 ㄈㄟ
+餥 0 ㄈㄟ
+婔 0 ㄈㄟ
+渄 0 ㄈㄟ
+猆 0 ㄈㄟ
+靟 0 ㄈㄟ
+䬠 0 ㄈㄟ
+飝 0 ㄈㄟ
+匪 0 ㄈㄟˇ
+翡 0 ㄈㄟˇ
+斐 0 ㄈㄟˇ
+蜚 0 ㄈㄟˇ
+誹 0 ㄈㄟˇ
+悱 0 ㄈㄟˇ
+菲 0 ㄈㄟˇ
+朏 0 ㄈㄟˇ
+棐 0 ㄈㄟˇ
+榧 0 ㄈㄟˇ
+篚 0 ㄈㄟˇ
+奜 0 ㄈㄟˇ
+餥 0 ㄈㄟˇ
+非 0 ㄈㄟˇ
+扉 0 ㄈㄟˇ
+裴 0 ㄈㄟˇ
+昢 0 ㄈㄟˇ
+棑 0 ㄈㄟˇ
+緋 0 ㄈㄟˇ
+裵 0 ㄈㄟˇ
+蕜 0 ㄈㄟˇ
+廢 0 ㄈㄟˋ
+費 0 ㄈㄟˋ
+肺 0 ㄈㄟˋ
+沸 0 ㄈㄟˋ
+吠 0 ㄈㄟˋ
+痱 0 ㄈㄟˋ
+怫 0 ㄈㄟˋ
+疿 0 ㄈㄟˋ
+芾 0 ㄈㄟˋ
+屝 0 ㄈㄟˋ
+剕 0 ㄈㄟˋ
+狒 0 ㄈㄟˋ
+砩 0 ㄈㄟˋ
+濷 0 ㄈㄟˋ
+癈 0 ㄈㄟˋ
+昲 0 ㄈㄟˋ
+胇 0 ㄈㄟˋ
+俷 0 ㄈㄟˋ
+厞 0 ㄈㄟˋ
+曊 0 ㄈㄟˋ
+鼣 0 ㄈㄟˋ
+櫠 0 ㄈㄟˋ
+蟦 0 ㄈㄟˋ
+鐨 0 ㄈㄟˋ
+菲 0 ㄈㄟˋ
+陫 0 ㄈㄟˋ
+琲 0 ㄈㄟˋ
+鯡 0 ㄈㄟˋ
+黂 0 ㄈㄟˋ
+㻗 0 ㄈㄟˋ
+墢 0 ㄈㄟˋ
+橃 0 ㄈㄟˋ
+蕟 0 ㄈㄟˋ
+靅 0 ㄈㄟˋ
+䀟 0 ㄈㄟˋ
+㹃 0 ㄈㄟˋ
+䤵 0 ㄈㄟˋ
+廃 0 ㄈㄟˋ
+肥 0 ㄈㄟˊ
+淝 0 ㄈㄟˊ
+腓 0 ㄈㄟˊ
+萉 0 ㄈㄟˊ
+蜰 0 ㄈㄟˊ
+分 0 ㄈㄣ
+紛 0 ㄈㄣ
+芬 0 ㄈㄣ
+氛 0 ㄈㄣ
+吩 0 ㄈㄣ
+棻 0 ㄈㄣ
+玢 0 ㄈㄣ
+酚 0 ㄈㄣ
+雰 0 ㄈㄣ
+昐 0 ㄈㄣ
+鈖 0 ㄈㄣ
+砏 0 ㄈㄣ
+翂 0 ㄈㄣ
+衯 0 ㄈㄣ
+饙 0 ㄈㄣ
+梤 0 ㄈㄣ
+鳻 0 ㄈㄣ
+汾 0 ㄈㄣ
+邠 0 ㄈㄣ
+錀 0 ㄈㄣ
+岎 0 ㄈㄣ
+帉 0 ㄈㄣ
+㤋 0 ㄈㄣ
+訜 0 ㄈㄣ
+䭻 0 ㄈㄣ
+朆 0 ㄈㄣ
+餴 0 ㄈㄣ
+粉 0 ㄈㄣˇ
+黺 0 ㄈㄣˇ
+份 0 ㄈㄣˋ
+忿 0 ㄈㄣˋ
+奮 0 ㄈㄣˋ
+憤 0 ㄈㄣˋ
+分 0 ㄈㄣˋ
+糞 0 ㄈㄣˋ
+僨 0 ㄈㄣˋ
+瀵 0 ㄈㄣˋ
+坋 0 ㄈㄣˋ
+秎 0 ㄈㄣˋ
+魵 0 ㄈㄣˋ
+橨 0 ㄈㄣˋ
+膹 0 ㄈㄣˋ
+羵 0 ㄈㄣˋ
+拚 0 ㄈㄣˋ
+氛 0 ㄈㄣˋ
+焚 0 ㄈㄣˋ
+噴 0 ㄈㄣˋ
+墳 0 ㄈㄣˋ
+弅 0 ㄈㄣˋ
+幩 0 ㄈㄣˋ
+歕 0 ㄈㄣˋ
+坟 0 ㄈㄣˋ
+坆 0 ㄈㄣˋ
+奋 0 ㄈㄣˋ
+喯 0 ㄈㄣˋ
+燌 0 ㄈㄣˋ
+燓 0 ㄈㄣˋ
+隫 0 ㄈㄣˋ
+鱝 0 ㄈㄣˋ
+獖 0 ㄈㄣˋ
+墳 0 ㄈㄣˊ
+焚 0 ㄈㄣˊ
+汾 0 ㄈㄣˊ
+枌 0 ㄈㄣˊ
+棼 0 ㄈㄣˊ
+蚡 0 ㄈㄣˊ
+豶 0 ㄈㄣˊ
+鼖 0 ㄈㄣˊ
+幩 0 ㄈㄣˊ
+濆 0 ㄈㄣˊ
+轒 0 ㄈㄣˊ
+鼢 0 ㄈㄣˊ
+妢 0 ㄈㄣˊ
+炃 0 ㄈㄣˊ
+羒 0 ㄈㄣˊ
+蒶 0 ㄈㄣˊ
+黂 0 ㄈㄣˊ
+弅 0 ㄈㄣˊ
+蕡 0 ㄈㄣˊ
+鐼 0 ㄈㄣˊ
+秎 0 ㄈㄣˊ
+梤 0 ㄈㄣˊ
+僨 0 ㄈㄣˊ
+鳻 0 ㄈㄣˊ
+橨 0 ㄈㄣˊ
+羵 0 ㄈㄣˊ
+坟 0 ㄈㄣˊ
+坆 0 ㄈㄣˊ
+蚠 0 ㄈㄣˊ
+馚 0 ㄈㄣˊ
+燌 0 ㄈㄣˊ
+燓 0 ㄈㄣˊ
+隫 0 ㄈㄣˊ
+馩 0 ㄈㄣˊ
+覅 0 ㄈㄧㄠˋ
diff --git a/include/internal/bopomofo-private.h b/include/internal/bopomofo-private.h
index 966c06d..7a06686 100644
--- a/include/internal/bopomofo-private.h
+++ b/include/internal/bopomofo-private.h
@@ -48,6 +48,10 @@ int BopomofoPhoInput(ChewingData *, int key); /* assume `key' is "ascii" c
int BopomofoRemoveLast(BopomofoData *);
int BopomofoRemoveAll(BopomofoData *);
int BopomofoIsEntering(BopomofoData *);
+int BopomofoKeyseq(BopomofoData *, char key_seq[10]);
+int BopomofoSyllableIndex(BopomofoData *);
+int BopomofoSyllableIndexAlt(BopomofoData *);
+int BopomofoKbType(BopomofoData *);

/* *INDENT-OFF* */
#endif
diff --git a/include/internal/chewing-private.h b/include/internal/chewing-private.h
index 2c3a7ab..334dd50 100644
--- a/include/internal/chewing-private.h
+++ b/include/internal/chewing-private.h
@@ -34,14 +34,14 @@ typedef SSIZE_T ssize_t;
# include "chewing_internal.h"
#else
# include "global.h"
+# include "plat_mmap.h"
+# include "userphrase-private.h"
+# if WITH_SQLITE3
+# include "sqlite3.h"
+# include "chewing-sql.h"
+# endif
#endif
-#include "plat_mmap.h"

-#include "userphrase-private.h"
-#if WITH_SQLITE3
-# include "sqlite3.h"
-# include "chewing-sql.h"
-#endif

#define MAX_UTF8_SIZE 4
#define BOPOMOFO_SIZE 4
@@ -78,6 +78,7 @@ static inline int min(int a, int b)
}
#endif

+#ifndef WITH_RUST
/**
* @struct TreeType
* @brief node type of the system index tree
@@ -204,11 +205,11 @@ typedef struct ChewingStaticData {
struct HASH_ITEM *userphrase_enum; /* FIXME: Shall be in ChewingData? */
#endif

- unsigned int n_symbol_entry;
- SymbolEntry **symbol_table;
+ unsigned int nSymbolEntry;
+ SymbolEntry **symbolTable;

- char *g_easy_symbol_value[EASY_SYMBOL_KEY_TAB_LEN];
- int g_easy_symbol_num[EASY_SYMBOL_KEY_TAB_LEN];
+ char *gEasySymbolValue[EASY_SYMBOL_KEY_TAB_LEN];
+ int gEasySymbolNum[EASY_SYMBOL_KEY_TAB_LEN];

struct keymap *hanyuInitialsMap;
struct keymap *hanyuFinalsMap;
@@ -237,8 +238,8 @@ typedef struct ChewingData {
PreeditBuf preeditBuf[MAX_PHONE_SEQ_LEN];
int chiSymbolCursor;
int chiSymbolBufLen;
- int PointStart;
- int PointEnd;
+ int pointStart;
+ int pointEnd;

int bShowMsg;
char showMsg[MAX_UTF8_SIZE * (MAX_PHRASE_LEN + AUX_PREFIX_LEN) + 1];
@@ -267,7 +268,7 @@ typedef struct ChewingData {
struct HASH_ITEM *prev_userphrase;
#endif

- ChewingStaticData static_data;
+ ChewingStaticData staticData;
void (*logger) (void *data, int level, const char *fmt, ...);
void *loggerData;
} ChewingData;
@@ -284,8 +285,8 @@ typedef struct ChewingOutput {
int chiSymbolBufLen;
/** @brief current position of the cursor. */
long chiSymbolCursor;
- long PointStart;
- long PointEnd;
+ long pointStart;
+ long pointEnd;
char bopomofoBuf[BOPOMOFO_SIZE * MAX_UTF8_SIZE + 1];
/** @brief indicate the method of showing sentence break. */
IntervalType dispInterval[MAX_INTERVAL]; /* from prefer, considering symbol */
@@ -323,6 +324,7 @@ typedef struct Phrase {
char phrase[MAX_PHRASE_LEN * MAX_UTF8_SIZE + 1];
int freq;
} Phrase;
+#endif

/* *INDENT-OFF* */
#endif
diff --git a/src/bopomofo.c b/src/bopomofo.c
index d519e3c..726aa2d 100644
--- a/src/bopomofo.c
+++ b/src/bopomofo.c
@@ -700,3 +700,24 @@ int BopomofoIsEntering(BopomofoData *pBopomofo)
}
return 0;
}
+
+int BopomofoKeyseq(BopomofoData *pBopomofo, char key_seq[10])
+{
+ strcpy(key_seq, pBopomofo->pinYinData.keySeq);
+ return 1;
+}
+
+int BopomofoSyllableIndex(BopomofoData *pBopomofo)
+{
+ return pBopomofo->phone;
+}
+
+int BopomofoSyllableIndexAlt(BopomofoData *pBopomofo)
+{
+ return pBopomofo->phoneAlt;
+}
+
+int BopomofoKbType(BopomofoData *pBopomofo)
+{
+ return pBopomofo->kbtype;
+}
\ No newline at end of file
diff --git a/src/chewing-sql.c b/src/chewing-sql.c
index 7c9677a..bf77b73 100644
--- a/src/chewing-sql.c
+++ b/src/chewing-sql.c
@@ -116,7 +116,7 @@ static int CreateTable(ChewingData *pgdata)

STATIC_ASSERT(MAX_PHRASE_LEN == 11);

- ret = sqlite3_exec(pgdata->static_data.db,
+ ret = sqlite3_exec(pgdata->staticData.db,
"CREATE TABLE IF NOT EXISTS userphrase_v1 ("
"time INTEGER,"
"user_freq INTEGER,"
@@ -153,7 +153,7 @@ static int CreateTable(ChewingData *pgdata)
return -1;
}

- ret = sqlite3_exec(pgdata->static_data.db,
+ ret = sqlite3_exec(pgdata->staticData.db,
"CREATE TABLE IF NOT EXISTS config_v1 ("
"id INTEGER,"
"value INTEGER,"
@@ -170,55 +170,55 @@ static int SetupUserphraseLifeTime(ChewingData *pgdata)
{
int ret;

- assert(pgdata->static_data.stmt_config[STMT_CONFIG_INSERT]);
+ assert(pgdata->staticData.stmt_config[STMT_CONFIG_INSERT]);

- ret = sqlite3_bind_int(pgdata->static_data.stmt_config[STMT_CONFIG_INSERT], BIND_CONFIG_ID, CONFIG_ID_LIFETIME);
+ ret = sqlite3_bind_int(pgdata->staticData.stmt_config[STMT_CONFIG_INSERT], BIND_CONFIG_ID, CONFIG_ID_LIFETIME);
if (ret != SQLITE_OK) {
LOG_ERROR("Cannot bind ?%d to %d in stmt %s, error = %d",
BIND_CONFIG_ID, CONFIG_ID_LIFETIME, SQL_STMT_CONFIG[STMT_CONFIG_INSERT].stmt, ret);
return -1;
}

- ret = sqlite3_bind_int(pgdata->static_data.stmt_config[STMT_CONFIG_INSERT], BIND_CONFIG_VALUE, 0);
+ ret = sqlite3_bind_int(pgdata->staticData.stmt_config[STMT_CONFIG_INSERT], BIND_CONFIG_VALUE, 0);
if (ret != SQLITE_OK) {
LOG_ERROR("Cannot bind ?%d to %d in stmt %s, error = %d",
BIND_CONFIG_VALUE, 0, SQL_STMT_CONFIG[STMT_CONFIG_INSERT].stmt, ret);
return -1;
}

- ret = sqlite3_step(pgdata->static_data.stmt_config[STMT_CONFIG_INSERT]);
+ ret = sqlite3_step(pgdata->staticData.stmt_config[STMT_CONFIG_INSERT]);
if (ret != SQLITE_DONE) {
LOG_ERROR("sqlite3_step returns %d", ret);
return -1;
}

- ret = sqlite3_reset(pgdata->static_data.stmt_config[STMT_CONFIG_INSERT]);
+ ret = sqlite3_reset(pgdata->staticData.stmt_config[STMT_CONFIG_INSERT]);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_reset returns %d", ret);
return -1;
}

- assert(pgdata->static_data.stmt_config[STMT_CONFIG_SELECT]);
+ assert(pgdata->staticData.stmt_config[STMT_CONFIG_SELECT]);

- ret = sqlite3_bind_int(pgdata->static_data.stmt_config[STMT_CONFIG_SELECT], BIND_CONFIG_ID, CONFIG_ID_LIFETIME);
+ ret = sqlite3_bind_int(pgdata->staticData.stmt_config[STMT_CONFIG_SELECT], BIND_CONFIG_ID, CONFIG_ID_LIFETIME);
if (ret != SQLITE_OK) {
LOG_ERROR("Cannot bind ?%d to %d in stmt %s, error = %d",
BIND_CONFIG_ID, CONFIG_ID_LIFETIME, SQL_STMT_CONFIG[STMT_CONFIG_SELECT].stmt, ret);
return -1;
}

- ret = sqlite3_step(pgdata->static_data.stmt_config[STMT_CONFIG_SELECT]);
+ ret = sqlite3_step(pgdata->staticData.stmt_config[STMT_CONFIG_SELECT]);
if (ret != SQLITE_ROW) {
LOG_ERROR("sqlite3_step returns %d", ret);
return -1;
}

- pgdata->static_data.original_lifetime = sqlite3_column_int(pgdata->static_data.stmt_config[STMT_CONFIG_SELECT],
+ pgdata->staticData.original_lifetime = sqlite3_column_int(pgdata->staticData.stmt_config[STMT_CONFIG_SELECT],
SQL_STMT_CONFIG[STMT_CONFIG_SELECT].column
[COLUMN_CONFIG_VALUE]);
- pgdata->static_data.new_lifetime = pgdata->static_data.original_lifetime;
+ pgdata->staticData.new_lifetime = pgdata->staticData.original_lifetime;

- ret = sqlite3_reset(pgdata->static_data.stmt_config[STMT_CONFIG_SELECT]);
+ ret = sqlite3_reset(pgdata->staticData.stmt_config[STMT_CONFIG_SELECT]);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_reset returns %d", ret);
return -1;
@@ -232,20 +232,20 @@ static int UpdateLifeTime(ChewingData *pgdata)
int ret;
int result = 0;

- if (!pgdata->static_data.stmt_config[STMT_CONFIG_INCREASE]) {
- LOG_ERROR("pgdata->static_data.stmt_config[STMT_CONFIG_INCREASE] is NULL");
+ if (!pgdata->staticData.stmt_config[STMT_CONFIG_INCREASE]) {
+ LOG_ERROR("pgdata->staticData.stmt_config[STMT_CONFIG_INCREASE] is NULL");
result = -1;
goto end;
}

- ret = sqlite3_clear_bindings(pgdata->static_data.stmt_config[STMT_CONFIG_INCREASE]);
+ ret = sqlite3_clear_bindings(pgdata->staticData.stmt_config[STMT_CONFIG_INCREASE]);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_clear_bindings returns %d", ret);
result = -1;
goto end;
}

- ret = sqlite3_bind_int(pgdata->static_data.stmt_config[STMT_CONFIG_INCREASE], BIND_CONFIG_ID, CONFIG_ID_LIFETIME);
+ ret = sqlite3_bind_int(pgdata->staticData.stmt_config[STMT_CONFIG_INCREASE], BIND_CONFIG_ID, CONFIG_ID_LIFETIME);
if (ret != SQLITE_OK) {
LOG_ERROR("Cannot bind ?%d to %d in stmt %s, error = %d",
BIND_CONFIG_ID, CONFIG_ID_LIFETIME, SQL_STMT_CONFIG[STMT_CONFIG_INCREASE].stmt, ret);
@@ -253,18 +253,18 @@ static int UpdateLifeTime(ChewingData *pgdata)
goto end;
}

- ret = sqlite3_bind_int(pgdata->static_data.stmt_config[STMT_CONFIG_INCREASE],
- BIND_CONFIG_VALUE, pgdata->static_data.new_lifetime - pgdata->static_data.original_lifetime);
+ ret = sqlite3_bind_int(pgdata->staticData.stmt_config[STMT_CONFIG_INCREASE],
+ BIND_CONFIG_VALUE, pgdata->staticData.new_lifetime - pgdata->staticData.original_lifetime);
if (ret != SQLITE_OK) {
LOG_ERROR("Cannot bind ?%d to %d in stmt %s, error = %d",
BIND_CONFIG_VALUE,
- pgdata->static_data.new_lifetime - pgdata->static_data.original_lifetime,
+ pgdata->staticData.new_lifetime - pgdata->staticData.original_lifetime,
SQL_STMT_CONFIG[STMT_CONFIG_INCREASE].stmt, ret);
result = -1;
goto end;
}

- ret = sqlite3_step(pgdata->static_data.stmt_config[STMT_CONFIG_INCREASE]);
+ ret = sqlite3_step(pgdata->staticData.stmt_config[STMT_CONFIG_INCREASE]);
if (ret != SQLITE_DONE) {
LOG_ERROR("sqlite3_step returns %d", ret);
result = -1;
@@ -272,7 +272,7 @@ static int UpdateLifeTime(ChewingData *pgdata)
}

end:
- ret = sqlite3_reset(pgdata->static_data.stmt_config[STMT_CONFIG_INCREASE]);
+ ret = sqlite3_reset(pgdata->staticData.stmt_config[STMT_CONFIG_INCREASE]);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_reset returns %d", ret);
result = -1;
@@ -286,9 +286,9 @@ static int ConfigDatabase(ChewingData *pgdata)
int ret;

assert(pgdata);
- assert(pgdata->static_data.db);
+ assert(pgdata->staticData.db);

- ret = sqlite3_exec(pgdata->static_data.db, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
+ ret = sqlite3_exec(pgdata->staticData.db, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
if (ret != SQLITE_OK) {
LOG_ERROR("Cannot set synchronous=OFF, error = %d", ret);
return -1;
@@ -304,12 +304,12 @@ static int CreateStmt(ChewingData *pgdata)

assert(pgdata);

- STATIC_ASSERT(ARRAY_SIZE(SQL_STMT_CONFIG) == ARRAY_SIZE(pgdata->static_data.stmt_config));
- STATIC_ASSERT(ARRAY_SIZE(SQL_STMT_USERPHRASE) == ARRAY_SIZE(pgdata->static_data.stmt_userphrase));
+ STATIC_ASSERT(ARRAY_SIZE(SQL_STMT_CONFIG) == ARRAY_SIZE(pgdata->staticData.stmt_config));
+ STATIC_ASSERT(ARRAY_SIZE(SQL_STMT_USERPHRASE) == ARRAY_SIZE(pgdata->staticData.stmt_userphrase));

for (i = 0; i < ARRAY_SIZE(SQL_STMT_CONFIG); ++i) {
- ret = sqlite3_prepare_v2(pgdata->static_data.db,
- SQL_STMT_CONFIG[i].stmt, -1, &pgdata->static_data.stmt_config[i], NULL);
+ ret = sqlite3_prepare_v2(pgdata->staticData.db,
+ SQL_STMT_CONFIG[i].stmt, -1, &pgdata->staticData.stmt_config[i], NULL);
if (ret != SQLITE_OK) {
LOG_ERROR("Cannot create stmt %s", SQL_STMT_CONFIG[i].stmt);
return -1;
@@ -317,8 +317,8 @@ static int CreateStmt(ChewingData *pgdata)
}

for (i = 0; i < ARRAY_SIZE(SQL_STMT_USERPHRASE); ++i) {
- ret = sqlite3_prepare_v2(pgdata->static_data.db,
- SQL_STMT_USERPHRASE[i].stmt, -1, &pgdata->static_data.stmt_userphrase[i], NULL);
+ ret = sqlite3_prepare_v2(pgdata->staticData.db,
+ SQL_STMT_USERPHRASE[i].stmt, -1, &pgdata->staticData.stmt_userphrase[i], NULL);
if (ret != SQLITE_OK) {
LOG_ERROR("Cannot create stmt %s", SQL_STMT_USERPHRASE[i].stmt);
return -1;
@@ -432,11 +432,11 @@ int InitUserphrase(ChewingData *pgdata, const char *path)
{
int ret;

- assert(!pgdata->static_data.db);
+ assert(!pgdata->staticData.db);
assert(path);

- pgdata->static_data.db = GetSQLiteInstance(pgdata, path);
- if (!pgdata->static_data.db) {
+ pgdata->staticData.db = GetSQLiteInstance(pgdata, path);
+ if (!pgdata->staticData.db) {
LOG_ERROR("GetSQLiteInstance fails");
goto error;
}
@@ -483,17 +483,17 @@ void TerminateUserphrase(ChewingData *pgdata)

UpdateLifeTime(pgdata);

- for (i = 0; i < ARRAY_SIZE(pgdata->static_data.stmt_config); ++i) {
- sqlite3_finalize(pgdata->static_data.stmt_config[i]);
- pgdata->static_data.stmt_config[i] = NULL;
+ for (i = 0; i < ARRAY_SIZE(pgdata->staticData.stmt_config); ++i) {
+ sqlite3_finalize(pgdata->staticData.stmt_config[i]);
+ pgdata->staticData.stmt_config[i] = NULL;
}

- for (i = 0; i < ARRAY_SIZE(pgdata->static_data.stmt_userphrase); ++i) {
- sqlite3_finalize(pgdata->static_data.stmt_userphrase[i]);
- pgdata->static_data.stmt_userphrase[i] = NULL;
+ for (i = 0; i < ARRAY_SIZE(pgdata->staticData.stmt_userphrase); ++i) {
+ sqlite3_finalize(pgdata->staticData.stmt_userphrase[i]);
+ pgdata->staticData.stmt_userphrase[i] = NULL;
}

- ret = sqlite3_close(pgdata->static_data.db);
+ ret = sqlite3_close(pgdata->staticData.db);
assert(SQLITE_OK == ret);
- pgdata->static_data.db = NULL;
+ pgdata->staticData.db = NULL;
}
diff --git a/src/chewing.c b/src/chewing.c
new file mode 100644
index 0000000..e69de29
diff --git a/src/chewingio.c b/src/chewingio.c
index 3e37122..c6210b4 100644
--- a/src/chewingio.c
+++ b/src/chewingio.c
@@ -26,27 +26,33 @@
#include <stdlib.h>
#include <stdio.h>

-#include "chewing-utf8-util.h"
-#include "bopomofo-private.h"
#include "chewingutil.h"
-#include "userphrase-private.h"
#include "choice-private.h"
-#include "dict-private.h"
-#include "tree-private.h"
-#include "pinyin-private.h"
#include "private.h"
#include "chewingio.h"
#include "mod_aux.h"
#include "global-private.h"
+
+#ifdef WITH_RUST
+# include "chewing_rs.h"
+# include "chewing_internal.h"
+#else
+#include "global.h"
+#include "bopomofo-private.h"
+#include "chewing-utf8-util.h"
+#include "dict-private.h"
+#include "key2pho-private.h"
+#include "pinyin-private.h"
#include "plat_path.h"
+#include "tree-private.h"
+#include "userphrase-private.h"
#include "chewing-private.h"
-#include "key2pho-private.h"
-
#if WITH_SQLITE3
# include "chewing-sql.h"
#else
# include "hash-private.h"
#endif
+#endif

const char *const kb_type_str[] = {
"KB_DEFAULT",
@@ -64,11 +70,19 @@ const char *const kb_type_str[] = {
"KB_CARPALX"
};

+#ifdef WITH_RUST
+const char *const DICT_FILES[] = {
+ "tsi.dat",
+ "word.dat",
+ NULL,
+};
+#else
const char *const DICT_FILES[] = {
DICT_FILE,
PHONE_TREE_FILE,
NULL,
};
+#endif

const char *const SYMBOL_TABLE_FILES[] = {
SYMBOL_TABLE_FILE,
@@ -291,10 +305,15 @@ CHEWING_API ChewingContext *chewing_new()
CHEWING_API int chewing_Reset(ChewingContext *ctx)
{
ChewingData *pgdata;
- ChewingStaticData static_data;
+ ChewingStaticData staticData;
ChewingConfigData old_config;
void (*logger) (void *data, int level, const char *fmt, ...);
void *loggerData;
+#ifdef WITH_RUST
+ const void *dict;
+ void *ce;
+ void *ue;
+#endif

if (!ctx) {
return -1;
@@ -305,17 +324,32 @@ CHEWING_API int chewing_Reset(ChewingContext *ctx)

/* Backup old config and restore it after clearing pgdata structure. */
old_config = pgdata->config;
- static_data = pgdata->static_data;
+ staticData = pgdata->staticData;
logger = pgdata->logger;
loggerData = pgdata->loggerData;
+#ifdef WITH_RUST
+ dict = pgdata->dict;
+ ce = pgdata->ce;
+ ue = pgdata->ue;
+ if (pgdata->bopomofoData.editorWithKeymap != 0) {
+ FreePhoneticEditor(pgdata->bopomofoData.editorWithKeymap);
+ }
+#endif
memset(pgdata, 0, sizeof(ChewingData));
pgdata->config = old_config;
- pgdata->static_data = static_data;
+ pgdata->staticData = staticData;
pgdata->logger = logger;
pgdata->loggerData = loggerData;

+#ifdef WITH_RUST
+ pgdata->dict = dict;
+ pgdata->ce = ce;
+ pgdata->ue = ue;
+ chewing_set_KBType(ctx, KB_DEFAULT);
+#else
/* bopomofoData */
memset(&(pgdata->bopomofoData), 0, sizeof(BopomofoData));
+#endif

/* choiceInfo */
memset(&(pgdata->choiceInfo), 0, sizeof(ChoiceInfo));
@@ -329,8 +363,8 @@ CHEWING_API int chewing_Reset(ChewingContext *ctx)
pgdata->bFullShape = HALFSHAPE_MODE;
pgdata->bSelect = 0;
pgdata->nSelect = 0;
- pgdata->PointStart = -1;
- pgdata->PointEnd = 0;
+ pgdata->pointStart = -1;
+ pgdata->pointEnd = 0;
pgdata->phrOut.nNumCut = 0;
return 0;
}
@@ -346,6 +380,18 @@ CHEWING_API int chewing_set_KBType(ChewingContext *ctx, int kbtype)

LOG_API("kbtype = %d", kbtype);

+#ifdef WITH_RUST
+ if (pgdata->bopomofoData.editorWithKeymap != 0) {
+ FreePhoneticEditor(pgdata->bopomofoData.editorWithKeymap);
+ }
+ if (kbtype < KB_TYPE_NUM && kbtype >= 0) {
+ pgdata->bopomofoData.editorWithKeymap = NewPhoneticEditor(kbtype);
+ return 0;
+ } else {
+ pgdata->bopomofoData.editorWithKeymap = NewPhoneticEditor(KB_DEFAULT);
+ return -1;
+ }
+#else
if (kbtype < KB_TYPE_NUM && kbtype >= 0) {
ctx->data->bopomofoData.kbtype = kbtype;
return 0;
@@ -353,6 +399,7 @@ CHEWING_API int chewing_set_KBType(ChewingContext *ctx, int kbtype)
ctx->data->bopomofoData.kbtype = KB_DEFAULT;
return -1;
}
+#endif
}

CHEWING_API int chewing_get_KBType(const ChewingContext *ctx)
@@ -364,9 +411,11 @@ CHEWING_API int chewing_get_KBType(const ChewingContext *ctx)
}
pgdata = ctx->data;

- LOG_API("kbtype = %d", ctx->data->bopomofoData.kbtype);
+ int kbtype = BopomofoKbType(&ctx->data->bopomofoData);

- return ctx->data->bopomofoData.kbtype;
+ LOG_API("kbtype = %d", kbtype);
+
+ return kbtype;
}

CHEWING_API char *chewing_get_KBString(const ChewingContext *ctx)
@@ -378,18 +427,27 @@ CHEWING_API char *chewing_get_KBString(const ChewingContext *ctx)
}
pgdata = ctx->data;

- LOG_API("KBString = %s", kb_type_str[ctx->data->bopomofoData.kbtype]);
+ int kbtype = BopomofoKbType(&ctx->data->bopomofoData);
+
+ LOG_API("KBString = %s", kb_type_str[kbtype]);

- return strdup(kb_type_str[ctx->data->bopomofoData.kbtype]);
+ return strdup(kb_type_str[kbtype]);
}

CHEWING_API void chewing_delete(ChewingContext *ctx)
{
if (ctx) {
if (ctx->data) {
+ if (ctx->data->bSelect) {
+ chewing_cand_close(ctx);
+ }
TerminatePinyin(ctx->data);
TerminateEasySymbolTable(ctx->data);
TerminateSymbolTable(ctx->data);
+#ifdef WITH_RUST
+ FreePhoneticEditor(ctx->data->bopomofoData.editorWithKeymap);
+ UserGetPhraseEnd(ctx->data, NULL);
+#endif
TerminateUserphrase(ctx->data);
TerminateTree(ctx->data);
TerminateDict(ctx->data);
@@ -772,9 +830,9 @@ CHEWING_API int chewing_get_autoLearn(const ChewingContext *ctx)

static void CheckAndResetRange(ChewingData *pgdata)
{
- if (pgdata->PointStart > -1) {
- pgdata->PointStart = -1;
- pgdata->PointEnd = 0;
+ if (pgdata->pointStart > -1) {
+ pgdata->pointStart = -1;
+ pgdata->pointEnd = 0;
}
}

@@ -906,26 +964,26 @@ CHEWING_API int chewing_handle_Enter(ChewingContext *ctx)
keystrokeRtn = KEYSTROKE_IGNORE;
} else if (pgdata->bSelect) {
keystrokeRtn = KEYSTROKE_ABSORB | KEYSTROKE_BELL;
- } else if (pgdata->PointStart > -1) {
+ } else if (pgdata->pointStart > -1) {
int buf = pgdata->chiSymbolCursor;
int key = '0';

- if (pgdata->PointEnd > 1) {
+ if (pgdata->pointEnd > 1) {
if (!pgdata->config.bAddPhraseForward) {
- pgdata->chiSymbolCursor = pgdata->PointStart;
+ pgdata->chiSymbolCursor = pgdata->pointStart;
} else {
- pgdata->chiSymbolCursor = pgdata->PointStart + pgdata->PointEnd;
+ pgdata->chiSymbolCursor = pgdata->pointStart + pgdata->pointEnd;
}
- key = '0' + pgdata->PointEnd;
- } else if (pgdata->PointEnd < 1) {
+ key = '0' + pgdata->pointEnd;
+ } else if (pgdata->pointEnd < 1) {
if (pgdata->config.bAddPhraseForward)
- pgdata->chiSymbolCursor = buf - pgdata->PointEnd;
- key = '0' - pgdata->PointEnd;
+ pgdata->chiSymbolCursor = buf - pgdata->pointEnd;
+ key = '0' - pgdata->pointEnd;
}
chewing_handle_CtrlNum(ctx, key);
pgdata->chiSymbolCursor = buf;
- pgdata->PointStart = -1;
- pgdata->PointEnd = 0;
+ pgdata->pointStart = -1;
+ pgdata->pointEnd = 0;
MakeOutputWithRtn(pgo, pgdata, keystrokeRtn);
MakeOutputAddMsgAndCleanInterval(pgo, pgdata);
return 0;
@@ -1098,16 +1156,16 @@ CHEWING_API int chewing_handle_ShiftLeft(ChewingContext *ctx)
keystrokeRtn = KEYSTROKE_IGNORE;
}
if (!pgdata->bSelect) {
- /* PointEnd locates (-9, +9) */
- if (!BopomofoIsEntering(&(pgdata->bopomofoData)) && pgdata->chiSymbolCursor > 0 && pgdata->PointEnd > -9) {
- if (pgdata->PointStart == -1)
- pgdata->PointStart = pgdata->chiSymbolCursor;
+ /* pointEnd locates (-9, +9) */
+ if (!BopomofoIsEntering(&(pgdata->bopomofoData)) && pgdata->chiSymbolCursor > 0 && pgdata->pointEnd > -9) {
+ if (pgdata->pointStart == -1)
+ pgdata->pointStart = pgdata->chiSymbolCursor;
pgdata->chiSymbolCursor--;
if (ChewingIsChiAt(pgdata->chiSymbolCursor, pgdata)) {
- pgdata->PointEnd--;
+ pgdata->pointEnd--;
}
- if (pgdata->PointEnd == 0)
- pgdata->PointStart = -1;
+ if (pgdata->pointEnd == 0)
+ pgdata->pointStart = -1;
}
}

@@ -1169,17 +1227,17 @@ CHEWING_API int chewing_handle_ShiftRight(ChewingContext *ctx)
}

if (!pgdata->bSelect) {
- /* PointEnd locates (-9, +9) */
+ /* pointEnd locates (-9, +9) */
if (!BopomofoIsEntering(&(pgdata->bopomofoData)) &&
- pgdata->chiSymbolCursor < pgdata->chiSymbolBufLen && pgdata->PointEnd < 9) {
- if (pgdata->PointStart == -1)
- pgdata->PointStart = pgdata->chiSymbolCursor;
+ pgdata->chiSymbolCursor < pgdata->chiSymbolBufLen && pgdata->pointEnd < 9) {
+ if (pgdata->pointStart == -1)
+ pgdata->pointStart = pgdata->chiSymbolCursor;
if (ChewingIsChiAt(pgdata->chiSymbolCursor, pgdata)) {
- pgdata->PointEnd++;
+ pgdata->pointEnd++;
}
pgdata->chiSymbolCursor++;
- if (pgdata->PointEnd == 0)
- pgdata->PointStart = -1;
+ if (pgdata->pointEnd == 0)
+ pgdata->pointStart = -1;
}
}

@@ -1495,7 +1553,7 @@ CHEWING_API int chewing_handle_Default(ChewingContext *ctx, int key)
DEBUG_OUT(" key=%d", key);

/* Dvorak Hsu */
- if (pgdata->bopomofoData.kbtype == KB_DVORAK_HSU) {
+ if (BopomofoKbType(&pgdata->bopomofoData) == KB_DVORAK_HSU) {
key = dvorak_convert(key);
}

@@ -1564,7 +1622,8 @@ CHEWING_API int chewing_handle_Default(ChewingContext *ctx, int key)
keystrokeRtn = KEYSTROKE_ABSORB;
break;
case BOPOMOFO_COMMIT:
- AddChi(pgdata->bopomofoData.phone, pgdata->bopomofoData.phoneAlt, pgdata);
+ AddChi(BopomofoSyllableIndex(&pgdata->bopomofoData), BopomofoSyllableIndexAlt(&pgdata->bopomofoData), pgdata);
+ BopomofoRemoveAll(&pgdata->bopomofoData);
break;
case BOPOMOFO_NO_WORD:
keystrokeRtn = KEYSTROKE_BELL | KEYSTROKE_ABSORB;
@@ -1887,27 +1946,32 @@ CHEWING_API int chewing_userphrase_enumerate(ChewingContext *ctx)
{
ChewingData *pgdata;

-#if WITH_SQLITE3
- int ret;
-#endif
-
if (!ctx) {
return -1;
}

+#ifdef WITH_RUST
+ UserGetPhraseEnd(ctx->data, NULL);
+ ctx->data->phraseIter = UserEnumeratePhrase(ctx->data->ue);
+#else
+#if WITH_SQLITE3
+ int ret;
+#endif
+
pgdata = ctx->data;

LOG_API("");

#if WITH_SQLITE3
- assert(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT]);
- ret = sqlite3_reset(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT]);
+ assert(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT]);
+ ret = sqlite3_reset(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT]);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_reset returns %d", ret);
return -1;
}
#else
- pgdata->static_data.userphrase_enum = FindNextHash(pgdata, NULL);
+ pgdata->staticData.userphrase_enum = FindNextHash(pgdata, NULL);
+#endif
#endif
return 0;
}
@@ -1916,19 +1980,23 @@ CHEWING_API int chewing_userphrase_has_next(ChewingContext *ctx, unsigned int *p
{
ChewingData *pgdata;

+ if (!ctx || !phrase_len || !bopomofo_len) {
+ return 0;
+ }
+
+#ifdef WITH_RUST
+ return UserEnumerateHasNext(ctx->data->phraseIter, phrase_len, bopomofo_len);
+#else
#if WITH_SQLITE3
int ret;
#endif

- if (!ctx || !phrase_len || !bopomofo_len) {
- return 0;
- }
pgdata = ctx->data;

LOG_API("");

#if WITH_SQLITE3
- ret = sqlite3_step(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT]);
+ ret = sqlite3_step(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT]);
if (ret != SQLITE_ROW) {
if (ret != SQLITE_DONE) {
LOG_ERROR("sqlite3_step returns %d", ret);
@@ -1936,24 +2004,26 @@ CHEWING_API int chewing_userphrase_has_next(ChewingContext *ctx, unsigned int *p
return 0;
}

- *phrase_len = strlen((const char *) sqlite3_column_text(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT],
+ *phrase_len = strlen((const char *) sqlite3_column_text(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT].column
[COLUMN_USERPHRASE_PHRASE])) + 1;

- *bopomofo_len = GetBopomofoBufLen(sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT],
+ *bopomofo_len = GetBopomofoBufLen(sqlite3_column_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT].column
[COLUMN_USERPHRASE_LENGTH]));

return 1;
#else
- if (pgdata->static_data.userphrase_enum) {
- *phrase_len = strlen(pgdata->static_data.userphrase_enum->data.wordSeq) + 1;
- *bopomofo_len = BopomofoFromUintArray(NULL, 0, pgdata->static_data.userphrase_enum->data.phoneSeq);
+ if (pgdata->staticData.userphrase_enum) {
+ *phrase_len = strlen(pgdata->staticData.userphrase_enum->data.wordSeq) + 1;
+ *bopomofo_len = BopomofoFromUintArray(NULL, 0, pgdata->staticData.userphrase_enum->data.phoneSeq);
return 1;

}
return 0;
#endif
+#endif
+ return 0;
}

CHEWING_API int chewing_userphrase_get(ChewingContext *ctx,
@@ -1962,6 +2032,13 @@ CHEWING_API int chewing_userphrase_get(ChewingContext *ctx,
{
ChewingData *pgdata;

+ if (!ctx || !phrase_buf || !phrase_len || !bopomofo_buf || !bopomofo_len) {
+ return -1;
+ }
+
+#ifdef WITH_RUST
+ return UserEnumerateGet(ctx->data->phraseIter, phrase_buf, phrase_len, bopomofo_buf, bopomofo_len);
+#else
#if WITH_SQLITE3
const char *phrase;
int length;
@@ -1969,19 +2046,16 @@ CHEWING_API int chewing_userphrase_get(ChewingContext *ctx,
uint16_t phone_array[MAX_PHRASE_LEN + 1] = { 0 };
#endif

- if (!ctx || !phrase_buf || !phrase_len || !bopomofo_buf || !bopomofo_len) {
- return -1;
- }
pgdata = ctx->data;

LOG_API("");

#if WITH_SQLITE3
- phrase = (const char *) sqlite3_column_text(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT],
+ phrase = (const char *) sqlite3_column_text(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT].column
[COLUMN_USERPHRASE_PHRASE]);
length =
- sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT],
+ sqlite3_column_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT].column[COLUMN_USERPHRASE_LENGTH]);

if (phrase_len < strlen(phrase) + 1) {
@@ -1995,7 +2069,7 @@ CHEWING_API int chewing_userphrase_get(ChewingContext *ctx,
}

for (i = 0; i < length && i < MAX_PHRASE_LEN; ++i) {
- phone_array[i] = sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT],
+ phone_array[i] = sqlite3_column_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT].column[COLUMN_USERPHRASE_PHONE_0
+ i]);
}
@@ -2005,20 +2079,22 @@ CHEWING_API int chewing_userphrase_get(ChewingContext *ctx,

return 0;
#else
- if (pgdata->static_data.userphrase_enum) {
- strncpy(phrase_buf, pgdata->static_data.userphrase_enum->data.wordSeq, phrase_len);
+ if (pgdata->staticData.userphrase_enum) {
+ strncpy(phrase_buf, pgdata->staticData.userphrase_enum->data.wordSeq, phrase_len);
phrase_buf[phrase_len - 1] = 0;

- BopomofoFromUintArray(bopomofo_buf, bopomofo_len, pgdata->static_data.userphrase_enum->data.phoneSeq);
+ BopomofoFromUintArray(bopomofo_buf, bopomofo_len, pgdata->staticData.userphrase_enum->data.phoneSeq);
bopomofo_buf[bopomofo_len - 1] = 0;

- pgdata->static_data.userphrase_enum = FindNextHash(pgdata, pgdata->static_data.userphrase_enum);
+ pgdata->staticData.userphrase_enum = FindNextHash(pgdata, pgdata->staticData.userphrase_enum);

return 0;
}

return -1;
#endif
+#endif
+ return -1;
}

CHEWING_API int chewing_userphrase_add(ChewingContext *ctx, const char *phrase_buf, const char *bopomofo_buf)
@@ -2097,7 +2173,7 @@ CHEWING_API int chewing_userphrase_lookup(ChewingContext *ctx, const char *phras
ssize_t phone_len;
uint16_t *phone_buf = 0;
int ret;
- UserPhraseData *user_phrase_data;
+ UserPhraseData *user_phrase_data = NULL;

if (!ctx || !bopomofo_buf) {
return 0;
diff --git a/src/chewingutil.c b/src/chewingutil.c
index 8344285..fb429ed 100644
--- a/src/chewingutil.c
+++ b/src/chewingutil.c
@@ -23,15 +23,18 @@
#include <stdlib.h>
#include <stdio.h>

-#include "chewing-utf8-util.h"
#include "global-private.h"
#include "chewingutil.h"
-#include "bopomofo-private.h"
#include "choice-private.h"
-#include "tree-private.h"
-#include "userphrase-private.h"
#include "private.h"

+#ifndef WITH_RUST
+
+#include "global.h"
+#include "bopomofo-private.h"
+#include "chewing-utf8-util.h"
+#include "tree-private.h"
+#include "userphrase-private.h"
#ifdef HAVE_ASPRINTF
/* asprintf is provided by GNU extensions and *BSD */
# ifndef _GNU_SOURCE
@@ -42,6 +45,8 @@
# include "plat_path.h"
#endif

+#endif
+
extern const char *const zhuin_tab[];
static void MakePreferInterval(ChewingData *pgdata);
static void ShiftInterval(ChewingOutput *pgo, ChewingData *pgdata);
@@ -117,14 +122,26 @@ int HaninSymbolInput(ChewingData *pgdata)
AvailInfo *pai = &(pgdata->availInfo);

/* No available symbol table */
- if (!pgdata->static_data.symbol_table)
+ if (!pgdata->staticData.symbolTable)
return BOPOMOFO_ABSORB;

pci->nTotalChoice = 0;
- for (i = 0; i < pgdata->static_data.n_symbol_entry; i++) {
- strcpy(pci->totalChoiceStr[pci->nTotalChoice], pgdata->static_data.symbol_table[i]->category);
+ for (i = 0; i < pgdata->staticData.nSymbolEntry; i++) {
+ strcpy(pci->totalChoiceStr[pci->nTotalChoice], pgdata->staticData.symbolTable[i]->category);
pci->nTotalChoice++;
}
+
+#ifdef WITH_RUST
+ if (pgdata->availInfo.nAvail) {
+ for (int i = 0; i < pgdata->availInfo.nAvail; ++i) {
+ if (pgdata->availInfo.avail[i].id) {
+ FreeTreePhrase(pgdata->availInfo.avail[i].id);
+ }
+ }
+ }
+ pgdata->availInfo.nAvail = 0;
+#endif
+
pai->avail[0].len = 1;
pai->avail[0].id = NULL;
pai->nAvail = 1;
@@ -139,7 +156,9 @@ int HaninSymbolInput(ChewingData *pgdata)

static int _Inner_InternalSpecialSymbol(int key, ChewingData *pgdata, char symkey, const char *const chibuf)
{
+#ifndef WITH_RUST
int kbtype;
+#endif
PreeditBuf *buf;

if (key == symkey && NULL != chibuf) {
@@ -162,11 +181,15 @@ static int _Inner_InternalSpecialSymbol(int key, ChewingData *pgdata, char symke
pgdata->bUserArrCnnct[PhoneSeqCursor(pgdata)] = 0;
pgdata->chiSymbolCursor++;
pgdata->chiSymbolBufLen++;
+#ifdef WITH_RUST
+ BopomofoRemoveAll(&pgdata->bopomofoData);
+#else
/* reset Bopomofo data */
/* Don't forget the kbtype */
kbtype = pgdata->bopomofoData.kbtype;
memset(&(pgdata->bopomofoData), 0, sizeof(BopomofoData));
pgdata->bopomofoData.kbtype = kbtype;
+#endif
return 1;
}
return 0;
@@ -289,15 +312,15 @@ int EasySymbolInput(int key, ChewingData *pgdata)

_index = FindEasySymbolIndex(key);
if (-1 != _index) {
- for (loop = 0; loop < pgdata->static_data.g_easy_symbol_num[_index]; ++loop) {
- ueStrNCpy(wordbuf, ueStrSeek(pgdata->static_data.g_easy_symbol_value[_index], loop), 1, 1);
+ for (loop = 0; loop < pgdata->staticData.gEasySymbolNum[_index]; ++loop) {
+ ueStrNCpy(wordbuf, ueStrSeek(pgdata->staticData.gEasySymbolValue[_index], loop), 1, 1);
(void) _Inner_InternalSpecialSymbol(key, pgdata, key, wordbuf);
}
return SYMBOL_KEY_OK;
}

rtn = InternalSpecialSymbol(key, pgdata, nSpecial,
- G_EASY_SYMBOL_KEY, (const char **) pgdata->static_data.g_easy_symbol_value);
+ G_EASY_SYMBOL_KEY, (const char **) pgdata->staticData.gEasySymbolValue);
if (rtn == BOPOMOFO_IGNORE)
rtn = SpecialSymbolInput(key, pgdata);
return (rtn == BOPOMOFO_IGNORE ? SYMBOL_KEY_ERROR : SYMBOL_KEY_OK);
@@ -305,15 +328,14 @@ int EasySymbolInput(int key, ChewingData *pgdata)

int SymbolChoice(ChewingData *pgdata, int sel_i)
{
- int kbtype;
int i;
int symbol_type;
int key;

- if (!pgdata->static_data.symbol_table && pgdata->choiceInfo.isSymbol != SYMBOL_CHOICE_UPDATE)
+ if (!pgdata->staticData.symbolTable && pgdata->choiceInfo.isSymbol != SYMBOL_CHOICE_UPDATE)
return BOPOMOFO_ABSORB;

- if (pgdata->choiceInfo.isSymbol == SYMBOL_CATEGORY_CHOICE && 0 == pgdata->static_data.symbol_table[sel_i]->nSymbols)
+ if (pgdata->choiceInfo.isSymbol == SYMBOL_CATEGORY_CHOICE && 0 == pgdata->staticData.symbolTable[sel_i]->nSymbols)
symbol_type = SYMBOL_CHOICE_INSERT;
else
symbol_type = pgdata->choiceInfo.isSymbol;
@@ -325,11 +347,21 @@ int SymbolChoice(ChewingData *pgdata, int sel_i)

/* Display all symbols in this category */
pci->nTotalChoice = 0;
- for (i = 0; i < pgdata->static_data.symbol_table[sel_i]->nSymbols; i++) {
+ for (i = 0; i < pgdata->staticData.symbolTable[sel_i]->nSymbols; i++) {
ueStrNCpy(pci->totalChoiceStr[pci->nTotalChoice],
- pgdata->static_data.symbol_table[sel_i]->symbols[i], 1, 1);
+ pgdata->staticData.symbolTable[sel_i]->symbols[i], 1, 1);
pci->nTotalChoice++;
}
+#ifdef WITH_RUST
+ if (pgdata->availInfo.nAvail) {
+ for (int i = 0; i < pgdata->availInfo.nAvail; ++i) {
+ if (pgdata->availInfo.avail[i].id) {
+ FreeTreePhrase(pgdata->availInfo.avail[i].id);
+ }
+ }
+ }
+ pgdata->availInfo.nAvail = 0;
+#endif
pai->avail[0].len = 1;
pai->avail[0].id = NULL;
pai->nAvail = 1;
@@ -364,10 +396,15 @@ int SymbolChoice(ChewingData *pgdata, int sel_i)

pgdata->bUserArrCnnct[PhoneSeqCursor(pgdata)] = 0;
ChoiceEndChoice(pgdata);
- /* Don't forget the kbtype */
- kbtype = pgdata->bopomofoData.kbtype;
- memset(&(pgdata->bopomofoData), 0, sizeof(BopomofoData));
- pgdata->bopomofoData.kbtype = kbtype;
+
+#ifdef WITH_RUST
+ BopomofoRemoveAll(&pgdata->bopomofoData);
+#else
+ memset(&pgdata->bopomofoData.pho_inx, 0, sizeof(pgdata->bopomofoData.pho_inx));
+ memset(&pgdata->bopomofoData.pho_inx_alt, 0, sizeof(pgdata->bopomofoData.pho_inx_alt));
+ pgdata->bopomofoData.phone = 0;
+ pgdata->bopomofoData.phoneAlt = 0;
+#endif

if (symbol_type == SYMBOL_CHOICE_INSERT) {
pgdata->chiSymbolBufLen++;
@@ -849,17 +886,27 @@ int MakeOutput(ChewingOutput *pgo, ChewingData *pgdata)
}

/* fill point */
- pgo->PointStart = pgdata->PointStart;
- pgo->PointEnd = pgdata->PointEnd;
+ pgo->pointStart = pgdata->pointStart;
+ pgo->pointEnd = pgdata->pointEnd;

/* fill other fields */
pgo->chiSymbolBufLen = pgdata->chiSymbolBufLen;
pgo->chiSymbolCursor = pgdata->chiSymbolCursor;

/* fill bopomofoBuf */
- if (pgdata->bopomofoData.kbtype >= KB_HANYU_PINYIN) {
- strcpy(pgo->bopomofoBuf, pgdata->bopomofoData.pinYinData.keySeq);
+ if (BopomofoKbType(&pgdata->bopomofoData) >= KB_HANYU_PINYIN) {
+ char key_seq[10];
+ BopomofoKeyseq(&pgdata->bopomofoData, key_seq);
+ strcpy(pgo->bopomofoBuf, key_seq);
} else {
+#if WITH_RUST
+ int pho_inx[4];
+ BopomofoPhoInx(&pgdata->bopomofoData, pho_inx);
+ uint16_t pho_num = UintFromPhoneInx(&pho_inx);
+ PhoneFromUint(pgo->bopomofoBuf,
+ sizeof(pgo->bopomofoBuf),
+ pho_num);
+#else
for (i = 0; i < BOPOMOFO_SIZE; i++) {
inx = pgdata->bopomofoData.pho_inx[i];
if (inx != 0) {
@@ -868,6 +915,7 @@ int MakeOutput(ChewingOutput *pgo, ChewingData *pgdata)
1, STRNCPY_CLOSE);
}
}
+#endif
}

ShiftInterval(pgo, pgdata);
@@ -1239,6 +1287,17 @@ int OpenSymbolChoice(ChewingData *pgdata)
pci->pageNo = 0;
pci->isSymbol = SYMBOL_CHOICE_UPDATE;

+#ifdef WITH_RUST
+ if (pgdata->availInfo.nAvail) {
+ for (int i = 0; i < pgdata->availInfo.nAvail; ++i) {
+ if (pgdata->availInfo.avail[i].id) {
+ FreeTreePhrase(pgdata->availInfo.avail[i].id);
+ }
+ }
+ }
+ pgdata->availInfo.nAvail = 0;
+#endif
+
pgdata->bSelect = 1;
pgdata->availInfo.nAvail = 1;
pgdata->availInfo.currentAvail = 0;
@@ -1265,8 +1324,8 @@ int InitSymbolTable(ChewingData *pgdata, const char *prefix)
size_t size;
int ret = -1;

- pgdata->static_data.n_symbol_entry = 0;
- pgdata->static_data.symbol_table = NULL;
+ pgdata->staticData.nSymbolEntry = 0;
+ pgdata->staticData.symbolTable = NULL;

ret = asprintf(&filename, "%s" PLAT_SEPARATOR "%s", prefix, SYMBOL_TABLE_FILE);
if (ret == -1)
@@ -1286,7 +1345,7 @@ int InitSymbolTable(ChewingData *pgdata, const char *prefix)
if (!entry)
goto error;

- while (fgets(line, LINE_LEN, file) && pgdata->static_data.n_symbol_entry < MAX_SYMBOL_ENTRY) {
+ while (fgets(line, LINE_LEN, file) && pgdata->staticData.nSymbolEntry < MAX_SYMBOL_ENTRY) {

category_end = strpbrk(line, "=\r\n");
if (!category_end)
@@ -1298,44 +1357,44 @@ int InitSymbolTable(ChewingData *pgdata, const char *prefix)
*symbols_end = 0;
len = ueStrLen(symbols);

- entry[pgdata->static_data.n_symbol_entry] =
+ entry[pgdata->staticData.nSymbolEntry] =
(SymbolEntry *) malloc(sizeof(entry[0][0]) + sizeof(entry[0][0].symbols[0]) * len);
- if (!entry[pgdata->static_data.n_symbol_entry])
+ if (!entry[pgdata->staticData.nSymbolEntry])
goto error;
- entry[pgdata->static_data.n_symbol_entry]
+ entry[pgdata->staticData.nSymbolEntry]
->nSymbols = len;

symbol = symbols;

for (i = 0; i < len; ++i) {
- ueStrNCpy(entry[pgdata->static_data.n_symbol_entry]->symbols[i], symbol, 1, 1);
+ ueStrNCpy(entry[pgdata->staticData.nSymbolEntry]->symbols[i], symbol, 1, 1);
// FIXME: What if symbol is combining sequences.
symbol += ueBytesFromChar(symbol[0]);
}


} else {
- entry[pgdata->static_data.n_symbol_entry] = (SymbolEntry *) malloc(sizeof(entry[0][0]));
- if (!entry[pgdata->static_data.n_symbol_entry])
+ entry[pgdata->staticData.nSymbolEntry] = (SymbolEntry *) malloc(sizeof(entry[0][0]));
+ if (!entry[pgdata->staticData.nSymbolEntry])
goto error;

- entry[pgdata->static_data.n_symbol_entry]
+ entry[pgdata->staticData.nSymbolEntry]
->nSymbols = 0;
}

*category_end = 0;
- ueStrNCpy(entry[pgdata->static_data.n_symbol_entry]->category, line, MAX_PHRASE_LEN, 1);
+ ueStrNCpy(entry[pgdata->staticData.nSymbolEntry]->category, line, MAX_PHRASE_LEN, 1);

- ++pgdata->static_data.n_symbol_entry;
+ ++pgdata->staticData.nSymbolEntry;
}

- size = sizeof(*pgdata->static_data.symbol_table) * pgdata->static_data.n_symbol_entry;
+ size = sizeof(*pgdata->staticData.symbolTable) * pgdata->staticData.nSymbolEntry;
if (!size)
goto end;
- pgdata->static_data.symbol_table = (SymbolEntry **) malloc(size);
- if (!pgdata->static_data.symbol_table)
+ pgdata->staticData.symbolTable = (SymbolEntry **) malloc(size);
+ if (!pgdata->staticData.symbolTable)
goto error;
- memcpy(pgdata->static_data.symbol_table, entry, size);
+ memcpy(pgdata->staticData.symbolTable, entry, size);

ret = 0;
end:
@@ -1346,7 +1405,7 @@ int InitSymbolTable(ChewingData *pgdata, const char *prefix)
return ret;

error:
- for (i = 0; i < pgdata->static_data.n_symbol_entry; ++i) {
+ for (i = 0; i < pgdata->staticData.nSymbolEntry; ++i) {
free(entry[i]);
}
goto end;
@@ -1356,12 +1415,12 @@ void TerminateSymbolTable(ChewingData *pgdata)
{
unsigned int i;

- if (pgdata->static_data.symbol_table) {
- for (i = 0; i < pgdata->static_data.n_symbol_entry; ++i)
- free(pgdata->static_data.symbol_table[i]);
- free(pgdata->static_data.symbol_table);
- pgdata->static_data.n_symbol_entry = 0;
- pgdata->static_data.symbol_table = NULL;
+ if (pgdata->staticData.symbolTable) {
+ for (i = 0; i < pgdata->staticData.nSymbolEntry; ++i)
+ free(pgdata->staticData.symbolTable[i]);
+ free(pgdata->staticData.symbolTable);
+ pgdata->staticData.nSymbolEntry = 0;
+ pgdata->staticData.symbolTable = NULL;
}
}

@@ -1413,9 +1472,9 @@ int InitEasySymbolInput(ChewingData *pgdata, const char *prefix)

ueStrNCpy(symbol, &line[2], len, 1);

- free(pgdata->static_data.g_easy_symbol_value[_index]);
- pgdata->static_data.g_easy_symbol_value[_index] = symbol;
- pgdata->static_data.g_easy_symbol_num[_index] = len;
+ free(pgdata->staticData.gEasySymbolValue[_index]);
+ pgdata->staticData.gEasySymbolValue[_index] = symbol;
+ pgdata->staticData.gEasySymbolNum[_index] = len;
}
ret = 0;

@@ -1437,11 +1496,11 @@ void TerminateEasySymbolTable(ChewingData *pgdata)
unsigned int i;

for (i = 0; i < EASY_SYMBOL_KEY_TAB_LEN; ++i) {
- if (NULL != pgdata->static_data.g_easy_symbol_value[i]) {
- free(pgdata->static_data.g_easy_symbol_value[i]);
- pgdata->static_data.g_easy_symbol_value[i] = NULL;
+ if (NULL != pgdata->staticData.gEasySymbolValue[i]) {
+ free(pgdata->staticData.gEasySymbolValue[i]);
+ pgdata->staticData.gEasySymbolValue[i] = NULL;
}
- pgdata->static_data.g_easy_symbol_num[i] = 0;
+ pgdata->staticData.gEasySymbolNum[i] = 0;
}
}

diff --git a/src/choice.c b/src/choice.c
index 7759ab2..296bde7 100644
--- a/src/choice.c
+++ b/src/choice.c
@@ -20,16 +20,20 @@
#include <string.h>
#include <assert.h>

+#include "chewingutil.h"
+#include "choice-private.h"
+#include "private.h"
+
+#ifndef WITH_RUST
+#include "global.h"
+#include "bopomofo-private.h"
#include "chewing-utf8-util.h"
#include "dict-private.h"
-#include "chewingutil.h"
#include "tree-private.h"
#include "userphrase-private.h"
-#include "choice-private.h"
-#include "bopomofo-private.h"
-#include "private.h"
+#endif

-static void ChangeSelectIntervalAndBreakpoint(ChewingData *pgdata, int from, int to, const char *str)
+void ChangeSelectIntervalAndBreakpoint(ChewingData *pgdata, int from, int to, const char *str)
{
int i;
int user_alloc;
@@ -70,7 +74,11 @@ static void SetAvailInfo(ChewingData *pgdata, int begin, int end)
const int *bSymbolArrBrkpt = pgdata->bSymbolArrBrkpt;
int symbolArrBrkpt[ARRAY_SIZE(pgdata->bSymbolArrBrkpt)] = { 0 };

+#ifdef WITH_RUST
+ const void* tree_pos;
+#else
const TreeType *tree_pos;
+#endif
int diff;
uint16_t userPhoneSeq[MAX_PHONE_SEQ_LEN];

@@ -80,6 +88,17 @@ static void SetAvailInfo(ChewingData *pgdata, int begin, int end)

head = tail = 0;

+#ifdef WITH_RUST
+ if (pgdata->availInfo.nAvail) {
+ for (int i = 0; i < pgdata->availInfo.nAvail; ++i) {
+ if (pgdata->availInfo.avail[i].id) {
+ FreeTreePhrase(pgdata->availInfo.avail[i].id);
+ }
+ }
+ }
+ pgdata->availInfo.nAvail = 0;
+#endif
+
pai->nAvail = 0;

/*
@@ -220,7 +239,7 @@ static void SetChoiceInfo(ChewingData *pgdata)
ChoiceInfoAppendChi(pgdata, pci, phoneSeqAlt[cursor]);
}

- if (pgdata->bopomofoData.kbtype == KB_HSU || pgdata->bopomofoData.kbtype == KB_DVORAK_HSU) {
+ if (BopomofoKbType(&pgdata->bopomofoData) == KB_HSU || BopomofoKbType(&pgdata->bopomofoData) == KB_DVORAK_HSU) {
switch (phoneSeq[cursor]) {
case 0x2800: /* 'ㄘ' */
ChoiceInfoAppendChi(pgdata, pci, 0x30); /* 'ㄟ' */
@@ -271,7 +290,7 @@ static void SetChoiceInfo(ChewingData *pgdata)
}
}

- if (pgdata->bopomofoData.kbtype == KB_ET26) {
+ if (BopomofoKbType(&pgdata->bopomofoData) == KB_ET26) {
switch (phoneSeq[cursor]) {
case 0x40: /* 'ㄡ' */
ChoiceInfoAppendChi(pgdata, pci, 0x400); /* 'ㄆ' */
@@ -525,6 +544,15 @@ int ChoiceEndChoice(ChewingData *pgdata)
pgdata->chiSymbolCursor = pgdata->choiceInfo.oldChiSymbolCursor;
assert(pgdata->chiSymbolCursor <= pgdata->chiSymbolBufLen);

+#ifdef WITH_RUST
+ for (int i = 0; i < pgdata->availInfo.nAvail; ++i) {
+ if (pgdata->availInfo.avail[i].id) {
+ FreeTreePhrase(pgdata->availInfo.avail[i].id);
+ }
+ }
+ pgdata->availInfo.nAvail = 0;
+#endif
+
pgdata->choiceInfo.isSymbol = WORD_CHOICE;
return 0;
}
diff --git a/src/conversion.rs b/src/conversion.rs
new file mode 100644
index 0000000..141a9f6
--- /dev/null
+++ b/src/conversion.rs
@@ -0,0 +1,38 @@
+use crate::zhuyin::Syllable;
+
+#[derive(Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Clone)]
+pub struct Interval {
+ pub start: usize,
+ pub end: usize,
+ pub phrase: String,
+}
+
+impl Interval {
+ pub fn contains(&self, other: &Interval) -> bool {
+ self.start <= other.start && self.end >= other.end
+ }
+ pub fn len(&self) -> usize {
+ self.end - self.start
+ }
+ pub fn is_empty(&self) -> bool {
+ self.len() == 0
+ }
+}
+
+#[derive(Debug)]
+pub struct Break(pub usize);
+
+#[derive(Debug)]
+pub struct ChineseSequence {
+ pub syllables: Vec<Syllable>,
+ pub selections: Vec<Interval>,
+ pub breaks: Vec<Break>,
+}
+
+pub trait ConversionEngine {
+ fn convert(&self, segment: &ChineseSequence) -> Vec<Interval>;
+ fn convert_next(&self, segment: &ChineseSequence, next: usize) -> Vec<Interval>;
+}
+
+mod chewing_conversion;
+pub use chewing_conversion::ChewingConversionEngine;
diff --git a/src/conversion/chewing_conversion.rs b/src/conversion/chewing_conversion.rs
new file mode 100644
index 0000000..e45aa19
--- /dev/null
+++ b/src/conversion/chewing_conversion.rs
@@ -0,0 +1,698 @@
+use std::{
+ collections::HashMap,
+ fmt::{Debug, Display},
+ ops::Neg,
+ rc::Rc,
+};
+
+use tracing::trace;
+
+use crate::{
+ dictionary::{Dictionary, Phrase},
+ zhuyin::Syllable,
+};
+
+use super::{Break, ChineseSequence, ConversionEngine, Interval};
+
+#[derive(Debug)]
+pub struct ChewingConversionEngine {
+ dict: Rc<dyn Dictionary>,
+}
+
+impl ConversionEngine for ChewingConversionEngine {
+ fn convert(&self, segment: &ChineseSequence) -> Vec<Interval> {
+ if segment.syllables.is_empty() {
+ return vec![];
+ }
+ let intervals = self.find_intervals(segment);
+ self.find_best_path(segment.syllables.len(), intervals)
+ }
+
+ fn convert_next(&self, segment: &ChineseSequence, next: usize) -> Vec<Interval> {
+ if segment.syllables.is_empty() {
+ return vec![];
+ }
+ let mut graph = Graph::default();
+ let paths = self.find_all_paths(&mut graph, segment, 0, segment.syllables.len(), None);
+ let mut trimmed_paths = self.trim_paths(paths);
+ trimmed_paths.sort();
+ trimmed_paths
+ .into_iter()
+ .rev()
+ .cycle()
+ .nth(next)
+ .map(|p| p.intervals)
+ .expect("should have path")
+ .into_iter()
+ .map(|it| it.into())
+ .collect()
+ }
+}
+
+impl ChewingConversionEngine {
+ pub fn new(dict: Rc<dyn Dictionary>) -> ChewingConversionEngine {
+ ChewingConversionEngine { dict }
+ }
+
+ fn find_best_phrase(
+ &self,
+ start: usize,
+ syllables: &[Syllable],
+ selections: &[Interval],
+ breaks: &[Break],
+ ) -> Option<Rc<Phrase>> {
+ let end = start + syllables.len();
+
+ for br in breaks.iter() {
+ if br.0 > start && br.0 < end {
+ // There exists a break point that forbids connecting these
+ // syllables.
+ return None;
+ }
+ }
+
+ let mut max_freq = 0;
+ let mut best_phrase = None;
+ 'next_phrase: for phrase in self.dict.lookup_phrase(syllables) {
+ // If there exists a user selected interval which is a
+ // sub-interval of this phrase but the substring is
+ // different then we can skip this phrase.
+ for selection in selections.iter() {
+ debug_assert!(!selection.phrase.is_empty());
+ if start <= selection.start && end >= selection.end {
+ let offset = selection.start - start;
+ let len = selection.end - selection.start;
+ let substring: String =
+ phrase.as_str().chars().skip(offset).take(len).collect();
+ if substring != selection.phrase {
+ continue 'next_phrase;
+ }
+ }
+ }
+
+ // If there are phrases that can satisfy all the constraints
+ // then pick the one with highest frequency.
+ if best_phrase.is_none() || phrase.freq() > max_freq {
+ max_freq = phrase.freq();
+ best_phrase = Some(Rc::new(phrase));
+ }
+ }
+
+ best_phrase
+ }
+ fn find_intervals(&self, seq: &ChineseSequence) -> Vec<PossibleInterval> {
+ let mut intervals = vec![];
+ for begin in 0..seq.syllables.len() {
+ for end in begin..=seq.syllables.len() {
+ if let Some(phrase) = self.find_best_phrase(
+ begin,
+ &seq.syllables[begin..end],
+ &seq.selections,
+ &seq.breaks,
+ ) {
+ intervals.push(PossibleInterval {
+ start: begin,
+ end,
+ phrase,
+ });
+ }
+ }
+ }
+ intervals
+ }
+ /// Calculate the best path with dynamic programming.
+ ///
+ /// Assume P(x,y) is the highest score phrasing result from x to y. The
+ /// following is formula for P(x,y):
+ ///
+ /// P(x,y) = MAX( P(x,y-1)+P(y-1,y), P(x,y-2)+P(y-2,y), ... )
+ ///
+ /// While P(x,y-1) is stored in highest_score array, and P(y-1,y) is
+ /// interval end at y. In this formula, x is always 0.
+ ///
+ /// The format of highest_score array is described as following:
+ ///
+ /// highest_score[0] = P(0,0)
+ /// highest_score[1] = P(0,1)
+ /// ...
+ /// highest_score[y-1] = P(0,y-1)
+ fn find_best_path(&self, len: usize, mut intervals: Vec<PossibleInterval>) -> Vec<Interval> {
+ let mut highest_score = vec![PossiblePath::default(); len + 1];
+
+ // The interval shall be sorted by the increase order of end.
+ intervals.sort_by(|a, b| a.end.cmp(&b.end));
+
+ for interval in intervals.into_iter() {
+ let start = interval.start;
+ let end = interval.end;
+
+ let mut candidate_path = highest_score[start].clone();
+ candidate_path.intervals.push(interval);
+
+ if highest_score[end].score() < candidate_path.score() {
+ highest_score[end] = candidate_path;
+ }
+ }
+
+ highest_score
+ .pop()
+ .expect("highest_score has at least one element")
+ .intervals
+ .into_iter()
+ .map(|interval| interval.into())
+ .collect()
+ }
+
+ fn find_all_paths<'g, 's: 'g, 'b: 'g>(
+ &'s self,
+ graph: &mut Graph<'g>,
+ sequence: &ChineseSequence,
+ start: usize,
+ target: usize,
+ prefix: Option<PossiblePath<'b>>,
+ ) -> Vec<PossiblePath<'g>> {
+ if start == target {
+ return vec![prefix.expect("should have prefix")];
+ }
+ let mut result = vec![];
+ for end in start..=target {
+ let entry = graph.entry((start, end));
+ if let Some(phrase) = entry.or_insert_with(|| {
+ self.find_best_phrase(
+ start,
+ &sequence.syllables[start..end],
+ &sequence.selections,
+ &sequence.breaks,
+ )
+ }) {
+ let mut prefix = prefix.clone().unwrap_or_default();
+ prefix.intervals.push(PossibleInterval {
+ start,
+ end,
+ phrase: phrase.clone(),
+ });
+ result.append(&mut self.find_all_paths(graph, sequence, end, target, Some(prefix)));
+ }
+ }
+ result
+ }
+
+ /// Trim some paths that were part of other paths
+ ///
+ /// Ported from original C implementation, but the original algorithm seems wrong.
+ fn trim_paths<'a>(&self, paths: Vec<PossiblePath<'a>>) -> Vec<PossiblePath<'a>> {
+ let mut trimmed_paths: Vec<PossiblePath> = vec![];
+ for candidate in paths.into_iter() {
+ trace!("Trim check {}", candidate);
+ let mut drop_candidate = false;
+ let mut keeper = vec![];
+ for p in trimmed_paths.into_iter() {
+ if drop_candidate || p.contains(&candidate) {
+ drop_candidate = true;
+ trace!(" Keep {}", p);
+ keeper.push(p);
+ continue;
+ }
+ if candidate.contains(&p) {
+ trace!(" Drop {}", p);
+ continue;
+ }
+ trace!(" Keep {}", p);
+ keeper.push(p);
+ }
+ if !drop_candidate {
+ trace!(" Keep {}", candidate);
+ keeper.push(candidate);
+ }
+ trimmed_paths = keeper;
+ }
+ trimmed_paths
+ }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct PossibleInterval<'a> {
+ start: usize,
+ end: usize,
+ phrase: Rc<Phrase<'a>>,
+}
+
+impl PossibleInterval<'_> {
+ pub fn contains(&self, other: &PossibleInterval) -> bool {
+ self.start <= other.start && self.end >= other.end
+ }
+ pub fn len(&self) -> usize {
+ self.end - self.start
+ }
+}
+
+impl From<PossibleInterval<'_>> for Interval {
+ fn from(value: PossibleInterval) -> Self {
+ Interval {
+ start: value.start,
+ end: value.end,
+ phrase: value.phrase.to_string(),
+ }
+ }
+}
+
+#[derive(Default, Clone, Eq)]
+struct PossiblePath<'a> {
+ intervals: Vec<PossibleInterval<'a>>,
+}
+
+impl Debug for PossiblePath<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.debug_struct("PossiblePath")
+ .field("score()", &self.score())
+ .field("intervals", &self.intervals)
+ .finish()
+ }
+}
+
+impl PossiblePath<'_> {
+ fn score(&self) -> i32 {
+ let mut score = 0;
+ score += 1000 * self.rule_largest_sum();
+ score += 1000 * self.rule_largest_avgwordlen();
+ score += 100 * self.rule_smallest_lenvariance();
+ score += self.rule_largest_freqsum();
+ score
+ }
+
+ /// Copied from IsRecContain to trim some paths
+ fn contains(&self, other: &Self) -> bool {
+ let mut big = 0;
+ for sml in 0..other.intervals.len() {
+ loop {
+ if big < self.intervals.len()
+ && self.intervals[big].start < other.intervals[sml].end
+ {
+ if self.intervals[big].contains(&other.intervals[sml]) {
+ break;
+ }
+ } else {
+ return false;
+ }
+ big += 1;
+ }
+ }
+ true
+ }
+
+ fn rule_largest_sum(&self) -> i32 {
+ let mut score = 0;
+ for interval in &self.intervals {
+ score += interval.end - interval.start;
+ }
+ score as i32
+ }
+
+ fn rule_largest_avgwordlen(&self) -> i32 {
+ if self.intervals.is_empty() {
+ return 0;
+ }
+ // Constant factor 6=1*2*3, to keep value as integer
+ 6 * self.rule_largest_sum()
+ / i32::try_from(self.intervals.len()).expect("number of intervals should be small")
+ }
+
+ fn rule_smallest_lenvariance(&self) -> i32 {
+ let len = self.intervals.len();
+ let mut score = 0;
+ // kcwu: heuristic? why variance no square function?
+ for i in 0..len {
+ for j in i + 1..len {
+ let interval_1 = &self.intervals[i];
+ let interval_2 = &self.intervals[j];
+ score += interval_1.len().abs_diff(interval_2.len());
+ }
+ }
+ i32::try_from(score).expect("score should fit in i32").neg()
+ }
+
+ fn rule_largest_freqsum(&self) -> i32 {
+ let mut score = 0;
+ for interval in &self.intervals {
+ let reduction_factor = if interval.len() == 1 { 512 } else { 1 };
+ score += interval.phrase.freq() / reduction_factor;
+ }
+ i32::try_from(score).expect("score should fit in i32")
+ }
+}
+
+impl PartialEq for PossiblePath<'_> {
+ fn eq(&self, other: &Self) -> bool {
+ self.score() == other.score()
+ }
+}
+
+impl PartialOrd for PossiblePath<'_> {
+ fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
+ self.score().partial_cmp(&other.score())
+ }
+}
+
+impl Ord for PossiblePath<'_> {
+ fn cmp(&self, other: &Self) -> std::cmp::Ordering {
+ self.score().cmp(&other.score())
+ }
+}
+
+impl Display for PossiblePath<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(f, "#PossiblePath({}", self.score())?;
+ for interval in &self.intervals {
+ write!(
+ f,
+ " ({} {} '{})",
+ interval.start, interval.end, interval.phrase
+ )?;
+ }
+ write!(f, ")")?;
+ Ok(())
+ }
+}
+
+type Graph<'a> = HashMap<(usize, usize), Option<Rc<Phrase<'a>>>>;
+
+#[cfg(test)]
+mod tests {
+ use std::{collections::HashMap, rc::Rc};
+
+ use crate::{
+ conversion::{Break, ChineseSequence, ConversionEngine, Interval},
+ dictionary::{Dictionary, Phrase},
+ syl,
+ zhuyin::Bopomofo::*,
+ };
+
+ use super::{ChewingConversionEngine, PossibleInterval, PossiblePath};
+
+ fn test_dictionary() -> Rc<dyn Dictionary> {
+ Rc::new(HashMap::from([
+ (vec![syl![G, U, O, TONE2]], vec![("國", 1).into()]),
+ (vec![syl![M, I, EN, TONE2]], vec![("民", 1).into()]),
+ (vec![syl![D, A, TONE4]], vec![("大", 1).into()]),
+ (vec![syl![H, U, EI, TONE4]], vec![("會", 1).into()]),
+ (vec![syl![D, AI, TONE4]], vec![("代", 1).into()]),
+ (vec![syl![B, I, AU, TONE3]], vec![("表", 1).into()]),
+ (
+ vec![syl![G, U, O, TONE2], syl![M, I, EN, TONE2]],
+ vec![("國民", 200).into()],
+ ),
+ (
+ vec![syl![D, A, TONE4], syl![H, U, EI, TONE4]],
+ vec![("大會", 200).into()],
+ ),
+ (
+ vec![syl![D, AI, TONE4], syl![B, I, AU, TONE3]],
+ vec![("代表", 200).into(), ("戴錶", 100).into()],
+ ),
+ (vec![syl![X, I, EN]], vec![("心", 1).into()]),
+ (
+ vec![syl![K, U, TONE4], syl![I, EN]],
+ vec![("庫音", 300).into()],
+ ),
+ (
+ vec![syl![X, I, EN], syl![K, U, TONE4], syl![I, EN]],
+ vec![("新酷音", 200).into()],
+ ),
+ (
+ vec![syl![C, E, TONE4], syl![SH, TONE4], syl![I, TONE2]],
+ vec![("測試儀", 42).into()],
+ ),
+ (
+ vec![syl![C, E, TONE4], syl![SH, TONE4]],
+ vec![("測試", 9318).into()],
+ ),
+ (
+ vec![syl![I, TONE2], syl![X, I, A, TONE4]],
+ vec![("一下", 10576).into()],
+ ),
+ (vec![syl![X, I, A, TONE4]], vec![("下", 10576).into()]),
+ ]))
+ }
+
+ #[test]
+ fn convert_empty_sequence() {
+ let dict = test_dictionary();
+ let engine = ChewingConversionEngine::new(dict);
+ let sequence = ChineseSequence {
+ syllables: vec![],
+ selections: vec![],
+ breaks: vec![],
+ };
+ assert_eq!(Vec::<Interval>::new(), engine.convert(&sequence));
+ }
+
+ #[test]
+ fn convert_simple_chinese_sequence() {
+ let dict = test_dictionary();
+ let engine = ChewingConversionEngine::new(dict);
+ let sequence = ChineseSequence {
+ syllables: vec![
+ syl![G, U, O, TONE2],
+ syl![M, I, EN, TONE2],
+ syl![D, A, TONE4],
+ syl![H, U, EI, TONE4],
+ syl![D, AI, TONE4],
+ syl![B, I, AU, TONE3],
+ ],
+ selections: vec![],
+ breaks: vec![],
+ };
+ assert_eq!(
+ vec![
+ Interval {
+ start: 0,
+ end: 2,
+ phrase: "國民".to_string()
+ },
+ Interval {
+ start: 2,
+ end: 4,
+ phrase: "大會".to_string()
+ },
+ Interval {
+ start: 4,
+ end: 6,
+ phrase: "代表".to_string()
+ },
+ ],
+ engine.convert(&sequence)
+ );
+ }
+
+ #[test]
+ fn convert_chinese_sequence_with_breaks() {
+ let dict = test_dictionary();
+ let engine = ChewingConversionEngine::new(dict);
+ let sequence = ChineseSequence {
+ syllables: vec![
+ syl![G, U, O, TONE2],
+ syl![M, I, EN, TONE2],
+ syl![D, A, TONE4],
+ syl![H, U, EI, TONE4],
+ syl![D, AI, TONE4],
+ syl![B, I, AU, TONE3],
+ ],
+ selections: vec![],
+ breaks: vec![Break(1), Break(5)],
+ };
+ assert_eq!(
+ vec![
+ Interval {
+ start: 0,
+ end: 1,
+ phrase: "國".to_string()
+ },
+ Interval {
+ start: 1,
+ end: 2,
+ phrase: "民".to_string()
+ },
+ Interval {
+ start: 2,
+ end: 4,
+ phrase: "大會".to_string()
+ },
+ Interval {
+ start: 4,
+ end: 5,
+ phrase: "代".to_string()
+ },
+ Interval {
+ start: 5,
+ end: 6,
+ phrase: "表".to_string()
+ },
+ ],
+ engine.convert(&sequence)
+ );
+ }
+
+ #[test]
+ fn convert_chinese_sequence_with_good_selection() {
+ let dict = test_dictionary();
+ let engine = ChewingConversionEngine::new(dict);
+ let sequence = ChineseSequence {
+ syllables: vec![
+ syl![G, U, O, TONE2],
+ syl![M, I, EN, TONE2],
+ syl![D, A, TONE4],
+ syl![H, U, EI, TONE4],
+ syl![D, AI, TONE4],
+ syl![B, I, AU, TONE3],
+ ],
+ selections: vec![Interval {
+ start: 4,
+ end: 6,
+ phrase: "戴錶".to_string(),
+ }],
+ breaks: vec![],
+ };
+ assert_eq!(
+ vec![
+ Interval {
+ start: 0,
+ end: 2,
+ phrase: "國民".to_string()
+ },
+ Interval {
+ start: 2,
+ end: 4,
+ phrase: "大會".to_string()
+ },
+ Interval {
+ start: 4,
+ end: 6,
+ phrase: "戴錶".to_string()
+ },
+ ],
+ engine.convert(&sequence)
+ );
+ }
+
+ #[test]
+ fn convert_chinese_sequence_with_substring_selection() {
+ let dict = test_dictionary();
+ let engine = ChewingConversionEngine::new(dict);
+ let sequence = ChineseSequence {
+ syllables: vec![syl![X, I, EN], syl![K, U, TONE4], syl![I, EN]],
+ selections: vec![Interval {
+ start: 1,
+ end: 3,
+ phrase: "酷音".to_string(),
+ }],
+ breaks: vec![],
+ };
+ assert_eq!(
+ vec![Interval {
+ start: 0,
+ end: 3,
+ phrase: "新酷音".to_string()
+ },],
+ engine.convert(&sequence)
+ );
+ }
+
+ #[test]
+ fn convert_cycle_alternatives() {
+ let dict = test_dictionary();
+ let engine = ChewingConversionEngine::new(dict);
+ let sequence = ChineseSequence {
+ syllables: vec![
+ syl![C, E, TONE4],
+ syl![SH, TONE4],
+ syl![I, TONE2],
+ syl![X, I, A, TONE4],
+ ],
+ selections: vec![],
+ breaks: vec![],
+ };
+ assert_eq!(
+ vec![
+ Interval {
+ start: 0,
+ end: 2,
+ phrase: "測試".to_string()
+ },
+ Interval {
+ start: 2,
+ end: 4,
+ phrase: "一下".to_string()
+ }
+ ],
+ engine.convert_next(&sequence, 0)
+ );
+ assert_eq!(
+ vec![
+ Interval {
+ start: 0,
+ end: 3,
+ phrase: "測試儀".to_string()
+ },
+ Interval {
+ start: 3,
+ end: 4,
+ phrase: "下".to_string()
+ }
+ ],
+ engine.convert_next(&sequence, 1)
+ );
+ assert_eq!(
+ vec![
+ Interval {
+ start: 0,
+ end: 2,
+ phrase: "測試".to_string()
+ },
+ Interval {
+ start: 2,
+ end: 4,
+ phrase: "一下".to_string()
+ }
+ ],
+ engine.convert_next(&sequence, 2)
+ );
+ }
+
+ #[test]
+ fn possible_path_contains() {
+ let path_1 = PossiblePath {
+ intervals: vec![
+ PossibleInterval {
+ start: 0,
+ end: 2,
+ phrase: Phrase::new("測試", 0).into(),
+ },
+ PossibleInterval {
+ start: 2,
+ end: 4,
+ phrase: Phrase::new("一下", 0).into(),
+ },
+ ],
+ };
+ let path_2 = PossiblePath {
+ intervals: vec![
+ PossibleInterval {
+ start: 0,
+ end: 2,
+ phrase: Phrase::new("測試", 0).into(),
+ },
+ PossibleInterval {
+ start: 2,
+ end: 3,
+ phrase: Phrase::new("遺", 0).into(),
+ },
+ PossibleInterval {
+ start: 3,
+ end: 4,
+ phrase: Phrase::new("下", 0).into(),
+ },
+ ],
+ };
+ assert!(path_1.contains(&path_2));
+ }
+}
diff --git a/src/dict.c b/src/dict.c
index ef9b683..6d03457 100644
--- a/src/dict.c
+++ b/src/dict.c
@@ -29,7 +29,7 @@

void TerminateDict(ChewingData *pgdata)
{
- plat_mmap_close(&pgdata->static_data.dict_mmap);
+ plat_mmap_close(&pgdata->staticData.dict_mmap);
}

int InitDict(ChewingData *pgdata, const char *prefix)
@@ -44,15 +44,15 @@ int InitDict(ChewingData *pgdata, const char *prefix)
if (len + 1 > sizeof(filename))
return -1;

- plat_mmap_set_invalid(&pgdata->static_data.dict_mmap);
- file_size = plat_mmap_create(&pgdata->static_data.dict_mmap, filename, FLAG_ATTRIBUTE_READ);
+ plat_mmap_set_invalid(&pgdata->staticData.dict_mmap);
+ file_size = plat_mmap_create(&pgdata->staticData.dict_mmap, filename, FLAG_ATTRIBUTE_READ);
if (file_size <= 0)
return -1;

offset = 0;
csize = file_size;
- pgdata->static_data.dict = (const char *) plat_mmap_set_view(&pgdata->static_data.dict_mmap, &offset, &csize);
- if (!pgdata->static_data.dict)
+ pgdata->staticData.dict = (const char *) plat_mmap_set_view(&pgdata->staticData.dict_mmap, &offset, &csize);
+ if (!pgdata->staticData.dict)
return -1;

return 0;
@@ -64,9 +64,9 @@ int InitDict(ChewingData *pgdata, const char *prefix)
*/
static void GetVocabFromDict(ChewingData *pgdata, Phrase *phr_ptr)
{
- snprintf(phr_ptr->phrase, sizeof(phr_ptr->phrase), "%s", pgdata->static_data.dict + GetUint24(pgdata->static_data.tree_cur_pos->phrase.pos));
- phr_ptr->freq = GetUint24(pgdata->static_data.tree_cur_pos->phrase.freq);
- pgdata->static_data.tree_cur_pos++;
+ snprintf(phr_ptr->phrase, sizeof(phr_ptr->phrase), "%s", pgdata->staticData.dict + GetUint24(pgdata->staticData.tree_cur_pos->phrase.pos));
+ phr_ptr->freq = GetUint24(pgdata->staticData.tree_cur_pos->phrase.freq);
+ pgdata->staticData.tree_cur_pos++;
}

int GetCharFirst(ChewingData *pgdata, Phrase *wrd_ptr, uint16_t key)
@@ -97,8 +97,8 @@ int GetPhraseFirst(ChewingData *pgdata, Phrase *phr_ptr, const TreeType *phrase_

int GetVocabNext(ChewingData *pgdata, Phrase *phr_ptr)
{
- if (pgdata->static_data.tree_cur_pos >= pgdata->static_data.tree_end_pos
- || GetUint16(pgdata->static_data.tree_cur_pos->key) != 0)
+ if (pgdata->staticData.tree_cur_pos >= pgdata->staticData.tree_end_pos
+ || GetUint16(pgdata->staticData.tree_cur_pos->key) != 0)
return 0;
GetVocabFromDict(pgdata, phr_ptr);
return 1;
diff --git a/src/dictionary.rs b/src/dictionary.rs
new file mode 100644
index 0000000..b81a014
--- /dev/null
+++ b/src/dictionary.rs
@@ -0,0 +1,445 @@
+//! Dictionaries for looking up phrases.
+
+use std::{
+ borrow::{Borrow, Cow},
+ cmp::Ordering,
+ collections::{HashMap, HashSet},
+ fmt::{Debug, Display},
+ path::Path,
+};
+
+use thiserror::Error;
+
+use crate::zhuyin::Syllable;
+
+pub use layered::LayeredDictionary;
+pub use sqlite::{SqliteDictionary, SqliteDictionaryBuilder, SqliteDictionaryError};
+pub use trie::{TrieDictionary, TrieDictionaryBuilder, TrieDictionaryStatistics};
+
+mod layered;
+mod sqlite;
+mod trie;
+
+/// The error type which is returned from updating a dictionary.
+#[derive(Error, Debug)]
+#[error("update dictionary failed")]
+pub struct DictionaryUpdateError {
+ #[from]
+ pub source: Box<dyn std::error::Error + Send + Sync>,
+}
+
+/// The error type which is returned from building or updating a dictionary.
+#[derive(Error, Debug)]
+#[error("found duplicated phrases")]
+pub struct DuplicatePhraseError;
+
+/// A collection of metadata of a dictionary.
+///
+/// The dictionary version and copyright information can be used in
+/// configuration application.
+///
+/// # Examples
+///
+/// ```no_run
+/// # use std::collections::HashMap;
+/// # use chewing::dictionary::Dictionary;
+/// # let dictionary = HashMap::new();
+/// let about = dictionary.about();
+/// assert_eq!("libchewing default", about.name.unwrap());
+/// assert_eq!("Copyright (c) 2022 libchewing Core Team", about.copyright.unwrap());
+/// assert_eq!("LGPL-2.1-or-later", about.license.unwrap());
+/// assert_eq!("init_database 0.5.1", about.software.unwrap());
+/// ```
+#[derive(Debug, Clone, Default)]
+pub struct DictionaryInfo {
+ /// The name of the dictionary.
+ pub name: Option<String>,
+ /// The copyright information of the dictionary.
+ ///
+ /// It's recommended to include the copyright holders' names and email
+ /// addresses, separated by semicolons.
+ pub copyright: Option<String>,
+ /// The license information of the dictionary.
+ ///
+ /// It's recommended to use the [SPDX license identifier](https://spdx.org/licenses/).
+ pub license: Option<String>,
+ /// The version of the dictionary.
+ ///
+ /// It's recommended to use the commit hash or revision if the dictionary is
+ /// managed in a source control repository.
+ pub version: Option<String>,
+ /// The name of the software used to generate the dictionary.
+ ///
+ /// It's recommended to include the name and the version number.
+ pub software: Option<String>,
+}
+
+/// A type containing a phrase string and its frequency.
+///
+/// # Examples
+///
+/// A `Phrase` can be created from/to a tuple.
+///
+/// ```
+/// use chewing::dictionary::Phrase;
+///
+/// let phrase = Phrase::new("測", 1);
+/// assert_eq!(phrase, ("測", 1).into());
+/// assert_eq!(("測".to_string(), 1u32), phrase.into());
+/// ```
+///
+/// Phrases are ordered by their frequency.
+///
+/// ```
+/// use chewing::dictionary::Phrase;
+///
+/// assert!(Phrase::new("測", 100) > Phrase::new("冊", 1));
+/// ```
+#[derive(Clone, PartialEq, Eq, Hash, Debug)]
+pub struct Phrase<'a> {
+ phrase: Cow<'a, str>,
+ freq: u32,
+ last_used: Option<u64>,
+}
+
+impl<'a> Phrase<'a> {
+ /// Creates a new `Phrase`.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use chewing::dictionary::Phrase;
+ ///
+ /// let phrase = Phrase::new("新", 1);
+ /// ```
+ pub fn new<S>(phrase: S, freq: u32) -> Phrase<'a>
+ where
+ S: Into<Cow<'a, str>>,
+ {
+ Phrase {
+ phrase: phrase.into(),
+ freq,
+ last_used: None,
+ }
+ }
+ /// Sets the last used time of the phrase.
+ pub fn with_time(mut self, last_used: u64) -> Phrase<'a> {
+ self.last_used = Some(last_used);
+ self
+ }
+ /// Returns the frequency of the phrase.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use chewing::dictionary::Phrase;
+ ///
+ /// let phrase = Phrase::new("詞頻", 100);
+ ///
+ /// assert_eq!(100, phrase.freq());
+ /// ```
+ pub fn freq(&self) -> u32 {
+ self.freq
+ }
+ /// Returns the last time this phrase was selected as user phrase.
+ ///
+ /// The time is a counter increased by one for each keystroke.
+ pub fn last_used(&self) -> Option<u64> {
+ self.last_used
+ }
+ /// Returns the inner str of the phrase.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use chewing::dictionary::Phrase;
+ ///
+ /// let phrase = Phrase::new("詞", 100);
+ ///
+ /// assert_eq!("詞", phrase.as_str());
+ /// ```
+ pub fn as_str(&self) -> &str {
+ self.phrase.borrow()
+ }
+}
+
+/// Phrases are compared by their frequency first, followed by their phrase
+/// string.
+impl PartialOrd for Phrase<'_> {
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ match self.freq.partial_cmp(&other.freq) {
+ Some(Ordering::Equal) => {}
+ ord => return ord,
+ }
+ self.phrase.partial_cmp(&other.phrase)
+ }
+}
+
+/// Phrases are compared by their frequency first, followed by their phrase
+/// string.
+impl Ord for Phrase<'_> {
+ fn cmp(&self, other: &Self) -> Ordering {
+ self.partial_cmp(other).unwrap()
+ }
+}
+
+impl AsRef<str> for Phrase<'_> {
+ fn as_ref(&self) -> &str {
+ self.as_str()
+ }
+}
+
+impl From<Phrase<'_>> for String {
+ fn from(phrase: Phrase) -> Self {
+ phrase.phrase.into_owned()
+ }
+}
+
+impl From<Phrase<'_>> for (String, u32) {
+ fn from(phrase: Phrase) -> Self {
+ (phrase.phrase.into_owned(), phrase.freq)
+ }
+}
+
+impl<'a, S> From<(S, u32)> for Phrase<'a>
+where
+ S: Into<Cow<'a, str>>,
+{
+ fn from(tuple: (S, u32)) -> Self {
+ Phrase::new(tuple.0, tuple.1)
+ }
+}
+
+impl<'a, S> From<(S, u32, u64)> for Phrase<'a>
+where
+ S: Into<Cow<'a, str>>,
+{
+ fn from(tuple: (S, u32, u64)) -> Self {
+ Phrase::new(tuple.0, tuple.1).with_time(tuple.2)
+ }
+}
+
+impl Display for Phrase<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.write_str(self.as_str())
+ }
+}
+
+/// A generic iterator over the phrases and their frequency in a dictionary.
+///
+/// # Examples
+///
+/// ```
+/// use std::collections::HashMap;
+///
+/// use chewing::{dictionary::Dictionary, syl, zhuyin::Bopomofo};
+///
+/// let dict = HashMap::from([
+/// (vec![syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]], vec![("測", 100).into()]),
+/// ]);
+///
+/// for phrase in dict.lookup_word(
+/// syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]
+/// ) {
+/// assert_eq!("測", phrase.as_str());
+/// assert_eq!(100, phrase.freq());
+/// }
+/// ```
+pub type Phrases<'a, 'p> = Box<dyn Iterator<Item = Phrase<'p>> + 'a>;
+
+pub type DictEntries<'a, 'p> = Box<dyn Iterator<Item = (Vec<Syllable>, Phrase<'p>)> + 'a>;
+
+/// An interface for looking up dictionaries.
+///
+/// This is the main dictionary trait. For more about the concept of
+/// dictionaries generally, please see the [module-level
+/// documentation][crate::dictionary].
+///
+/// # Examples
+///
+/// The std [`HashMap`] implements the `Dictionary` trait so it can be used in
+/// tests.
+///
+/// ```
+/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
+/// use std::collections::HashMap;
+///
+/// use chewing::{dictionary::Dictionary, syl, zhuyin::Bopomofo};
+///
+/// let mut dict = HashMap::new();
+/// let dict_mut = dict.as_mut_dict().unwrap();
+/// dict_mut.insert(&[syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]], ("測", 100).into())?;
+///
+/// for phrase in dict.lookup_word(
+/// syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]
+/// ) {
+/// assert_eq!("測", phrase.as_str());
+/// assert_eq!(100, phrase.freq());
+/// }
+/// # Ok(())
+/// # }
+/// ```
+pub trait Dictionary: Debug {
+ /// Returns an iterator to all single syllable words matched by the
+ /// syllable, if any. The result should use a stable order each time for the
+ /// same input.
+ fn lookup_word(&self, syllable: Syllable) -> Phrases {
+ self.lookup_phrase(&[syllable])
+ }
+ /// Returns an iterator to all phrases matched by the syllables, if any. The
+ /// result should use a stable order each time for the same input.
+ fn lookup_phrase(&self, syllables: &[Syllable]) -> Phrases;
+ /// Returns an iterator to all phrases in the dictionary.
+ fn entries(&self) -> DictEntries;
+ /// Returns information about the dictionary instance.
+ fn about(&self) -> DictionaryInfo;
+ /// Returns a mutable reference to the dictionary if the underlying
+ /// implementation allows update.
+ fn as_mut_dict(&mut self) -> Option<&mut dyn DictionaryMut>;
+}
+
+/// An interface for updating dictionaries.
+///
+/// For more about the concept of dictionaries generally, please see the
+/// [module-level documentation][crate::dictionary].
+///
+/// # Examples
+///
+/// The std [`HashMap`] implements the `DictionaryMut` trait so it can be used in
+/// tests.
+///
+/// ```
+/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
+/// use std::collections::HashMap;
+///
+/// use chewing::{dictionary::Dictionary, syl, zhuyin::Bopomofo};
+///
+/// let mut dict = HashMap::new();
+/// let dict_mut = dict.as_mut_dict().unwrap();
+/// dict_mut.insert(&[syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]], ("測", 100).into())?;
+/// # Ok(())
+/// # }
+/// ```
+pub trait DictionaryMut {
+ fn insert(
+ &mut self,
+ syllables: &[Syllable],
+ phrase: Phrase<'static>,
+ ) -> Result<(), DictionaryUpdateError>;
+
+ fn update(
+ &mut self,
+ syllables: &[Syllable],
+ phrase: Phrase,
+ user_freq: u32,
+ time: u64,
+ ) -> Result<(), DictionaryUpdateError>;
+
+ fn remove(
+ &mut self,
+ syllables: &[Syllable],
+ phrase_str: &str,
+ ) -> Result<(), DictionaryUpdateError>;
+}
+
+#[derive(Error, Debug)]
+#[error("build dictionary error")]
+pub struct BuildDictionaryError {
+ #[from]
+ source: Box<dyn std::error::Error + Send + Sync>,
+}
+
+impl From<std::io::Error> for BuildDictionaryError {
+ fn from(source: std::io::Error) -> Self {
+ BuildDictionaryError {
+ source: Box::new(source),
+ }
+ }
+}
+
+pub trait DictionaryBuilder {
+ fn set_info(&mut self, info: DictionaryInfo) -> Result<(), BuildDictionaryError>;
+ fn insert(
+ &mut self,
+ syllables: &[Syllable],
+ phrase: Phrase,
+ ) -> Result<(), BuildDictionaryError>;
+ fn build(&mut self, path: &Path) -> Result<(), BuildDictionaryError>;
+}
+
+impl Dictionary for HashMap<Vec<Syllable>, Vec<Phrase<'static>>> {
+ fn lookup_phrase(&self, syllables: &[Syllable]) -> Phrases {
+ self.get(syllables)
+ .cloned()
+ .map(|v| Box::new(v.into_iter()) as Phrases)
+ .unwrap_or_else(|| Box::new(std::iter::empty()))
+ }
+
+ fn entries(&self) -> DictEntries {
+ Box::new(
+ self.iter()
+ .flat_map(|(k, v)| v.iter().map(|phrase| (k.clone(), phrase.clone()))),
+ )
+ }
+
+ fn about(&self) -> DictionaryInfo {
+ Default::default()
+ }
+
+ fn as_mut_dict(&mut self) -> Option<&mut dyn DictionaryMut> {
+ Some(self)
+ }
+}
+
+impl DictionaryMut for HashMap<Vec<Syllable>, Vec<Phrase<'static>>> {
+ fn insert(
+ &mut self,
+ syllables: &[Syllable],
+ phrase: Phrase<'static>,
+ ) -> Result<(), DictionaryUpdateError> {
+ let vec = self.entry(syllables.to_vec()).or_default();
+ if vec.iter().any(|it| it.as_str() == phrase.as_str()) {
+ return Err(DictionaryUpdateError {
+ source: Box::new(DuplicatePhraseError),
+ });
+ }
+ vec.push(phrase);
+ Ok(())
+ }
+
+ fn update(
+ &mut self,
+ _syllables: &[Syllable],
+ _phrase: Phrase,
+ _user_freq: u32,
+ _time: u64,
+ ) -> Result<(), DictionaryUpdateError> {
+ Ok(())
+ }
+
+ fn remove(
+ &mut self,
+ syllables: &[Syllable],
+ phrase_str: &str,
+ ) -> Result<(), DictionaryUpdateError> {
+ let vec = self.entry(syllables.to_vec()).or_default();
+ *vec = vec
+ .iter()
+ .cloned()
+ .filter(|p| p.as_str() != phrase_str)
+ .collect::<Vec<_>>();
+ Ok(())
+ }
+}
+
+/// A block list contains unwanted phrases.
+pub trait BlockList: Debug {
+ /// Returns if whether a phrase is in the block list.
+ fn is_blocked(&self, phrase: &str) -> bool;
+}
+
+impl BlockList for HashSet<String> {
+ fn is_blocked(&self, phrase: &str) -> bool {
+ self.contains(phrase)
+ }
+}
diff --git a/src/dictionary/layered.rs b/src/dictionary/layered.rs
new file mode 100644
index 0000000..f24c89d
--- /dev/null
+++ b/src/dictionary/layered.rs
@@ -0,0 +1,188 @@
+use std::hash::{Hash, Hasher};
+
+use indexmap::IndexSet;
+
+use crate::zhuyin::Syllable;
+
+use super::{
+ BlockList, DictEntries, Dictionary, DictionaryInfo, DictionaryMut, DictionaryUpdateError,
+ Phrase, Phrases,
+};
+
+/// A collection of dictionaries that returns the union of the lookup results.
+/// # Examples
+///
+/// ```
+/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
+/// use std::collections::{HashMap, HashSet};
+///
+/// use chewing::{dictionary::{LayeredDictionary, Dictionary}, syl, zhuyin::Bopomofo};
+///
+/// let mut sys_dict = Box::new(HashMap::new());
+/// let mut user_dict = Box::new(HashMap::new());
+/// sys_dict.insert(
+/// vec![syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]],
+/// vec![("測", 1).into(), ("冊", 1).into(), ("側", 1).into()]
+/// );
+/// user_dict.insert(
+/// vec![syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]],
+/// vec![("策", 100).into(), ("冊", 100).into()]
+/// );
+///
+/// let user_block_list = Box::new(HashSet::from(["側".to_string()]));
+///
+/// let dict = LayeredDictionary::new(vec![sys_dict, user_dict], vec![user_block_list]);
+/// assert_eq!(
+/// [
+/// ("策", 100).into(),
+/// ("冊", 100).into(),
+/// ("測", 1).into(),
+/// ]
+/// .into_iter()
+/// .collect::<HashSet<_>>(),
+/// dict.lookup_phrase(&[
+/// syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]
+/// ])
+/// .collect::<HashSet<_>>(),
+/// );
+/// # Ok(())
+/// # }
+/// ```
+#[derive(Debug)]
+pub struct LayeredDictionary {
+ inner: Vec<Box<dyn Dictionary>>,
+ blocked: Vec<Box<dyn BlockList>>,
+}
+
+impl LayeredDictionary {
+ /// Creates a new `LayeredDictionary` with the list of dictionaries and
+ /// block lists.
+ pub fn new(
+ dictionaries: Vec<Box<dyn Dictionary>>,
+ block_lists: Vec<Box<dyn BlockList>>,
+ ) -> LayeredDictionary {
+ LayeredDictionary {
+ inner: dictionaries,
+ blocked: block_lists,
+ }
+ }
+ fn is_blocked(&self, phrase: &str) -> bool {
+ self.blocked.iter().any(|b| b.is_blocked(phrase))
+ }
+}
+
+impl Dictionary for LayeredDictionary {
+ /// Lookup phrases from all underlying dictionaries.
+ ///
+ /// Phrases are ordered by their first apperance in the underlying dictionaries.
+ ///
+ /// Pseudo code
+ ///
+ /// ```pseudo_code
+ /// Set phrases = list()
+ /// Set [d_base, d_layers] = d_list
+ /// Foreach phrase, freq in d_base.lookup(syllables)
+ /// Add phrases <- (phrase, freq)
+ /// Foreach d in d_layers
+ /// Foreach phrase, freq in d.lookup_syllables)
+ /// If phrase in phrases
+ /// Set phrases[phrase].freq = freq
+ /// Else
+ /// Add phrases <- (phrase, freq)
+ /// ```
+ fn lookup_phrase(&self, syllables: &[Syllable]) -> Phrases {
+ let (base, layers) = match self.inner.split_first() {
+ Some(d) => d,
+ None => return Box::new(std::iter::empty()),
+ };
+ let mut phrases = base
+ .lookup_phrase(syllables)
+ .map(LookupPhrase)
+ .collect::<IndexSet<_>>();
+ for d in layers {
+ for phrase in d.lookup_phrase(syllables) {
+ phrases.replace(LookupPhrase(phrase));
+ }
+ }
+ Box::new(
+ phrases
+ .into_iter()
+ .map(|p| p.0)
+ .filter(|phrase| !self.is_blocked(&phrase.phrase)),
+ )
+ }
+
+ fn entries(&self) -> DictEntries {
+ todo!("entries from all layers")
+ // Box::new(std::iter::empty())
+ }
+
+ fn about(&self) -> DictionaryInfo {
+ DictionaryInfo {
+ name: Some("Built-in LayeredDictionary".to_string()),
+ ..Default::default()
+ }
+ }
+
+ fn as_mut_dict(&mut self) -> Option<&mut dyn DictionaryMut> {
+ Some(self)
+ }
+}
+
+impl DictionaryMut for LayeredDictionary {
+ fn insert(
+ &mut self,
+ syllables: &[Syllable],
+ phrase: Phrase<'static>,
+ ) -> Result<(), DictionaryUpdateError> {
+ for dict in &mut self.inner {
+ if let Some(dict_mut) = dict.as_mut_dict() {
+ dict_mut.insert(syllables, phrase.clone())?;
+ }
+ }
+ Ok(())
+ }
+
+ fn update(
+ &mut self,
+ syllables: &[Syllable],
+ phrase: Phrase,
+ user_freq: u32,
+ time: u64,
+ ) -> Result<(), DictionaryUpdateError> {
+ for dict in &mut self.inner {
+ if let Some(dict_mut) = dict.as_mut_dict() {
+ dict_mut.update(syllables, phrase.clone(), user_freq, time)?;
+ }
+ }
+ Ok(())
+ }
+
+ fn remove(
+ &mut self,
+ syllables: &[Syllable],
+ phrase_str: &str,
+ ) -> Result<(), DictionaryUpdateError> {
+ for dict in &mut self.inner {
+ if let Some(dict_mut) = dict.as_mut_dict() {
+ dict_mut.remove(syllables, phrase_str)?;
+ }
+ }
+ Ok(())
+ }
+}
+
+#[derive(Debug, Eq)]
+struct LookupPhrase<'a>(Phrase<'a>);
+
+impl Hash for LookupPhrase<'_> {
+ fn hash<H: Hasher>(&self, state: &mut H) {
+ self.0.phrase.hash(state);
+ }
+}
+
+impl PartialEq for LookupPhrase<'_> {
+ fn eq(&self, other: &Self) -> bool {
+ self.0.phrase == other.0.phrase
+ }
+}
diff --git a/src/dictionary/sqlite.rs b/src/dictionary/sqlite.rs
new file mode 100644
index 0000000..22edd2e
--- /dev/null
+++ b/src/dictionary/sqlite.rs
@@ -0,0 +1,625 @@
+use std::{os::unix::prelude::OsStrExt, path::Path, str};
+
+use rusqlite::{params, Connection, Error as RusqliteError, OpenFlags, OptionalExtension};
+use thiserror::Error;
+
+use crate::zhuyin::{IntoSyllablesBytes, Syllable};
+
+use super::{
+ BuildDictionaryError, DictEntries, Dictionary, DictionaryBuilder, DictionaryInfo,
+ DictionaryMut, DictionaryUpdateError, Phrase, Phrases,
+};
+
+#[derive(Debug, Error)]
+#[error("sqlite error")]
+pub enum SqliteDictionaryError {
+ SqliteError {
+ #[from]
+ source: RusqliteError,
+ },
+ MissingTable {
+ table: String,
+ },
+}
+
+#[derive(Debug)]
+pub struct SqliteDictionary {
+ conn: Connection,
+ info: DictionaryInfo,
+ read_only: bool,
+}
+
+impl SqliteDictionary {
+ pub fn open<P: AsRef<Path>>(path: P) -> Result<SqliteDictionary, SqliteDictionaryError> {
+ let mut conn = Connection::open(path)?;
+ Self::initialize_tables(&conn)?;
+ Self::migrate_from_userphrase_v1(&mut conn)?;
+ Self::ensure_tables(&conn)?;
+ let info = Self::read_info_v1(&conn)?;
+
+ Ok(SqliteDictionary {
+ conn,
+ info,
+ read_only: false,
+ })
+ }
+
+ pub fn open_read_only<P: AsRef<Path>>(
+ path: P,
+ ) -> Result<SqliteDictionary, SqliteDictionaryError> {
+ let conn = Connection::open_with_flags(path, OpenFlags::SQLITE_OPEN_READ_ONLY)?;
+ Self::ensure_tables(&conn)?;
+ let info = Self::read_info_v1(&conn)?;
+
+ Ok(SqliteDictionary {
+ conn,
+ info,
+ read_only: true,
+ })
+ }
+
+ pub fn open_in_memory() -> Result<SqliteDictionary, SqliteDictionaryError> {
+ let conn = Connection::open_in_memory()?;
+ Self::initialize_tables(&conn)?;
+ Self::ensure_tables(&conn)?;
+ let info = Self::read_info_v1(&conn)?;
+
+ Ok(SqliteDictionary {
+ conn,
+ info,
+ read_only: false,
+ })
+ }
+
+ fn initialize_tables(conn: &Connection) -> Result<(), SqliteDictionaryError> {
+ conn.pragma_update(None, "journal_mode", "WAL")?;
+ conn.execute(
+ "CREATE TABLE IF NOT EXISTS dictionary_v1 (
+ syllables BLOB NOT NULL,
+ phrase TEXT NOT NULL,
+ freq INTEGER NOT NULL,
+ sort_id INTEGER,
+ userphrase_id INTEGER,
+ PRIMARY KEY (syllables, phrase)
+ ) WITHOUT ROWID",
+ [],
+ )?;
+
+ conn.execute(
+ "CREATE TABLE IF NOT EXISTS userphrase_v2 (
+ id INTEGER PRIMARY KEY,
+ user_freq INTEGER,
+ time INTEGER
+ )",
+ [],
+ )?;
+
+ conn.execute(
+ "CREATE TABLE IF NOT EXISTS migration_v1 (name TEXT PRIMARY KEY) WITHOUT ROWID",
+ [],
+ )?;
+
+ conn.execute(
+ "CREATE TABLE IF NOT EXISTS info_v1 (
+ key TEXT PRIMARY KEY,
+ value TEXT NOT NULL
+ ) WITHOUT ROWID",
+ [],
+ )?;
+
+ Ok(())
+ }
+
+ fn ensure_tables(conn: &Connection) -> Result<(), SqliteDictionaryError> {
+ let mut stmt = conn
+ .prepare("SELECT EXISTS (SELECT 1 FROM sqlite_schema WHERE type='table' AND name=?)")?;
+ for table_name in ["dictionary_v1", "userphrase_v2", "migration_v1", "info_v1"] {
+ let has_table: bool = stmt.query_row([table_name], |row| row.get(0))?;
+ if !has_table {
+ return Err(SqliteDictionaryError::MissingTable {
+ table: table_name.into(),
+ });
+ }
+ }
+ Ok(())
+ }
+
+ fn migrate_from_userphrase_v1(conn: &mut Connection) -> Result<(), SqliteDictionaryError> {
+ let has_userphrase_v1: bool = conn.query_row(
+ "SELECT EXISTS (SELECT 1 FROM sqlite_master WHERE type='table' AND name='userphrase_v1')",
+ [],
+ |row| row.get(0)
+ )?;
+ let migrated: bool = conn.query_row(
+ "SELECT EXISTS (SELECT 1 FROM migration_v1 WHERE name='migrate_from_userphrase_v1')",
+ [],
+ |row| row.get(0),
+ )?;
+ if !has_userphrase_v1 || migrated {
+ // Don't need to migrate
+ conn.execute(
+ "INSERT OR IGNORE INTO migration_v1 (name) VALUES ('migrate_from_userphrase_v1')",
+ [],
+ )?;
+ return Ok(());
+ }
+
+ let mut userphrases: Vec<(Vec<Syllable>, String, u32, u32, u64)> = vec![];
+ {
+ let mut stmt = conn.prepare(
+ "SELECT
+ phrase,
+ orig_freq,
+ user_freq,
+ time,
+ phone_0,
+ phone_1,
+ phone_2,
+ phone_3,
+ phone_4,
+ phone_5,
+ phone_6,
+ phone_7,
+ phone_8,
+ phone_9,
+ phone_10
+ FROM userphrase_v1",
+ )?;
+ let mut rows = stmt.query([])?;
+ while let Some(row) = rows.next()? {
+ let mut syllables = vec![];
+ for i in 4..15 {
+ let syllable_u16: u16 = row.get(i)?;
+ if let Ok(syllable) = Syllable::try_from(syllable_u16) {
+ if !syllable.is_empty() {
+ syllables.push(syllable);
+ }
+ }
+ }
+ userphrases.push((
+ syllables,
+ row.get(0)?,
+ row.get(1)?,
+ row.get(2)?,
+ row.get(3)?,
+ ));
+ }
+ }
+
+ let tx = conn.transaction()?;
+ {
+ for item in userphrases {
+ let mut stmt = tx.prepare_cached(
+ "INSERT INTO userphrase_v2 (
+ user_freq,
+ time
+ ) VALUES (?, ?)",
+ )?;
+ stmt.execute(params![item.3, item.4])?;
+ let row_id = tx.last_insert_rowid();
+ let mut stmt = tx.prepare_cached(
+ "INSERT OR REPLACE INTO dictionary_v1 (
+ syllables,
+ phrase,
+ freq,
+ userphrase_id
+ ) VALUES (?, ?, ?, ?)",
+ )?;
+ let mut syllables_bytes = vec![];
+ item.0
+ .into_iter()
+ .for_each(|syl| syllables_bytes.extend_from_slice(&syl.to_u16().to_le_bytes()));
+ stmt.execute(params![syllables_bytes, item.1, item.2, row_id])?;
+ }
+ tx.execute(
+ "INSERT INTO migration_v1 (name) VALUES ('migrate_from_userphrase_v1')",
+ [],
+ )?;
+ }
+ tx.commit()?;
+ Ok(())
+ }
+
+ fn read_info_v1(conn: &Connection) -> Result<DictionaryInfo, SqliteDictionaryError> {
+ let mut info = DictionaryInfo::default();
+ let mut stmt = conn.prepare(
+ "SELECT key, value FROM info_v1 WHERE key IN (
+ 'name',
+ 'copyright',
+ 'license',
+ 'version',
+ 'software'
+ )",
+ )?;
+ let mut rows = stmt.query([])?;
+ while let Some(row) = rows.next()? {
+ let key: String = row.get(0)?;
+ let value: String = row.get(1)?;
+ match key.as_str() {
+ "name" => info.name = Some(value),
+ "copyright" => info.copyright = Some(value),
+ "license" => info.license = Some(value),
+ "version" => info.version = Some(value),
+ "software" => info.software = Some(value),
+ _ => (),
+ }
+ }
+ Ok(info)
+ }
+}
+
+impl Dictionary for SqliteDictionary {
+ fn lookup_phrase(&self, syllables: &[Syllable]) -> Phrases {
+ let syllables_bytes = syllables.into_syllables_bytes();
+ let mut stmt = self
+ .conn
+ .prepare_cached(
+ "SELECT
+ phrase,
+ max(freq, coalesce(user_freq, 0)),
+ time
+ FROM dictionary_v1 LEFT JOIN userphrase_v2 ON userphrase_id = id
+ WHERE syllables = ?
+ ORDER BY sort_id ASC, max(freq, coalesce(user_freq, 0)) DESC, phrase DESC",
+ )
+ .expect("SQL error");
+ Box::new(
+ stmt.query_map([syllables_bytes], |row| {
+ let (phrase, freq, time): (String, _, _) = row.try_into()?;
+ let mut phrase = Phrase::new(phrase, freq);
+ if let Some(last_used) = time {
+ phrase = phrase.with_time(last_used);
+ }
+ Ok(phrase)
+ })
+ .unwrap()
+ .map(|r| r.unwrap())
+ .collect::<Vec<_>>()
+ .into_iter(),
+ )
+ }
+
+ fn entries(&self) -> DictEntries {
+ let mut stmt = self
+ .conn
+ .prepare_cached(
+ "SELECT syllables, phrase, max(freq, coalesce(user_freq, 0)), time
+ FROM dictionary_v1 LEFT JOIN userphrase_v2 ON userphrase_id = id",
+ )
+ .expect("SQL error");
+ Box::new(
+ stmt.query_map([], |row| {
+ let (syllables_bytes, phrase, freq, time): (Vec<u8>, String, _, _) =
+ row.try_into()?;
+ let syllables = syllables_bytes
+ .chunks_exact(2)
+ .map(|bytes| {
+ let mut u16_bytes = [0; 2];
+ u16_bytes.copy_from_slice(bytes);
+ let syl_u16 = u16::from_le_bytes(u16_bytes);
+ Syllable::try_from(syl_u16).unwrap()
+ })
+ .collect::<Vec<_>>();
+ let mut phrase = Phrase::new(phrase, freq);
+ if let Some(last_used) = time {
+ phrase = phrase.with_time(last_used);
+ }
+ Ok((syllables, phrase))
+ })
+ .unwrap()
+ .map(|r| r.unwrap())
+ .collect::<Vec<_>>()
+ .into_iter(),
+ )
+ }
+
+ fn about(&self) -> DictionaryInfo {
+ self.info.clone()
+ }
+
+ fn as_mut_dict(&mut self) -> Option<&mut dyn DictionaryMut> {
+ if self.read_only {
+ None
+ } else {
+ Some(self)
+ }
+ }
+}
+
+impl From<RusqliteError> for DictionaryUpdateError {
+ fn from(source: RusqliteError) -> Self {
+ DictionaryUpdateError {
+ source: source.into(),
+ }
+ }
+}
+
+impl DictionaryMut for SqliteDictionary {
+ fn insert(
+ &mut self,
+ syllables: &[Syllable],
+ phrase: Phrase,
+ ) -> Result<(), DictionaryUpdateError> {
+ let syllables_bytes = syllables.into_syllables_bytes();
+ let mut stmt = self.conn.prepare_cached(
+ "INSERT OR REPLACE INTO dictionary_v1 (
+ syllables,
+ phrase,
+ freq
+ ) VALUES (?, ?, ?)",
+ )?;
+ stmt.execute(params![syllables_bytes, phrase.as_str(), phrase.freq()])?;
+ Ok(())
+ }
+
+ fn update(
+ &mut self,
+ syllables: &[Syllable],
+ phrase: Phrase,
+ user_freq: u32,
+ time: u64,
+ ) -> Result<(), DictionaryUpdateError> {
+ let syllables_bytes = syllables.into_syllables_bytes();
+ let tx = self.conn.transaction()?;
+ {
+ let mut stmt = tx.prepare_cached(
+ "SELECT userphrase_id FROM dictionary_v1 WHERE syllables = ? AND phrase = ?",
+ )?;
+ let userphrase_id: Option<Option<u64>> = stmt
+ .query_row(params![syllables_bytes, phrase.as_str()], |row| row.get(0))
+ .optional()?;
+ match userphrase_id {
+ Some(Some(id)) => {
+ let mut stmt =
+ tx.prepare_cached("UPDATE userphrase_v2 SET user_freq = ? WHERE id = ?")?;
+ stmt.execute(params![user_freq, id])?;
+ }
+ Some(None) | None => {
+ let mut stmt = tx.prepare_cached(
+ "INSERT INTO userphrase_v2 (user_freq, time) VALUES (?, ?)",
+ )?;
+ stmt.execute(params![user_freq, time])?;
+ let userphrase_id = tx.last_insert_rowid();
+ let mut stmt = tx.prepare_cached(
+ "INSERT OR REPLACE INTO dictionary_v1 (
+ syllables,
+ phrase,
+ freq,
+ userphrase_id
+ ) VALUES (?, ?, ?, ?)",
+ )?;
+ stmt.execute(params![
+ syllables_bytes,
+ phrase.as_str(),
+ phrase.freq(),
+ userphrase_id
+ ])?;
+ }
+ }
+ }
+ tx.commit()?;
+ Ok(())
+ }
+
+ fn remove(
+ &mut self,
+ syllables: &[Syllable],
+ phrase_str: &str,
+ ) -> Result<(), DictionaryUpdateError> {
+ let syllables_bytes = syllables.into_syllables_bytes();
+ let mut stmt = self
+ .conn
+ .prepare_cached("DELETE FROM dictionary_v1 WHERE syllables = ? AND phrase = ?")?;
+ stmt.execute(params![syllables_bytes, phrase_str])?;
+ Ok(())
+ }
+}
+
+pub struct SqliteDictionaryBuilder {
+ dict: SqliteDictionary,
+ sort_id: u64,
+}
+
+impl SqliteDictionaryBuilder {
+ pub fn new() -> SqliteDictionaryBuilder {
+ let dict = SqliteDictionary::open_in_memory().unwrap();
+ SqliteDictionaryBuilder { dict, sort_id: 0 }
+ }
+}
+
+impl Default for SqliteDictionaryBuilder {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl From<RusqliteError> for BuildDictionaryError {
+ fn from(source: RusqliteError) -> Self {
+ BuildDictionaryError {
+ source: Box::new(source),
+ }
+ }
+}
+
+impl From<std::str::Utf8Error> for BuildDictionaryError {
+ fn from(source: std::str::Utf8Error) -> Self {
+ BuildDictionaryError {
+ source: Box::new(source),
+ }
+ }
+}
+
+impl DictionaryBuilder for SqliteDictionaryBuilder {
+ fn set_info(&mut self, info: DictionaryInfo) -> Result<(), BuildDictionaryError> {
+ let tx = self.dict.conn.transaction()?;
+ {
+ let mut stmt =
+ tx.prepare("INSERT OR REPLACE INTO info_v1 (key, value) VALUES (?, ?)")?;
+ if let Some(name) = info.name {
+ stmt.execute(["name", &name])?;
+ }
+ if let Some(copyright) = info.copyright {
+ stmt.execute(["copyright", &copyright])?;
+ }
+ if let Some(license) = info.license {
+ stmt.execute(["license", &license])?;
+ }
+ if let Some(version) = info.version {
+ stmt.execute(["version", &version])?;
+ }
+ if let Some(software) = info.software {
+ stmt.execute(["software", &software])?;
+ }
+ }
+ tx.commit()?;
+ Ok(())
+ }
+
+ fn insert(
+ &mut self,
+ syllables: &[Syllable],
+ phrase: Phrase,
+ ) -> Result<(), BuildDictionaryError> {
+ let sort_id = if syllables.len() == 1 {
+ self.sort_id += 1;
+ self.sort_id
+ } else {
+ 0
+ };
+ let syllables_bytes = syllables.into_syllables_bytes();
+ let mut stmt = self.dict.conn.prepare_cached(
+ "INSERT OR REPLACE INTO dictionary_v1 (
+ syllables,
+ phrase,
+ freq,
+ sort_id
+ ) VALUES (?, ?, ?, ?)",
+ )?;
+ stmt.execute(params![
+ syllables_bytes,
+ phrase.as_str(),
+ phrase.freq(),
+ sort_id
+ ])?;
+
+ Ok(())
+ }
+
+ fn build(&mut self, path: &Path) -> Result<(), BuildDictionaryError> {
+ let path = str::from_utf8(path.as_os_str().as_bytes())?;
+ self.dict.conn.execute("VACUUM INTO ?", [path])?;
+ Ok(())
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use std::error::Error;
+
+ use rusqlite::{params, Connection};
+ use tempfile::NamedTempFile;
+
+ use crate::{
+ dictionary::{Dictionary, DictionaryMut, Phrase},
+ syl,
+ zhuyin::Bopomofo,
+ };
+
+ use super::SqliteDictionary;
+
+ #[test]
+ fn migration_from_userphrase_v1() {
+ let temp_path = NamedTempFile::new()
+ .expect("Unable to create tempfile")
+ .into_temp_path();
+ let temp_db = Connection::open(&temp_path).expect("Unable to open database");
+ temp_db.execute(
+ "CREATE TABLE IF NOT EXISTS userphrase_v1 (
+ time INTEGER,
+ user_freq INTEGER,
+ max_freq INTEGER,
+ orig_freq INTEGER,
+ length INTEGER,
+ phone_0 INTEGER,
+ phone_1 INTEGER,
+ phone_2 INTEGER,
+ phone_3 INTEGER,
+ phone_4 INTEGER,
+ phone_5 INTEGER,
+ phone_6 INTEGER,
+ phone_7 INTEGER,
+ phone_8 INTEGER,
+ phone_9 INTEGER,
+ phone_10 INTEGER,
+ phrase TEXT,
+ PRIMARY KEY (phone_0,phone_1,phone_2,phone_3,phone_4,phone_5,phone_6,phone_7,phone_8,phone_9,phone_10,phrase)
+ )", []).expect("Initialize db failed");
+ temp_db
+ .execute(
+ "INSERT INTO userphrase_v1 (
+ time, user_freq, max_freq, orig_freq, length,
+ phone_0,phone_1,phone_2,phone_3,phone_4,phone_5,phone_6,phone_7,phone_8,phone_9,phone_10,phrase
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?), (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
+ params![186613,9318,9318,9318,2,10268,8708,0,0,0,0,0,0,0,0,0,"測試".to_string(),
+ 186613,318,9318,9318,2,10268,8708,0,0,0,0,0,0,0,0,0,"策士".to_string()],
+ )
+ .expect("Initialize db failed");
+ temp_db.close().expect("Unable to close database");
+
+ let dict = SqliteDictionary::open(&temp_path).expect("Unable to open database");
+ assert_eq!(
+ vec![
+ Phrase::new("策士", 9318).with_time(186613),
+ Phrase::new("測試", 9318).with_time(186613)
+ ],
+ dict.lookup_phrase(&[
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ])
+ .collect::<Vec<_>>()
+ );
+ }
+
+ #[test]
+ fn insert_and_update_user_freq() -> Result<(), Box<dyn Error>> {
+ let mut dict = SqliteDictionary::open_in_memory()?;
+ dict.update(
+ &[
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ],
+ ("測試", 9318).into(),
+ 9900,
+ 0,
+ )?;
+ assert_eq!(
+ vec![Phrase::new("測試", 9900).with_time(0)],
+ dict.lookup_phrase(&[
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ])
+ .collect::<Vec<_>>()
+ );
+ Ok(())
+ }
+
+ #[test]
+ fn update_user_freq() -> Result<(), Box<dyn Error>> {
+ let mut dict = SqliteDictionary::open_in_memory()?;
+ let syllables = [
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ];
+ dict.insert(&syllables, ("測試", 9318).into())?;
+ dict.update(&syllables, ("測試", 9318).into(), 9900, 0)?;
+ assert_eq!(
+ vec![Phrase::new("測試", 9900).with_time(0)],
+ dict.lookup_phrase(&[
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ])
+ .collect::<Vec<_>>()
+ );
+ Ok(())
+ }
+}
diff --git a/src/dictionary/trie.rs b/src/dictionary/trie.rs
new file mode 100644
index 0000000..023fe32
--- /dev/null
+++ b/src/dictionary/trie.rs
@@ -0,0 +1,1224 @@
+use std::{
+ cmp::Ordering,
+ collections::VecDeque,
+ ffi::CString,
+ fmt::Debug,
+ fs::File,
+ io::{self, BufWriter, Read, Seek, Write},
+ path::Path,
+};
+
+use binary_layout::define_layout;
+use riff::{Chunk, ChunkContents, ChunkId, RIFF_ID};
+
+use crate::zhuyin::Syllable;
+
+use super::{
+ BuildDictionaryError, Dictionary, DictionaryBuilder, DictionaryInfo, DictionaryMut,
+ DuplicatePhraseError, Phrase, Phrases,
+};
+
+const CHEW: ChunkId = ChunkId { value: *b"CHEW" };
+const DICT: ChunkId = ChunkId { value: *b"DICT" };
+const DATA: ChunkId = ChunkId { value: *b"DATA" };
+const LIST: ChunkId = ChunkId { value: *b"LIST" };
+const INFO: ChunkId = ChunkId { value: *b"INFO" };
+const INAM: ChunkId = ChunkId { value: *b"INAM" };
+const ICOP: ChunkId = ChunkId { value: *b"ICOP" };
+const ILIC: ChunkId = ChunkId { value: *b"ILIC" };
+const IREV: ChunkId = ChunkId { value: *b"IREV" };
+const ISFT: ChunkId = ChunkId { value: *b"ISFT" };
+
+define_layout!(trie_node, LittleEndian, {
+ syllable: u16,
+ child_begin: u32,
+ child_end: u32,
+});
+
+define_layout!(trie_leaf, LittleEndian, {
+ zero: u16,
+ data_position: u32,
+ frequency: u32,
+});
+
+/// A read-only dictionary using a pre-built [Trie][] index that is both space
+/// efficient and fast to lookup.
+///
+/// `TrieDictionary`s are used as system dictionaries, or shared dictionaries.
+/// The dictionary file is defined using the platform independent [Resource
+/// Interchange File Format (RIFF)][RIFF], allowing them to be versioned and
+/// shared easily.
+///
+/// `TrieDictionary`s can be created from anything that implements the [`Read`]
+/// and [`Seek`] trait, as long as the underlying data conforms to the file
+/// format spec.
+///
+/// A new dictionary can be built using a [`TrieDictionaryBuilder`].
+///
+/// # Examples
+///
+/// We may want to read a dictionary from a [File][`std::fs::File`]:
+///
+/// ```
+/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
+/// use std::fs::File;
+///
+/// use chewing::{syl, zhuyin::{Bopomofo, Syllable}};
+/// # use chewing::dictionary::{DictionaryBuilder, TrieDictionaryBuilder};
+/// use chewing::dictionary::{Dictionary, TrieDictionary};
+/// # let mut tempfile = File::create("dict.dat")?;
+/// # let mut builder = TrieDictionaryBuilder::new();
+/// # builder.insert(&[
+/// # syl![Bopomofo::Z, Bopomofo::TONE4],
+/// # syl![Bopomofo::D, Bopomofo::I, Bopomofo::AN]
+/// # ], ("字典", 0).into());
+/// # builder.write(&mut tempfile)?;
+///
+/// let mut file = File::open("dict.dat")?;
+/// let dict = TrieDictionary::new(&mut file)?;
+///
+/// // Find the phrase ㄗˋㄉ一ㄢˇ (dictionary)
+/// let mut phrases = dict.lookup_phrase(&[
+/// syl![Bopomofo::Z, Bopomofo::TONE4],
+/// syl![Bopomofo::D, Bopomofo::I, Bopomofo::AN]
+/// ]);
+/// assert_eq!("字典", phrases.next().unwrap().as_str());
+/// # Ok(())
+/// # }
+/// ```
+///
+/// [Trie]: https://en.m.wikipedia.org/wiki/Trie
+/// [RIFF]: https://en.m.wikipedia.org/wiki/Resource_Interchange_File_Format
+#[derive(Debug)]
+pub struct TrieDictionary {
+ info: DictionaryInfo,
+ dict: Vec<u8>,
+ data: Vec<u8>,
+}
+
+impl TrieDictionary {
+ /// Creates a new `TrieDictionary` instance from a file.
+ ///
+ /// The data in the file must conform to the dictionary format spec. See
+ /// [`TrieDictionaryBuilder`] on how to build a dictionary.
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
+ /// use chewing::dictionary::TrieDictionary;
+ ///
+ /// let dict = TrieDictionary::open("dict.dat")?;
+ /// # Ok(())
+ /// # }
+ /// ```
+ pub fn open<P: AsRef<Path>>(path: P) -> io::Result<TrieDictionary> {
+ let mut file = File::open(path)?;
+ TrieDictionary::new(&mut file)
+ }
+ /// Creates a new `TrieDictionary` instance from a input stream.
+ ///
+ /// The underlying data of the input stream must conform to the dictionary
+ /// format spec. See [`TrieDictionaryBuilder`] on how to build a dictionary.
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
+ /// use std::fs::File;
+ ///
+ /// use chewing::dictionary::TrieDictionary;
+ ///
+ /// let mut file = File::open("dict.dat")?;
+ /// let dict = TrieDictionary::new(&mut file)?;
+ /// # Ok(())
+ /// # }
+ /// ```
+ pub fn new<T>(mut stream: T) -> io::Result<TrieDictionary>
+ where
+ T: Read + Seek,
+ {
+ let root = Chunk::read(&mut stream, 0)?;
+ if root.id() != RIFF_ID {
+ return Err(io::Error::from(io::ErrorKind::InvalidData));
+ }
+ let file_type = root.read_type(&mut stream)?;
+ if file_type != CHEW {
+ return Err(io::Error::from(io::ErrorKind::InvalidData));
+ }
+ let mut dict_chunk = None;
+ let mut data_chunk = None;
+ let mut info_chunk = None;
+ for chunk in root.iter(&mut stream) {
+ match chunk.id() {
+ LIST => info_chunk = Some(chunk),
+ DICT => dict_chunk = Some(chunk),
+ DATA => data_chunk = Some(chunk),
+ _ => (),
+ }
+ }
+ let mut info = DictionaryInfo::default();
+ if let Some(chunk) = info_chunk {
+ info = Self::read_dictionary_info(chunk, &mut stream)?;
+ }
+ let dict = dict_chunk
+ .ok_or_else(|| io::Error::new(io::ErrorKind::UnexpectedEof, "expecting DICT chunk"))?
+ .read_contents(&mut stream)?;
+ let data = data_chunk
+ .ok_or_else(|| io::Error::new(io::ErrorKind::UnexpectedEof, "expecting DATA chunk"))?
+ .read_contents(&mut stream)?;
+ Ok(TrieDictionary { info, dict, data })
+ }
+
+ fn read_dictionary_info<T>(list_chunk: Chunk, mut stream: T) -> io::Result<DictionaryInfo>
+ where
+ T: Read + Seek,
+ {
+ let mut info = DictionaryInfo::default();
+ let chunk_type = list_chunk.read_type(&mut stream)?;
+ if chunk_type != INFO {
+ return Ok(info);
+ }
+
+ let mut chunks = vec![];
+
+ for chunk in list_chunk.iter(&mut stream) {
+ match chunk.id() {
+ INAM | ICOP | ILIC | IREV | ISFT => chunks.push((chunk.id(), chunk)),
+ _ => (),
+ }
+ }
+
+ for (id, chunk) in chunks {
+ let content = match id {
+ INAM | ICOP | ILIC | IREV | ISFT => Some(
+ CString::new(chunk.read_contents(&mut stream)?)?
+ .into_string()
+ .map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err))?,
+ ),
+ _ => None,
+ };
+ match id {
+ INAM => info.name = content,
+ ICOP => info.copyright = content,
+ ILIC => info.license = content,
+ IREV => info.version = content,
+ ISFT => info.software = content,
+ _ => (),
+ }
+ }
+
+ Ok(info)
+ }
+}
+
+fn trie_leaf_iter(dict: &TrieDictionary, begin: usize, end: usize) -> Phrases {
+ Box::new(
+ dict.dict[begin..end]
+ .chunks(trie_leaf::SIZE.unwrap())
+ .map(trie_leaf::View::new)
+ .filter(|view| view.zero().read() == 0)
+ .map(|leaf| {
+ let pos = leaf.data_position().read() as usize;
+ let len = dict.data[pos] as usize;
+ let start = pos + 1;
+ let end = start + len;
+ Phrase::new(
+ std::str::from_utf8(&dict.data[start..end]).expect("invalid data"),
+ leaf.frequency().read(),
+ )
+ }),
+ )
+}
+
+impl Dictionary for TrieDictionary {
+ fn lookup_phrase(&self, syllables: &[Syllable]) -> Phrases {
+ let chunk_size = trie_node::SIZE.unwrap();
+ let root = trie_node::View::new(self.dict.as_slice());
+ let mut node = root;
+ 'next: for syl in syllables {
+ debug_assert!(syl.to_u16() != 0);
+ let child_begin = node.child_begin().read() as usize * chunk_size;
+ let child_end = node.child_end().read() as usize * chunk_size;
+ for storage in self.dict[child_begin..child_end].chunks(chunk_size) {
+ let child = trie_node::View::new(storage);
+ if child.syllable().read() == syl.to_u16() {
+ node = child;
+ continue 'next;
+ }
+ }
+ return Box::new(std::iter::empty());
+ }
+ trie_leaf_iter(
+ self,
+ node.child_begin().read() as usize * chunk_size,
+ node.child_end().read() as usize * chunk_size,
+ )
+ }
+
+ fn entries(&self) -> super::DictEntries {
+ todo!();
+ }
+
+ fn about(&self) -> DictionaryInfo {
+ self.info.clone()
+ }
+
+ fn as_mut_dict(&mut self) -> Option<&mut dyn DictionaryMut> {
+ None
+ }
+}
+
+/// A builder to create a dictionary that can be loaded by the
+/// [`TrieDictionary`].
+///
+/// # Examples
+///
+/// We may want to create a dictionary [File][`std::fs::File`]:
+///
+/// ```
+/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
+/// use std::fs::File;
+///
+/// use chewing::{syl, zhuyin::Bopomofo};
+/// use chewing::dictionary::{DictionaryBuilder, TrieDictionaryBuilder};
+///
+/// let mut file = File::create("dict.dat")?;
+/// let mut builder = TrieDictionaryBuilder::new();
+/// builder.insert(&[
+/// syl![Bopomofo::Z, Bopomofo::TONE4],
+/// syl![Bopomofo::D, Bopomofo::I, Bopomofo::AN]
+/// ], ("字典", 0).into());
+/// builder.write(&mut file)?;
+/// # Ok(())
+/// # }
+/// ```
+///
+/// # RIFF File Format
+///
+/// The dictionary file is defined using the platform independent [Resource
+/// Interchange File Format (RIFF)][RIFF], allowing them to be versioned and
+/// shared easily. The text describing the RIFF format in this document is
+/// adopted from the [WebP Container Specification][WebP].
+///
+/// The basic element of a RIFF file is a chunk. It consists of:
+///
+/// ```text
+/// 0 1 2 3
+/// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Chunk FourCC |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Chunk Size |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Chunk Payload |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// ```
+///
+/// - **Chunk FourCC: 32 bits**
+/// - ASCII four-character code used for chunk identification.
+/// - **Chunk Size: 32 bits (u32)**
+/// - The size of the chunk not including this field, the chunk identifier
+/// or padding.
+/// - **Chunk Payload: Chunk Size bytes**
+/// - The data payload. If Chunk Size is odd, a single padding byte -- that
+/// SHOULD be 0 -- is added.
+/// - **ChunkHeader('ABCD')**
+/// - This is used to describe the FourCC and Chunk Size header of
+/// individual chunks, where 'ABCD' is the FourCC for the chunk. This
+/// element's size is 8 bytes.
+///
+/// ## File Header
+///
+/// ```text
+/// 0 1 2 3
+/// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | 'R' | 'I' | 'F' | 'F' |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | File Size |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | 'C' | 'H' | 'E' | 'W' |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// ```
+///
+/// - **'RIFF': 32 bits**
+/// - The ASCII characters 'R' 'I' 'F' 'F'.
+/// - **File Size: 32 bits (u32)**
+/// - The size of the file in bytes starting at offset 8. The maximum value
+/// of this field is 2^32 minus 10 bytes and thus the size of the whole
+/// file is at most 4GiB minus 2 bytes.
+/// - **'CHEW': 32 bits**
+/// - The ASCII characters 'C' 'H' 'E' 'W'.
+///
+/// A TrieDictionary file MUST begin with a RIFF header with the FourCC 'CHEW'.
+/// The file size in the header is the total size of the chunks that follow plus
+/// 4 bytes for the 'CHEW' FourCC. The file SHOULD NOT contain anything after
+/// it. As the size of any chunk is even, the size given by the RIFF header is
+/// also even. The contents of individual chunks will be described in the
+/// following sections.
+///
+/// ## File Layout
+///
+/// ```text
+/// 0 1 2 3
+/// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Dictionary file header (12 bytes) |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Info chunk |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Index chunk |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Phrases chunk |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// ```
+///
+/// ### Info chunk:
+///
+/// ```text
+/// 0 1 2 3
+/// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | ChunkHeader('LIST') |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | 'I' | 'N' | 'F' | 'O' |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Sub chunk header |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Sub chunk payload |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | .... |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// ```
+///
+/// The `LIST` chunk and the list type `INFO` is a standard RIFF chunk. The list
+/// contains information about the copyright, author, engineer of the file, and
+/// other similar text. Each sub-chunk's data is a null-terminated string.
+///
+/// Info data chunks recognized by this library:
+///
+/// - **INAM**: The name of the file
+/// - **ICOP**: Copyright information about the file
+/// - **ILIC**: License information about the file
+/// - **IREV**: The version of the file
+/// - **ISFT**: The name of the software package used to create the file
+///
+/// ### Index chunk:
+///
+/// ```text
+/// 0 1 2 3
+/// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | ChunkHeader('DICT') |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Reserved | Child Begin ...
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// ... | Child End ...
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// ... | SyllableU16 |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Child Begin |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Child End |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Zero | Data Position ...
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// ... | Phrase Frequency ...
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// ... | ...
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// ```
+///
+/// The index chunk contains the trie node records serialized in BFS order. The
+/// first record is the root node, followed by the nodes in the first layer,
+/// followed by the nodes in the second layer, and so on.
+///
+/// Each node record has fixed size. There are two kinds of nodes.
+///
+/// Internal node:
+///
+/// ```text
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | SyllableU16 | Child Begin | Child End |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// ```
+///
+/// - **SyllableU16: 16 bits (u16)**
+/// - The [`Syllable`] encoded as an u16 integer.
+/// - **Child Begin: 32 bits (u32)**
+/// - The record index of the first child node.
+/// - **Child End: 32 bits (u32)**
+/// - The record index of the end of the child nodes, exclusive.
+///
+/// Leaf node:
+///
+/// ```text
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Zero | Data Position | Frequency |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// ```
+///
+/// - **Zero: 16 bits (u16)**
+/// - Must be all zeros, indicating a leaf node.
+/// - **Data Position: 32 bits (u32)**
+/// - The offset into the Phrases chunk for the phrase data.
+/// - **Frequency: 32 bits (u32)**
+/// - The frequency of the phrase.
+///
+/// ### Phrases chunk:
+///
+/// ```text
+/// 0 1 2 3
+/// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | ChunkHeader('DATA') |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Length | Phrase |
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// | Length | ...
+/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/// ```
+///
+/// The phrases chunk contains all the phrases strings. Each phrase is written
+/// as length prefixed strings.
+///
+/// - **Length: 8 bits (u8)**
+/// - Each phrase encoded in UTF-8 must not exceed 255 bytes long.
+/// - **Phrase: variable bits**
+/// - UTF-8 encoded string, not null-terminated.
+///
+/// [WebP]: https://developers.google.com/speed/webp/docs/riff_container
+/// [Trie]: https://en.m.wikipedia.org/wiki/Trie
+/// [RIFF]: https://en.m.wikipedia.org/wiki/Resource_Interchange_File_Format
+pub struct TrieDictionaryBuilder {
+ // The builder uses an arena to allocate nodes and reference each node with
+ // node index.
+ arena: Vec<TrieBuilderNode>,
+ info: DictionaryInfo,
+}
+
+#[derive(Debug, PartialEq)]
+struct TrieBuilderNode {
+ id: usize,
+ syllable: Option<Syllable>,
+ children: Vec<usize>,
+ frequency: u32,
+ phrase: String,
+}
+
+/// A container for trie dictionary statistics.
+#[derive(Debug)]
+pub struct TrieDictionaryStatistics {
+ /// The number of nodes in the dictionary.
+ pub node_count: usize,
+ /// The number of internal nodes at the edge (phrases with same syllables).
+ pub internal_leaf_count: usize,
+ /// The number of leaf nodes (total number of phrases).
+ pub leaf_node_count: usize,
+ /// The max height (longest phrase) of the trie.
+ pub max_height: usize,
+ /// The average height (average phrase length) of the trie.
+ pub avg_height: usize,
+ /// The max branch count (shared prefix) including the root of the trie.
+ pub root_branch_count: usize,
+ /// The max branch count (shared prefix) excluding the root of the trie.
+ pub max_branch_count: usize,
+ /// The average branch count of the trie.
+ pub avg_branch_count: usize,
+}
+
+impl TrieDictionaryBuilder {
+ /// Creates a new `TrieDictionaryBuilder`.
+ ///
+ /// The builder is initialized with a empty root node. Use the [`insert`][Self::insert]
+ /// method to add more entries to the dictionary.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use chewing::dictionary::TrieDictionaryBuilder;
+ ///
+ /// let mut builder = TrieDictionaryBuilder::new();
+ /// ```
+ pub fn new() -> TrieDictionaryBuilder {
+ let root = TrieBuilderNode {
+ id: 0,
+ syllable: None,
+ children: vec![],
+ frequency: 0,
+ phrase: String::new(),
+ };
+ TrieDictionaryBuilder {
+ arena: vec![root],
+ info: Default::default(),
+ }
+ }
+
+ /// Allocates a new leaf node and returns the new node id.
+ fn alloc_leaf(&mut self, phrase: &str, frequency: u32) -> usize {
+ let next_id = self.arena.len();
+ let leaf = TrieBuilderNode {
+ id: next_id,
+ syllable: None,
+ children: vec![],
+ frequency,
+ phrase: phrase.to_owned(),
+ };
+ self.arena.push(leaf);
+ next_id
+ }
+
+ /// Allocates a new internal node and returns the new node id.
+ fn alloc_internal(&mut self, syl: Syllable) -> usize {
+ let next_id = self.arena.len();
+ let internal = TrieBuilderNode {
+ id: next_id,
+ syllable: Some(syl),
+ children: vec![],
+ frequency: 0,
+ phrase: String::new(),
+ };
+ self.arena.push(internal);
+ next_id
+ }
+
+ /// Iterates through the syllables and insert all missing internal nodes.
+ ///
+ /// Returns the id to the last internal node so we can add leaf nodes to it.
+ fn find_or_insert_internal(&mut self, syllables: &[Syllable]) -> usize {
+ let mut node_id = 0;
+ 'next: for &syl in syllables {
+ for &child_node_id in &self.arena[node_id].children {
+ if self.arena[child_node_id].syllable == Some(syl) {
+ node_id = child_node_id;
+ continue 'next;
+ }
+ }
+ // We didn't find the child node so insert a new one
+ let next_id = self.alloc_internal(syl);
+ self.arena[node_id].children.push(next_id);
+ node_id = next_id;
+ }
+ node_id
+ }
+
+ /// Writes the dictionary to an output stream and returns the number of
+ /// bytes written.
+ ///
+ /// This method creates the sub-chunks containing the index, phrases, and
+ /// metadata, then wraps them in a RIFF container.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// # fn main() -> Result<(), Box<dyn std::error::Error>> {
+ /// use std::io::Cursor;
+ ///
+ /// use chewing::dictionary::TrieDictionaryBuilder;
+ ///
+ /// let mut writer = Cursor::new(vec![]);
+ /// let mut builder = TrieDictionaryBuilder::new();
+ ///
+ /// builder.write(&mut writer)?;
+ /// # Ok(())
+ /// # }
+ /// ```
+ pub fn write<T>(&self, mut writer: T) -> io::Result<u64>
+ where
+ T: Write + Seek,
+ {
+ const ROOT_ID: usize = 0;
+ let mut dict_buf = Vec::new();
+ let mut data_buf = Vec::new();
+ let mut queue = VecDeque::new();
+
+ // The root node's child index starts from 1 (0 is the root).
+ let mut child_begin = 1;
+
+ // Walk the tree in BFS order and write the nodes to the dict buffer.
+ queue.push_back(ROOT_ID);
+ while !queue.is_empty() {
+ // Insert nodes layer by layer.
+ let layer_nodes_count = queue.len();
+ for _ in 0..layer_nodes_count {
+ let id = queue.pop_front().unwrap();
+ let node = &self.arena[id];
+
+ // An internal node has an associated syllable. The root node is
+ // a special case with no syllable.
+ if node.syllable.is_some() || id == ROOT_ID {
+ debug_assert_eq!(Some(10), trie_node::SIZE);
+ let mut record = [0; 10];
+ let mut view = trie_node::View::new(&mut record);
+ let syllable_u16 = node.syllable.map_or(0, |v| v.to_u16());
+ let child_end = child_begin + node.children.len() as u32;
+ view.syllable_mut().write(syllable_u16);
+ view.child_begin_mut().write(child_begin);
+ view.child_end_mut().write(child_end);
+ dict_buf.write_all(view.into_storage())?;
+ } else {
+ debug_assert_eq!(Some(10), trie_leaf::SIZE);
+ let mut record = [0; 10];
+ let mut view = trie_leaf::View::new(&mut record);
+ view.zero_mut().write(0);
+ view.data_position_mut().write(data_buf.len() as u32);
+ view.frequency_mut().write(node.frequency);
+ dict_buf.write_all(view.into_storage())?;
+
+ let phrase = &node.phrase;
+ debug_assert!(phrase.len() <= u8::MAX as usize);
+ data_buf.write_all(&[phrase.len() as u8])?;
+ data_buf.write_all(phrase.as_bytes())?;
+ }
+
+ child_begin += node.children.len() as u32;
+
+ // Sort the children nodes by their syllables
+ //
+ // NB: this must use a stable sorting algorithm so that lookup
+ // results are stable according to the input file.
+ let mut children = node.children.clone();
+ children.sort_by(|&a, &b| {
+ let a = &self.arena[a];
+ let b = &self.arena[b];
+ let syllable_u16_a = a.syllable.map_or(0, |syl| syl.to_u16());
+ let syllable_u16_b = b.syllable.map_or(0, |syl| syl.to_u16());
+ match (syllable_u16_a, syllable_u16_b) {
+ // Don't sort single word leaves.
+ // But sort phrases first by the frequency, then by the UTF-8 order.
+ (0, 0) => match (a.phrase.chars().count(), b.phrase.chars().count()) {
+ (1, 1) => Ordering::Equal,
+ (1, _) | (_, 1) => a.phrase.len().cmp(&b.phrase.len()),
+ _ => {
+ if a.frequency == b.frequency {
+ b.phrase.cmp(&a.phrase)
+ } else {
+ b.frequency.cmp(&a.frequency)
+ }
+ }
+ },
+ _ => syllable_u16_b.cmp(&syllable_u16_a),
+ }
+ });
+ for child_id in children {
+ queue.push_back(child_id);
+ }
+ }
+ }
+
+ // Wrap the data in a RIFF container
+ let contents = ChunkContents::Children(
+ RIFF_ID.clone(),
+ CHEW,
+ vec![
+ ChunkContents::Children(LIST, INFO, self.info_chunks()?),
+ ChunkContents::Data(DICT, dict_buf),
+ ChunkContents::Data(DATA, data_buf),
+ ],
+ );
+
+ contents.write(&mut writer)
+ }
+
+ fn info_chunks(&self) -> Result<Vec<ChunkContents>, io::Error> {
+ let mut info_chunks = vec![];
+ if let Some(name) = &self.info.name {
+ info_chunks.push(ChunkContents::Data(
+ INAM,
+ CString::new(name.as_bytes())?.into_bytes(),
+ ))
+ }
+ if let Some(copyright) = &self.info.copyright {
+ info_chunks.push(ChunkContents::Data(
+ ICOP,
+ CString::new(copyright.as_bytes())?.into_bytes(),
+ ))
+ }
+ if let Some(license) = &self.info.license {
+ info_chunks.push(ChunkContents::Data(
+ ILIC,
+ CString::new(license.as_bytes())?.into_bytes(),
+ ))
+ }
+ if let Some(version) = &self.info.version {
+ info_chunks.push(ChunkContents::Data(
+ IREV,
+ CString::new(version.as_bytes())?.into_bytes(),
+ ))
+ }
+ if let Some(software) = &self.info.software {
+ info_chunks.push(ChunkContents::Data(
+ ISFT,
+ CString::new(software.as_bytes())?.into_bytes(),
+ ))
+ }
+ Ok(info_chunks)
+ }
+
+ /// Calculates the statistics of the dictionary.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use chewing::{syl, zhuyin::Bopomofo};
+ /// use chewing::dictionary::{DictionaryBuilder, TrieDictionaryBuilder};
+ ///
+ /// let mut builder = TrieDictionaryBuilder::new();
+ /// builder.insert(&[
+ /// syl![Bopomofo::G, Bopomofo::U, Bopomofo::O, Bopomofo::TONE2],
+ /// ], ("國", 0).into());
+ /// builder.insert(&[
+ /// syl![Bopomofo::M, Bopomofo::I, Bopomofo::EN, Bopomofo::TONE2]
+ /// ], ("民", 0).into());
+ /// builder.insert(&[
+ /// syl![Bopomofo::D, Bopomofo::A, Bopomofo::TONE4],
+ /// ], ("大", 0).into());
+ /// builder.insert(&[
+ /// syl![Bopomofo::H, Bopomofo::U, Bopomofo::EI, Bopomofo::TONE4],
+ /// ], ("會", 0).into());
+ /// builder.insert(&[
+ /// syl![Bopomofo::G, Bopomofo::U, Bopomofo::O, Bopomofo::TONE2],
+ /// syl![Bopomofo::M, Bopomofo::I, Bopomofo::EN, Bopomofo::TONE2]
+ /// ], ("國民", 0).into());
+ /// builder.insert(&[
+ /// syl![Bopomofo::G, Bopomofo::U, Bopomofo::O, Bopomofo::TONE2],
+ /// syl![Bopomofo::M, Bopomofo::I, Bopomofo::EN, Bopomofo::TONE2],
+ /// syl![Bopomofo::D, Bopomofo::A, Bopomofo::TONE4],
+ /// syl![Bopomofo::H, Bopomofo::U, Bopomofo::EI, Bopomofo::TONE4],
+ /// ], ("國民大會", 0).into());
+ /// let stats = builder.statistics();
+ /// assert_eq!(14, stats.node_count);
+ /// assert_eq!(6, stats.internal_leaf_count);
+ /// assert_eq!(6, stats.leaf_node_count);
+ /// assert_eq!(6, stats.max_height);
+ /// assert_eq!(2, stats.avg_height);
+ /// assert_eq!(4, stats.root_branch_count);
+ /// assert_eq!(2, stats.max_branch_count);
+ /// assert_eq!(0, stats.avg_branch_count);
+ /// ```
+ pub fn statistics(&self) -> TrieDictionaryStatistics {
+ let mut node_count = 0;
+ let mut internal_leaf_count = 0;
+ let mut leaf_node_count = 0;
+ let mut max_height = 0;
+ let mut branch_heights = vec![];
+ let mut root_branch_count = 0;
+ let mut max_branch_count = 0;
+ let mut branch_counts = vec![];
+
+ const ROOT_ID: usize = 0;
+ let mut queue = VecDeque::new();
+ queue.push_back(ROOT_ID);
+
+ while !queue.is_empty() {
+ let layer_nodes_count = queue.len();
+
+ max_height += 1;
+ for _ in 0..layer_nodes_count {
+ let id = queue.pop_front().unwrap();
+ let node = &self.arena[id];
+
+ node_count += 1;
+
+ if node.syllable.is_some() || id == ROOT_ID {
+ if node
+ .children
+ .iter()
+ .any(|&child_id| self.arena[child_id].syllable.is_none())
+ {
+ internal_leaf_count += 1;
+ branch_heights.push(max_height);
+ }
+ let branch_count = node
+ .children
+ .iter()
+ .filter(|&&child_id| self.arena[child_id].syllable.is_some())
+ .count();
+ branch_counts.push(branch_count);
+ if branch_count > max_branch_count && id != ROOT_ID {
+ max_branch_count = node.children.len();
+ }
+ if branch_count > root_branch_count {
+ root_branch_count = node.children.len();
+ }
+ } else {
+ leaf_node_count += 1;
+ }
+ for &child_id in &node.children {
+ queue.push_back(child_id);
+ }
+ }
+ }
+
+ TrieDictionaryStatistics {
+ node_count,
+ internal_leaf_count,
+ leaf_node_count,
+ max_height,
+ avg_height: branch_heights.iter().sum::<usize>() / branch_counts.len(),
+ root_branch_count,
+ max_branch_count,
+ avg_branch_count: branch_counts.iter().sum::<usize>() / branch_counts.len(),
+ }
+ }
+}
+
+impl DictionaryBuilder for TrieDictionaryBuilder {
+ fn set_info(&mut self, info: DictionaryInfo) -> Result<(), BuildDictionaryError> {
+ self.info = info;
+ Ok(())
+ }
+
+ /// Inserts a new entry to the dictionary.
+ ///
+ /// A DuplicatePhraseError is returned if a phrase is already present with
+ /// the same syllables.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use chewing::{syl, zhuyin::Bopomofo};
+ /// use chewing::dictionary::{DictionaryBuilder, TrieDictionaryBuilder};
+ ///
+ /// let mut builder = TrieDictionaryBuilder::new();
+ ///
+ /// builder.insert(&[
+ /// syl![Bopomofo::Z, Bopomofo::TONE4],
+ /// syl![Bopomofo::D, Bopomofo::I, Bopomofo::AN]
+ /// ], ("字典", 0).into());
+ /// ```
+ fn insert(
+ &mut self,
+ syllables: &[Syllable],
+ phrase: Phrase,
+ ) -> Result<(), BuildDictionaryError> {
+ let leaf_id = self.alloc_leaf(phrase.as_str(), phrase.freq());
+ let parent_id = self.find_or_insert_internal(syllables);
+ if self.arena[parent_id]
+ .children
+ .iter()
+ .map(|&child_id| &self.arena[child_id])
+ .any(|child| child.phrase == phrase.as_str())
+ {
+ return Err(BuildDictionaryError {
+ source: Box::new(DuplicatePhraseError),
+ });
+ }
+ self.arena[parent_id].children.push(leaf_id);
+ Ok(())
+ }
+
+ fn build(&mut self, path: &Path) -> Result<(), BuildDictionaryError> {
+ let database = File::create(path)?;
+ let mut writer = BufWriter::new(database);
+ self.write(&mut writer)?;
+ Ok(())
+ }
+}
+
+impl Default for TrieDictionaryBuilder {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use std::io::Cursor;
+
+ use crate::{
+ dictionary::{
+ trie::TrieBuilderNode, Dictionary, DictionaryBuilder, DictionaryInfo, Phrase,
+ },
+ syl,
+ zhuyin::Bopomofo,
+ };
+
+ use super::{TrieDictionary, TrieDictionaryBuilder};
+
+ #[test]
+ fn test_tree_construction() -> Result<(), Box<dyn std::error::Error>> {
+ let mut builder = TrieDictionaryBuilder::new();
+ builder.insert(
+ &vec![
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ],
+ ("測試", 100).into(),
+ )?;
+ builder.insert(
+ &vec![
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::S, Bopomofo::U, Bopomofo::O, Bopomofo::TONE3],
+ ],
+ ("廁所", 100).into(),
+ )?;
+ assert_eq!(
+ vec![
+ TrieBuilderNode {
+ id: 0,
+ syllable: None,
+ children: vec![2],
+ frequency: 0,
+ phrase: String::new(),
+ },
+ TrieBuilderNode {
+ id: 1,
+ syllable: None,
+ children: vec![],
+ frequency: 100,
+ phrase: String::from("測試"),
+ },
+ TrieBuilderNode {
+ id: 2,
+ syllable: Some(syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]),
+ children: vec![3, 5],
+ frequency: 0,
+ phrase: String::new(),
+ },
+ TrieBuilderNode {
+ id: 3,
+ syllable: Some(syl![Bopomofo::SH, Bopomofo::TONE4]),
+ children: vec![1],
+ frequency: 0,
+ phrase: String::new(),
+ },
+ TrieBuilderNode {
+ id: 4,
+ syllable: None,
+ children: vec![],
+ frequency: 100,
+ phrase: String::from("廁所"),
+ },
+ TrieBuilderNode {
+ id: 5,
+ syllable: Some(syl![Bopomofo::S, Bopomofo::U, Bopomofo::O, Bopomofo::TONE3]),
+ children: vec![4],
+ frequency: 0,
+ phrase: String::new(),
+ },
+ ],
+ builder.arena
+ );
+ Ok(())
+ }
+
+ #[test]
+ fn tree_lookup_word() -> Result<(), Box<dyn std::error::Error>> {
+ let mut builder = TrieDictionaryBuilder::new();
+ builder.insert(
+ &vec![syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]],
+ ("測", 1).into(),
+ )?;
+ builder.insert(
+ &vec![syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]],
+ ("冊", 1).into(),
+ )?;
+ let mut cursor = Cursor::new(vec![]);
+ builder.write(&mut cursor)?;
+
+ let dict = TrieDictionary::new(&mut cursor)?;
+ assert_eq!(
+ vec![Phrase::new("測", 1), Phrase::new("冊", 1)],
+ dict.lookup_word(syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4])
+ .collect::<Vec<_>>()
+ );
+
+ Ok(())
+ }
+
+ #[test]
+ fn tree_lookup_phrase() -> Result<(), Box<dyn std::error::Error>> {
+ let mut builder = TrieDictionaryBuilder::new();
+ builder.insert(
+ &vec![
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ],
+ ("測試", 1).into(),
+ )?;
+ builder.insert(
+ &vec![
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ],
+ ("策試", 2).into(),
+ )?;
+ builder.insert(
+ &vec![
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ syl![Bopomofo::CH, Bopomofo::ENG, Bopomofo::TONE2],
+ syl![Bopomofo::G, Bopomofo::U, Bopomofo::ENG],
+ ],
+ ("測試成功", 3).into(),
+ )?;
+ let mut cursor = Cursor::new(vec![]);
+ builder.write(&mut cursor)?;
+
+ let dict = TrieDictionary::new(&mut cursor)?;
+ assert_eq!(
+ vec![Phrase::new("策試", 2), Phrase::new("測試", 1)],
+ dict.lookup_phrase(&[
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4]
+ ])
+ .collect::<Vec<_>>()
+ );
+ assert_eq!(
+ vec![Phrase::new("測試成功", 3)],
+ dict.lookup_phrase(&[
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ syl![Bopomofo::CH, Bopomofo::ENG, Bopomofo::TONE2],
+ syl![Bopomofo::G, Bopomofo::U, Bopomofo::ENG],
+ ])
+ .collect::<Vec<_>>()
+ );
+ assert_eq!(
+ Vec::<Phrase>::new(),
+ dict.lookup_phrase(&[
+ syl![Bopomofo::C, Bopomofo::U, Bopomofo::O, Bopomofo::TONE4],
+ syl![Bopomofo::U, Bopomofo::TONE4]
+ ])
+ .collect::<Vec<_>>()
+ );
+
+ Ok(())
+ }
+
+ #[test]
+ #[should_panic]
+ fn tree_builder_duplicate_phrase_error() {
+ let mut builder = TrieDictionaryBuilder::new();
+ builder
+ .insert(
+ &vec![
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ],
+ ("測試", 1).into(),
+ )
+ .expect("Duplicate phrase error");
+ builder
+ .insert(
+ &vec![
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ],
+ ("測試", 2).into(),
+ )
+ .expect("Duplicate phrase error");
+ }
+
+ #[test]
+ fn stable_word_sort_order() -> Result<(), Box<dyn std::error::Error>> {
+ let mut builder = TrieDictionaryBuilder::new();
+ for word in ["冊", "策", "測", "側"] {
+ builder.insert(
+ &vec![syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4]],
+ (word, 0).into(),
+ )?;
+ }
+ let mut cursor = Cursor::new(vec![]);
+ builder.write(&mut cursor)?;
+
+ let dict = TrieDictionary::new(&mut cursor)?;
+ assert_eq!(
+ vec![
+ Phrase::new("冊", 0),
+ Phrase::new("策", 0),
+ Phrase::new("測", 0),
+ Phrase::new("側", 0),
+ ],
+ dict.lookup_phrase(&vec![syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],])
+ .collect::<Vec<Phrase>>()
+ );
+ Ok(())
+ }
+
+ #[test]
+ fn stable_phrase_sort_order() -> Result<(), Box<dyn std::error::Error>> {
+ let mut builder = TrieDictionaryBuilder::new();
+ builder.insert(
+ &vec![
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ],
+ ("側室", 318).into(),
+ )?;
+ builder.insert(
+ &vec![
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ],
+ ("側視", 318).into(),
+ )?;
+ builder.insert(
+ &vec![
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ],
+ ("策士", 318).into(),
+ )?;
+ builder.insert(
+ &vec![
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ],
+ ("策試", 318).into(),
+ )?;
+ builder.insert(
+ &vec![
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ],
+ ("測試", 9318).into(),
+ )?;
+ let mut cursor = Cursor::new(vec![]);
+ builder.write(&mut cursor)?;
+
+ let dict = TrieDictionary::new(&mut cursor)?;
+ assert_eq!(
+ vec![
+ Phrase::new("測試", 9318),
+ Phrase::new("策試", 318),
+ Phrase::new("策士", 318),
+ Phrase::new("側視", 318),
+ Phrase::new("側室", 318),
+ ],
+ dict.lookup_phrase(&vec![
+ syl![Bopomofo::C, Bopomofo::E, Bopomofo::TONE4],
+ syl![Bopomofo::SH, Bopomofo::TONE4],
+ ])
+ .collect::<Vec<Phrase>>()
+ );
+ Ok(())
+ }
+
+ #[test]
+ fn tree_builder_write_read_metadata() {
+ let mut builder = TrieDictionaryBuilder::new();
+ let info = DictionaryInfo {
+ name: Some("name".into()),
+ copyright: Some("copyright".into()),
+ license: Some("license".into()),
+ version: Some("version".into()),
+ software: Some("software".into()),
+ };
+ builder.set_info(info).unwrap();
+
+ let mut cursor = Cursor::new(vec![]);
+ builder.write(&mut cursor).unwrap();
+
+ let dict = TrieDictionary::new(&mut cursor).unwrap();
+ let info = dict.about();
+
+ assert_eq!("name", info.name.unwrap());
+ assert_eq!("copyright", info.copyright.unwrap());
+ assert_eq!("license", info.license.unwrap());
+ assert_eq!("version", info.version.unwrap());
+ assert_eq!("software", info.software.unwrap());
+ }
+}
diff --git a/src/editor.rs b/src/editor.rs
new file mode 100644
index 0000000..d3aa66a
--- /dev/null
+++ b/src/editor.rs
@@ -0,0 +1,6 @@
+mod estimate;
+pub mod keymap;
+pub mod layout;
+
+pub use estimate::{EstimateError, SqliteUserFreqEstimate, UserFreqEstimate};
+pub use layout::SyllableEditor;
diff --git a/src/editor/estimate.rs b/src/editor/estimate.rs
new file mode 100644
index 0000000..c138939
--- /dev/null
+++ b/src/editor/estimate.rs
@@ -0,0 +1,112 @@
+use std::path::Path;
+
+use rusqlite::Connection;
+use thiserror::Error;
+
+use crate::dictionary::Phrase;
+
+#[derive(Error, Debug)]
+#[error("update estimate error")]
+pub struct EstimateError {
+ source: Box<dyn std::error::Error>,
+}
+
+pub trait UserFreqEstimate {
+ fn tick(&mut self) -> Result<(), EstimateError>;
+ fn now(&self) -> Result<u64, EstimateError>;
+ fn estimate(&self, phrase: &Phrase, orig_freq: u32, max_freq: u32) -> u32;
+}
+
+pub struct SqliteUserFreqEstimate {
+ conn: Connection,
+ lifetime: u64,
+}
+
+impl From<rusqlite::Error> for EstimateError {
+ fn from(source: rusqlite::Error) -> Self {
+ EstimateError {
+ source: source.into(),
+ }
+ }
+}
+
+impl SqliteUserFreqEstimate {
+ pub fn open<P: AsRef<Path>>(path: P) -> Result<SqliteUserFreqEstimate, EstimateError> {
+ let conn = Connection::open(path)?;
+ Self::initialize_tables(&conn)?;
+ let lifetime = conn.query_row("SELECT value FROM config_v1 WHERE id = 0", [], |row| {
+ row.get(0)
+ })?;
+ Ok(SqliteUserFreqEstimate { conn, lifetime })
+ }
+
+ pub fn open_in_memory() -> Result<SqliteUserFreqEstimate, EstimateError> {
+ let conn = Connection::open_in_memory()?;
+ Self::initialize_tables(&conn)?;
+ let lifetime = conn.query_row("SELECT value FROM config_v1 WHERE id = 0", [], |row| {
+ row.get(0)
+ })?;
+ Ok(SqliteUserFreqEstimate { conn, lifetime })
+ }
+
+ fn initialize_tables(conn: &Connection) -> Result<(), EstimateError> {
+ conn.execute(
+ "CREATE TABLE IF NOT EXISTS config_v1 (
+ id INTEGER PRIMARY KEY,
+ value INTEGER
+ ) WITHOUT ROWID",
+ [],
+ )?;
+ conn.execute(
+ "INSERT OR IGNORE INTO config_v1 (id, value) VALUES (0, 0)",
+ [],
+ )?;
+ Ok(())
+ }
+}
+
+const SHORT_INCREASE_FREQ: u32 = 10;
+const MEDIUM_INCREASE_FREQ: u32 = 5;
+const LONG_DECREASE_FREQ: u32 = 10;
+const MAX_USER_FREQ: u32 = 99999999;
+
+impl UserFreqEstimate for SqliteUserFreqEstimate {
+ fn tick(&mut self) -> Result<(), EstimateError> {
+ // TODO debounce write
+ self.conn
+ .execute("UPDATE config_v1 SET value = value + 1 WHERE id = 0", [])?;
+ self.lifetime =
+ self.conn
+ .query_row("SELECT value FROM config_v1 WHERE id = 0", [], |row| {
+ row.get(0)
+ })?;
+ Ok(())
+ }
+
+ fn now(&self) -> Result<u64, EstimateError> {
+ Ok(self.lifetime)
+ }
+
+ fn estimate(&self, phrase: &Phrase, orig_freq: u32, max_freq: u32) -> u32 {
+ let delta_time = self.lifetime - phrase.last_used().unwrap_or(self.lifetime);
+
+ if delta_time < 4000 {
+ let delta = if phrase.freq() >= max_freq {
+ ((max_freq - orig_freq) / 5 + 1).min(SHORT_INCREASE_FREQ)
+ } else {
+ ((max_freq - orig_freq) / 5 + 1).max(SHORT_INCREASE_FREQ)
+ };
+ (phrase.freq() + delta).min(MAX_USER_FREQ)
+ } else if delta_time < 50000 {
+ let delta = if phrase.freq() >= max_freq {
+ ((max_freq - orig_freq) / 10 + 1).min(MEDIUM_INCREASE_FREQ)
+ } else {
+ ((max_freq - orig_freq) / 10 + 1).max(MEDIUM_INCREASE_FREQ)
+ };
+ (phrase.freq() + delta).min(MAX_USER_FREQ)
+ } else {
+ let delta = ((phrase.freq() - orig_freq) / 5).max(LONG_DECREASE_FREQ);
+ (phrase.freq() - delta).max(orig_freq)
+ }
+ }
+}
diff --git a/src/editor/keymap.rs b/src/editor/keymap.rs
new file mode 100644
index 0000000..f956310
--- /dev/null
+++ b/src/editor/keymap.rs
@@ -0,0 +1,159 @@
+//! Keyboard layout conversion
+//!
+//! People usually practice Zhuyin input method independently from practicing
+//! English typing, they acquire different muscle memory. This module provides APIs
+//! to map different English layouts to layout independent key indexes that can be
+//! used to drive the phonetic conversion engines.
+
+/// Layout independent key index
+#[derive(Debug, Clone, Copy, PartialEq)]
+#[rustfmt::skip]
+pub enum KeyIndex {
+ K0 = 0,
+// 1 2 3 4 5 6 7 8 9 0 - = \ `
+ K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12, K13, K14,
+// Q W E R T Y U I O P [ ]
+ K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26,
+// A S D F G H J K L ; '
+ K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37,
+// Z X C V B N M , . / SPC
+ K38, K39, K40, K41, K42, K43, K44, K45, K46, K47, K48
+}
+
+/// USB HID KeyCodes
+#[derive(Debug, Clone, Copy, PartialEq)]
+#[rustfmt::skip]
+pub enum KeyCode {
+ Unknown = 0,
+ N1, N2, N3, N4, N5, N6, N7, N8, N9, N0, Minus, Equal, BSlash, Grave,
+ Q, W, E, R, T, Y, U, I, O, P, LBracket, RBracket,
+ A, S, D, F, G, H, J, K, L, SColon, Quote,
+ Z, X, C, V, B, N, M, Comma, Dot, Slash, Space
+}
+
+/// Key processed by a keymap
+#[derive(Debug, Clone, Copy, PartialEq)]
+pub struct KeyEvent {
+ pub index: KeyIndex,
+ pub code: KeyCode,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq)]
+pub struct Layout {
+ name: &'static str,
+ map: [KeyCode; 48],
+}
+
+pub trait Keymap {
+ fn map_key(&self, input: KeyCode) -> KeyEvent;
+}
+
+#[derive(Debug)]
+pub struct IdentityKeymap {
+ inner: RemappingKeymap,
+}
+
+impl IdentityKeymap {
+ pub fn new(source: Layout) -> IdentityKeymap {
+ IdentityKeymap {
+ inner: RemappingKeymap::new(source, source),
+ }
+ }
+}
+
+impl Keymap for IdentityKeymap {
+ fn map_key(&self, input: KeyCode) -> KeyEvent {
+ self.inner.map_key(input)
+ }
+}
+
+#[derive(Debug)]
+pub struct RemappingKeymap {
+ source: Layout,
+ target: Layout,
+}
+
+impl RemappingKeymap {
+ pub fn new(source: Layout, target: Layout) -> RemappingKeymap {
+ RemappingKeymap { source, target }
+ }
+}
+
+impl Keymap for RemappingKeymap {
+ fn map_key(&self, input: KeyCode) -> KeyEvent {
+ let position = self
+ .source
+ .map
+ .iter()
+ .position(|&key| input == key)
+ .expect("invalid keycode");
+ let index = BLANK[position];
+ let code = self.target.map[position];
+ KeyEvent { index, code }
+ }
+}
+
+#[rustfmt::skip]
+const QWERTY_INDEX: [u8; 48] = [
+ b'1', b'2', b'3', b'4', b'5', b'6', b'7', b'8', b'9', b'0', b'-', b'=', b'\\', b'`',
+ b'q', b'w', b'e', b'r', b't', b'y', b'u', b'i', b'o', b'p', b'[', b']',
+ b'a', b's', b'd', b'f', b'g', b'h', b'j', b'k', b'l', b';', b'\'',
+ b'z', b'x', b'c', b'v', b'b', b'n', b'm', b',', b'.', b'/', b' '
+];
+
+pub trait KeyCodeFromQwerty {
+ fn as_key_code(&self) -> Option<KeyCode>;
+}
+
+impl KeyCodeFromQwerty for u8 {
+ fn as_key_code(&self) -> Option<KeyCode> {
+ let position = QWERTY_INDEX.iter().position(|key| key == self);
+ position.map(|pos| QWERTY.map[pos])
+ }
+}
+
+use std::fmt::Debug;
+
+use KeyCode::*;
+use KeyIndex::*;
+
+#[rustfmt::skip]
+const BLANK: [KeyIndex; 48] = [
+ K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12, K13, K14,
+ K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26,
+ K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37,
+ K38, K39, K40, K41, K42, K43, K44, K45, K46, K47, K48
+];
+
+#[rustfmt::skip]
+pub const QWERTY: Layout = Layout {
+ name: "QWERTY",
+ map: [
+ N1, N2, N3, N4, N5, N6, N7, N8, N9, N0, Minus, Equal, BSlash, Grave,
+ Q, W, E, R, T, Y, U, I, O, P, LBracket, RBracket,
+ A, S, D, F, G, H, J, K, L, SColon, Quote,
+ Z, X, C, V, B, N, M, Comma, Dot, Slash, Space
+ ],
+};
+
+#[rustfmt::skip]
+pub const DVORAK: Layout = Layout {
+ name: "DVORAK",
+ map: [
+ N1, N2, N3, N4, N5, N6, N7, N8, N9, N0, LBracket, RBracket, BSlash, Grave,
+ Quote, Comma, Dot, P, Y, F, G, C, R, L, Slash, Equal,
+ A, O, E, U, I, D, H, T, N, S, Minus,
+ SColon, Q, J, K, X, B, M, W, V, Z, Space
+ ],
+};
+
+#[rustfmt::skip]
+pub const CARPALX: Layout = Layout {
+ name: "CARPALX (QGMLWY)",
+ map: [
+ N1, N2, N3, N4, N5, N6, N7, N8, N9, N0, Minus, Equal, BSlash, Grave,
+ Q, G, M, L, W, Y, F, U, B, SColon, LBracket, RBracket,
+ D, S, T, N, R, I, A, E, O, H, Quote,
+ Z, X, C, V, J, K, P, Comma, Dot, Slash, Space
+ ],
+};
diff --git a/src/editor/layout.rs b/src/editor/layout.rs
new file mode 100644
index 0000000..7b9f541
--- /dev/null
+++ b/src/editor/layout.rs
@@ -0,0 +1,87 @@
+//! Conversion from key events to phonetic keys
+//!
+//! This module contains engines for phonetic key conversions.
+//!
+//! Traditionally the keyboards sold in Chinese speaking region have
+//! both the English alphabets and Zhuyin symbols printed on the keys.
+//! Like English keyboards can have different layouts (QWERTY, Dvorak, etc.),
+//! Zhuyin keyboards also have different layouts.
+//!
+//! The most widely used Zhuyin layout is the one directly printed on the keyboards.
+//! It is a one to one mapping from keys to Zhuyin symbols. However, some layouts
+//! have smarter mapping from keys to Zhuyin symbols, taking advantage of impossible
+//! combinations, to reduce the total keys required.
+//!
+//! Chewing currently supports the default layout, Hsu's layout, ET26 layout,
+//! DaChen CP26 layout, and the Pinyin layout.
+
+use std::fmt::Debug;
+
+use crate::zhuyin::Syllable;
+
+pub use self::{
+ dc26::DaiChien26,
+ et::Et,
+ et26::Et26,
+ ginyieh::GinYieh,
+ hsu::Hsu,
+ ibm::Ibm,
+ pinyin::{Pinyin, PinyinVariant},
+ standard::Standard,
+};
+
+use super::keymap::KeyEvent;
+
+mod dc26;
+mod et;
+mod et26;
+mod ginyieh;
+mod hsu;
+mod ibm;
+mod pinyin;
+mod standard;
+
+#[derive(Clone, Copy, Debug, PartialEq)]
+#[repr(C)]
+pub enum KeyboardLayoutCompat {
+ Default = 0,
+ Hsu,
+ Ibm,
+ GinYieh,
+ Et,
+ Et26,
+ Dvorak,
+ DvorakHsu,
+ DachenCp26,
+ HanyuPinyin,
+ ThlPinyin,
+ Mps2Pinyin,
+ Carpalx,
+}
+
+#[derive(Debug, PartialEq)]
+#[repr(C)]
+pub enum KeyBehavior {
+ Ignore = 0,
+ Absorb,
+ Commit,
+ KeyError,
+ Error,
+ NoWord,
+ OpenSymbolTable,
+}
+
+pub trait SyllableEditor {
+ /// Handles a key press event and returns the behavior of the layout.
+ fn key_press(&mut self, key: KeyEvent) -> KeyBehavior;
+ /// Removes the last input from the buffer.
+ fn remove_last(&mut self);
+ /// Clears the phonetic key buffer, removing all values.
+ fn clear(&mut self);
+ /// Returns true if the editor buffer is empty.
+ fn is_empty(&self) -> bool;
+ /// Returns the current syllable without changing the editor buffer.
+ fn read(&self) -> Syllable;
+ /// Returns the current key seq buffer as printable string, if supported by the layout.
+ fn key_seq(&self) -> Option<String>;
+}
diff --git a/src/editor/layout/dc26.rs b/src/editor/layout/dc26.rs
new file mode 100644
index 0000000..83c6fac
--- /dev/null
+++ b/src/editor/layout/dc26.rs
@@ -0,0 +1,185 @@
+//! Dai Chien CP26
+
+use crate::{
+ editor::keymap::{KeyEvent, KeyIndex},
+ zhuyin::{Bopomofo, Syllable},
+};
+
+use super::{KeyBehavior, SyllableEditor};
+
+#[derive(Debug)]
+pub struct DaiChien26 {
+ syllable: Syllable,
+}
+
+impl DaiChien26 {
+ pub fn new() -> DaiChien26 {
+ DaiChien26 {
+ syllable: Default::default(),
+ }
+ }
+ fn is_end_key(&self, key: KeyIndex) -> bool {
+ match key {
+ KeyIndex::K17 | KeyIndex::K18 | KeyIndex::K29 | KeyIndex::K20 | KeyIndex::K48 => {
+ !self.syllable.is_empty()
+ }
+ _ => false,
+ }
+ }
+ fn has_initial_or_medial(&self) -> bool {
+ self.syllable.has_initial() || self.syllable.has_medial()
+ }
+}
+
+impl Default for DaiChien26 {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+fn default_or_alt(source: Option<Bopomofo>, default: Bopomofo, alt: Bopomofo) -> Bopomofo {
+ match source {
+ None => default,
+ Some(src) => {
+ if src == default {
+ alt
+ } else {
+ default
+ }
+ }
+ }
+}
+
+impl SyllableEditor for DaiChien26 {
+ fn key_press(&mut self, key: KeyEvent) -> KeyBehavior {
+ if self.is_end_key(key.index) {
+ match key.index {
+ // KeyIndex::K48 => Some(Bopomofo::TONE1),
+ KeyIndex::K17 => self.syllable.update(Bopomofo::TONE2),
+ KeyIndex::K18 => self.syllable.update(Bopomofo::TONE3),
+ KeyIndex::K29 => self.syllable.update(Bopomofo::TONE4),
+ KeyIndex::K20 => self.syllable.update(Bopomofo::TONE5),
+ _ => {
+ self.syllable.remove_tone();
+ }
+ };
+ return KeyBehavior::Commit;
+ }
+ let bopomofo = match key.index {
+ KeyIndex::K15 => default_or_alt(self.syllable.initial(), Bopomofo::B, Bopomofo::P),
+ KeyIndex::K27 => Bopomofo::M,
+ KeyIndex::K38 => Bopomofo::F,
+ KeyIndex::K16 => default_or_alt(self.syllable.initial(), Bopomofo::D, Bopomofo::T),
+ KeyIndex::K28 => Bopomofo::N,
+ KeyIndex::K39 => Bopomofo::L,
+ KeyIndex::K17 => Bopomofo::G,
+ KeyIndex::K29 => Bopomofo::K,
+ KeyIndex::K40 => Bopomofo::H,
+ KeyIndex::K18 => Bopomofo::J,
+ KeyIndex::K30 => Bopomofo::Q,
+ KeyIndex::K41 => Bopomofo::X,
+ KeyIndex::K19 => default_or_alt(self.syllable.initial(), Bopomofo::ZH, Bopomofo::CH),
+ KeyIndex::K31 => Bopomofo::SH,
+ KeyIndex::K42 => {
+ if self.has_initial_or_medial() {
+ Bopomofo::EH
+ } else {
+ Bopomofo::R
+ }
+ }
+ KeyIndex::K20 => Bopomofo::Z,
+ KeyIndex::K32 => Bopomofo::C,
+ KeyIndex::K43 => {
+ if self.has_initial_or_medial() {
+ Bopomofo::ENG
+ } else {
+ Bopomofo::S
+ }
+ }
+ KeyIndex::K21 => {
+ match (self.syllable.medial(), self.syllable.rime()) {
+ (Some(Bopomofo::I), Some(Bopomofo::A)) => {
+ self.syllable.remove_medial();
+ self.syllable.remove_rime();
+ return KeyBehavior::Absorb;
+ }
+ (_, Some(Bopomofo::A)) => {
+ self.syllable.update(Bopomofo::I);
+ return KeyBehavior::Absorb;
+ }
+ (Some(Bopomofo::I), _) => {
+ self.syllable.remove_medial();
+ self.syllable.update(Bopomofo::A);
+ return KeyBehavior::Absorb;
+ }
+ (Some(_), _) => {
+ self.syllable.update(Bopomofo::A);
+ return KeyBehavior::Absorb;
+ }
+ _ => (),
+ }
+ Bopomofo::I
+ }
+ KeyIndex::K33 => Bopomofo::U,
+ KeyIndex::K44 => {
+ match (self.syllable.medial(), self.syllable.rime()) {
+ (Some(Bopomofo::IU), None) => {
+ self.syllable.remove_medial();
+ self.syllable.update(Bopomofo::OU);
+ return KeyBehavior::Absorb;
+ }
+ (Some(Bopomofo::IU), Some(f)) if f != Bopomofo::OU => {
+ self.syllable.remove_medial();
+ self.syllable.update(Bopomofo::OU);
+ return KeyBehavior::Absorb;
+ }
+ (None, Some(Bopomofo::OU)) => {
+ self.syllable.update(Bopomofo::IU);
+ self.syllable.remove_rime();
+ return KeyBehavior::Absorb;
+ }
+ (Some(f), Some(Bopomofo::OU)) if f != Bopomofo::IU => {
+ self.syllable.update(Bopomofo::IU);
+ self.syllable.remove_rime();
+ return KeyBehavior::Absorb;
+ }
+ (Some(_), _) => {
+ self.syllable.update(Bopomofo::OU);
+ return KeyBehavior::Absorb;
+ }
+ _ => (),
+ }
+ Bopomofo::IU
+ }
+ KeyIndex::K22 => default_or_alt(self.syllable.rime(), Bopomofo::O, Bopomofo::AI),
+ KeyIndex::K34 => Bopomofo::E,
+ KeyIndex::K23 => default_or_alt(self.syllable.rime(), Bopomofo::EI, Bopomofo::AN),
+ KeyIndex::K35 => default_or_alt(self.syllable.rime(), Bopomofo::AU, Bopomofo::ANG),
+ KeyIndex::K24 => default_or_alt(self.syllable.rime(), Bopomofo::EN, Bopomofo::ER),
+ _ => return KeyBehavior::KeyError,
+ };
+
+ self.syllable.update(bopomofo);
+ KeyBehavior::Absorb
+ }
+
+ fn is_empty(&self) -> bool {
+ self.syllable.is_empty()
+ }
+
+ fn remove_last(&mut self) {
+ self.syllable.pop();
+ }
+
+ fn clear(&mut self) {
+ self.syllable.clear();
+ }
+
+ fn read(&self) -> Syllable {
+ self.syllable
+ }
+
+ fn key_seq(&self) -> Option<String> {
+ None
+ }
+}
diff --git a/src/editor/layout/et.rs b/src/editor/layout/et.rs
new file mode 100644
index 0000000..29dbb67
--- /dev/null
+++ b/src/editor/layout/et.rs
@@ -0,0 +1,135 @@
+//! ET41 keyboard layout
+//!
+//! Another commonly used keyboard layout on older IBM PC.
+
+use crate::{
+ editor::keymap::{KeyEvent, KeyIndex},
+ zhuyin::{Bopomofo, BopomofoKind, Syllable},
+};
+
+use super::{KeyBehavior, SyllableEditor};
+
+#[derive(Debug)]
+pub struct Et {
+ syllable: Syllable,
+}
+
+impl Et {
+ pub fn new() -> Et {
+ Et {
+ syllable: Syllable::new(),
+ }
+ }
+}
+
+impl Default for Et {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl SyllableEditor for Et {
+ fn key_press(&mut self, key: KeyEvent) -> KeyBehavior {
+ let bopomofo = match key.index {
+ KeyIndex::K1 => Bopomofo::TONE5,
+ KeyIndex::K2 => Bopomofo::TONE2,
+ KeyIndex::K3 => Bopomofo::TONE3,
+ KeyIndex::K4 => Bopomofo::TONE4,
+ KeyIndex::K7 => Bopomofo::Q,
+ KeyIndex::K8 => Bopomofo::AN,
+ KeyIndex::K9 => Bopomofo::EN,
+ KeyIndex::K10 => Bopomofo::ANG,
+ KeyIndex::K11 => Bopomofo::ENG,
+ KeyIndex::K12 => Bopomofo::ER,
+ KeyIndex::K15 => Bopomofo::EI,
+ KeyIndex::K16 => Bopomofo::EH,
+ KeyIndex::K17 => Bopomofo::I,
+ KeyIndex::K18 => Bopomofo::E,
+ KeyIndex::K19 => Bopomofo::T,
+ KeyIndex::K20 => Bopomofo::OU,
+ KeyIndex::K21 => Bopomofo::IU,
+ KeyIndex::K22 => Bopomofo::AI,
+ KeyIndex::K23 => Bopomofo::O,
+ KeyIndex::K24 => Bopomofo::P,
+ KeyIndex::K27 => Bopomofo::A,
+ KeyIndex::K28 => Bopomofo::S,
+ KeyIndex::K29 => Bopomofo::D,
+ KeyIndex::K30 => Bopomofo::F,
+ KeyIndex::K31 => Bopomofo::J,
+ KeyIndex::K32 => Bopomofo::H,
+ KeyIndex::K33 => Bopomofo::R,
+ KeyIndex::K34 => Bopomofo::K,
+ KeyIndex::K35 => Bopomofo::L,
+ KeyIndex::K36 => Bopomofo::Z,
+ KeyIndex::K37 => Bopomofo::C,
+ KeyIndex::K38 => Bopomofo::AU,
+ KeyIndex::K39 => Bopomofo::U,
+ KeyIndex::K40 => Bopomofo::X,
+ KeyIndex::K41 => Bopomofo::G,
+ KeyIndex::K42 => Bopomofo::B,
+ KeyIndex::K43 => Bopomofo::N,
+ KeyIndex::K44 => Bopomofo::M,
+ KeyIndex::K45 => Bopomofo::ZH,
+ KeyIndex::K46 => Bopomofo::CH,
+ KeyIndex::K47 => Bopomofo::SH,
+ KeyIndex::K48 => Bopomofo::TONE1,
+ _ => return KeyBehavior::KeyError,
+ };
+ if bopomofo.kind() == BopomofoKind::Tone {
+ if !self.syllable.is_empty() {
+ if bopomofo != Bopomofo::TONE1 {
+ self.syllable.update(bopomofo);
+ }
+ return KeyBehavior::Commit;
+ }
+ } else {
+ self.syllable.remove_tone();
+ }
+
+ // In C libchewing TONE1 / Space is not a phonetic symbol
+ if bopomofo == Bopomofo::TONE1 {
+ return KeyBehavior::KeyError;
+ }
+
+ self.syllable.update(bopomofo);
+ KeyBehavior::Absorb
+ }
+
+ fn is_empty(&self) -> bool {
+ self.syllable.is_empty()
+ }
+
+ fn remove_last(&mut self) {
+ self.syllable.pop();
+ }
+
+ fn clear(&mut self) {
+ self.syllable.clear()
+ }
+
+ fn read(&self) -> Syllable {
+ self.syllable
+ }
+
+ fn key_seq(&self) -> Option<String> {
+ None
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use crate::editor::{
+ keymap::{IdentityKeymap, KeyCode, Keymap, QWERTY},
+ layout::{KeyBehavior, SyllableEditor},
+ };
+
+ use super::Et;
+
+ #[test]
+ fn space() {
+ let mut editor = Et::new();
+ let keymap = IdentityKeymap::new(QWERTY);
+ let behavior = editor.key_press(keymap.map_key(KeyCode::Space));
+ assert_eq!(KeyBehavior::KeyError, behavior);
+ }
+}
diff --git a/src/editor/layout/et26.rs b/src/editor/layout/et26.rs
new file mode 100644
index 0000000..2a3cedb
--- /dev/null
+++ b/src/editor/layout/et26.rs
@@ -0,0 +1,222 @@
+//! ET26 (倚天26鍵)
+
+use crate::{
+ editor::keymap::{KeyCode, KeyEvent},
+ zhuyin::{Bopomofo, BopomofoKind, Syllable},
+};
+
+use super::{KeyBehavior, SyllableEditor};
+
+#[derive(Debug)]
+pub struct Et26 {
+ syllable: Syllable,
+}
+
+impl Et26 {
+ pub fn new() -> Et26 {
+ Et26 {
+ syllable: Default::default(),
+ }
+ }
+ fn is_end_key(&self, key: KeyCode) -> bool {
+ match key {
+ KeyCode::D | KeyCode::F | KeyCode::J | KeyCode::K | KeyCode::Space => {
+ !self.syllable.is_empty()
+ }
+ _ => false,
+ }
+ }
+ fn has_initial_or_medial(&self) -> bool {
+ self.syllable.has_initial() || self.syllable.has_medial()
+ }
+}
+
+impl Default for Et26 {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl SyllableEditor for Et26 {
+ fn key_press(&mut self, key: KeyEvent) -> KeyBehavior {
+ if self.is_end_key(key.code) {
+ if !self.syllable.has_medial() && !self.syllable.has_rime() {
+ match self.syllable.initial() {
+ Some(Bopomofo::J) => {
+ self.syllable.update(Bopomofo::ZH);
+ }
+ Some(Bopomofo::X) => {
+ self.syllable.update(Bopomofo::SH);
+ }
+ Some(Bopomofo::P) => {
+ self.syllable.remove_initial();
+ self.syllable.update(Bopomofo::OU);
+ }
+ Some(Bopomofo::M) => {
+ self.syllable.remove_initial();
+ self.syllable.update(Bopomofo::AN);
+ }
+ Some(Bopomofo::N) => {
+ self.syllable.remove_initial();
+ self.syllable.update(Bopomofo::EN);
+ }
+ Some(Bopomofo::T) => {
+ self.syllable.remove_initial();
+ self.syllable.update(Bopomofo::ANG);
+ }
+ Some(Bopomofo::L) => {
+ self.syllable.remove_initial();
+ self.syllable.update(Bopomofo::ENG);
+ }
+ Some(Bopomofo::H) => {
+ self.syllable.remove_initial();
+ self.syllable.update(Bopomofo::ER);
+ }
+ _ => (),
+ }
+ }
+ match key.code {
+ // KeyCode::Space => Some(Bopomofo::TONE1),
+ KeyCode::F => self.syllable.update(Bopomofo::TONE2),
+ KeyCode::J => self.syllable.update(Bopomofo::TONE3),
+ KeyCode::K => self.syllable.update(Bopomofo::TONE4),
+ KeyCode::D => self.syllable.update(Bopomofo::TONE5),
+ _ => {
+ self.syllable.remove_tone();
+ }
+ };
+ KeyBehavior::Commit
+ } else {
+ let bopomofo = match key.code {
+ KeyCode::A => Bopomofo::A,
+ KeyCode::B => Bopomofo::B,
+ KeyCode::C => Bopomofo::X,
+ KeyCode::D => Bopomofo::D,
+ KeyCode::E => Bopomofo::I,
+ KeyCode::F => Bopomofo::F,
+ KeyCode::G => Bopomofo::J,
+ KeyCode::H => {
+ if self.has_initial_or_medial() {
+ Bopomofo::ER
+ } else {
+ Bopomofo::H
+ }
+ }
+ KeyCode::I => Bopomofo::AI,
+ KeyCode::J => Bopomofo::R,
+ KeyCode::K => Bopomofo::K,
+ KeyCode::L => {
+ if self.has_initial_or_medial() {
+ Bopomofo::ENG
+ } else {
+ Bopomofo::L
+ }
+ }
+ KeyCode::M => {
+ if self.has_initial_or_medial() {
+ Bopomofo::AN
+ } else {
+ Bopomofo::M
+ }
+ }
+ KeyCode::N => {
+ if self.has_initial_or_medial() {
+ Bopomofo::EN
+ } else {
+ Bopomofo::N
+ }
+ }
+ KeyCode::O => Bopomofo::O,
+ KeyCode::P => {
+ if self.has_initial_or_medial() {
+ Bopomofo::OU
+ } else {
+ Bopomofo::P
+ }
+ }
+ KeyCode::Q => {
+ if self.has_initial_or_medial() {
+ Bopomofo::EI
+ } else {
+ Bopomofo::Z
+ }
+ }
+ KeyCode::R => Bopomofo::E,
+ KeyCode::S => Bopomofo::S,
+ KeyCode::T => {
+ if self.has_initial_or_medial() {
+ Bopomofo::ANG
+ } else {
+ Bopomofo::T
+ }
+ }
+ KeyCode::U => Bopomofo::IU,
+ KeyCode::V => Bopomofo::G,
+ KeyCode::W => {
+ if self.has_initial_or_medial() {
+ Bopomofo::EH
+ } else {
+ Bopomofo::C
+ }
+ }
+ KeyCode::X => Bopomofo::U,
+ KeyCode::Y => Bopomofo::CH,
+ KeyCode::Z => Bopomofo::AU,
+ _ => return KeyBehavior::NoWord,
+ };
+
+ match bopomofo.kind() {
+ BopomofoKind::Medial => {
+ if bopomofo == Bopomofo::U {
+ match self.syllable.initial() {
+ Some(Bopomofo::J) => {
+ self.syllable.update(Bopomofo::ZH);
+ }
+ Some(Bopomofo::X) => {
+ self.syllable.update(Bopomofo::SH);
+ }
+ _ => (),
+ }
+ } else if let Some(Bopomofo::G) = self.syllable.initial() {
+ self.syllable.update(Bopomofo::Q);
+ }
+ }
+ BopomofoKind::Rime if !self.syllable.has_medial() => {
+ match self.syllable.initial() {
+ Some(Bopomofo::J) => {
+ self.syllable.update(Bopomofo::ZH);
+ }
+ Some(Bopomofo::X) => {
+ self.syllable.update(Bopomofo::SH);
+ }
+ _ => (),
+ };
+ }
+ _ => (),
+ };
+
+ self.syllable.update(bopomofo);
+ KeyBehavior::Absorb
+ }
+ }
+
+ fn is_empty(&self) -> bool {
+ self.syllable.is_empty()
+ }
+
+ fn remove_last(&mut self) {
+ self.syllable.pop();
+ }
+
+ fn clear(&mut self) {
+ self.syllable.clear();
+ }
+
+ fn read(&self) -> Syllable {
+ self.syllable
+ }
+
+ fn key_seq(&self) -> Option<String> {
+ None
+ }
+}
diff --git a/src/editor/layout/ginyieh.rs b/src/editor/layout/ginyieh.rs
new file mode 100644
index 0000000..feba4d5
--- /dev/null
+++ b/src/editor/layout/ginyieh.rs
@@ -0,0 +1,134 @@
+//! GinYieh keyboard layout
+//!
+//! Another commonly used keyboard layout on older IBM PC.
+
+use crate::{
+ editor::keymap::{KeyEvent, KeyIndex},
+ zhuyin::{Bopomofo, BopomofoKind, Syllable},
+};
+
+use super::{KeyBehavior, SyllableEditor};
+
+#[derive(Debug)]
+pub struct GinYieh {
+ syllable: Syllable,
+}
+
+impl GinYieh {
+ pub fn new() -> GinYieh {
+ GinYieh {
+ syllable: Syllable::new(),
+ }
+ }
+}
+
+impl Default for GinYieh {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl SyllableEditor for GinYieh {
+ fn key_press(&mut self, key: KeyEvent) -> KeyBehavior {
+ let bopomofo = match key.index {
+ KeyIndex::K1 => Bopomofo::TONE5,
+ KeyIndex::K2 => Bopomofo::B,
+ KeyIndex::K3 => Bopomofo::D,
+ KeyIndex::K6 => Bopomofo::ZH,
+ KeyIndex::K8 => Bopomofo::A,
+ KeyIndex::K9 => Bopomofo::AI,
+ KeyIndex::K10 => Bopomofo::AN,
+ KeyIndex::K11 => Bopomofo::I,
+ KeyIndex::K12 => Bopomofo::ER,
+ KeyIndex::K15 => Bopomofo::TONE2,
+ KeyIndex::K16 => Bopomofo::P,
+ KeyIndex::K17 => Bopomofo::T,
+ KeyIndex::K18 => Bopomofo::G,
+ KeyIndex::K19 => Bopomofo::J,
+ KeyIndex::K20 => Bopomofo::CH,
+ KeyIndex::K21 => Bopomofo::Z,
+ KeyIndex::K22 => Bopomofo::O,
+ KeyIndex::K23 => Bopomofo::EI,
+ KeyIndex::K24 => Bopomofo::EN,
+ KeyIndex::K27 => Bopomofo::TONE3,
+ KeyIndex::K28 => Bopomofo::M,
+ KeyIndex::K29 => Bopomofo::N,
+ KeyIndex::K30 => Bopomofo::K,
+ KeyIndex::K31 => Bopomofo::Q,
+ KeyIndex::K32 => Bopomofo::SH,
+ KeyIndex::K33 => Bopomofo::C,
+ KeyIndex::K34 => Bopomofo::E,
+ KeyIndex::K35 => Bopomofo::OU,
+ KeyIndex::K36 => Bopomofo::ANG,
+ KeyIndex::K37 => Bopomofo::IU,
+ KeyIndex::K38 => Bopomofo::TONE4,
+ KeyIndex::K39 => Bopomofo::F,
+ KeyIndex::K40 => Bopomofo::L,
+ KeyIndex::K41 => Bopomofo::H,
+ KeyIndex::K42 => Bopomofo::X,
+ KeyIndex::K43 => Bopomofo::R,
+ KeyIndex::K44 => Bopomofo::S,
+ KeyIndex::K45 => Bopomofo::EH,
+ KeyIndex::K46 => Bopomofo::OU,
+ KeyIndex::K47 => Bopomofo::ENG,
+ KeyIndex::K48 => Bopomofo::TONE1,
+ _ => return KeyBehavior::KeyError,
+ };
+ if bopomofo.kind() == BopomofoKind::Tone {
+ if !self.syllable.is_empty() {
+ if bopomofo != Bopomofo::TONE1 {
+ self.syllable.update(bopomofo);
+ }
+ return KeyBehavior::Commit;
+ }
+ } else {
+ self.syllable.remove_tone();
+ }
+
+ // In C libchewing TONE1 / Space is not a phonetic symbol
+ if bopomofo == Bopomofo::TONE1 {
+ return KeyBehavior::KeyError;
+ }
+
+ self.syllable.update(bopomofo);
+ KeyBehavior::Absorb
+ }
+
+ fn is_empty(&self) -> bool {
+ self.syllable.is_empty()
+ }
+
+ fn remove_last(&mut self) {
+ self.syllable.pop();
+ }
+
+ fn clear(&mut self) {
+ self.syllable.clear()
+ }
+
+ fn read(&self) -> Syllable {
+ self.syllable
+ }
+
+ fn key_seq(&self) -> Option<String> {
+ None
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use crate::editor::{
+ keymap::{IdentityKeymap, KeyCode, Keymap, QWERTY},
+ layout::{KeyBehavior, SyllableEditor},
+ };
+
+ use super::GinYieh;
+
+ #[test]
+ fn space() {
+ let mut editor = GinYieh::new();
+ let keymap = IdentityKeymap::new(QWERTY);
+ let behavior = editor.key_press(keymap.map_key(KeyCode::Space));
+ assert_eq!(KeyBehavior::KeyError, behavior);
+ }
+}
diff --git a/src/editor/layout/hsu.rs b/src/editor/layout/hsu.rs
new file mode 100644
index 0000000..ce14619
--- /dev/null
+++ b/src/editor/layout/hsu.rs
@@ -0,0 +1,281 @@
+//! Hsu keyboard layout
+
+use crate::{
+ editor::keymap::KeyCode,
+ zhuyin::{Bopomofo, BopomofoKind, Syllable},
+};
+
+use super::{KeyBehavior, KeyEvent, SyllableEditor};
+
+#[derive(Debug)]
+pub struct Hsu {
+ syllable: Syllable,
+}
+
+impl Hsu {
+ pub fn new() -> Hsu {
+ Hsu {
+ syllable: Default::default(),
+ }
+ }
+ fn is_hsu_end_key(&self, key: KeyEvent) -> bool {
+ // TODO allow customize end key mapping
+ match key.code {
+ KeyCode::S | KeyCode::D | KeyCode::F | KeyCode::J | KeyCode::Space => {
+ !self.syllable.is_empty()
+ }
+ _ => false,
+ }
+ }
+ fn has_initial_or_medial(&self) -> bool {
+ self.syllable.has_initial() || self.syllable.has_medial()
+ }
+}
+
+impl Default for Hsu {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl SyllableEditor for Hsu {
+ fn key_press(&mut self, key: KeyEvent) -> KeyBehavior {
+ if self.is_hsu_end_key(key) {
+ if !self.syllable.has_medial() && !self.syllable.has_rime() {
+ if let Some(key) = self.syllable.initial() {
+ match key {
+ Bopomofo::J => {
+ self.syllable.update(Bopomofo::ZH);
+ }
+ Bopomofo::Q => {
+ self.syllable.update(Bopomofo::CH);
+ }
+ Bopomofo::X => {
+ self.syllable.update(Bopomofo::SH);
+ }
+ Bopomofo::H => {
+ self.syllable.remove_initial();
+ self.syllable.update(Bopomofo::O);
+ }
+ Bopomofo::G => {
+ self.syllable.remove_initial();
+ self.syllable.update(Bopomofo::E);
+ }
+ Bopomofo::M => {
+ self.syllable.remove_initial();
+ self.syllable.update(Bopomofo::AN);
+ }
+ Bopomofo::N => {
+ self.syllable.remove_initial();
+ self.syllable.update(Bopomofo::EN);
+ }
+ Bopomofo::K => {
+ self.syllable.remove_initial();
+ self.syllable.update(Bopomofo::ANG);
+ }
+ Bopomofo::L => {
+ self.syllable.remove_initial();
+ self.syllable.update(Bopomofo::ER);
+ }
+ _ => (),
+ }
+ }
+ }
+
+ // fuzzy ㄍㄧ to ㄐㄧ and ㄍㄩ to ㄐㄩ
+ match (self.syllable.initial(), self.syllable.medial()) {
+ (Some(Bopomofo::G), Some(Bopomofo::I)) | (Some(Bopomofo::J), Some(Bopomofo::I)) => {
+ self.syllable.update(Bopomofo::IU);
+ }
+ _ => (),
+ }
+
+ match key.code {
+ // KeyCode::Space => Some(Bopomofo::TONE1),
+ KeyCode::D => self.syllable.update(Bopomofo::TONE2),
+ KeyCode::F => self.syllable.update(Bopomofo::TONE3),
+ KeyCode::J => self.syllable.update(Bopomofo::TONE4),
+ KeyCode::S => self.syllable.update(Bopomofo::TONE5),
+ _ => {
+ self.syllable.remove_tone();
+ }
+ };
+ KeyBehavior::Commit
+ } else {
+ let bopomofo = match key.code {
+ KeyCode::A => {
+ if self.has_initial_or_medial() {
+ Bopomofo::EI
+ } else {
+ Bopomofo::C
+ }
+ }
+ KeyCode::B => Bopomofo::B,
+ KeyCode::C => Bopomofo::SH,
+ KeyCode::D => Bopomofo::D,
+ KeyCode::E => Bopomofo::I,
+ KeyCode::F => Bopomofo::F,
+ KeyCode::G => {
+ if self.has_initial_or_medial() {
+ Bopomofo::E
+ } else {
+ Bopomofo::G
+ }
+ }
+ KeyCode::H => {
+ if self.has_initial_or_medial() {
+ Bopomofo::O
+ } else {
+ Bopomofo::H
+ }
+ }
+ KeyCode::I => Bopomofo::AI,
+ KeyCode::J => Bopomofo::ZH,
+ KeyCode::K => {
+ if self.has_initial_or_medial() {
+ Bopomofo::ANG
+ } else {
+ Bopomofo::K
+ }
+ }
+ KeyCode::L => {
+ if self.has_initial_or_medial() {
+ Bopomofo::ENG
+ } else {
+ Bopomofo::L
+ }
+ }
+ KeyCode::M => {
+ if self.has_initial_or_medial() {
+ Bopomofo::AN
+ } else {
+ Bopomofo::M
+ }
+ }
+ KeyCode::N => {
+ if self.has_initial_or_medial() {
+ Bopomofo::EN
+ } else {
+ Bopomofo::N
+ }
+ }
+ KeyCode::O => Bopomofo::OU,
+ KeyCode::P => Bopomofo::P,
+ KeyCode::R => Bopomofo::R,
+ KeyCode::S => Bopomofo::S,
+ KeyCode::T => Bopomofo::T,
+ KeyCode::U => Bopomofo::IU,
+ KeyCode::V => Bopomofo::CH,
+ KeyCode::W => Bopomofo::AU,
+ KeyCode::X => Bopomofo::U,
+ KeyCode::Y => Bopomofo::A,
+ KeyCode::Z => Bopomofo::Z,
+ _ => return KeyBehavior::NoWord,
+ };
+ let kind = bopomofo.kind();
+
+ // fuzzy ㄍㄧ to ㄐㄧ and ㄍㄩ to ㄐㄩ
+ match (self.syllable.initial(), self.syllable.medial()) {
+ (Some(Bopomofo::G), Some(Bopomofo::I)) | (Some(Bopomofo::J), Some(Bopomofo::I)) => {
+ self.syllable.update(Bopomofo::IU);
+ }
+ _ => (),
+ }
+
+ // ㄐㄑㄒ must be followed by ㄧ or ㄩ. If not, convert them to ㄓㄔㄕ
+ if (kind == BopomofoKind::Medial && bopomofo == Bopomofo::U)
+ || (kind == BopomofoKind::Rime && self.syllable.medial().is_none())
+ {
+ match self.syllable.initial() {
+ Some(Bopomofo::J) => {
+ self.syllable.update(Bopomofo::ZH);
+ }
+ Some(Bopomofo::Q) => {
+ self.syllable.update(Bopomofo::CH);
+ }
+ Some(Bopomofo::X) => {
+ self.syllable.update(Bopomofo::SH);
+ }
+ _ => (),
+ }
+ }
+
+ // Likeweise, when ㄓㄔㄕ is followed by ㄧ or ㄩ, convert them to ㄐㄑㄒ
+ if bopomofo == Bopomofo::I || bopomofo == Bopomofo::IU {
+ match self.syllable.initial() {
+ Some(Bopomofo::ZH) => {
+ self.syllable.update(Bopomofo::J);
+ }
+ Some(Bopomofo::CH) => {
+ self.syllable.update(Bopomofo::Q);
+ }
+ Some(Bopomofo::SH) => {
+ self.syllable.update(Bopomofo::X);
+ }
+ _ => (),
+ }
+ }
+
+ self.syllable.update(bopomofo);
+ KeyBehavior::Absorb
+ }
+ }
+
+ fn is_empty(&self) -> bool {
+ self.syllable.is_empty()
+ }
+
+ fn remove_last(&mut self) {
+ self.syllable.pop();
+ }
+
+ fn clear(&mut self) {
+ self.syllable.clear();
+ }
+
+ fn read(&self) -> Syllable {
+ self.syllable
+ }
+
+ fn key_seq(&self) -> Option<String> {
+ None
+ }
+}
+
+#[cfg(test)]
+mod test {
+
+ use crate::{
+ editor::{
+ keymap::{IdentityKeymap, KeyCode, Keymap, QWERTY},
+ layout::SyllableEditor,
+ },
+ zhuyin::Bopomofo,
+ };
+
+ use super::Hsu;
+
+ #[test]
+ fn cen() {
+ let mut hsu = Hsu::new();
+ let keymap = IdentityKeymap::new(QWERTY);
+ hsu.key_press(keymap.map_key(KeyCode::C));
+ hsu.key_press(keymap.map_key(KeyCode::E));
+ hsu.key_press(keymap.map_key(KeyCode::N));
+ hsu.key_press(keymap.map_key(KeyCode::Space));
+ let result = hsu.read();
+ assert_eq!(result.initial(), Some(Bopomofo::X));
+ assert_eq!(result.medial(), Some(Bopomofo::I));
+ assert_eq!(result.rime(), Some(Bopomofo::EN));
+ }
+
+ #[test]
+ fn convert_n_to_en() {
+ let mut hsu = Hsu::new();
+ let keymap = IdentityKeymap::new(QWERTY);
+ hsu.key_press(keymap.map_key(KeyCode::N));
+ hsu.key_press(keymap.map_key(KeyCode::F));
+ let result = hsu.read();
+ assert_eq!(result.rime(), Some(Bopomofo::EN));
+ }
+}
diff --git a/src/editor/layout/ibm.rs b/src/editor/layout/ibm.rs
new file mode 100644
index 0000000..67f93d4
--- /dev/null
+++ b/src/editor/layout/ibm.rs
@@ -0,0 +1,135 @@
+//! IBM keyboard layout
+//!
+//! Another commonly used keyboard layout on older IBM PC.
+
+use crate::{
+ editor::keymap::{KeyEvent, KeyIndex},
+ zhuyin::{Bopomofo, BopomofoKind, Syllable},
+};
+
+use super::{KeyBehavior, SyllableEditor};
+
+#[derive(Debug)]
+pub struct Ibm {
+ syllable: Syllable,
+}
+
+impl Ibm {
+ pub fn new() -> Ibm {
+ Ibm {
+ syllable: Syllable::new(),
+ }
+ }
+}
+
+impl Default for Ibm {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl SyllableEditor for Ibm {
+ fn key_press(&mut self, key: KeyEvent) -> KeyBehavior {
+ let bopomofo = match key.index {
+ KeyIndex::K1 => Bopomofo::B,
+ KeyIndex::K2 => Bopomofo::P,
+ KeyIndex::K3 => Bopomofo::M,
+ KeyIndex::K4 => Bopomofo::F,
+ KeyIndex::K5 => Bopomofo::D,
+ KeyIndex::K6 => Bopomofo::T,
+ KeyIndex::K7 => Bopomofo::N,
+ KeyIndex::K8 => Bopomofo::L,
+ KeyIndex::K9 => Bopomofo::G,
+ KeyIndex::K10 => Bopomofo::K,
+ KeyIndex::K11 => Bopomofo::H,
+ KeyIndex::K15 => Bopomofo::J,
+ KeyIndex::K16 => Bopomofo::Q,
+ KeyIndex::K17 => Bopomofo::X,
+ KeyIndex::K18 => Bopomofo::S,
+ KeyIndex::K19 => Bopomofo::CH,
+ KeyIndex::K20 => Bopomofo::SH,
+ KeyIndex::K21 => Bopomofo::R,
+ KeyIndex::K22 => Bopomofo::Z,
+ KeyIndex::K23 => Bopomofo::C,
+ KeyIndex::K24 => Bopomofo::S,
+ KeyIndex::K27 => Bopomofo::I,
+ KeyIndex::K28 => Bopomofo::U,
+ KeyIndex::K29 => Bopomofo::IU,
+ KeyIndex::K30 => Bopomofo::A,
+ KeyIndex::K31 => Bopomofo::O,
+ KeyIndex::K32 => Bopomofo::E,
+ KeyIndex::K33 => Bopomofo::EH,
+ KeyIndex::K34 => Bopomofo::AI,
+ KeyIndex::K35 => Bopomofo::EI,
+ KeyIndex::K36 => Bopomofo::AU,
+ KeyIndex::K38 => Bopomofo::OU,
+ KeyIndex::K39 => Bopomofo::AN,
+ KeyIndex::K40 => Bopomofo::EN,
+ KeyIndex::K41 => Bopomofo::ANG,
+ KeyIndex::K42 => Bopomofo::ENG,
+ KeyIndex::K43 => Bopomofo::ER,
+ KeyIndex::K44 => Bopomofo::TONE2,
+ KeyIndex::K45 => Bopomofo::TONE3,
+ KeyIndex::K46 => Bopomofo::TONE4,
+ KeyIndex::K47 => Bopomofo::TONE5,
+ KeyIndex::K48 => Bopomofo::TONE1,
+ _ => return KeyBehavior::KeyError,
+ };
+ if bopomofo.kind() == BopomofoKind::Tone {
+ if !self.syllable.is_empty() {
+ if bopomofo != Bopomofo::TONE1 {
+ self.syllable.update(bopomofo);
+ }
+ return KeyBehavior::Commit;
+ }
+ } else {
+ self.syllable.remove_tone();
+ }
+
+ // In C libchewing TONE1 / Space is not a phonetic symbol
+ if bopomofo == Bopomofo::TONE1 {
+ return KeyBehavior::KeyError;
+ }
+
+ self.syllable.update(bopomofo);
+ KeyBehavior::Absorb
+ }
+
+ fn is_empty(&self) -> bool {
+ self.syllable.is_empty()
+ }
+
+ fn remove_last(&mut self) {
+ self.syllable.pop();
+ }
+
+ fn clear(&mut self) {
+ self.syllable.clear()
+ }
+
+ fn read(&self) -> Syllable {
+ self.syllable
+ }
+
+ fn key_seq(&self) -> Option<String> {
+ None
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use crate::editor::{
+ keymap::{IdentityKeymap, KeyCode, Keymap, QWERTY},
+ layout::{KeyBehavior, SyllableEditor},
+ };
+
+ use super::Ibm;
+
+ #[test]
+ fn space() {
+ let mut editor = Ibm::new();
+ let keymap = IdentityKeymap::new(QWERTY);
+ let behavior = editor.key_press(keymap.map_key(KeyCode::Space));
+ assert_eq!(KeyBehavior::KeyError, behavior);
+ }
+}
diff --git a/src/editor/layout/pinyin.rs b/src/editor/layout/pinyin.rs
new file mode 100644
index 0000000..4176663
--- /dev/null
+++ b/src/editor/layout/pinyin.rs
@@ -0,0 +1,498 @@
+//! Pinyin
+
+use crate::{
+ editor::keymap::{KeyCode, KeyEvent},
+ zhuyin::{Bopomofo, Syllable},
+};
+
+use super::{KeyBehavior, SyllableEditor};
+
+const MAX_PINYIN_LEN: usize = 10;
+
+#[derive(Debug)]
+pub enum PinyinVariant {
+ HanyuPinyin,
+ ThlPinyin,
+ Mps2Pinyin,
+}
+
+impl Default for PinyinVariant {
+ fn default() -> PinyinVariant {
+ PinyinVariant::HanyuPinyin
+ }
+}
+
+#[derive(Default, Debug)]
+pub struct Pinyin {
+ key_seq: String,
+ syllable: Syllable,
+ syllable_alt: Syllable,
+ variant: PinyinVariant,
+}
+
+impl Pinyin {
+ pub fn new() -> Pinyin {
+ Default::default()
+ }
+ pub fn hanyu() -> Pinyin {
+ Pinyin {
+ variant: PinyinVariant::HanyuPinyin,
+ ..Default::default()
+ }
+ }
+ pub fn thl() -> Pinyin {
+ Pinyin {
+ variant: PinyinVariant::ThlPinyin,
+ ..Default::default()
+ }
+ }
+ pub fn mps2() -> Pinyin {
+ Pinyin {
+ variant: PinyinVariant::Mps2Pinyin,
+ ..Default::default()
+ }
+ }
+ pub fn alt(&self) -> Syllable {
+ self.syllable_alt
+ }
+ pub fn key_seq(&self) -> &String {
+ &self.key_seq
+ }
+}
+
+impl SyllableEditor for Pinyin {
+ fn key_press(&mut self, key: KeyEvent) -> KeyBehavior {
+ if ![
+ KeyCode::Space,
+ KeyCode::N1,
+ KeyCode::N2,
+ KeyCode::N3,
+ KeyCode::N4,
+ KeyCode::N5,
+ ]
+ .contains(&key.code)
+ {
+ if self.key_seq.len() == MAX_PINYIN_LEN {
+ // buffer is full, ignore this keystroke
+ return KeyBehavior::NoWord;
+ }
+ let ch = match key.code {
+ KeyCode::A => 'a',
+ KeyCode::B => 'b',
+ KeyCode::C => 'c',
+ KeyCode::D => 'd',
+ KeyCode::E => 'e',
+ KeyCode::F => 'f',
+ KeyCode::G => 'g',
+ KeyCode::H => 'h',
+ KeyCode::I => 'i',
+ KeyCode::J => 'j',
+ KeyCode::K => 'k',
+ KeyCode::L => 'l',
+ KeyCode::M => 'm',
+ KeyCode::N => 'n',
+ KeyCode::O => 'o',
+ KeyCode::P => 'p',
+ KeyCode::Q => 'q',
+ KeyCode::R => 'r',
+ KeyCode::S => 's',
+ KeyCode::T => 't',
+ KeyCode::U => 'u',
+ KeyCode::V => 'v',
+ KeyCode::W => 'w',
+ KeyCode::X => 'x',
+ KeyCode::Y => 'y',
+ KeyCode::Z => 'z',
+ _ => return KeyBehavior::KeyError,
+ };
+ self.key_seq.push(ch);
+ return KeyBehavior::Absorb;
+ }
+
+ let tone = match key.code {
+ // KeyCode::Space | KeyCode::N1 => Some(Bopomofo::TONE1),
+ KeyCode::N2 => Some(Bopomofo::TONE2),
+ KeyCode::N3 => Some(Bopomofo::TONE3),
+ KeyCode::N4 => Some(Bopomofo::TONE4),
+ KeyCode::N5 => Some(Bopomofo::TONE5),
+ _ => None,
+ };
+
+ if let Some(entry) = match self.variant {
+ PinyinVariant::HanyuPinyin => table::HANYU_PINYIN_MAPPING.iter(),
+ PinyinVariant::ThlPinyin => table::THL_PINYIN_MAPPING.iter(),
+ PinyinVariant::Mps2Pinyin => table::MPS2_PINYIN_MAPPING.iter(),
+ }
+ .find(|entry| entry.pinyin == self.key_seq)
+ {
+ self.key_seq.clear();
+ self.syllable = entry.primary;
+ self.syllable_alt = entry.alt;
+ if let Some(tone) = tone {
+ self.syllable.update(tone);
+ self.syllable_alt.update(tone);
+ }
+ return KeyBehavior::Commit;
+ }
+
+ if let Some(entry) = table::COMMON_MAPPING
+ .iter()
+ .find(|entry| entry.pinyin == self.key_seq)
+ {
+ self.key_seq.clear();
+ self.syllable = entry.primary;
+ self.syllable_alt = entry.alt;
+ if let Some(tone) = tone {
+ self.syllable.update(tone);
+ self.syllable_alt.update(tone);
+ }
+ return KeyBehavior::Commit;
+ }
+
+ let initial = table::INITIAL_MAPPING
+ .iter()
+ .find(|entry| self.key_seq.starts_with(entry.pinyin));
+
+ let final_seq = match initial {
+ Some(entry) => self.key_seq.trim_start_matches(entry.pinyin),
+ None => &self.key_seq,
+ };
+
+ let fina = table::FINAL_MAPPING
+ .iter()
+ .find(|entry| final_seq == entry.pinyin);
+
+ if initial.is_none() && fina.is_none() {
+ self.key_seq.clear();
+ return KeyBehavior::Absorb;
+ }
+
+ let mut initial = initial.map(|i| i.initial);
+ let mut medial = fina.and_then(|f| f.medial);
+ let mut rime = fina.and_then(|f| f.rime);
+
+ if let Some(Bopomofo::I) = rime {
+ match initial {
+ Some(Bopomofo::ZH) | Some(Bopomofo::CH) | Some(Bopomofo::SH)
+ | Some(Bopomofo::R) | Some(Bopomofo::Z) | Some(Bopomofo::C) | Some(Bopomofo::S) => {
+ medial.take();
+ rime.take();
+ }
+ _ => (),
+ }
+ }
+
+ match initial {
+ Some(Bopomofo::J) | Some(Bopomofo::Q) | Some(Bopomofo::X) => {
+ match (medial, rime) {
+ (Some(Bopomofo::U), Some(Bopomofo::AN))
+ | (Some(Bopomofo::U), Some(Bopomofo::EN))
+ | (Some(Bopomofo::U), None) => {
+ medial.replace(Bopomofo::IU);
+ }
+ _ => (),
+ };
+ }
+ _ => (),
+ }
+
+ match medial {
+ Some(Bopomofo::I) | Some(Bopomofo::IU) => {
+ match initial {
+ Some(Bopomofo::S) | Some(Bopomofo::SH) => {
+ initial.replace(Bopomofo::X);
+ }
+ Some(Bopomofo::C) | Some(Bopomofo::CH) => {
+ initial.replace(Bopomofo::Q);
+ }
+ _ => (),
+ };
+ }
+ _ => {
+ if initial == Some(Bopomofo::J) {
+ initial.replace(Bopomofo::ZH);
+ }
+ }
+ }
+
+ match initial {
+ Some(Bopomofo::B) | Some(Bopomofo::P) | Some(Bopomofo::M) | Some(Bopomofo::F) => {
+ match (medial, rime) {
+ (Some(Bopomofo::U), Some(Bopomofo::ENG))
+ | (Some(Bopomofo::U), Some(Bopomofo::O)) => {
+ medial.take();
+ }
+ _ => (),
+ };
+ }
+ _ => (),
+ }
+
+ self.key_seq.clear();
+ let mut builder = Syllable::builder();
+ if let Some(initial) = initial {
+ builder = builder.insert(initial).unwrap();
+ }
+ if let Some(medial) = medial {
+ builder = builder.insert(medial).unwrap();
+ }
+ if let Some(rime) = rime {
+ builder = builder.insert(rime).unwrap();
+ }
+ if let Some(tone) = tone {
+ builder = builder.insert(tone).unwrap();
+ }
+ self.syllable = builder.build();
+ self.syllable_alt = self.syllable;
+ KeyBehavior::Commit
+ }
+
+ fn is_empty(&self) -> bool {
+ self.key_seq.is_empty()
+ }
+
+ fn remove_last(&mut self) {
+ self.key_seq.pop();
+ }
+
+ fn clear(&mut self) {
+ self.key_seq.clear();
+ self.syllable.clear();
+ self.syllable_alt.clear();
+ }
+
+ fn read(&self) -> Syllable {
+ self.syllable
+ }
+
+ fn key_seq(&self) -> Option<String> {
+ Some(self.key_seq.clone())
+ }
+}
+
+struct AmbiguousMapEntry {
+ pinyin: &'static str,
+ primary: Syllable,
+ alt: Syllable,
+}
+
+macro_rules! amb {
+ ($pinyin:expr, $primary:expr, $alt:expr ) => {
+ AmbiguousMapEntry {
+ pinyin: $pinyin,
+ primary: $primary,
+ alt: $alt,
+ }
+ };
+}
+
+struct InitialMapEntry {
+ pinyin: &'static str,
+ initial: Bopomofo,
+}
+
+macro_rules! ini {
+ ($pinyin:expr, $bopomofo:expr) => {
+ InitialMapEntry {
+ pinyin: $pinyin,
+ initial: $bopomofo,
+ }
+ };
+}
+
+struct FinalMapEntry {
+ pinyin: &'static str,
+ medial: Option<Bopomofo>,
+ rime: Option<Bopomofo>,
+}
+
+macro_rules! fin {
+ ($pinyin:expr, $medial:expr, $rime:expr) => {
+ FinalMapEntry {
+ pinyin: $pinyin,
+ medial: $medial,
+ rime: $rime,
+ }
+ };
+}
+
+mod table {
+
+ use crate::{syl, zhuyin::Bopomofo::*};
+
+ use super::{AmbiguousMapEntry, FinalMapEntry, InitialMapEntry};
+
+ pub(super) const COMMON_MAPPING: [AmbiguousMapEntry; 18] = [
+ // Special cases for WG
+ amb!("tzu", syl![Z], syl![Z, U]),
+ amb!("ssu", syl![S], syl![S, U]),
+ amb!("szu", syl![S], syl![S, U]),
+ // Common multiple mapping
+ amb!("e", syl![E], syl![EH]),
+ amb!("ch", syl![CH], syl![Q]),
+ amb!("sh", syl![SH], syl![X]),
+ amb!("c", syl![C], syl![Q]),
+ amb!("s", syl![S], syl![X]),
+ amb!("nu", syl![N, U], syl![N, IU]),
+ amb!("lu", syl![L, U], syl![L, IU]),
+ amb!("luan", syl![L, U, AN], syl![L, IU, AN]),
+ amb!("niu", syl![N, I, OU], syl![N, IU]),
+ amb!("liu", syl![L, I, OU], syl![L, IU]),
+ amb!("jiu", syl![J, I, OU], syl![J, IU]),
+ amb!("chiu", syl![Q, I, OU], syl![Q, IU]),
+ amb!("shiu", syl![X, I, OU], syl![X, IU]),
+ amb!("ju", syl![J, IU], syl![ZH, U]),
+ amb!("juan", syl![J, IU, AN], syl![ZH, U, AN]),
+ ];
+
+ pub(super) const HANYU_PINYIN_MAPPING: [AmbiguousMapEntry; 4] = [
+ amb!("chi", syl![CH], syl![Q, I]),
+ amb!("shi", syl![SH], syl![X, I]),
+ amb!("ci", syl![C], syl![Q, I]),
+ amb!("si", syl![S], syl![X, I]),
+ ];
+
+ pub(super) const THL_PINYIN_MAPPING: [AmbiguousMapEntry; 4] = [
+ amb!("chi", syl![Q, I], syl![CH]),
+ amb!("shi", syl![X, I], syl![SH]),
+ amb!("ci", syl![Q, I], syl![C]),
+ amb!("si", syl![X, I], syl![S]),
+ ];
+
+ pub(super) const MPS2_PINYIN_MAPPING: [AmbiguousMapEntry; 13] = [
+ amb!("chi", syl![Q, I], syl![CH]),
+ amb!("shi", syl![X, I], syl![SH]),
+ amb!("ci", syl![Q, I], syl![C]),
+ amb!("si", syl![X, I], syl![S]),
+ amb!("niu", syl![N, IU], syl![N, I, OU]),
+ amb!("liu", syl![L, IU], syl![L, I, OU]),
+ amb!("jiu", syl![J, IU], syl![J, I, OU]),
+ amb!("chiu", syl![Q, IU], syl![Q, I, OU]),
+ amb!("shiu", syl![X, IU], syl![X, I, OU]),
+ amb!("ju", syl![ZH, U], syl![J, IU]),
+ amb!("juan", syl![ZH, U, AN], syl![J, IU, AN]),
+ amb!("juen", syl![ZH, U, EN], syl![J, IU, EN]),
+ amb!("tzu", syl![Z, U], syl![Z]),
+ ];
+
+ pub(super) const INITIAL_MAPPING: [InitialMapEntry; 25] = [
+ ini!("tz", Z),
+ ini!("b", B),
+ ini!("p", P),
+ ini!("m", M),
+ ini!("f", F),
+ ini!("d", D),
+ ini!("ts", C),
+ ini!("t", T),
+ ini!("n", N),
+ ini!("l", L),
+ ini!("g", G),
+ ini!("k", K),
+ ini!("hs", X),
+ ini!("h", H),
+ ini!("jh", ZH),
+ ini!("j", J),
+ ini!("q", Q),
+ ini!("x", X),
+ ini!("zh", ZH),
+ ini!("ch", CH),
+ ini!("sh", SH),
+ ini!("r", R),
+ ini!("z", Z),
+ ini!("c", C),
+ ini!("s", S),
+ ];
+
+ pub(super) const FINAL_MAPPING: [FinalMapEntry; 90] = [
+ fin!("uang", Some(U), Some(ANG)),
+ fin!("wang", Some(U), Some(ANG)),
+ fin!("weng", Some(U), Some(ENG)),
+ fin!("wong", Some(U), Some(ENG)),
+ fin!("ying", Some(I), Some(ENG)),
+ fin!("yung", Some(IU), Some(ENG)),
+ fin!("yong", Some(IU), Some(ENG)),
+ fin!("iung", Some(IU), Some(ENG)),
+ fin!("iong", Some(IU), Some(ENG)),
+ fin!("iang", Some(I), Some(ANG)),
+ fin!("yang", Some(I), Some(ANG)),
+ fin!("yuan", Some(IU), Some(AN)),
+ fin!("iuan", Some(IU), Some(AN)),
+ fin!("ing", Some(I), Some(ENG)),
+ fin!("iao", Some(I), Some(AU)),
+ fin!("iau", Some(I), Some(AU)),
+ fin!("yao", Some(I), Some(AU)),
+ fin!("yau", Some(I), Some(AU)),
+ fin!("yun", Some(IU), Some(EN)),
+ fin!("iun", Some(IU), Some(EN)),
+ fin!("vn", Some(IU), Some(EN)),
+ fin!("iou", Some(I), Some(OU)),
+ fin!("iu", Some(I), Some(OU)),
+ fin!("you", Some(I), Some(OU)),
+ fin!("io", Some(I), Some(O)),
+ fin!("yo", Some(I), Some(O)),
+ fin!("ian", Some(I), Some(AN)),
+ fin!("ien", Some(I), Some(AN)),
+ fin!("yan", Some(I), Some(AN)),
+ fin!("yen", Some(I), Some(AN)),
+ fin!("yin", Some(I), Some(EN)),
+ fin!("ang", None, Some(ANG)),
+ fin!("eng", None, Some(ENG)),
+ fin!("uei", Some(U), Some(EI)),
+ fin!("ui", Some(U), Some(EI)),
+ fin!("wei", Some(U), Some(EI)),
+ fin!("uen", Some(U), Some(EN)),
+ fin!("yueh", Some(IU), Some(EH)),
+ fin!("yue", Some(IU), Some(EH)),
+ fin!("iue", Some(IU), Some(EH)),
+ fin!("ueh", Some(IU), Some(EH)),
+ fin!("ue", Some(IU), Some(EH)),
+ fin!("ve", Some(IU), Some(EH)),
+ fin!("uai", Some(U), Some(AI)),
+ fin!("wai", Some(U), Some(AI)),
+ fin!("uan", Some(U), Some(AN)),
+ fin!("wan", Some(U), Some(AN)),
+ fin!("un", Some(U), Some(EN)),
+ fin!("wen", Some(U), Some(EN)),
+ fin!("wun", Some(U), Some(EN)),
+ fin!("ung", Some(U), Some(ENG)),
+ fin!("ong", Some(U), Some(ENG)),
+ fin!("van", Some(IU), Some(AN)),
+ fin!("er", None, Some(ER)),
+ fin!("ai", None, Some(AI)),
+ fin!("ei", None, Some(EI)),
+ fin!("ao", None, Some(AU)),
+ fin!("au", None, Some(AU)),
+ fin!("ou", None, Some(OU)),
+ fin!("an", None, Some(AN)),
+ fin!("en", None, Some(EN)),
+ fin!("yi", None, Some(I)),
+ fin!("ia", Some(I), Some(A)),
+ fin!("ya", Some(I), Some(A)),
+ fin!("ieh", Some(I), Some(EH)),
+ fin!("ie", Some(I), Some(EH)),
+ fin!("yeh", Some(I), Some(EH)),
+ fin!("ye", Some(I), Some(EH)),
+ fin!("in", Some(I), Some(EN)),
+ fin!("wu", Some(U), None),
+ fin!("ua", Some(U), Some(A)),
+ fin!("wa", Some(U), Some(A)),
+ fin!("uo", Some(U), Some(O)),
+ fin!("wo", Some(U), Some(O)),
+ fin!("yu", Some(IU), None),
+ fin!("ve", Some(IU), Some(EH)),
+ fin!("vn", Some(IU), Some(EN)),
+ fin!("ih", None, None),
+ fin!("a", None, Some(A)),
+ fin!("o", None, Some(O)),
+ fin!("eh", None, Some(EH)),
+ fin!("e", None, Some(E)),
+ fin!("v", Some(IU), None),
+ fin!("i", Some(I), None),
+ fin!("u", Some(U), None),
+ fin!("E", None, Some(EH)),
+ fin!("n", None, Some(EN)),
+ fin!("ng", None, Some(ENG)),
+ fin!("r", None, None),
+ fin!("z", None, None),
+ ];
+}
diff --git a/src/editor/layout/standard.rs b/src/editor/layout/standard.rs
new file mode 100644
index 0000000..8f394e5
--- /dev/null
+++ b/src/editor/layout/standard.rs
@@ -0,0 +1,136 @@
+//! Standard keyboard layout
+//!
+//! Also known as the Dai Chien (大千) layout. It's the default layout on almost
+//! all platforms and the most commonly used one.
+
+use crate::{
+ editor::keymap::{KeyEvent, KeyIndex},
+ zhuyin::{Bopomofo, BopomofoKind, Syllable},
+};
+
+use super::{KeyBehavior, SyllableEditor};
+
+#[derive(Debug)]
+pub struct Standard {
+ syllable: Syllable,
+}
+
+impl Standard {
+ pub fn new() -> Standard {
+ Standard {
+ syllable: Syllable::new(),
+ }
+ }
+}
+
+impl Default for Standard {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl SyllableEditor for Standard {
+ fn key_press(&mut self, key: KeyEvent) -> KeyBehavior {
+ let bopomofo = match key.index {
+ KeyIndex::K1 => Bopomofo::B,
+ KeyIndex::K2 => Bopomofo::D,
+ KeyIndex::K3 => Bopomofo::TONE3,
+ KeyIndex::K4 => Bopomofo::TONE4,
+ KeyIndex::K5 => Bopomofo::ZH,
+ KeyIndex::K6 => Bopomofo::TONE2,
+ KeyIndex::K7 => Bopomofo::TONE5,
+ KeyIndex::K8 => Bopomofo::A,
+ KeyIndex::K9 => Bopomofo::AI,
+ KeyIndex::K10 => Bopomofo::AN,
+ KeyIndex::K11 => Bopomofo::ER,
+ KeyIndex::K15 => Bopomofo::P,
+ KeyIndex::K16 => Bopomofo::T,
+ KeyIndex::K17 => Bopomofo::G,
+ KeyIndex::K18 => Bopomofo::J,
+ KeyIndex::K19 => Bopomofo::CH,
+ KeyIndex::K20 => Bopomofo::Z,
+ KeyIndex::K21 => Bopomofo::I,
+ KeyIndex::K22 => Bopomofo::O,
+ KeyIndex::K23 => Bopomofo::EI,
+ KeyIndex::K24 => Bopomofo::EN,
+ KeyIndex::K27 => Bopomofo::M,
+ KeyIndex::K28 => Bopomofo::N,
+ KeyIndex::K29 => Bopomofo::K,
+ KeyIndex::K30 => Bopomofo::Q,
+ KeyIndex::K31 => Bopomofo::SH,
+ KeyIndex::K32 => Bopomofo::C,
+ KeyIndex::K33 => Bopomofo::U,
+ KeyIndex::K34 => Bopomofo::E,
+ KeyIndex::K35 => Bopomofo::AU,
+ KeyIndex::K36 => Bopomofo::ANG,
+ KeyIndex::K38 => Bopomofo::F,
+ KeyIndex::K39 => Bopomofo::L,
+ KeyIndex::K40 => Bopomofo::H,
+ KeyIndex::K41 => Bopomofo::X,
+ KeyIndex::K42 => Bopomofo::R,
+ KeyIndex::K43 => Bopomofo::S,
+ KeyIndex::K44 => Bopomofo::IU,
+ KeyIndex::K45 => Bopomofo::EH,
+ KeyIndex::K46 => Bopomofo::OU,
+ KeyIndex::K47 => Bopomofo::ENG,
+ KeyIndex::K48 => Bopomofo::TONE1,
+ _ => return KeyBehavior::KeyError,
+ };
+ if bopomofo.kind() == BopomofoKind::Tone {
+ if !self.syllable.is_empty() {
+ if bopomofo != Bopomofo::TONE1 {
+ self.syllable.update(bopomofo);
+ }
+ return KeyBehavior::Commit;
+ }
+ } else {
+ self.syllable.remove_tone();
+ }
+
+ // In C libchewing TONE1 / Space is not a phonetic symbol
+ if bopomofo == Bopomofo::TONE1 {
+ return KeyBehavior::KeyError;
+ }
+
+ self.syllable.update(bopomofo);
+ KeyBehavior::Absorb
+ }
+
+ fn is_empty(&self) -> bool {
+ self.syllable.is_empty()
+ }
+
+ fn remove_last(&mut self) {
+ self.syllable.pop();
+ }
+
+ fn clear(&mut self) {
+ self.syllable.clear()
+ }
+
+ fn read(&self) -> Syllable {
+ self.syllable
+ }
+
+ fn key_seq(&self) -> Option<String> {
+ None
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use crate::editor::{
+ keymap::{IdentityKeymap, KeyCode, Keymap, QWERTY},
+ layout::{KeyBehavior, SyllableEditor},
+ };
+
+ use super::Standard;
+
+ #[test]
+ fn space() {
+ let mut editor = Standard::new();
+ let keymap = IdentityKeymap::new(QWERTY);
+ let behavior = editor.key_press(keymap.map_key(KeyCode::Space));
+ assert_eq!(KeyBehavior::KeyError, behavior);
+ }
+}
diff --git a/src/hash.c b/src/hash.c
index 7eb8f09..b83eb61 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -79,7 +79,7 @@ static unsigned int HashFunc(const uint16_t phoneSeq[])

HASH_ITEM *HashFindPhonePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], HASH_ITEM *pItemLast)
{
- HASH_ITEM *pNow = pItemLast ? pItemLast->next : pgdata->static_data.hashtable[HashFunc(phoneSeq)];
+ HASH_ITEM *pNow = pItemLast ? pItemLast->next : pgdata->staticData.hashtable[HashFunc(phoneSeq)];

for (; pNow; pNow = pNow->next)
if (PhoneSeqTheSame(pNow->data.phoneSeq, phoneSeq))
@@ -92,7 +92,7 @@ HASH_ITEM **HashFindHead(ChewingData *pgdata, const uint16_t phoneSeq[])
assert(pgdata);
assert(phoneSeq);

- return &pgdata->static_data.hashtable[HashFunc(phoneSeq)];
+ return &pgdata->staticData.hashtable[HashFunc(phoneSeq)];
}

HASH_ITEM *HashFindEntry(ChewingData *pgdata, const uint16_t phoneSeq[], const char wordSeq[])
@@ -102,7 +102,7 @@ HASH_ITEM *HashFindEntry(ChewingData *pgdata, const uint16_t phoneSeq[], const c

hashvalue = HashFunc(phoneSeq);

- for (pItem = pgdata->static_data.hashtable[hashvalue]; pItem; pItem = pItem->next) {
+ for (pItem = pgdata->staticData.hashtable[hashvalue]; pItem; pItem = pItem->next) {
if (!strcmp(pItem->data.wordSeq, wordSeq) && PhoneSeqTheSame(pItem->data.phoneSeq, phoneSeq)) {
return pItem;
}
@@ -125,7 +125,7 @@ HASH_ITEM *HashInsert(ChewingData *pgdata, UserPhraseData *pData)

hashvalue = HashFunc(pData->phoneSeq);
/* set the new element */
- pItem->next = pgdata->static_data.hashtable[hashvalue];
+ pItem->next = pgdata->staticData.hashtable[hashvalue];

/* transfer ownership of pointers inside |pData| to |pItem->data| */
pItem->data = *pData;
@@ -133,7 +133,7 @@ HASH_ITEM *HashInsert(ChewingData *pgdata, UserPhraseData *pData)
pItem->item_index = -1;

/* set link to the new element */
- pgdata->static_data.hashtable[hashvalue] = pItem;
+ pgdata->staticData.hashtable[hashvalue] = pItem;

return pItem;
}
@@ -152,8 +152,8 @@ HASH_ITEM *FindNextHash(const ChewingData *pgdata, HASH_ITEM *curr)
}

for (; hash_value < HASH_TABLE_SIZE; ++hash_value)
- if (pgdata->static_data.hashtable[hash_value])
- return pgdata->static_data.hashtable[hash_value];
+ if (pgdata->staticData.hashtable[hash_value])
+ return pgdata->staticData.hashtable[hash_value];
return NULL;
}

@@ -213,14 +213,14 @@ void HashModify(ChewingData *pgdata, HASH_ITEM *pItem)
FILE *outfile;
char str[FIELD_SIZE + 1];

- outfile = fopen(pgdata->static_data.hashfilename, "r+b");
+ outfile = fopen(pgdata->staticData.hashfilename, "r+b");
if (!outfile)
return;

/* update "lifetime" */
fseek(outfile, strlen(BIN_HASH_SIG), SEEK_SET);
- fwrite(&pgdata->static_data.chewing_lifetime, 1, 4, outfile);
- sprintf(str, "%d", pgdata->static_data.chewing_lifetime);
+ fwrite(&pgdata->staticData.chewing_lifetime, 1, 4, outfile);
+ sprintf(str, "%d", pgdata->staticData.chewing_lifetime);
DEBUG_OUT("HashModify-1: '%-75s'\n", str);

/* update record */
@@ -436,7 +436,7 @@ static int migrate_hash_to_bin(ChewingData *pgdata)
HASH_ITEM item;
int item_index, iret, tflen;
int ret;
- const char *ofilename = pgdata->static_data.hashfilename;
+ const char *ofilename = pgdata->staticData.hashfilename;

/* allocate dump buffer */
txtfile = open_file_get_length(ofilename, "r", &tflen);
@@ -448,7 +448,7 @@ static int migrate_hash_to_bin(ChewingData *pgdata)
fclose(txtfile);
return 0;
}
- ret = fscanf(txtfile, "%d", &pgdata->static_data.chewing_lifetime);
+ ret = fscanf(txtfile, "%d", &pgdata->staticData.chewing_lifetime);
if (ret != 1) {
free(dump);
return 0;
@@ -458,8 +458,8 @@ static int migrate_hash_to_bin(ChewingData *pgdata)
seekdump = dump;
memcpy(seekdump, BIN_HASH_SIG, strlen(BIN_HASH_SIG));
memcpy(seekdump + strlen(BIN_HASH_SIG),
- &pgdata->static_data.chewing_lifetime, sizeof(pgdata->static_data.chewing_lifetime));
- seekdump += strlen(BIN_HASH_SIG) + sizeof(pgdata->static_data.chewing_lifetime);
+ &pgdata->staticData.chewing_lifetime, sizeof(pgdata->static_data.chewing_lifetime));
+ seekdump += strlen(BIN_HASH_SIG) + sizeof(pgdata->staticData.chewing_lifetime);

/* migrate */
item_index = 0;
@@ -511,7 +511,7 @@ void TerminateUserphrase(ChewingData *pgdata)
int i;

for (i = 0; i < HASH_TABLE_SIZE; ++i) {
- pItem = pgdata->static_data.hashtable[i];
+ pItem = pgdata->staticData.hashtable[i];
FreeHashItem(pItem);
}
}
@@ -522,26 +522,26 @@ int InitUserphrase(struct ChewingData *pgdata, const char *path)
int item_index, hashvalue, iret, fsize, hdrlen, oldest = INT_MAX;
char *dump, *seekdump;

- strncpy(pgdata->static_data.hashfilename, path, ARRAY_SIZE(pgdata->static_data.hashfilename) - 1);
- memset(pgdata->static_data.hashtable, 0, sizeof(pgdata->static_data.hashtable));
+ strncpy(pgdata->staticData.hashfilename, path, ARRAY_SIZE(pgdata->static_data.hashfilename) - 1);
+ memset(pgdata->staticData.hashtable, 0, sizeof(pgdata->static_data.hashtable));

open_hash_file:
- dump = _load_hash_file(pgdata->static_data.hashfilename, &fsize);
- hdrlen = strlen(BIN_HASH_SIG) + sizeof(pgdata->static_data.chewing_lifetime);
+ dump = _load_hash_file(pgdata->staticData.hashfilename, &fsize);
+ hdrlen = strlen(BIN_HASH_SIG) + sizeof(pgdata->staticData.chewing_lifetime);
item_index = 0;
if (dump == NULL || fsize < hdrlen) {
FILE *outfile;

- outfile = fopen(pgdata->static_data.hashfilename, "w+b");
+ outfile = fopen(pgdata->staticData.hashfilename, "w+b");
if (!outfile) {
if (dump) {
free(dump);
}
return -1;
}
- pgdata->static_data.chewing_lifetime = 0;
+ pgdata->staticData.chewing_lifetime = 0;
fwrite(BIN_HASH_SIG, 1, strlen(BIN_HASH_SIG), outfile);
- fwrite(&pgdata->static_data.chewing_lifetime, 1, sizeof(pgdata->static_data.chewing_lifetime), outfile);
+ fwrite(&pgdata->staticData.chewing_lifetime, 1, sizeof(pgdata->static_data.chewing_lifetime), outfile);
fclose(outfile);
} else {
if (memcmp(dump, BIN_HASH_SIG, strlen(BIN_HASH_SIG)) != 0) {
@@ -553,7 +553,7 @@ int InitUserphrase(struct ChewingData *pgdata, const char *path)
goto open_hash_file;
}

- pgdata->static_data.chewing_lifetime = *(int *) (dump + strlen(BIN_HASH_SIG));
+ pgdata->staticData.chewing_lifetime = *(int *) (dump + strlen(BIN_HASH_SIG));
seekdump = dump + hdrlen;
fsize -= hdrlen;

@@ -588,11 +588,11 @@ int InitUserphrase(struct ChewingData *pgdata, const char *path)
pPool = pItem->next;

hashvalue = HashFunc(pItem->data.phoneSeq);
- pItem->next = pgdata->static_data.hashtable[hashvalue];
- pgdata->static_data.hashtable[hashvalue] = pItem;
+ pItem->next = pgdata->staticData.hashtable[hashvalue];
+ pgdata->staticData.hashtable[hashvalue] = pItem;
pItem->data.recentTime -= oldest;
}
- pgdata->static_data.chewing_lifetime -= oldest;
+ pgdata->staticData.chewing_lifetime -= oldest;
}
return 0;
}
@@ -628,7 +628,7 @@ int HashFileSeekToUserPhrase(struct ChewingData *pgdata, HASH_ITEM *pItem, FILE
return 0;
}

- hdrlen = strlen(BIN_HASH_SIG) + sizeof(pgdata->static_data.chewing_lifetime);
+ hdrlen = strlen(BIN_HASH_SIG) + sizeof(pgdata->staticData.chewing_lifetime);
seekdump = buf + hdrlen;
fsize -= hdrlen;

diff --git a/src/lib.rs b/src/lib.rs
index fbc5f1b..d372fd6 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1 +1,9 @@
-pub mod zhuyin;
\ No newline at end of file
+//! # Glossary
+//!
+//! 1. **Phonetic Key**
+
+pub mod conversion;
+pub mod dictionary;
+pub mod editor;
+pub mod path;
+pub mod zhuyin;
diff --git a/src/mod_aux.c b/src/mod_aux.c
index 7818f8d..56a0da7 100644
--- a/src/mod_aux.c
+++ b/src/mod_aux.c
@@ -17,11 +17,15 @@
#include <stdlib.h>

#include "chewing-private.h"
-#include "bopomofo-private.h"
#include "chewingio.h"
-#include "chewing-utf8-util.h"
#include "private.h"

+#ifndef WITH_RUST
+#include "global.h"
+#include "bopomofo-private.h"
+#include "chewing-utf8-util.h"
+#endif
+
/**
* @param ctx handle to Chewing IM context
* @retval TRUE if it currnet input state is at the "end-of-a-char"
diff --git a/src/path.rs b/src/path.rs
new file mode 100644
index 0000000..1303924
--- /dev/null
+++ b/src/path.rs
@@ -0,0 +1,58 @@
+//! Types and functions related to file system path operations.
+
+use std::{env, path::PathBuf};
+
+use dirs_next::{data_dir as user_data_dir, home_dir};
+
+/// Returns the path to the user's default chewing data directory.
+///
+/// The returned value depends on the operating system and is either a
+/// Some, containing a value from the following table, or a None.
+///
+/// |Platform | Base | Example |
+/// | ------- | ---------------------------------------- | ------------------------------------------------ |
+/// | Linux | `$XDG_DATA_HOME` or `$HOME`/.local/share | /home/alice/.local/share/chewing |
+/// | macOS | `$HOME`/Library/Application Support | /Users/Alice/Library/Application Support/chewing |
+/// | Windows | `{FOLDERID_RoamingAppData}` | C:\Users\Alice\AppData\Roaming\chewing |
+///
+/// Legacy path is automatically detected and used
+///
+/// |Platform | Base | Example |
+/// | ------- | -------------- | --------------------- ------------ |
+/// | Linux | `$HOME` | /home/alice/.chewing |
+/// | macOS | /Library | /Library/ChewingOSX |
+/// | Windows | `$USERPROFILE` | C:\Users\Alice\ChewingTextService |
+///
+/// Users can set the `CHEWING_USER_PATH` environment variable to
+/// override the default path.
+pub fn data_dir() -> Option<PathBuf> {
+ // TODO per-OS integration test
+ if let Ok(path) = env::var("CHEWING_USER_PATH") {
+ return Some(path.into());
+ }
+ if let Some(path) = legacy_data_dir() {
+ if path.exists() && path.is_dir() {
+ return Some(path);
+ }
+ }
+ user_data_dir().map(|path| path.join("chewing"))
+}
+
+fn legacy_data_dir() -> Option<PathBuf> {
+ #[cfg(target_os = "windows")]
+ return home_dir().map(|path| path.join("ChewingTextService"));
+
+ #[cfg(any(target_os = "macos", target_os = "ios"))]
+ return Some("/Library/ChewingOSX".into());
+
+ home_dir().map(|path| path.join(".chewing"))
+}
+
+/// Returns the path to the user's default userphrase database file.
+///
+/// This function uses the default path from the [`data_dir()`] method
+/// and also respects the `CHEWING_USER_PATH` environment variable.
+pub fn userphrase_path() -> Option<PathBuf> {
+ // TODO support uhash.dat
+ data_dir().map(|path| path.join("chewing.sqlite3"))
+}
diff --git a/src/pinyin.c b/src/pinyin.c
index 989b140..f23a723 100644
--- a/src/pinyin.c
+++ b/src/pinyin.c
@@ -22,8 +22,8 @@

void TerminatePinyin(ChewingData *pgdata)
{
- free(pgdata->static_data.hanyuInitialsMap);
- free(pgdata->static_data.hanyuFinalsMap);
+ free(pgdata->staticData.hanyuInitialsMap);
+ free(pgdata->staticData.hanyuFinalsMap);
}

int InitPinyin(ChewingData *pgdata, const char *prefix)
@@ -40,29 +40,29 @@ int InitPinyin(ChewingData *pgdata, const char *prefix)
if (!fd)
return 0;

- ret = fscanf(fd, "%d", &pgdata->static_data.HANYU_INITIALS);
+ ret = fscanf(fd, "%d", &pgdata->staticData.HANYU_INITIALS);
if (ret != 1) {
goto fail;
}
- ++pgdata->static_data.HANYU_INITIALS;
- pgdata->static_data.hanyuInitialsMap = ALC(keymap, pgdata->static_data.HANYU_INITIALS);
- for (i = 0; i < pgdata->static_data.HANYU_INITIALS - 1; i++) {
+ ++pgdata->staticData.HANYU_INITIALS;
+ pgdata->staticData.hanyuInitialsMap = ALC(keymap, pgdata->staticData.HANYU_INITIALS);
+ for (i = 0; i < pgdata->staticData.HANYU_INITIALS - 1; i++) {
ret = fscanf(fd, "%s %s",
- pgdata->static_data.hanyuInitialsMap[i].pinyin, pgdata->static_data.hanyuInitialsMap[i].bopomofo);
+ pgdata->staticData.hanyuInitialsMap[i].pinyin, pgdata->staticData.hanyuInitialsMap[i].bopomofo);
if (ret != 2) {
goto fail;
}
}

- ret = fscanf(fd, "%d", &pgdata->static_data.HANYU_FINALS);
+ ret = fscanf(fd, "%d", &pgdata->staticData.HANYU_FINALS);
if (ret != 1) {
goto fail;
}
- ++pgdata->static_data.HANYU_FINALS;
- pgdata->static_data.hanyuFinalsMap = ALC(keymap, pgdata->static_data.HANYU_FINALS);
- for (i = 0; i < pgdata->static_data.HANYU_FINALS - 1; i++) {
+ ++pgdata->staticData.HANYU_FINALS;
+ pgdata->staticData.hanyuFinalsMap = ALC(keymap, pgdata->staticData.HANYU_FINALS);
+ for (i = 0; i < pgdata->staticData.HANYU_FINALS - 1; i++) {
ret = fscanf(fd, "%s %s",
- pgdata->static_data.hanyuFinalsMap[i].pinyin, pgdata->static_data.hanyuFinalsMap[i].bopomofo);
+ pgdata->staticData.hanyuFinalsMap[i].pinyin, pgdata->staticData.hanyuFinalsMap[i].bopomofo);
if (ret != 2) {
goto fail;
}
@@ -198,15 +198,15 @@ int PinyinToBopomofo(ChewingData *pgdata, const char *pinyinKeySeq, char *bopomo
}


- for (i = 0; i < pgdata->static_data.HANYU_INITIALS; i++) {
- p = strstr(pinyinKeySeq, pgdata->static_data.hanyuInitialsMap[i].pinyin);
+ for (i = 0; i < pgdata->staticData.HANYU_INITIALS; i++) {
+ p = strstr(pinyinKeySeq, pgdata->staticData.hanyuInitialsMap[i].pinyin);
if (p == pinyinKeySeq) {
- initial = pgdata->static_data.hanyuInitialsMap[i].bopomofo;
- cursor = pinyinKeySeq + strlen(pgdata->static_data.hanyuInitialsMap[i].pinyin);
+ initial = pgdata->staticData.hanyuInitialsMap[i].bopomofo;
+ cursor = pinyinKeySeq + strlen(pgdata->staticData.hanyuInitialsMap[i].pinyin);
break;
}
}
- if (i == pgdata->static_data.HANYU_INITIALS) {
+ if (i == pgdata->staticData.HANYU_INITIALS) {
/* No initials. might be ㄧㄨㄩ */
/* XXX: I NEED Implementation
if(finalsKeySeq[0] != ) {
@@ -216,13 +216,13 @@ int PinyinToBopomofo(ChewingData *pgdata, const char *pinyinKeySeq, char *bopomo
}

if (cursor) {
- for (i = 0; i < pgdata->static_data.HANYU_FINALS; i++) {
- if (strcmp(cursor, pgdata->static_data.hanyuFinalsMap[i].pinyin) == 0) {
- final = pgdata->static_data.hanyuFinalsMap[i].bopomofo;
+ for (i = 0; i < pgdata->staticData.HANYU_FINALS; i++) {
+ if (strcmp(cursor, pgdata->staticData.hanyuFinalsMap[i].pinyin) == 0) {
+ final = pgdata->staticData.hanyuFinalsMap[i].bopomofo;
break;
}
}
- if (i == pgdata->static_data.HANYU_FINALS) {
+ if (i == pgdata->staticData.HANYU_FINALS) {
return 2;
}
}
diff --git a/src/private.h b/src/private.h
index a282f4d..d436a67 100644
--- a/src/private.h
+++ b/src/private.h
@@ -8,6 +8,42 @@
/* Platform-dependent declaration */
#include "plat_types.h"

+#ifdef WITH_RUST
+#define LOG_VERBOSE(fmt, ...) \
+ do { \
+ } while (0)
+
+#define LOG_DEBUG(fmt, ...) \
+ do { \
+ } while (0)
+
+#define LOG_INFO(fmt, ...) \
+ do { \
+ } while (0)
+
+#define LOG_WARN(fmt, ...) \
+ do { \
+ } while (0)
+
+#define LOG_ERROR(fmt, ...) \
+ do { \
+ } while (0)
+
+#define DEBUG_OUT( fmt, ... ) \
+ do { \
+ } while (0)
+
+#define DEBUG_CHECKPOINT() \
+ do { \
+ } while (0)
+
+/* Use LOG_API to log all public API call. */
+#define LOG_API(fmt, ...) \
+ do { \
+ } while (0)
+
+#else
+
#define LOG_VERBOSE(fmt, ...) \
do { \
pgdata->logger(pgdata->loggerData, CHEWING_LOG_VERBOSE, \
@@ -61,6 +97,7 @@
do { \
LOG_INFO("API call: " fmt, ##__VA_ARGS__); \
} while (0)
+#endif

#define ALC(type, size) \
(type *) calloc(size, sizeof(type))
diff --git a/src/tree.c b/src/tree.c
index f6d70dc..2e2baea 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -77,8 +77,8 @@ static int PhraseIntervalIntersect(PhraseIntervalType in1, PhraseIntervalType in

void TerminateTree(ChewingData *pgdata)
{
- pgdata->static_data.tree = NULL;
- plat_mmap_close(&pgdata->static_data.tree_mmap);
+ pgdata->staticData.tree = NULL;
+ plat_mmap_close(&pgdata->staticData.tree_mmap);
}


@@ -92,15 +92,15 @@ int InitTree(ChewingData *pgdata, const char *prefix)
if (len + 1 > sizeof(filename))
return -1;

- plat_mmap_set_invalid(&pgdata->static_data.tree_mmap);
- pgdata->static_data.tree_size = plat_mmap_create(&pgdata->static_data.tree_mmap, filename, FLAG_ATTRIBUTE_READ);
- if (pgdata->static_data.tree_size <= 0)
+ plat_mmap_set_invalid(&pgdata->staticData.tree_mmap);
+ pgdata->staticData.tree_size = plat_mmap_create(&pgdata->staticData.tree_mmap, filename, FLAG_ATTRIBUTE_READ);
+ if (pgdata->staticData.tree_size <= 0)
return -1;

offset = 0;
- pgdata->static_data.tree =
- (const TreeType *) plat_mmap_set_view(&pgdata->static_data.tree_mmap, &offset, &pgdata->static_data.tree_size);
- if (!pgdata->static_data.tree)
+ pgdata->staticData.tree =
+ (const TreeType *) plat_mmap_set_view(&pgdata->staticData.tree_mmap, &offset, &pgdata->staticData.tree_size);
+ if (!pgdata->staticData.tree)
return -1;

return 0;
@@ -249,7 +249,7 @@ static int CompTreeType(const void *a, const void *b)
const TreeType *TreeFindPhrase(ChewingData *pgdata, int begin, int end, const uint16_t *phoneSeq)
{
TreeType target;
- const TreeType *tree_p = pgdata->static_data.tree;
+ const TreeType *tree_p = pgdata->staticData.tree;
uint32_t range[2];
int i;

@@ -258,7 +258,7 @@ const TreeType *TreeFindPhrase(ChewingData *pgdata, int begin, int end, const ui
range[0] = GetUint24(tree_p->child.begin);
range[1] = GetUint24(tree_p->child.end);
assert(range[1] >= range[0]);
- tree_p = (const TreeType *) bsearch(&target, pgdata->static_data.tree + range[0],
+ tree_p = (const TreeType *) bsearch(&target, pgdata->staticData.tree + range[0],
range[1] - range[0], sizeof(TreeType), CompTreeType);

/* if not found any word then fail. */
@@ -267,7 +267,7 @@ const TreeType *TreeFindPhrase(ChewingData *pgdata, int begin, int end, const ui
}

/* If its child has no key value of 0, then it is only a "half" phrase. */
- if (GetUint16(pgdata->static_data.tree[GetUint24(tree_p->child.begin)].key) != 0)
+ if (GetUint16(pgdata->staticData.tree[GetUint24(tree_p->child.begin)].key) != 0)
return NULL;
return tree_p;
}
@@ -277,8 +277,8 @@ const TreeType *TreeFindPhrase(ChewingData *pgdata, int begin, int end, const ui
*/
void TreeChildRange(ChewingData *pgdata, const TreeType *parent)
{
- pgdata->static_data.tree_cur_pos = pgdata->static_data.tree + GetUint24(parent->child.begin);
- pgdata->static_data.tree_end_pos = pgdata->static_data.tree + GetUint24(parent->child.end);
+ pgdata->staticData.tree_cur_pos = pgdata->staticData.tree + GetUint24(parent->child.begin);
+ pgdata->staticData.tree_end_pos = pgdata->staticData.tree + GetUint24(parent->child.end);
}

static void AddInterval(TreeDataType *ptd, int begin, int end, Phrase *p_phrase, int dict_or_user)
diff --git a/src/userphrase-hash.c b/src/userphrase-hash.c
index 39208a0..48d3558 100644
--- a/src/userphrase-hash.c
+++ b/src/userphrase-hash.c
@@ -150,7 +150,7 @@ int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char
data.maxfreq = LoadMaxFreq(pgdata, phoneSeq, len);

data.userfreq = data.origfreq;
- data.recentTime = pgdata->static_data.chewing_lifetime;
+ data.recentTime = pgdata->staticData.chewing_lifetime;
pItem = HashInsert(pgdata, &data);
DestroyUserPhraseData(&data);
LogUserPhrase(pgdata, phoneSeq, wordSeq, pItem->data.origfreq, pItem->data.maxfreq, pItem->data.userfreq,
@@ -162,8 +162,8 @@ int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char
pItem->data.userfreq = UpdateFreq(pItem->data.userfreq,
pItem->data.maxfreq,
pItem->data.origfreq,
- pgdata->static_data.chewing_lifetime - pItem->data.recentTime);
- pItem->data.recentTime = pgdata->static_data.chewing_lifetime;
+ pgdata->staticData.chewing_lifetime - pItem->data.recentTime);
+ pItem->data.recentTime = pgdata->staticData.chewing_lifetime;
LogUserPhrase(pgdata, phoneSeq, wordSeq, pItem->data.origfreq, pItem->data.maxfreq, pItem->data.userfreq,
pItem->data.recentTime);
HashModify(pgdata, pItem);
@@ -232,5 +232,5 @@ void IncreaseLifeTime(ChewingData *pgdata)
{
assert(pgdata);

- ++pgdata->static_data.chewing_lifetime;
+ ++pgdata->staticData.chewing_lifetime;
}
diff --git a/src/userphrase-sql.c b/src/userphrase-sql.c
index f2a125e..abde6eb 100644
--- a/src/userphrase-sql.c
+++ b/src/userphrase-sql.c
@@ -33,14 +33,14 @@ static int UserBindPhone(ChewingData *pgdata, int index, const uint16_t phoneSeq
return -1;
}

- ret = sqlite3_bind_int(pgdata->static_data.stmt_userphrase[index], BIND_USERPHRASE_LENGTH, len);
+ ret = sqlite3_bind_int(pgdata->staticData.stmt_userphrase[index], BIND_USERPHRASE_LENGTH, len);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_bind_int returns %d", ret);
return ret;
}

for (i = 0; i < len; ++i) {
- ret = sqlite3_bind_int(pgdata->static_data.stmt_userphrase[index], BIND_USERPHRASE_PHONE_0 + i, phoneSeq[i]);
+ ret = sqlite3_bind_int(pgdata->staticData.stmt_userphrase[index], BIND_USERPHRASE_PHONE_0 + i, phoneSeq[i]);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_bind_int returns %d", ret);
return ret;
@@ -48,7 +48,7 @@ static int UserBindPhone(ChewingData *pgdata, int index, const uint16_t phoneSeq
}

for (i = len; i < MAX_PHRASE_LEN; ++i) {
- ret = sqlite3_bind_int(pgdata->static_data.stmt_userphrase[index], BIND_USERPHRASE_PHONE_0 + i, 0);
+ ret = sqlite3_bind_int(pgdata->staticData.stmt_userphrase[index], BIND_USERPHRASE_PHONE_0 + i, 0);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_bind_int returns %d", ret);
return ret;
@@ -102,7 +102,7 @@ static int LoadMaxFreq(ChewingData *pgdata, const uint16_t phoneSeq[], int len)
}
free(phrase);

- assert(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_GET_MAX_FREQ]);
+ assert(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_GET_MAX_FREQ]);

ret = UserBindPhone(pgdata, STMT_USERPHRASE_GET_MAX_FREQ, phoneSeq, len);
if (ret != SQLITE_OK) {
@@ -110,17 +110,17 @@ static int LoadMaxFreq(ChewingData *pgdata, const uint16_t phoneSeq[], int len)
return maxFreq;
}

- ret = sqlite3_step(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_GET_MAX_FREQ]);
+ ret = sqlite3_step(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_GET_MAX_FREQ]);
if (ret != SQLITE_ROW)
return maxFreq;

- ret = sqlite3_reset(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_GET_MAX_FREQ]);
+ ret = sqlite3_reset(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_GET_MAX_FREQ]);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_reset returns %d", ret);
return maxFreq;
}

- max_userphrase_freq = sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_GET_MAX_FREQ],
+ max_userphrase_freq = sqlite3_column_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_GET_MAX_FREQ],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_GET_MAX_FREQ].column
[COLUMN_USERPHRASE_USER_FREQ]);

@@ -158,7 +158,7 @@ static int UpdateFreq(int freq, int maxfreq, int origfreq, int deltatime)

static int GetCurrentLifeTime(ChewingData *pgdata)
{
- return pgdata->static_data.new_lifetime;
+ return pgdata->staticData.new_lifetime;
}

static void LogUserPhrase(ChewingData *pgdata,
@@ -181,7 +181,7 @@ static void LogUserPhrase(ChewingData *pgdata,

void UserUpdatePhraseBegin(ChewingData *pgdata)
{
- sqlite3_exec(pgdata->static_data.db, "BEGIN", 0, 0, 0);
+ sqlite3_exec(pgdata->staticData.db, "BEGIN", 0, 0, 0);
}

int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char wordSeq[])
@@ -221,7 +221,7 @@ int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char
goto end;
}

- ret = sqlite3_bind_text(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE],
+ ret = sqlite3_bind_text(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE],
BIND_USERPHRASE_PHRASE, wordSeq, -1, SQLITE_STATIC);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_bind_text returns %d", ret);
@@ -231,21 +231,21 @@ int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char

recent_time = GetCurrentLifeTime(pgdata);

- ret = sqlite3_step(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE]);
+ ret = sqlite3_step(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE]);
if (ret == SQLITE_ROW) {
action = USER_UPDATE_MODIFY;

- orig_freq = sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE],
+ orig_freq = sqlite3_column_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE].column
[COLUMN_USERPHRASE_ORIG_FREQ]);

max_freq = LoadMaxFreq(pgdata, phoneSeq, phone_len);

- user_freq = sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE],
+ user_freq = sqlite3_column_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE].column
[COLUMN_USERPHRASE_USER_FREQ]);

- orig_time = sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE],
+ orig_time = sqlite3_column_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE].column
[COLUMN_USERPHRASE_TIME]);

@@ -258,9 +258,9 @@ int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char
user_freq = orig_freq;
}

- assert(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT]);
+ assert(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_UPSERT]);

- ret = sqlite3_bind_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT],
+ ret = sqlite3_bind_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_UPSERT],
BIND_USERPHRASE_TIME, recent_time);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_bind_int returns %d", ret);
@@ -268,7 +268,7 @@ int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char
goto end;
}

- ret = sqlite3_bind_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT],
+ ret = sqlite3_bind_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_UPSERT],
BIND_USERPHRASE_USER_FREQ, user_freq);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_bind_int returns %d", ret);
@@ -276,7 +276,7 @@ int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char
goto end;
}

- ret = sqlite3_bind_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT],
+ ret = sqlite3_bind_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_UPSERT],
BIND_USERPHRASE_MAX_FREQ, max_freq);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_bind_int returns %d", ret);
@@ -284,7 +284,7 @@ int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char
goto end;
}

- ret = sqlite3_bind_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT],
+ ret = sqlite3_bind_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_UPSERT],
BIND_USERPHRASE_ORIG_FREQ, orig_freq);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_bind_int returns %d", ret);
@@ -299,7 +299,7 @@ int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char
goto end;
}

- ret = sqlite3_bind_text(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT],
+ ret = sqlite3_bind_text(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_UPSERT],
BIND_USERPHRASE_PHRASE, wordSeq, -1, SQLITE_STATIC);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_bind_text returns %d", ret);
@@ -307,7 +307,7 @@ int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char
goto end;
}

- ret = sqlite3_step(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT]);
+ ret = sqlite3_step(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_UPSERT]);
if (ret != SQLITE_DONE) {
LOG_ERROR("sqlite3_step returns %d", ret);
action = USER_UPDATE_FAIL;
@@ -317,12 +317,12 @@ int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char
LogUserPhrase(pgdata, phoneSeq, wordSeq, orig_freq, max_freq, user_freq, recent_time);

end:
- ret = sqlite3_reset(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT]);
+ ret = sqlite3_reset(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_UPSERT]);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_reset returns %d", ret);
}

- ret = sqlite3_reset(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE]);
+ ret = sqlite3_reset(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE]);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_reset returns %d", ret);
}
@@ -332,7 +332,7 @@ int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char

void UserUpdatePhraseEnd(ChewingData *pgdata)
{
- sqlite3_exec(pgdata->static_data.db, "END", 0, 0, 0);
+ sqlite3_exec(pgdata->staticData.db, "END", 0, 0, 0);
}

int UserRemovePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char wordSeq[])
@@ -345,7 +345,7 @@ int UserRemovePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char
assert(phoneSeq);
assert(wordSeq);

- assert(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_DELETE]);
+ assert(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_DELETE]);

len = GetPhoneLen(phoneSeq);
ret = UserBindPhone(pgdata, STMT_USERPHRASE_DELETE, phoneSeq, len);
@@ -354,23 +354,23 @@ int UserRemovePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char
goto end;
}

- ret = sqlite3_bind_text(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_DELETE],
+ ret = sqlite3_bind_text(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_DELETE],
BIND_USERPHRASE_PHRASE, wordSeq, -1, SQLITE_STATIC);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_bind_text returns %d", ret);
goto end;
}

- ret = sqlite3_step(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_DELETE]);
+ ret = sqlite3_step(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_DELETE]);
if (ret != SQLITE_DONE) {
LOG_ERROR("sqlite3_step returns %d", ret);
goto end;
}

- affected = sqlite3_changes(pgdata->static_data.db);
+ affected = sqlite3_changes(pgdata->staticData.db);

end:
- ret = sqlite3_reset(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_DELETE]);
+ ret = sqlite3_reset(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_DELETE]);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_reset returns %d", ret);
}
@@ -387,8 +387,8 @@ UserPhraseData *UserGetPhraseFirst(ChewingData *pgdata, const uint16_t phoneSeq[
assert(pgdata);
assert(phoneSeq);

- assert(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE]);
- ret = sqlite3_reset(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE]);
+ assert(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE]);
+ ret = sqlite3_reset(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE]);
if (ret != SQLITE_OK) {
LOG_ERROR("sqlite3_reset returns %d", ret);
return NULL;
@@ -411,31 +411,31 @@ UserPhraseData *UserGetPhraseNext(ChewingData *pgdata, const uint16_t phoneSeq[]
assert(pgdata);
assert(phoneSeq);

- ret = sqlite3_step(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE]);
+ ret = sqlite3_step(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE]);
if (ret != SQLITE_ROW)
return NULL;

/* FIXME: shall not remove const here. */
pgdata->userphrase_data.wordSeq =
- (char *) sqlite3_column_text(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE],
+ (char *) sqlite3_column_text(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT_BY_PHONE].column
[COLUMN_USERPHRASE_PHRASE]);
pgdata->userphrase_data.phoneSeq = (uint16_t *) phoneSeq;

pgdata->userphrase_data.recentTime =
- sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE],
+ sqlite3_column_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT_BY_PHONE].column[COLUMN_USERPHRASE_TIME]);

pgdata->userphrase_data.userfreq =
- sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE],
+ sqlite3_column_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT_BY_PHONE].column[COLUMN_USERPHRASE_USER_FREQ]);

pgdata->userphrase_data.maxfreq =
- sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE],
+ sqlite3_column_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT_BY_PHONE].column[COLUMN_USERPHRASE_MAX_FREQ]);

pgdata->userphrase_data.origfreq =
- sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE],
+ sqlite3_column_int(pgdata->staticData.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE],
SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT_BY_PHONE].column[COLUMN_USERPHRASE_ORIG_FREQ]);

return &pgdata->userphrase_data;
@@ -448,5 +448,5 @@ void UserGetPhraseEnd(ChewingData *pgdata UNUSED, const uint16_t phoneSeq[] UNUS

void IncreaseLifeTime(ChewingData *pgdata)
{
- ++pgdata->static_data.new_lifetime;
+ ++pgdata->staticData.new_lifetime;
}
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 821bf58..a8d2a0e 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -4,11 +4,9 @@ set(ALL_TESTCASES
test-easy-symbol
test-error-handling
test-fullshape
- test-key2pho
test-keyboard
test-keyboardless
test-logger
- test-mmap
test-path
test-regression
test-reset
@@ -18,6 +16,12 @@ set(ALL_TESTCASES
test-userphrase
test-utf8
)
+if (NOT WITH_RUST)
+ list(APPEND ALL_TESTCASES
+ test-key2pho
+ test-mmap
+ )
+endif()
set(ALL_TESTTOOLS
performance
randkeystroke
@@ -50,6 +54,7 @@ foreach(target ${ALL_TESTS})
add_executable(${target} ${TEST_SRC_DIR}/${target}.c)
if (WITH_RUST)
target_link_libraries(${target} chewing-internal)
+ target_link_libraries(${target} ${SQLITE3_LIBRARY})
endif()
add_dependencies(${target} data all_static_data)
add_dependencies(check ${target})
@@ -60,7 +65,9 @@ add_library(testhelper STATIC
$<TARGET_OBJECTS:chewing>
$<TARGET_OBJECTS:common>
)
-target_link_libraries(testhelper userphrase)
+if (NOT WITH_RUST)
+ target_link_libraries(testhelper userphrase)
+endif()
target_compile_definitions(testhelper PRIVATE
CHEWING_DATA_PREFIX=\"${DATA_BIN_DIR}\"
TEST_HASH_DIR=\"${TEST_BIN_DIR}\"
diff --git a/test/test-bopomofo.c b/test/test-bopomofo.c
index 37e01f2..fa519dd 100644
--- a/test/test-bopomofo.c
+++ b/test/test-bopomofo.c
@@ -17,8 +17,13 @@
#include <stdio.h>
#include <string.h>

+#ifdef WITH_RUST
+#include "chewing_internal.h"
+#else
#include "key2pho-private.h"
#include "bopomofo-private.h"
+#endif
+
#include "plat_types.h"
#include "testhelper.h"

diff --git a/test/test-path.c b/test/test-path.c
index 12d6510..ac24330 100644
--- a/test/test-path.c
+++ b/test/test-path.c
@@ -27,6 +27,16 @@ FILE *fd;

int find_path_by_files(const char *search_path, const char *const *files, char *output, size_t output_len);

+#ifdef WITH_RUST
+static const char *FILES[] = {
+ "tsi.dat",
+ "word.dat",
+ SYMBOL_TABLE_FILE,
+ SOFTKBD_TABLE_FILE,
+ PINYIN_TAB_NAME,
+ NULL,
+};
+#else
static const char *FILES[] = {
DICT_FILE,
PHONE_TREE_FILE,
@@ -35,6 +45,7 @@ static const char *FILES[] = {
PINYIN_TAB_NAME,
NULL,
};
+#endif

void test_plat_get_search_path()
{
diff --git a/test/testhelper.c b/test/testhelper.c
index becb754..e1a5c46 100644
--- a/test/testhelper.c
+++ b/test/testhelper.c
@@ -17,10 +17,16 @@
#include <string.h>

#include "chewing-private.h"
+
+#ifdef WITH_RUST
+#include "plat_types.h"
+#else
#include "chewing-utf8-util.h"
#include "key2pho-private.h"
-#include "plat_path.h"
#include "userphrase-private.h"
+#include "plat_path.h"
+#endif
+

static unsigned int test_run;
static unsigned int test_ok;
diff --git a/test/testhelper.h b/test/testhelper.h
index dc2f2f7..9dbb1a5 100644
--- a/test/testhelper.h
+++ b/test/testhelper.h
@@ -15,9 +15,17 @@

#include "chewing.h"
#include "chewingio.h"
-#include "chewing-utf8-util.h"

+#ifdef WITH_RUST
+#if WITH_SQLITE3
+# define DB_NAME "chewing.sqlite3"
+#else
+# define DB_NAME "uhash.dat"
+#endif
+#else
+#include "chewing-utf8-util.h"
#include "plat_path.h"
+#endif

/* The following macros are modified from GLIB.
* from GNU cpp Manual:
diff --git a/tools/Cargo.toml b/tools/Cargo.toml
new file mode 100644
index 0000000..3ec74b9
--- /dev/null
+++ b/tools/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "chewing-tools"
+description = "Tools of the Chewing (酷音) intelligent Zhuyin input method."
+license = "LGPL-2.1-or-later"
+version = "0.5.1-alpha.1"
+edition = "2021"
+
+[dependencies]
+chewing = { version = "0.5.1-alpha.1", path = ".." }
+thiserror = "1.0.0"
+anyhow = "1.0.0"
+clap = "4.1.0"
diff --git a/tools/src/bin/init_database.rs b/tools/src/bin/init_database.rs
new file mode 100644
index 0000000..500958a
--- /dev/null
+++ b/tools/src/bin/init_database.rs
@@ -0,0 +1,121 @@
+use std::{
+ fs::{self, File},
+ io::{BufRead, BufReader},
+ path::Path,
+};
+
+use anyhow::{bail, Context, Result};
+use chewing::{
+ dictionary::{
+ DictionaryBuilder, DictionaryInfo, SqliteDictionaryBuilder, TrieDictionaryBuilder,
+ },
+ zhuyin::{Bopomofo, Syllable},
+};
+use clap::{Arg, ArgAction, Command};
+use thiserror::Error;
+
+#[derive(Error, Debug)]
+#[error("parsing failed at line {line_num}")]
+struct ParseError {
+ line_num: usize,
+ column: usize,
+ #[source]
+ source: anyhow::Error,
+}
+
+trait IntoParseError<T> {
+ fn parse_error(self, line_num: usize, column: usize) -> std::result::Result<T, ParseError>;
+}
+
+impl<T> IntoParseError<T> for Result<T> {
+ fn parse_error(self, line_num: usize, column: usize) -> std::result::Result<T, ParseError> {
+ self.map_err(|source| ParseError {
+ line_num,
+ column,
+ source,
+ })
+ }
+}
+
+fn main() -> Result<()> {
+ let m = Command::new("init_database")
+ .about("This program creates a new chewing phrase dictionary file.")
+ .arg(
+ Arg::new("type")
+ .short('t')
+ .value_parser(["sqlite", "trie"])
+ .default_value("trie"),
+ )
+ .arg(Arg::new("name").short('n').default_value("我的詞庫"))
+ .arg(Arg::new("copyright").short('c').default_value("Unknown"))
+ .arg(Arg::new("license").short('l').default_value("Unknown"))
+ .arg(Arg::new("version").short('r').default_value("1.0.0"))
+ .arg(
+ Arg::new("keep-word-freq")
+ .short('k')
+ .action(ArgAction::SetTrue),
+ )
+ .arg(Arg::new("tsi.src").required(true))
+ .arg(Arg::new("output").required(true))
+ .arg_required_else_help(true)
+ .get_matches();
+
+ let tsi_src: &String = m.get_one("tsi.src").unwrap();
+ let output: &String = m.get_one("output").unwrap();
+ let db_type: &String = m.get_one("type").unwrap();
+ let name: &String = m.get_one("name").unwrap();
+ let copyright: &String = m.get_one("copyright").unwrap();
+ let license: &String = m.get_one("license").unwrap();
+ let version: &String = m.get_one("version").unwrap();
+ let keep_word_freq: bool = m.get_flag("keep-word-freq");
+
+ let mut builder: Box<dyn DictionaryBuilder> = match db_type.as_str() {
+ "sqlite" => Box::new(SqliteDictionaryBuilder::new()),
+ "trie" => Box::new(TrieDictionaryBuilder::new()),
+ _ => bail!("Unknown database type {}", db_type),
+ };
+
+ builder.set_info(DictionaryInfo {
+ name: name.to_owned().into(),
+ copyright: copyright.to_owned().into(),
+ license: license.to_owned().into(),
+ version: version.to_owned().into(),
+ software: format!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")).into(),
+ })?;
+
+ let tsi = File::open(tsi_src)?;
+ let reader = BufReader::new(tsi);
+ for (line_num, line) in reader.lines().enumerate() {
+ let mut syllables = vec![];
+ let line = line?;
+ let phrase = line.split_ascii_whitespace().next().unwrap();
+ let freq: u32 = match phrase.chars().count() {
+ 1 if !keep_word_freq => 0,
+ _ => line
+ .split_ascii_whitespace()
+ .nth(1)
+ .unwrap()
+ .parse()
+ .context("unable to parse frequency")
+ .parse_error(line_num, 0)?,
+ };
+ for syllable_str in line.split_ascii_whitespace().skip(2) {
+ let mut syllable_builder = Syllable::builder();
+ if syllable_str.starts_with('#') {
+ break;
+ }
+ for c in syllable_str.chars() {
+ syllable_builder = syllable_builder.insert(Bopomofo::try_from(c)?)?;
+ }
+ syllables.push(syllable_builder.build());
+ }
+ builder.insert(&syllables, (phrase, freq).into())?;
+ }
+ let path: &Path = output.as_ref();
+ if path.exists() {
+ fs::remove_file(path).context("unable to overwrite output")?;
+ }
+ builder.build(path)?;
+
+ Ok(())
+}
--
2.39.1

Kan-Ru Chen

unread,
Jan 26, 2023, 8:43:04 PM1/26/23
to chewin...@googlegroups.com, czc...@czchen.org, jser...@gmail.com, Kan-Ru Chen
---
Cargo.lock | 2 +-
Cargo.toml | 10 +++++++++-
2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 3574fae..fe3d1a2 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -85,7 +85,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"

[[package]]
name = "chewing"
-version = "0.5.1-alpha.1"
+version = "0.5.1-alpha.2"
dependencies = [
"binary-layout",
"dirs-next",
diff --git a/Cargo.toml b/Cargo.toml
index 7be2878..ef7a97b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -3,9 +3,17 @@ name = "chewing"
description = "The Chewing (酷音) intelligent Zhuyin input method."
license = "LGPL-2.1-or-later"
documentation = "https://docs.rs/chewing"
-version = "0.5.1-alpha.1"
+version = "0.5.1-alpha.2"
edition = "2021"

+include = [
+ "src/**/*.rs",
+ "Cargo.toml",
+ "AUTHORS",
+ "COPYING",
+ "NEWS"
+]
+
[dependencies]
binary-layout = "3.0.0"
dirs-next = "2.0.0"
--
2.39.1

Reply all
Reply to author
Forward
0 new messages