diff --git a/source/containers/document-pii-detection/Dockerfile b/source/containers/document-pii-detection/Dockerfile index 91f1b3f8..d0de5bc8 100644 --- a/source/containers/document-pii-detection/Dockerfile +++ b/source/containers/document-pii-detection/Dockerfile @@ -1,27 +1,30 @@ -FROM public.ecr.aws/lambda/python:3.9 +# temp stage +FROM python:3.12-slim-bullseye as builder -ARG FUNCTION_DIR="/opt/ml/code" -COPY requirements.txt ${FUNCTION_DIR}/requirements.txt -RUN python3.9 -m pip install -r ${FUNCTION_DIR}/requirements.txt +# Install build dependencies +RUN apt-get update && \ + apt-get install -y --no-install-recommends gcc g++ -COPY main.py parser_factory.py ${FUNCTION_DIR}/ -COPY parsers/ ${FUNCTION_DIR}/parsers/ +# Install Python dependencies first +COPY requirements.txt . +RUN pip wheel --no-cache-dir --no-deps --wheel-dir /app/wheels -r requirements.txt -ARG OCR_MODEL_URL="https://aws-gcr-solutions-assets.s3.cn-northwest-1.amazonaws.com.cn/ai-solution-kit/infer-ocr-model/standard" -ARG OCR_MODEL_VERSION="v1.0.0" -ARG FD_MODEL_URL="https://aws-gcr-solutions-assets.s3.cn-northwest-1.amazonaws.com.cn/ai-solution-kit/face-detection" -ARG FD_MODEL_VERSION="1.2.0" +# prod stage +FROM python:3.12-slim-bullseye -RUN yum install -y wget -RUN mkdir -p ${FUNCTION_DIR}/ocr_model -RUN wget -c $OCR_MODEL_URL/$OCR_MODEL_VERSION/classifier.onnx -O ${FUNCTION_DIR}/ocr_model/classifier.onnx -RUN wget -c $OCR_MODEL_URL/$OCR_MODEL_VERSION/det_standard.onnx -O ${FUNCTION_DIR}/ocr_model/det_standard.onnx -RUN wget -c $OCR_MODEL_URL/$OCR_MODEL_VERSION/keys_v1.txt -O ${FUNCTION_DIR}/ocr_model/keys_v1.txt -RUN wget -c $OCR_MODEL_URL/$OCR_MODEL_VERSION/rec_standard.onnx -O ${FUNCTION_DIR}/ocr_model/rec_standard.onnx -RUN mkdir -p ${FUNCTION_DIR}/fd_model -RUN wget -c ${FD_MODEL_URL}/${FD_MODEL_VERSION}/det.onnx -O ${FUNCTION_DIR}/fd_model/det.onnx +ARG FUNCTION_DIR="/opt/ml/code" WORKDIR ${FUNCTION_DIR} -# Command can be overwritten by providing a different command in the template directly. -ENTRYPOINT ["python"] +RUN apt-get update && apt-get install -y --no-install-recommends libmagic1 && rm -rf /var/lib/apt/lists/* + +COPY ocr_model/ ${FUNCTION_DIR}/ocr_model/ +COPY fd_model/ ${FUNCTION_DIR}/fd_model/ +COPY --from=builder /app/wheels ${FUNCTION_DIR}/wheels +RUN pip install --no-cache ${FUNCTION_DIR}/wheels/* + +COPY parsers/ ${FUNCTION_DIR}/parsers/ +COPY requirements.txt main.py parser_factory.py ${FUNCTION_DIR}/ + + +CMD ["python3", "main.py"] \ No newline at end of file diff --git a/source/containers/document-pii-detection/fd_model/det.onnx b/source/containers/document-pii-detection/fd_model/det.onnx new file mode 100644 index 00000000..dfcd378b Binary files /dev/null and b/source/containers/document-pii-detection/fd_model/det.onnx differ diff --git a/source/containers/document-pii-detection/main.py b/source/containers/document-pii-detection/main.py index 7aa831e0..67024838 100644 --- a/source/containers/document-pii-detection/main.py +++ b/source/containers/document-pii-detection/main.py @@ -1,18 +1,21 @@ -import json -import boto3 -import os -import sys -import pandas as pd -import re import argparse import copy -import logging -import tempfile +import json import pathlib +import re +import tempfile from collections import defaultdict +from multiprocessing import Process, Queue, Lock + +import boto3 +import pandas as pd +import psutil +import pyarrow as pa +import pyarrow.parquet as pq from parser_factory import ParserFactory + def remove_symbols(input_string): # Define the pattern to match symbols symbol_pattern = r'\W' @@ -22,6 +25,7 @@ def remove_symbols(input_string): return output_string + def group_files_by_extension(sample_files): """ Group files by extension. @@ -35,6 +39,7 @@ def group_files_by_extension(sample_files): sample_file_extension_dict[sample_file_extension].append(sample_file) return sample_file_extension_dict + def split_dictionary(raw_dictionary, chunk_size=100): keys = list(raw_dictionary.keys()) total_items = len(keys) @@ -50,8 +55,8 @@ def split_dictionary(raw_dictionary, chunk_size=100): return split_dictionaries -def get_previous_tables(glue_client, database_name): +def get_previous_tables(glue_client, database_name): tables = [] next_token = "" @@ -70,17 +75,16 @@ def get_previous_tables(glue_client, database_name): return tables -def organize_table_info(table_name, result_bucket_name, original_bucket_name, file_info, columns, file_category, split_file_content_id): - +def organize_table_info(table_name, result_bucket_name, original_bucket_name, file_info, columns, file_category, + split_file_content_id): simplified_file_info = copy.deepcopy(file_info) simplified_file_info['sample_files'] = simplified_file_info['sample_files'][:10] description = json.dumps(simplified_file_info, ensure_ascii=False) s3_location = f"s3://{result_bucket_name}/parser_results/{table_name}/" - input_format = 'org.apache.hadoop.mapred.TextInputFormat' + input_format = 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' output_format = 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' table_type = 'EXTERNAL_TABLE' - serde_info = {'SerializationLibrary': 'org.apache.hadoop.hive.serde2.OpenCSVSerde', - 'Parameters': {'field.delim': ','}} + serde_info = {'SerializationLibrary': 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'} parameters = {'originalFileBucketName': original_bucket_name, 'originalFileType': file_info['file_type'], 'originalFilePath': file_info['file_path'], @@ -88,13 +92,13 @@ def organize_table_info(table_name, result_bucket_name, original_bucket_name, fi 'originalFileCategory': file_category, 'sizeKey': str(file_info['total_file_size']), 'objectCount': str(file_info['total_file_count']), - 'Unstructured': 'true', - 'classification': 'csv', + 'Unstructured': 'false', + 'classification': 'parquet', 'splitFileContentId': str(split_file_content_id)} glue_table_columns = [{'Name': 'index', 'Type': 'string'}] for column in columns: glue_table_columns.append({'Name': column, 'Type': 'string'}) - + glue_table_info = { 'Name': table_name, 'Description': description, @@ -112,6 +116,7 @@ def organize_table_info(table_name, result_bucket_name, original_bucket_name, fi } return glue_table_info + def batch_process_files(s3_client, bucket_name, file_info, file_category): """ Batch process files in a folder with the same schema. @@ -126,7 +131,7 @@ def batch_process_files(s3_client, bucket_name, file_info, file_category): "total_file_size": 421226, "total_file_count": 1, "sample_files": [ - "工商营业执照.jpg" + "xxxxx.jpg" ] } @@ -143,7 +148,7 @@ def batch_process_files(s3_client, bucket_name, file_info, file_category): grouped_sample_files = group_files_by_extension(sample_files) for sample_file_extension, sample_file_extension_files in grouped_sample_files.items(): - + parser = ParserFactory.create_parser(file_type=sample_file_extension, s3_client=s3_client) for sample_file in sample_file_extension_files: @@ -156,14 +161,15 @@ def batch_process_files(s3_client, bucket_name, file_info, file_category): for sample_file in sample_files: sample_file_name_no_symbol = remove_symbols(sample_file) file_contents[f"{sample_file_name_no_symbol}"] = ['This file is marked as Contains-PII.'] - + elif file_category == 'exclude_files': for sample_file in sample_files: sample_file_name_no_symbol = remove_symbols(sample_file) file_contents[f"{sample_file_name_no_symbol}"] = ['This file is marked as Non-PII.'] - + return file_contents + def process_file(parser, bucket_name, object_key): """ Process a single file. @@ -172,11 +178,11 @@ def process_file(parser, bucket_name, object_key): json_format_content = {} json_format_content[f"{object_key}"] = file_content - + return json_format_content -def create_glue_table(glue_client, database_name, table_name, glue_table_info): +def create_glue_table(glue_client, database_name, table_name, glue_table_info): # Check if table exists try: response = glue_client.get_table( @@ -195,18 +201,93 @@ def create_glue_table(glue_client, database_name, table_name, glue_table_info): TableInput=glue_table_info ) - print(response) + +# Worker function to process a detection_files item +def worker(queue, + lock, + crawler_result_bucket_name, + destination_database, + original_file_bucket_name, + region_name): + while not queue.empty(): + with lock: + item = queue.get() + if item is None: + break + + glue_client = boto3.client('glue', region_name=region_name) + s3_client = boto3.client('s3', region_name=region_name) + file_category = item[0] + file = item[1] + file_path = file[0] + file_info = file[1] + try: + print('Worker is processing ' + file_path) + file_contents = batch_process_files(s3_client, original_file_bucket_name, file_info, file_category) + # split file_contents into several dictionaries, with which contain 100 files at most + split_file_contents_list = split_dictionary(file_contents, chunk_size=100) + len_split_file_contents_list = len(split_file_contents_list) + for split_file_content_id, split_file_contents in enumerate(split_file_contents_list): + # convert file_contents to dataframe + df = pd.DataFrame.from_dict(split_file_contents, orient='index') + df = df.transpose() + columns = df.columns.tolist() + + # dump file_info into string and encode in base64 as filename + file_path = file_path.lstrip('./') + file_path_process_list = file_path.split('/') + if len_split_file_contents_list > 1: + file_path_process_list = file_path_process_list[:-1] + [ + f"part{str(split_file_content_id)}"] + file_path_process_list[-1:] + + table_name = '_'.join(file_path_process_list) + + table_name = table_name.replace('.', '_') + table_name = original_file_bucket_name + '_' + table_name + + # Convert the DataFrame to a PyArrow Table + table = pa.Table.from_pandas(df) + + # Create a PyArrow Writer for Parquet format without compression + sink = pa.BufferOutputStream() + writer = pq.ParquetWriter(sink, table.schema) + + # Write the PyArrow Table to the buffer + writer.write_table(table) + + # Close the writer + writer.close() + + # Get the uncompressed in-memory Parquet data as bytes + parquet_bytes = sink.getvalue().to_pybytes() + + # Upload the uncompressed Parquet data to S3 + s3_client.put_object( + Body=parquet_bytes, + Bucket=crawler_result_bucket_name, + Key=f"parser_results/{table_name}/result.parquet" + ) + + glue_table_info = organize_table_info(table_name, crawler_result_bucket_name, + original_file_bucket_name, file_info, columns, file_category, + split_file_content_id) + create_glue_table(glue_client, destination_database, table_name, glue_table_info) + + except Exception as e: + print(f"Error occurred processing {file_path}. Error message: {e}") + print('Worker is finished on ' + file_path) + def main(param_dict): original_bucket_name = param_dict['SourceBucketName'] crawler_result_bucket_name = param_dict['ResultBucketName'] region_name = param_dict['RegionName'] - + worker_num = psutil.cpu_count(logical=False) crawler_result_object_key = f"crawler_results/{original_bucket_name}_info.json" destination_database = f"SDPS-unstructured-{original_bucket_name}" - s3_client = boto3.client('s3', region_name = region_name) - glue_client = boto3.client('glue', region_name = region_name) + s3_client = boto3.client('s3', region_name=region_name) + glue_client = boto3.client('glue', region_name=region_name) # 1. Create a Glue Database try: @@ -218,76 +299,70 @@ def main(param_dict): except glue_client.exceptions.AlreadyExistsException: print(f"Database '{destination_database}' already exists. Skipping database creation...") # Need to delete previous created tables - print(f"Deleting all tables in database '{destination_database}'...") - previous_tables = get_previous_tables(glue_client, destination_database) - for table in previous_tables: - response = glue_client.delete_table( - DatabaseName=destination_database, - Name=table['Name'] - ) - print(f"Deleted all tables in database '{destination_database}'. Start creating tables...") - # 2. Download the crawler result from S3 and + response = glue_client.delete_database(Name=destination_database) + response = glue_client.create_database( + DatabaseInput={ + 'Name': destination_database + } + ) + print(f"Re-created database '{destination_database}'") + + # 2. Download the crawler result from S3 with tempfile.NamedTemporaryFile(mode='w') as temp: temp_file_path = temp.name - s3_client.download_file(Bucket=crawler_result_bucket_name, Key=crawler_result_object_key, Filename=temp_file_path) + s3_client.download_file(Bucket=crawler_result_bucket_name, Key=crawler_result_object_key, + Filename=temp_file_path) with open(temp_file_path, 'r') as f: bucket_info = json.load(f) - - # 4. Batch process files in same folder with same type + queue = Queue() + lock = Lock() + original_file_bucket_name = bucket_info['bucket_name'] + num_items = 0 for file_category in ['detection_files', 'include_files', 'exclude_files']: - files = bucket_info[file_category] - for file_path, file_info in files.items(): - print(f"Processing {file_path}...") - try: - file_contents = batch_process_files(s3_client, original_file_bucket_name, file_info, file_category) - - # split file_contents into several dictionaries, with which contain 100 files at most - split_file_contents_list = split_dictionary(file_contents, chunk_size=100) - len_split_file_contents_list = len(split_file_contents_list) - for split_file_content_id, split_file_contents in enumerate(split_file_contents_list): - # convert file_contents to dataframe - df = pd.DataFrame.from_dict(split_file_contents, orient='index') - df = df.transpose() - columns = df.columns.tolist() - - # dump file_info into string and encode in base64 as filename - file_path = file_path.lstrip('./') - file_path_process_list = file_path.split('/') - if len_split_file_contents_list > 1: - file_path_process_list = file_path_process_list[:-1] + [f"part{str(split_file_content_id)}"] + file_path_process_list[-1:] - - table_name = '_'.join(file_path_process_list) - - table_name = table_name.replace('.', '_') - table_name = original_file_bucket_name + '_' + table_name - - # save to csv and upload to s3 - with tempfile.NamedTemporaryFile(mode='w') as temp: - csv_file_path = temp.name - df.to_csv(csv_file_path, header=False) - s3_client.upload_file(csv_file_path, crawler_result_bucket_name, f"parser_results/{table_name}/result.csv") - - glue_table_info = organize_table_info(table_name, crawler_result_bucket_name, original_file_bucket_name, file_info, columns, file_category, split_file_content_id) - create_glue_table(glue_client, destination_database, table_name, glue_table_info) - - except Exception as e: - print(f"Error occured processing {file_path}. Error message: {e}") - - + for files in bucket_info[file_category].items(): + queue.put((file_category, files)) + num_items += 1 + + processes = [] + worker_num = min(worker_num, num_items) + for _ in range(worker_num): + p = Process( + target=worker, + args=( + queue, + lock, + crawler_result_bucket_name, + destination_database, + original_file_bucket_name, + region_name + ) + ) + processes.append(p) + p.start() + + # Add None to the queue to signal workers to exit + for _ in range(worker_num): + queue.put(None) + + # Wait for all worker processes to finish + for p in processes: + p.join() + + if __name__ == '__main__': parser = argparse.ArgumentParser(...) - parser.add_argument('--SourceBucketName', type=str, default='icyxu-glue-assets-member-a', + parser.add_argument('--SourceBucketName', type=str, default='', help='crawler_result_bucket_name') - parser.add_argument('--ResultBucketName', type=str, default='icyxu-glue-assets-member-a', + parser.add_argument('--ResultBucketName', type=str, default='', help='crawler_result_bucket_name') - parser.add_argument('--RegionName', type=str, default='us-west-2', + parser.add_argument('--RegionName', type=str, default='', help='crawler_result_object_key') args, _ = parser.parse_known_args() param_dict = copy.copy(vars(args)) - + main(param_dict) diff --git a/source/containers/document-pii-detection/ocr_model/classifier.onnx b/source/containers/document-pii-detection/ocr_model/classifier.onnx new file mode 100644 index 00000000..bd615425 Binary files /dev/null and b/source/containers/document-pii-detection/ocr_model/classifier.onnx differ diff --git a/source/containers/document-pii-detection/ocr_model/det_standard.onnx b/source/containers/document-pii-detection/ocr_model/det_standard.onnx new file mode 100644 index 00000000..a3dc4f99 Binary files /dev/null and b/source/containers/document-pii-detection/ocr_model/det_standard.onnx differ diff --git a/source/containers/document-pii-detection/ocr_model/keys_v1.txt b/source/containers/document-pii-detection/ocr_model/keys_v1.txt new file mode 100644 index 00000000..3290aadb --- /dev/null +++ b/source/containers/document-pii-detection/ocr_model/keys_v1.txt @@ -0,0 +1,9219 @@ +' +疗 +绚 +诚 +娇 +溜 +题 +贿 +者 +廖 +更 +纳 +加 +奉 +公 +一 +就 +汴 +计 +与 +路 +房 +原 +妇 +2 +0 +8 +- +7 +其 +> +: +] +, +, +骑 +刈 +全 +消 +昏 +傈 +安 +久 +钟 +嗅 +不 +影 +处 +驽 +蜿 +资 +关 +椤 +地 +瘸 +专 +问 +忖 +票 +嫉 +炎 +韵 +要 +月 +田 +节 +陂 +鄙 +捌 +备 +拳 +伺 +眼 +网 +盎 +大 +傍 +心 +东 +愉 +汇 +蹿 +科 +每 +业 +里 +航 +晏 +字 +平 +录 +先 +1 +3 +彤 +鲶 +产 +稍 +督 +腴 +有 +象 +岳 +注 +绍 +在 +泺 +文 +定 +核 +名 +水 +过 +理 +让 +偷 +率 +等 +这 +发 +” +为 +含 +肥 +酉 +相 +鄱 +七 +编 +猥 +锛 +日 +镀 +蒂 +掰 +倒 +辆 +栾 +栗 +综 +涩 +州 +雌 +滑 +馀 +了 +机 +块 +司 +宰 +甙 +兴 +矽 +抚 +保 +用 +沧 +秩 +如 +收 +息 +滥 +页 +疑 +埠 +! +! +姥 +异 +橹 +钇 +向 +下 +跄 +的 +椴 +沫 +国 +绥 +獠 +报 +开 +民 +蜇 +何 +分 +凇 +长 +讥 +藏 +掏 +施 +羽 +中 +讲 +派 +嘟 +人 +提 +浼 +间 +世 +而 +古 +多 +倪 +唇 +饯 +控 +庚 +首 +赛 +蜓 +味 +断 +制 +觉 +技 +替 +艰 +溢 +潮 +夕 +钺 +外 +摘 +枋 +动 +双 +单 +啮 +户 +枇 +确 +锦 +曜 +杜 +或 +能 +效 +霜 +盒 +然 +侗 +电 +晁 +放 +步 +鹃 +新 +杖 +蜂 +吒 +濂 +瞬 +评 +总 +隍 +对 +独 +合 +也 +是 +府 +青 +天 +诲 +墙 +组 +滴 +级 +邀 +帘 +示 +已 +时 +骸 +仄 +泅 +和 +遨 +店 +雇 +疫 +持 +巍 +踮 +境 +只 +亨 +目 +鉴 +崤 +闲 +体 +泄 +杂 +作 +般 +轰 +化 +解 +迂 +诿 +蛭 +璀 +腾 +告 +版 +服 +省 +师 +小 +规 +程 +线 +海 +办 +引 +二 +桧 +牌 +砺 +洄 +裴 +修 +图 +痫 +胡 +许 +犊 +事 +郛 +基 +柴 +呼 +食 +研 +奶 +律 +蛋 +因 +葆 +察 +戏 +褒 +戒 +再 +李 +骁 +工 +貂 +油 +鹅 +章 +啄 +休 +场 +给 +睡 +纷 +豆 +器 +捎 +说 +敏 +学 +会 +浒 +设 +诊 +格 +廓 +查 +来 +霓 +室 +溆 +¢ +诡 +寥 +焕 +舜 +柒 +狐 +回 +戟 +砾 +厄 +实 +翩 +尿 +五 +入 +径 +惭 +喹 +股 +宇 +篝 +| +; +美 +期 +云 +九 +祺 +扮 +靠 +锝 +槌 +系 +企 +酰 +阊 +暂 +蚕 +忻 +豁 +本 +羹 +执 +条 +钦 +H +獒 +限 +进 +季 +楦 +于 +芘 +玖 +铋 +茯 +未 +答 +粘 +括 +样 +精 +欠 +矢 +甥 +帷 +嵩 +扣 +令 +仔 +风 +皈 +行 +支 +部 +蓉 +刮 +站 +蜡 +救 +钊 +汗 +松 +嫌 +成 +可 +. +鹤 +院 +从 +交 +政 +怕 +活 +调 +球 +局 +验 +髌 +第 +韫 +谗 +串 +到 +圆 +年 +米 +/ +* +友 +忿 +检 +区 +看 +自 +敢 +刃 +个 +兹 +弄 +流 +留 +同 +没 +齿 +星 +聆 +轼 +湖 +什 +三 +建 +蛔 +儿 +椋 +汕 +震 +颧 +鲤 +跟 +力 +情 +璺 +铨 +陪 +务 +指 +族 +训 +滦 +鄣 +濮 +扒 +商 +箱 +十 +召 +慷 +辗 +所 +莞 +管 +护 +臭 +横 +硒 +嗓 +接 +侦 +六 +露 +党 +馋 +驾 +剖 +高 +侬 +妪 +幂 +猗 +绺 +骐 +央 +酐 +孝 +筝 +课 +徇 +缰 +门 +男 +西 +项 +句 +谙 +瞒 +秃 +篇 +教 +碲 +罚 +声 +呐 +景 +前 +富 +嘴 +鳌 +稀 +免 +朋 +啬 +睐 +去 +赈 +鱼 +住 +肩 +愕 +速 +旁 +波 +厅 +健 +茼 +厥 +鲟 +谅 +投 +攸 +炔 +数 +方 +击 +呋 +谈 +绩 +别 +愫 +僚 +躬 +鹧 +胪 +炳 +招 +喇 +膨 +泵 +蹦 +毛 +结 +5 +4 +谱 +识 +陕 +粽 +婚 +拟 +构 +且 +搜 +任 +潘 +比 +郢 +妨 +醪 +陀 +桔 +碘 +扎 +选 +哈 +骷 +楷 +亿 +明 +缆 +脯 +监 +睫 +逻 +婵 +共 +赴 +淝 +凡 +惦 +及 +达 +揖 +谩 +澹 +减 +焰 +蛹 +番 +祁 +柏 +员 +禄 +怡 +峤 +龙 +白 +叽 +生 +闯 +起 +细 +装 +谕 +竟 +聚 +钙 +上 +导 +渊 +按 +艾 +辘 +挡 +耒 +盹 +饪 +臀 +记 +邮 +蕙 +受 +各 +医 +搂 +普 +滇 +朗 +茸 +带 +翻 +酚 +( +光 +堤 +墟 +蔷 +万 +幻 +〓 +瑙 +辈 +昧 +盏 +亘 +蛀 +吉 +铰 +请 +子 +假 +闻 +税 +井 +诩 +哨 +嫂 +好 +面 +琐 +校 +馊 +鬣 +缂 +营 +访 +炖 +占 +农 +缀 +否 +经 +钚 +棵 +趟 +张 +亟 +吏 +茶 +谨 +捻 +论 +迸 +堂 +玉 +信 +吧 +瞠 +乡 +姬 +寺 +咬 +溏 +苄 +皿 +意 +赉 +宝 +尔 +钰 +艺 +特 +唳 +踉 +都 +荣 +倚 +登 +荐 +丧 +奇 +涵 +批 +炭 +近 +符 +傩 +感 +道 +着 +菊 +虹 +仲 +众 +懈 +濯 +颞 +眺 +南 +释 +北 +缝 +标 +既 +茗 +整 +撼 +迤 +贲 +挎 +耱 +拒 +某 +妍 +卫 +哇 +英 +矶 +藩 +治 +他 +元 +领 +膜 +遮 +穗 +蛾 +飞 +荒 +棺 +劫 +么 +市 +火 +温 +拈 +棚 +洼 +转 +果 +奕 +卸 +迪 +伸 +泳 +斗 +邡 +侄 +涨 +屯 +萋 +胭 +氡 +崮 +枞 +惧 +冒 +彩 +斜 +手 +豚 +随 +旭 +淑 +妞 +形 +菌 +吲 +沱 +争 +驯 +歹 +挟 +兆 +柱 +传 +至 +包 +内 +响 +临 +红 +功 +弩 +衡 +寂 +禁 +老 +棍 +耆 +渍 +织 +害 +氵 +渑 +布 +载 +靥 +嗬 +虽 +苹 +咨 +娄 +库 +雉 +榜 +帜 +嘲 +套 +瑚 +亲 +簸 +欧 +边 +6 +腿 +旮 +抛 +吹 +瞳 +得 +镓 +梗 +厨 +继 +漾 +愣 +憨 +士 +策 +窑 +抑 +躯 +襟 +脏 +参 +贸 +言 +干 +绸 +鳄 +穷 +藜 +音 +折 +详 +) +举 +悍 +甸 +癌 +黎 +谴 +死 +罩 +迁 +寒 +驷 +袖 +媒 +蒋 +掘 +模 +纠 +恣 +观 +祖 +蛆 +碍 +位 +稿 +主 +澧 +跌 +筏 +京 +锏 +帝 +贴 +证 +糠 +才 +黄 +鲸 +略 +炯 +饱 +四 +出 +园 +犀 +牧 +容 +汉 +杆 +浈 +汰 +瑷 +造 +虫 +瘩 +怪 +驴 +济 +应 +花 +沣 +谔 +夙 +旅 +价 +矿 +以 +考 +s +u +呦 +晒 +巡 +茅 +准 +肟 +瓴 +詹 +仟 +褂 +译 +桌 +混 +宁 +怦 +郑 +抿 +些 +余 +鄂 +饴 +攒 +珑 +群 +阖 +岔 +琨 +藓 +预 +环 +洮 +岌 +宀 +杲 +瀵 +最 +常 +囡 +周 +踊 +女 +鼓 +袭 +喉 +简 +范 +薯 +遐 +疏 +粱 +黜 +禧 +法 +箔 +斤 +遥 +汝 +奥 +直 +贞 +撑 +置 +绱 +集 +她 +馅 +逗 +钧 +橱 +魉 +[ +恙 +躁 +唤 +9 +旺 +膘 +待 +脾 +惫 +购 +吗 +依 +盲 +度 +瘿 +蠖 +俾 +之 +镗 +拇 +鲵 +厝 +簧 +续 +款 +展 +啃 +表 +剔 +品 +钻 +腭 +损 +清 +锶 +统 +涌 +寸 +滨 +贪 +链 +吠 +冈 +伎 +迥 +咏 +吁 +览 +防 +迅 +失 +汾 +阔 +逵 +绀 +蔑 +列 +川 +凭 +努 +熨 +揪 +利 +俱 +绉 +抢 +鸨 +我 +即 +责 +膦 +易 +毓 +鹊 +刹 +玷 +岿 +空 +嘞 +绊 +排 +术 +估 +锷 +违 +们 +苟 +铜 +播 +肘 +件 +烫 +审 +鲂 +广 +像 +铌 +惰 +铟 +巳 +胍 +鲍 +康 +憧 +色 +恢 +想 +拷 +尤 +疳 +知 +S +Y +F +D +A +峄 +裕 +帮 +握 +搔 +氐 +氘 +难 +墒 +沮 +雨 +叁 +缥 +悴 +藐 +湫 +娟 +苑 +稠 +颛 +簇 +后 +阕 +闭 +蕤 +缚 +怎 +佞 +码 +嘤 +蔡 +痊 +舱 +螯 +帕 +赫 +昵 +升 +烬 +岫 +、 +疵 +蜻 +髁 +蕨 +隶 +烛 +械 +丑 +盂 +梁 +强 +鲛 +由 +拘 +揉 +劭 +龟 +撤 +钩 +呕 +孛 +费 +妻 +漂 +求 +阑 +崖 +秤 +甘 +通 +深 +补 +赃 +坎 +床 +啪 +承 +吼 +量 +暇 +钼 +烨 +阂 +擎 +脱 +逮 +称 +P +神 +属 +矗 +华 +届 +狍 +葑 +汹 +育 +患 +窒 +蛰 +佼 +静 +槎 +运 +鳗 +庆 +逝 +曼 +疱 +克 +代 +官 +此 +麸 +耧 +蚌 +晟 +例 +础 +榛 +副 +测 +唰 +缢 +迹 +灬 +霁 +身 +岁 +赭 +扛 +又 +菡 +乜 +雾 +板 +读 +陷 +徉 +贯 +郁 +虑 +变 +钓 +菜 +圾 +现 +琢 +式 +乐 +维 +渔 +浜 +左 +吾 +脑 +钡 +警 +T +啵 +拴 +偌 +漱 +湿 +硕 +止 +骼 +魄 +积 +燥 +联 +踢 +玛 +则 +窿 +见 +振 +畿 +送 +班 +钽 +您 +赵 +刨 +印 +讨 +踝 +籍 +谡 +舌 +崧 +汽 +蔽 +沪 +酥 +绒 +怖 +财 +帖 +肱 +私 +莎 +勋 +羔 +霸 +励 +哼 +帐 +将 +帅 +渠 +纪 +婴 +娩 +岭 +厘 +滕 +吻 +伤 +坝 +冠 +戊 +隆 +瘁 +介 +涧 +物 +黍 +并 +姗 +奢 +蹑 +掣 +垸 +锴 +命 +箍 +捉 +病 +辖 +琰 +眭 +迩 +艘 +绌 +繁 +寅 +若 +毋 +思 +诉 +类 +诈 +燮 +轲 +酮 +狂 +重 +反 +职 +筱 +县 +委 +磕 +绣 +奖 +晋 +濉 +志 +徽 +肠 +呈 +獐 +坻 +口 +片 +碰 +几 +村 +柿 +劳 +料 +获 +亩 +惕 +晕 +厌 +号 +罢 +池 +正 +鏖 +煨 +家 +棕 +复 +尝 +懋 +蜥 +锅 +岛 +扰 +队 +坠 +瘾 +钬 +@ +卧 +疣 +镇 +譬 +冰 +彷 +频 +黯 +据 +垄 +采 +八 +缪 +瘫 +型 +熹 +砰 +楠 +襁 +箐 +但 +嘶 +绳 +啤 +拍 +盥 +穆 +傲 +洗 +盯 +塘 +怔 +筛 +丿 +台 +恒 +喂 +葛 +永 +¥ +烟 +酒 +桦 +书 +砂 +蚝 +缉 +态 +瀚 +袄 +圳 +轻 +蛛 +超 +榧 +遛 +姒 +奘 +铮 +右 +荽 +望 +偻 +卡 +丶 +氰 +附 +做 +革 +索 +戚 +坨 +桷 +唁 +垅 +榻 +岐 +偎 +坛 +莨 +山 +殊 +微 +骇 +陈 +爨 +推 +嗝 +驹 +澡 +藁 +呤 +卤 +嘻 +糅 +逛 +侵 +郓 +酌 +德 +摇 +※ +鬃 +被 +慨 +殡 +羸 +昌 +泡 +戛 +鞋 +河 +宪 +沿 +玲 +鲨 +翅 +哽 +源 +铅 +语 +照 +邯 +址 +荃 +佬 +顺 +鸳 +町 +霭 +睾 +瓢 +夸 +椁 +晓 +酿 +痈 +咔 +侏 +券 +噎 +湍 +签 +嚷 +离 +午 +尚 +社 +锤 +背 +孟 +使 +浪 +缦 +潍 +鞅 +军 +姹 +驶 +笑 +鳟 +鲁 +》 +孽 +钜 +绿 +洱 +礴 +焯 +椰 +颖 +囔 +乌 +孔 +巴 +互 +性 +椽 +哞 +聘 +昨 +早 +暮 +胶 +炀 +隧 +低 +彗 +昝 +铁 +呓 +氽 +藉 +喔 +癖 +瑗 +姨 +权 +胱 +韦 +堑 +蜜 +酋 +楝 +砝 +毁 +靓 +歙 +锲 +究 +屋 +喳 +骨 +辨 +碑 +武 +鸠 +宫 +辜 +烊 +适 +坡 +殃 +培 +佩 +供 +走 +蜈 +迟 +翼 +况 +姣 +凛 +浔 +吃 +飘 +债 +犟 +金 +促 +苛 +崇 +坂 +莳 +畔 +绂 +兵 +蠕 +斋 +根 +砍 +亢 +欢 +恬 +崔 +剁 +餐 +榫 +快 +扶 +‖ +濒 +缠 +鳜 +当 +彭 +驭 +浦 +篮 +昀 +锆 +秸 +钳 +弋 +娣 +瞑 +夷 +龛 +苫 +拱 +致 +% +嵊 +障 +隐 +弑 +初 +娓 +抉 +汩 +累 +蓖 +" +唬 +助 +苓 +昙 +押 +毙 +破 +城 +郧 +逢 +嚏 +獭 +瞻 +溱 +婿 +赊 +跨 +恼 +璧 +萃 +姻 +貉 +灵 +炉 +密 +氛 +陶 +砸 +谬 +衔 +点 +琛 +沛 +枳 +层 +岱 +诺 +脍 +榈 +埂 +征 +冷 +裁 +打 +蹴 +素 +瘘 +逞 +蛐 +聊 +激 +腱 +萘 +踵 +飒 +蓟 +吆 +取 +咙 +簋 +涓 +矩 +曝 +挺 +揣 +座 +你 +史 +舵 +焱 +尘 +苏 +笈 +脚 +溉 +榨 +诵 +樊 +邓 +焊 +义 +庶 +儋 +蟋 +蒲 +赦 +呷 +杞 +诠 +豪 +还 +试 +颓 +茉 +太 +除 +紫 +逃 +痴 +草 +充 +鳕 +珉 +祗 +墨 +渭 +烩 +蘸 +慕 +璇 +镶 +穴 +嵘 +恶 +骂 +险 +绋 +幕 +碉 +肺 +戳 +刘 +潞 +秣 +纾 +潜 +銮 +洛 +须 +罘 +销 +瘪 +汞 +兮 +屉 +r +林 +厕 +质 +探 +划 +狸 +殚 +善 +煊 +烹 +〒 +锈 +逯 +宸 +辍 +泱 +柚 +袍 +远 +蹋 +嶙 +绝 +峥 +娥 +缍 +雀 +徵 +认 +镱 +谷 += +贩 +勉 +撩 +鄯 +斐 +洋 +非 +祚 +泾 +诒 +饿 +撬 +威 +晷 +搭 +芍 +锥 +笺 +蓦 +候 +琊 +档 +礁 +沼 +卵 +荠 +忑 +朝 +凹 +瑞 +头 +仪 +弧 +孵 +畏 +铆 +突 +衲 +车 +浩 +气 +茂 +悖 +厢 +枕 +酝 +戴 +湾 +邹 +飚 +攘 +锂 +写 +宵 +翁 +岷 +无 +喜 +丈 +挑 +嗟 +绛 +殉 +议 +槽 +具 +醇 +淞 +笃 +郴 +阅 +饼 +底 +壕 +砚 +弈 +询 +缕 +庹 +翟 +零 +筷 +暨 +舟 +闺 +甯 +撞 +麂 +茌 +蔼 +很 +珲 +捕 +棠 +角 +阉 +媛 +娲 +诽 +剿 +尉 +爵 +睬 +韩 +诰 +匣 +危 +糍 +镯 +立 +浏 +阳 +少 +盆 +舔 +擘 +匪 +申 +尬 +铣 +旯 +抖 +赘 +瓯 +居 +ˇ +哮 +游 +锭 +茏 +歌 +坏 +甚 +秒 +舞 +沙 +仗 +劲 +潺 +阿 +燧 +郭 +嗖 +霏 +忠 +材 +奂 +耐 +跺 +砀 +输 +岖 +媳 +氟 +极 +摆 +灿 +今 +扔 +腻 +枝 +奎 +药 +熄 +吨 +话 +q +额 +慑 +嘌 +协 +喀 +壳 +埭 +视 +著 +於 +愧 +陲 +翌 +峁 +颅 +佛 +腹 +聋 +侯 +咎 +叟 +秀 +颇 +存 +较 +罪 +哄 +岗 +扫 +栏 +钾 +羌 +己 +璨 +枭 +霉 +煌 +涸 +衿 +键 +镝 +益 +岢 +奏 +连 +夯 +睿 +冥 +均 +糖 +狞 +蹊 +稻 +爸 +刿 +胥 +煜 +丽 +肿 +璃 +掸 +跚 +灾 +垂 +樾 +濑 +乎 +莲 +窄 +犹 +撮 +战 +馄 +软 +络 +显 +鸢 +胸 +宾 +妲 +恕 +埔 +蝌 +份 +遇 +巧 +瞟 +粒 +恰 +剥 +桡 +博 +讯 +凯 +堇 +阶 +滤 +卖 +斌 +骚 +彬 +兑 +磺 +樱 +舷 +两 +娱 +福 +仃 +差 +找 +桁 +÷ +净 +把 +阴 +污 +戬 +雷 +碓 +蕲 +楚 +罡 +焖 +抽 +妫 +咒 +仑 +闱 +尽 +邑 +菁 +爱 +贷 +沥 +鞑 +牡 +嗉 +崴 +骤 +塌 +嗦 +订 +拮 +滓 +捡 +锻 +次 +坪 +杩 +臃 +箬 +融 +珂 +鹗 +宗 +枚 +降 +鸬 +妯 +阄 +堰 +盐 +毅 +必 +杨 +崃 +俺 +甬 +状 +莘 +货 +耸 +菱 +腼 +铸 +唏 +痤 +孚 +澳 +懒 +溅 +翘 +疙 +杷 +淼 +缙 +骰 +喊 +悉 +砻 +坷 +艇 +赁 +界 +谤 +纣 +宴 +晃 +茹 +归 +饭 +梢 +铡 +街 +抄 +肼 +鬟 +苯 +颂 +撷 +戈 +炒 +咆 +茭 +瘙 +负 +仰 +客 +琉 +铢 +封 +卑 +珥 +椿 +镧 +窨 +鬲 +寿 +御 +袤 +铃 +萎 +砖 +餮 +脒 +裳 +肪 +孕 +嫣 +馗 +嵇 +恳 +氯 +江 +石 +褶 +冢 +祸 +阻 +狈 +羞 +银 +靳 +透 +咳 +叼 +敷 +芷 +啥 +它 +瓤 +兰 +痘 +懊 +逑 +肌 +往 +捺 +坊 +甩 +呻 +〃 +沦 +忘 +膻 +祟 +菅 +剧 +崆 +智 +坯 +臧 +霍 +墅 +攻 +眯 +倘 +拢 +骠 +铐 +庭 +岙 +瓠 +′ +缺 +泥 +迢 +捶 +? +? +郏 +喙 +掷 +沌 +纯 +秘 +种 +听 +绘 +固 +螨 +团 +香 +盗 +妒 +埚 +蓝 +拖 +旱 +荞 +铀 +血 +遏 +汲 +辰 +叩 +拽 +幅 +硬 +惶 +桀 +漠 +措 +泼 +唑 +齐 +肾 +念 +酱 +虚 +屁 +耶 +旗 +砦 +闵 +婉 +馆 +拭 +绅 +韧 +忏 +窝 +醋 +葺 +顾 +辞 +倜 +堆 +辋 +逆 +玟 +贱 +疾 +董 +惘 +倌 +锕 +淘 +嘀 +莽 +俭 +笏 +绑 +鲷 +杈 +择 +蟀 +粥 +嗯 +驰 +逾 +案 +谪 +褓 +胫 +哩 +昕 +颚 +鲢 +绠 +躺 +鹄 +崂 +儒 +俨 +丝 +尕 +泌 +啊 +萸 +彰 +幺 +吟 +骄 +苣 +弦 +脊 +瑰 +〈 +诛 +镁 +析 +闪 +剪 +侧 +哟 +框 +螃 +守 +嬗 +燕 +狭 +铈 +缮 +概 +迳 +痧 +鲲 +俯 +售 +笼 +痣 +扉 +挖 +满 +咋 +援 +邱 +扇 +歪 +便 +玑 +绦 +峡 +蛇 +叨 +〖 +泽 +胃 +斓 +喋 +怂 +坟 +猪 +该 +蚬 +炕 +弥 +赞 +棣 +晔 +娠 +挲 +狡 +创 +疖 +铕 +镭 +稷 +挫 +弭 +啾 +翔 +粉 +履 +苘 +哦 +楼 +秕 +铂 +土 +锣 +瘟 +挣 +栉 +习 +享 +桢 +袅 +磨 +桂 +谦 +延 +坚 +蔚 +噗 +署 +谟 +猬 +钎 +恐 +嬉 +雒 +倦 +衅 +亏 +璩 +睹 +刻 +殿 +王 +算 +雕 +麻 +丘 +柯 +骆 +丸 +塍 +谚 +添 +鲈 +垓 +桎 +蚯 +芥 +予 +飕 +镦 +谌 +窗 +醚 +菀 +亮 +搪 +莺 +蒿 +羁 +足 +J +真 +轶 +悬 +衷 +靛 +翊 +掩 +哒 +炅 +掐 +冼 +妮 +l +谐 +稚 +荆 +擒 +犯 +陵 +虏 +浓 +崽 +刍 +陌 +傻 +孜 +千 +靖 +演 +矜 +钕 +煽 +杰 +酗 +渗 +伞 +栋 +俗 +泫 +戍 +罕 +沾 +疽 +灏 +煦 +芬 +磴 +叱 +阱 +榉 +湃 +蜀 +叉 +醒 +彪 +租 +郡 +篷 +屎 +良 +垢 +隗 +弱 +陨 +峪 +砷 +掴 +颁 +胎 +雯 +绵 +贬 +沐 +撵 +隘 +篙 +暖 +曹 +陡 +栓 +填 +臼 +彦 +瓶 +琪 +潼 +哪 +鸡 +摩 +啦 +俟 +锋 +域 +耻 +蔫 +疯 +纹 +撇 +毒 +绶 +痛 +酯 +忍 +爪 +赳 +歆 +嘹 +辕 +烈 +册 +朴 +钱 +吮 +毯 +癜 +娃 +谀 +邵 +厮 +炽 +璞 +邃 +丐 +追 +词 +瓒 +忆 +轧 +芫 +谯 +喷 +弟 +半 +冕 +裙 +掖 +墉 +绮 +寝 +苔 +势 +顷 +褥 +切 +衮 +君 +佳 +嫒 +蚩 +霞 +佚 +洙 +逊 +镖 +暹 +唛 +& +殒 +顶 +碗 +獗 +轭 +铺 +蛊 +废 +恹 +汨 +崩 +珍 +那 +杵 +曲 +纺 +夏 +薰 +傀 +闳 +淬 +姘 +舀 +拧 +卷 +楂 +恍 +讪 +厩 +寮 +篪 +赓 +乘 +灭 +盅 +鞣 +沟 +慎 +挂 +饺 +鼾 +杳 +树 +缨 +丛 +絮 +娌 +臻 +嗳 +篡 +侩 +述 +衰 +矛 +圈 +蚜 +匕 +筹 +匿 +濞 +晨 +叶 +骋 +郝 +挚 +蚴 +滞 +增 +侍 +描 +瓣 +吖 +嫦 +蟒 +匾 +圣 +赌 +毡 +癞 +恺 +百 +曳 +需 +篓 +肮 +庖 +帏 +卿 +驿 +遗 +蹬 +鬓 +骡 +歉 +芎 +胳 +屐 +禽 +烦 +晌 +寄 +媾 +狄 +翡 +苒 +船 +廉 +终 +痞 +殇 +々 +畦 +饶 +改 +拆 +悻 +萄 +£ +瓿 +乃 +訾 +桅 +匮 +溧 +拥 +纱 +铍 +骗 +蕃 +龋 +缬 +父 +佐 +疚 +栎 +醍 +掳 +蓄 +x +惆 +颜 +鲆 +榆 +〔 +猎 +敌 +暴 +谥 +鲫 +贾 +罗 +玻 +缄 +扦 +芪 +癣 +落 +徒 +臾 +恿 +猩 +托 +邴 +肄 +牵 +春 +陛 +耀 +刊 +拓 +蓓 +邳 +堕 +寇 +枉 +淌 +啡 +湄 +兽 +酷 +萼 +碚 +濠 +萤 +夹 +旬 +戮 +梭 +琥 +椭 +昔 +勺 +蜊 +绐 +晚 +孺 +僵 +宣 +摄 +冽 +旨 +萌 +忙 +蚤 +眉 +噼 +蟑 +付 +契 +瓜 +悼 +颡 +壁 +曾 +窕 +颢 +澎 +仿 +俑 +浑 +嵌 +浣 +乍 +碌 +褪 +乱 +蔟 +隙 +玩 +剐 +葫 +箫 +纲 +围 +伐 +决 +伙 +漩 +瑟 +刑 +肓 +镳 +缓 +蹭 +氨 +皓 +典 +畲 +坍 +铑 +檐 +塑 +洞 +倬 +储 +胴 +淳 +戾 +吐 +灼 +惺 +妙 +毕 +珐 +缈 +虱 +盖 +羰 +鸿 +磅 +谓 +髅 +娴 +苴 +唷 +蚣 +霹 +抨 +贤 +唠 +犬 +誓 +逍 +庠 +逼 +麓 +籼 +釉 +呜 +碧 +秧 +氩 +摔 +霄 +穸 +纨 +辟 +妈 +映 +完 +牛 +缴 +嗷 +炊 +恩 +荔 +茆 +掉 +紊 +慌 +莓 +羟 +阙 +萁 +磐 +另 +蕹 +辱 +鳐 +湮 +吡 +吩 +唐 +睦 +垠 +舒 +圜 +冗 +瞿 +溺 +芾 +囱 +匠 +僳 +汐 +菩 +饬 +漓 +黑 +霰 +浸 +濡 +窥 +毂 +蒡 +兢 +驻 +鹉 +芮 +诙 +迫 +雳 +厂 +忐 +臆 +猴 +鸣 +蚪 +栈 +箕 +羡 +渐 +莆 +捍 +眈 +哓 +趴 +蹼 +埕 +嚣 +骛 +宏 +淄 +斑 +噜 +严 +瑛 +垃 +椎 +诱 +压 +庾 +绞 +焘 +廿 +抡 +迄 +棘 +夫 +纬 +锹 +眨 +瞌 +侠 +脐 +竞 +瀑 +孳 +骧 +遁 +姜 +颦 +荪 +滚 +萦 +伪 +逸 +粳 +爬 +锁 +矣 +役 +趣 +洒 +颔 +诏 +逐 +奸 +甭 +惠 +攀 +蹄 +泛 +尼 +拼 +阮 +鹰 +亚 +颈 +惑 +勒 +〉 +际 +肛 +爷 +刚 +钨 +丰 +养 +冶 +鲽 +辉 +蔻 +画 +覆 +皴 +妊 +麦 +返 +醉 +皂 +擀 +〗 +酶 +凑 +粹 +悟 +诀 +硖 +港 +卜 +z +杀 +涕 +± +舍 +铠 +抵 +弛 +段 +敝 +镐 +奠 +拂 +轴 +跛 +袱 +e +t +沉 +菇 +俎 +薪 +峦 +秭 +蟹 +历 +盟 +菠 +寡 +液 +肢 +喻 +染 +裱 +悱 +抱 +氙 +赤 +捅 +猛 +跑 +氮 +谣 +仁 +尺 +辊 +窍 +烙 +衍 +架 +擦 +倏 +璐 +瑁 +币 +楞 +胖 +夔 +趸 +邛 +惴 +饕 +虔 +蝎 +§ +哉 +贝 +宽 +辫 +炮 +扩 +饲 +籽 +魏 +菟 +锰 +伍 +猝 +末 +琳 +哚 +蛎 +邂 +呀 +姿 +鄞 +却 +歧 +仙 +恸 +椐 +森 +牒 +寤 +袒 +婆 +虢 +雅 +钉 +朵 +贼 +欲 +苞 +寰 +故 +龚 +坭 +嘘 +咫 +礼 +硷 +兀 +睢 +汶 +’ +铲 +烧 +绕 +诃 +浃 +钿 +哺 +柜 +讼 +颊 +璁 +腔 +洽 +咐 +脲 +簌 +筠 +镣 +玮 +鞠 +谁 +兼 +姆 +挥 +梯 +蝴 +谘 +漕 +刷 +躏 +宦 +弼 +b +垌 +劈 +麟 +莉 +揭 +笙 +渎 +仕 +嗤 +仓 +配 +怏 +抬 +错 +泯 +镊 +孰 +猿 +邪 +仍 +秋 +鼬 +壹 +歇 +吵 +炼 +< +尧 +射 +柬 +廷 +胧 +霾 +凳 +隋 +肚 +浮 +梦 +祥 +株 +堵 +退 +L +鹫 +跎 +凶 +毽 +荟 +炫 +栩 +玳 +甜 +沂 +鹿 +顽 +伯 +爹 +赔 +蛴 +徐 +匡 +欣 +狰 +缸 +雹 +蟆 +疤 +默 +沤 +啜 +痂 +衣 +禅 +w +i +h +辽 +葳 +黝 +钗 +停 +沽 +棒 +馨 +颌 +肉 +吴 +硫 +悯 +劾 +娈 +马 +啧 +吊 +悌 +镑 +峭 +帆 +瀣 +涉 +咸 +疸 +滋 +泣 +翦 +拙 +癸 +钥 +蜒 ++ +尾 +庄 +凝 +泉 +婢 +渴 +谊 +乞 +陆 +锉 +糊 +鸦 +淮 +I +B +N +晦 +弗 +乔 +庥 +葡 +尻 +席 +橡 +傣 +渣 +拿 +惩 +麋 +斛 +缃 +矮 +蛏 +岘 +鸽 +姐 +膏 +催 +奔 +镒 +喱 +蠡 +摧 +钯 +胤 +柠 +拐 +璋 +鸥 +卢 +荡 +倾 +^ +_ +珀 +逄 +萧 +塾 +掇 +贮 +笆 +聂 +圃 +冲 +嵬 +M +滔 +笕 +值 +炙 +偶 +蜱 +搐 +梆 +汪 +蔬 +腑 +鸯 +蹇 +敞 +绯 +仨 +祯 +谆 +梧 +糗 +鑫 +啸 +豺 +囹 +猾 +巢 +柄 +瀛 +筑 +踌 +沭 +暗 +苁 +鱿 +蹉 +脂 +蘖 +牢 +热 +木 +吸 +溃 +宠 +序 +泞 +偿 +拜 +檩 +厚 +朐 +毗 +螳 +吞 +媚 +朽 +担 +蝗 +橘 +畴 +祈 +糟 +盱 +隼 +郜 +惜 +珠 +裨 +铵 +焙 +琚 +唯 +咚 +噪 +骊 +丫 +滢 +勤 +棉 +呸 +咣 +淀 +隔 +蕾 +窈 +饨 +挨 +煅 +短 +匙 +粕 +镜 +赣 +撕 +墩 +酬 +馁 +豌 +颐 +抗 +酣 +氓 +佑 +搁 +哭 +递 +耷 +涡 +桃 +贻 +碣 +截 +瘦 +昭 +镌 +蔓 +氚 +甲 +猕 +蕴 +蓬 +散 +拾 +纛 +狼 +猷 +铎 +埋 +旖 +矾 +讳 +囊 +糜 +迈 +粟 +蚂 +紧 +鲳 +瘢 +栽 +稼 +羊 +锄 +斟 +睁 +桥 +瓮 +蹙 +祉 +醺 +鼻 +昱 +剃 +跳 +篱 +跷 +蒜 +翎 +宅 +晖 +嗑 +壑 +峻 +癫 +屏 +狠 +陋 +袜 +途 +憎 +祀 +莹 +滟 +佶 +溥 +臣 +约 +盛 +峰 +磁 +慵 +婪 +拦 +莅 +朕 +鹦 +粲 +裤 +哎 +疡 +嫖 +琵 +窟 +堪 +谛 +嘉 +儡 +鳝 +斩 +郾 +驸 +酊 +妄 +胜 +贺 +徙 +傅 +噌 +钢 +栅 +庇 +恋 +匝 +巯 +邈 +尸 +锚 +粗 +佟 +蛟 +薹 +纵 +蚊 +郅 +绢 +锐 +苗 +俞 +篆 +淆 +膀 +鲜 +煎 +诶 +秽 +寻 +涮 +刺 +怀 +噶 +巨 +褰 +魅 +灶 +灌 +桉 +藕 +谜 +舸 +薄 +搀 +恽 +借 +牯 +痉 +渥 +愿 +亓 +耘 +杠 +柩 +锔 +蚶 +钣 +珈 +喘 +蹒 +幽 +赐 +稗 +晤 +莱 +泔 +扯 +肯 +菪 +裆 +腩 +豉 +疆 +骜 +腐 +倭 +珏 +唔 +粮 +亡 +润 +慰 +伽 +橄 +玄 +誉 +醐 +胆 +龊 +粼 +塬 +陇 +彼 +削 +嗣 +绾 +芽 +妗 +垭 +瘴 +爽 +薏 +寨 +龈 +泠 +弹 +赢 +漪 +猫 +嘧 +涂 +恤 +圭 +茧 +烽 +屑 +痕 +巾 +赖 +荸 +凰 +腮 +畈 +亵 +蹲 +偃 +苇 +澜 +艮 +换 +骺 +烘 +苕 +梓 +颉 +肇 +哗 +悄 +氤 +涠 +葬 +屠 +鹭 +植 +竺 +佯 +诣 +鲇 +瘀 +鲅 +邦 +移 +滁 +冯 +耕 +癔 +戌 +茬 +沁 +巩 +悠 +湘 +洪 +痹 +锟 +循 +谋 +腕 +鳃 +钠 +捞 +焉 +迎 +碱 +伫 +急 +榷 +奈 +邝 +卯 +辄 +皲 +卟 +醛 +畹 +忧 +稳 +雄 +昼 +缩 +阈 +睑 +扌 +耗 +曦 +涅 +捏 +瞧 +邕 +淖 +漉 +铝 +耦 +禹 +湛 +喽 +莼 +琅 +诸 +苎 +纂 +硅 +始 +嗨 +傥 +燃 +臂 +赅 +嘈 +呆 +贵 +屹 +壮 +肋 +亍 +蚀 +卅 +豹 +腆 +邬 +迭 +浊 +} +童 +螂 +捐 +圩 +勐 +触 +寞 +汊 +壤 +荫 +膺 +渌 +芳 +懿 +遴 +螈 +泰 +蓼 +蛤 +茜 +舅 +枫 +朔 +膝 +眙 +避 +梅 +判 +鹜 +璜 +牍 +缅 +垫 +藻 +黔 +侥 +惚 +懂 +踩 +腰 +腈 +札 +丞 +唾 +慈 +顿 +摹 +荻 +琬 +~ +斧 +沈 +滂 +胁 +胀 +幄 +莜 +Z +匀 +鄄 +掌 +绰 +茎 +焚 +赋 +萱 +谑 +汁 +铒 +瞎 +夺 +蜗 +野 +娆 +冀 +弯 +篁 +懵 +灞 +隽 +芡 +脘 +俐 +辩 +芯 +掺 +喏 +膈 +蝈 +觐 +悚 +踹 +蔗 +熠 +鼠 +呵 +抓 +橼 +峨 +畜 +缔 +禾 +崭 +弃 +熊 +摒 +凸 +拗 +穹 +蒙 +抒 +祛 +劝 +闫 +扳 +阵 +醌 +踪 +喵 +侣 +搬 +仅 +荧 +赎 +蝾 +琦 +买 +婧 +瞄 +寓 +皎 +冻 +赝 +箩 +莫 +瞰 +郊 +笫 +姝 +筒 +枪 +遣 +煸 +袋 +舆 +痱 +涛 +母 +〇 +启 +践 +耙 +绲 +盘 +遂 +昊 +搞 +槿 +诬 +纰 +泓 +惨 +檬 +亻 +越 +C +o +憩 +熵 +祷 +钒 +暧 +塔 +阗 +胰 +咄 +娶 +魔 +琶 +钞 +邻 +扬 +杉 +殴 +咽 +弓 +〆 +髻 +】 +吭 +揽 +霆 +拄 +殖 +脆 +彻 +岩 +芝 +勃 +辣 +剌 +钝 +嘎 +甄 +佘 +皖 +伦 +授 +徕 +憔 +挪 +皇 +庞 +稔 +芜 +踏 +溴 +兖 +卒 +擢 +饥 +鳞 +煲 +‰ +账 +颗 +叻 +斯 +捧 +鳍 +琮 +讹 +蛙 +纽 +谭 +酸 +兔 +莒 +睇 +伟 +觑 +羲 +嗜 +宜 +褐 +旎 +辛 +卦 +诘 +筋 +鎏 +溪 +挛 +熔 +阜 +晰 +鳅 +丢 +奚 +灸 +呱 +献 +陉 +黛 +鸪 +甾 +萨 +疮 +拯 +洲 +疹 +辑 +叙 +恻 +谒 +允 +柔 +烂 +氏 +逅 +漆 +拎 +惋 +扈 +湟 +纭 +啕 +掬 +擞 +哥 +忽 +涤 +鸵 +靡 +郗 +瓷 +扁 +廊 +怨 +雏 +钮 +敦 +E +懦 +憋 +汀 +拚 +啉 +腌 +岸 +f +痼 +瞅 +尊 +咀 +眩 +飙 +忌 +仝 +迦 +熬 +毫 +胯 +篑 +茄 +腺 +凄 +舛 +碴 +锵 +诧 +羯 +後 +漏 +汤 +宓 +仞 +蚁 +壶 +谰 +皑 +铄 +棰 +罔 +辅 +晶 +苦 +牟 +闽 +\ +烃 +饮 +聿 +丙 +蛳 +朱 +煤 +涔 +鳖 +犁 +罐 +荼 +砒 +淦 +妤 +黏 +戎 +孑 +婕 +瑾 +戢 +钵 +枣 +捋 +砥 +衩 +狙 +桠 +稣 +阎 +肃 +梏 +诫 +孪 +昶 +婊 +衫 +嗔 +侃 +塞 +蜃 +樵 +峒 +貌 +屿 +欺 +缫 +阐 +栖 +诟 +珞 +荭 +吝 +萍 +嗽 +恂 +啻 +蜴 +磬 +峋 +俸 +豫 +谎 +徊 +镍 +韬 +魇 +晴 +U +囟 +猜 +蛮 +坐 +囿 +伴 +亭 +肝 +佗 +蝠 +妃 +胞 +滩 +榴 +氖 +垩 +苋 +砣 +扪 +馏 +姓 +轩 +厉 +夥 +侈 +禀 +垒 +岑 +赏 +钛 +辐 +痔 +披 +纸 +碳 +“ +坞 +蠓 +挤 +荥 +沅 +悔 +铧 +帼 +蒌 +蝇 +a +p +y +n +g +哀 +浆 +瑶 +凿 +桶 +馈 +皮 +奴 +苜 +佤 +伶 +晗 +铱 +炬 +优 +弊 +氢 +恃 +甫 +攥 +端 +锌 +灰 +稹 +炝 +曙 +邋 +亥 +眶 +碾 +拉 +萝 +绔 +捷 +浍 +腋 +姑 +菖 +凌 +涞 +麽 +锢 +桨 +潢 +绎 +镰 +殆 +锑 +渝 +铬 +困 +绽 +觎 +匈 +糙 +暑 +裹 +鸟 +盔 +肽 +迷 +綦 +『 +亳 +佝 +俘 +钴 +觇 +骥 +仆 +疝 +跪 +婶 +郯 +瀹 +唉 +脖 +踞 +针 +晾 +忒 +扼 +瞩 +叛 +椒 +疟 +嗡 +邗 +肆 +跆 +玫 +忡 +捣 +咧 +唆 +艄 +蘑 +潦 +笛 +阚 +沸 +泻 +掊 +菽 +贫 +斥 +髂 +孢 +镂 +赂 +麝 +鸾 +屡 +衬 +苷 +恪 +叠 +希 +粤 +爻 +喝 +茫 +惬 +郸 +绻 +庸 +撅 +碟 +宄 +妹 +膛 +叮 +饵 +崛 +嗲 +椅 +冤 +搅 +咕 +敛 +尹 +垦 +闷 +蝉 +霎 +勰 +败 +蓑 +泸 +肤 +鹌 +幌 +焦 +浠 +鞍 +刁 +舰 +乙 +竿 +裔 +。 +茵 +函 +伊 +兄 +丨 +娜 +匍 +謇 +莪 +宥 +似 +蝽 +翳 +酪 +翠 +粑 +薇 +祢 +骏 +赠 +叫 +Q +噤 +噻 +竖 +芗 +莠 +潭 +俊 +羿 +耜 +O +郫 +趁 +嗪 +囚 +蹶 +芒 +洁 +笋 +鹑 +敲 +硝 +啶 +堡 +渲 +揩 +』 +携 +宿 +遒 +颍 +扭 +棱 +割 +萜 +蔸 +葵 +琴 +捂 +饰 +衙 +耿 +掠 +募 +岂 +窖 +涟 +蔺 +瘤 +柞 +瞪 +怜 +匹 +距 +楔 +炜 +哆 +秦 +缎 +幼 +茁 +绪 +痨 +恨 +楸 +娅 +瓦 +桩 +雪 +嬴 +伏 +榔 +妥 +铿 +拌 +眠 +雍 +缇 +‘ +卓 +搓 +哌 +觞 +噩 +屈 +哧 +髓 +咦 +巅 +娑 +侑 +淫 +膳 +祝 +勾 +姊 +莴 +胄 +疃 +薛 +蜷 +胛 +巷 +芙 +芋 +熙 +闰 +勿 +窃 +狱 +剩 +钏 +幢 +陟 +铛 +慧 +靴 +耍 +k +浙 +浇 +飨 +惟 +绗 +祜 +澈 +啼 +咪 +磷 +摞 +诅 +郦 +抹 +跃 +壬 +吕 +肖 +琏 +颤 +尴 +剡 +抠 +凋 +赚 +泊 +津 +宕 +殷 +倔 +氲 +漫 +邺 +涎 +怠 +$ +垮 +荬 +遵 +俏 +叹 +噢 +饽 +蜘 +孙 +筵 +疼 +鞭 +羧 +牦 +箭 +潴 +c +眸 +祭 +髯 +啖 +坳 +愁 +芩 +驮 +倡 +巽 +穰 +沃 +胚 +怒 +凤 +槛 +剂 +趵 +嫁 +v +邢 +灯 +鄢 +桐 +睽 +檗 +锯 +槟 +婷 +嵋 +圻 +诗 +蕈 +颠 +遭 +痢 +芸 +怯 +馥 +竭 +锗 +徜 +恭 +遍 +籁 +剑 +嘱 +苡 +龄 +僧 +桑 +潸 +弘 +澶 +楹 +悲 +讫 +愤 +腥 +悸 +谍 +椹 +呢 +桓 +葭 +攫 +阀 +翰 +躲 +敖 +柑 +郎 +笨 +橇 +呃 +魁 +燎 +脓 +葩 +磋 +垛 +玺 +狮 +沓 +砜 +蕊 +锺 +罹 +蕉 +翱 +虐 +闾 +巫 +旦 +茱 +嬷 +枯 +鹏 +贡 +芹 +汛 +矫 +绁 +拣 +禺 +佃 +讣 +舫 +惯 +乳 +趋 +疲 +挽 +岚 +虾 +衾 +蠹 +蹂 +飓 +氦 +铖 +孩 +稞 +瑜 +壅 +掀 +勘 +妓 +畅 +髋 +W +庐 +牲 +蓿 +榕 +练 +垣 +唱 +邸 +菲 +昆 +婺 +穿 +绡 +麒 +蚱 +掂 +愚 +泷 +涪 +漳 +妩 +娉 +榄 +讷 +觅 +旧 +藤 +煮 +呛 +柳 +腓 +叭 +庵 +烷 +阡 +罂 +蜕 +擂 +猖 +咿 +媲 +脉 +【 +沏 +貅 +黠 +熏 +哲 +烁 +坦 +酵 +兜 +× +潇 +撒 +剽 +珩 +圹 +乾 +摸 +樟 +帽 +嗒 +襄 +魂 +轿 +憬 +锡 +〕 +喃 +皆 +咖 +隅 +脸 +残 +泮 +袂 +鹂 +珊 +囤 +捆 +咤 +误 +徨 +闹 +淙 +芊 +淋 +怆 +囗 +拨 +梳 +渤 +R +G +绨 +蚓 +婀 +幡 +狩 +麾 +谢 +唢 +裸 +旌 +伉 +纶 +裂 +驳 +砼 +咛 +澄 +樨 +蹈 +宙 +澍 +倍 +貔 +操 +勇 +蟠 +摈 +砧 +虬 +够 +缁 +悦 +藿 +撸 +艹 +摁 +淹 +豇 +虎 +榭 +ˉ +吱 +d +° +喧 +荀 +踱 +侮 +奋 +偕 +饷 +犍 +惮 +坑 +璎 +徘 +宛 +妆 +袈 +倩 +窦 +昂 +荏 +乖 +K +怅 +撰 +鳙 +牙 +袁 +酞 +X +痿 +琼 +闸 +雁 +趾 +荚 +虻 +涝 +《 +杏 +韭 +偈 +烤 +绫 +鞘 +卉 +症 +遢 +蓥 +诋 +杭 +荨 +匆 +竣 +簪 +辙 +敕 +虞 +丹 +缭 +咩 +黟 +m +淤 +瑕 +咂 +铉 +硼 +茨 +嶂 +痒 +畸 +敬 +涿 +粪 +窘 +熟 +叔 +嫔 +盾 +忱 +裘 +憾 +梵 +赡 +珙 +咯 +娘 +庙 +溯 +胺 +葱 +痪 +摊 +荷 +卞 +乒 +髦 +寐 +铭 +坩 +胗 +枷 +爆 +溟 +嚼 +羚 +砬 +轨 +惊 +挠 +罄 +竽 +菏 +氧 +浅 +楣 +盼 +枢 +炸 +阆 +杯 +谏 +噬 +淇 +渺 +俪 +秆 +墓 +泪 +跻 +砌 +痰 +垡 +渡 +耽 +釜 +讶 +鳎 +煞 +呗 +韶 +舶 +绷 +鹳 +缜 +旷 +铊 +皱 +龌 +檀 +霖 +奄 +槐 +艳 +蝶 +旋 +哝 +赶 +骞 +蚧 +腊 +盈 +丁 +` +蜚 +矸 +蝙 +睨 +嚓 +僻 +鬼 +醴 +夜 +彝 +磊 +笔 +拔 +栀 +糕 +厦 +邰 +纫 +逭 +纤 +眦 +膊 +馍 +躇 +烯 +蘼 +冬 +诤 +暄 +骶 +哑 +瘠 +」 +臊 +丕 +愈 +咱 +螺 +擅 +跋 +搏 +硪 +谄 +笠 +淡 +嘿 +骅 +谧 +鼎 +皋 +姚 +歼 +蠢 +驼 +耳 +胬 +挝 +涯 +狗 +蒽 +孓 +犷 +凉 +芦 +箴 +铤 +孤 +嘛 +坤 +V +茴 +朦 +挞 +尖 +橙 +诞 +搴 +碇 +洵 +浚 +帚 +蜍 +漯 +柘 +嚎 +讽 +芭 +荤 +咻 +祠 +秉 +跖 +埃 +吓 +糯 +眷 +馒 +惹 +娼 +鲑 +嫩 +讴 +轮 +瞥 +靶 +褚 +乏 +缤 +宋 +帧 +删 +驱 +碎 +扑 +俩 +俄 +偏 +涣 +竹 +噱 +皙 +佰 +渚 +唧 +斡 +# +镉 +刀 +崎 +筐 +佣 +夭 +贰 +肴 +峙 +哔 +艿 +匐 +牺 +镛 +缘 +仡 +嫡 +劣 +枸 +堀 +梨 +簿 +鸭 +蒸 +亦 +稽 +浴 +{ +衢 +束 +槲 +j +阁 +揍 +疥 +棋 +潋 +聪 +窜 +乓 +睛 +插 +冉 +阪 +苍 +搽 +「 +蟾 +螟 +幸 +仇 +樽 +撂 +慢 +跤 +幔 +俚 +淅 +覃 +觊 +溶 +妖 +帛 +侨 +曰 +妾 +泗 +· +: +瀘 +風 +Ë +( +) +∶ +紅 +紗 +瑭 +雲 +頭 +鶏 +財 +許 +• +¥ +樂 +焗 +麗 +— +; +滙 +東 +榮 +繪 +興 +… +門 +業 +π +楊 +國 +顧 +é +盤 +寳 +Λ +龍 +鳳 +島 +誌 +緣 +結 +銭 +萬 +勝 +祎 +璟 +優 +歡 +臨 +時 +購 += +★ +藍 +昇 +鐵 +觀 +勅 +農 +聲 +畫 +兿 +術 +發 +劉 +記 +專 +耑 +園 +書 +壴 +種 +Ο +● +褀 +號 +銀 +匯 +敟 +锘 +葉 +橪 +廣 +進 +蒄 +鑽 +阝 +祙 +貢 +鍋 +豊 +夬 +喆 +團 +閣 +開 +燁 +賓 +館 +酡 +沔 +順 ++ +硚 +劵 +饸 +陽 +車 +湓 +復 +萊 +氣 +軒 +華 +堃 +迮 +纟 +戶 +馬 +學 +裡 +電 +嶽 +獨 +マ +シ +サ +ジ +燘 +袪 +環 +❤ +臺 +灣 +専 +賣 +孖 +聖 +攝 +線 +▪ +α +傢 +俬 +夢 +達 +莊 +喬 +貝 +薩 +劍 +羅 +壓 +棛 +饦 +尃 +璈 +囍 +醫 +G +I +A +# +N +鷄 +髙 +嬰 +啓 +約 +隹 +潔 +賴 +藝 +~ +寶 +籣 +麺 +  +嶺 +√ +義 +網 +峩 +長 +∧ +魚 +機 +構 +② +鳯 +偉 +L +B +㙟 +畵 +鴿 +' +詩 +溝 +嚞 +屌 +藔 +佧 +玥 +蘭 +織 +1 +3 +9 +0 +7 +點 +砭 +鴨 +鋪 +銘 +廳 +弍 +‧ +創 +湯 +坶 +℃ +卩 +骝 +& +烜 +荘 +當 +潤 +扞 +係 +懷 +碶 +钅 +蚨 +讠 +☆ +叢 +爲 +埗 +涫 +塗 +→ +楽 +現 +鯨 +愛 +瑪 +鈺 +忄 +悶 +藥 +飾 +樓 +視 +孬 +ㆍ +燚 +苪 +師 +① +丼 +锽 +│ +韓 +標 +è +兒 +閏 +匋 +張 +漢 +Ü +髪 +會 +閑 +檔 +習 +裝 +の +峯 +菘 +輝 +И +雞 +釣 +億 +浐 +K +O +R +8 +H +E +P +T +W +D +S +C +M +F +姌 +饹 +» +晞 +廰 +ä +嵯 +鷹 +負 +飲 +絲 +冚 +楗 +澤 +綫 +區 +❋ +← +質 +靑 +揚 +③ +滬 +統 +産 +協 +﹑ +乸 +畐 +經 +運 +際 +洺 +岽 +為 +粵 +諾 +崋 +豐 +碁 +ɔ +V +2 +6 +齋 +誠 +訂 +´ +勑 +雙 +陳 +無 +í +泩 +媄 +夌 +刂 +i +c +t +o +r +a +嘢 +耄 +燴 +暃 +壽 +媽 +靈 +抻 +體 +唻 +É +冮 +甹 +鎮 +錦 +ʌ +蜛 +蠄 +尓 +駕 +戀 +飬 +逹 +倫 +貴 +極 +Я +Й +寬 +磚 +嶪 +郎 +職 +| +間 +n +d +剎 +伈 +課 +飛 +橋 +瘊 +№ +譜 +骓 +圗 +滘 +縣 +粿 +咅 +養 +濤 +彳 +® +% +Ⅱ +啰 +㴪 +見 +矞 +薬 +糁 +邨 +鲮 +顔 +罱 +З +選 +話 +贏 +氪 +俵 +競 +瑩 +繡 +枱 +β +綉 +á +獅 +爾 +™ +麵 +戋 +淩 +徳 +個 +劇 +場 +務 +簡 +寵 +h +實 +膠 +轱 +圖 +築 +嘣 +樹 +㸃 +營 +耵 +孫 +饃 +鄺 +飯 +麯 +遠 +輸 +坫 +孃 +乚 +閃 +鏢 +㎡ +題 +廠 +關 +↑ +爺 +將 +軍 +連 +篦 +覌 +參 +箸 +- +窠 +棽 +寕 +夀 +爰 +歐 +呙 +閥 +頡 +熱 +雎 +垟 +裟 +凬 +勁 +帑 +馕 +夆 +疌 +枼 +馮 +貨 +蒤 +樸 +彧 +旸 +靜 +龢 +暢 +㐱 +鳥 +珺 +鏡 +灡 +爭 +堷 +廚 +Ó +騰 +診 +┅ +蘇 +褔 +凱 +頂 +豕 +亞 +帥 +嘬 +⊥ +仺 +桖 +複 +饣 +絡 +穂 +顏 +棟 +納 +▏ +濟 +親 +設 +計 +攵 +埌 +烺 +ò +頤 +燦 +蓮 +撻 +節 +講 +濱 +濃 +娽 +洳 +朿 +燈 +鈴 +護 +膚 +铔 +過 +補 +Z +U +5 +4 +坋 +闿 +䖝 +餘 +缐 +铞 +貿 +铪 +桼 +趙 +鍊 +[ +㐂 +垚 +菓 +揸 +捲 +鐘 +滏 +𣇉 +爍 +輪 +燜 +鴻 +鮮 +動 +鹞 +鷗 +丄 +慶 +鉌 +翥 +飮 +腸 +⇋ +漁 +覺 +來 +熘 +昴 +翏 +鲱 +圧 +鄉 +萭 +頔 +爐 +嫚 +г +貭 +類 +聯 +幛 +輕 +訓 +鑒 +夋 +锨 +芃 +珣 +䝉 +扙 +嵐 +銷 +處 +ㄱ +語 +誘 +苝 +歸 +儀 +燒 +楿 +內 +粢 +葒 +奧 +麥 +礻 +滿 +蠔 +穵 +瞭 +態 +鱬 +榞 +硂 +鄭 +黃 +煙 +祐 +奓 +逺 +* +瑄 +獲 +聞 +薦 +讀 +這 +樣 +決 +問 +啟 +們 +執 +説 +轉 +單 +隨 +唘 +帶 +倉 +庫 +還 +贈 +尙 +皺 +■ +餅 +產 +○ +∈ +報 +狀 +楓 +賠 +琯 +嗮 +禮 +` +傳 +> +≤ +嗞 +Φ +≥ +換 +咭 +∣ +↓ +曬 +ε +応 +寫 +″ +終 +様 +純 +費 +療 +聨 +凍 +壐 +郵 +ü +黒 +∫ +製 +塊 +調 +軽 +確 +撃 +級 +馴 +Ⅲ +涇 +繹 +數 +碼 +證 +狒 +処 +劑 +< +晧 +賀 +衆 +] +櫥 +兩 +陰 +絶 +對 +鯉 +憶 +◎ +p +e +Y +蕒 +煖 +頓 +測 +試 +鼽 +僑 +碩 +妝 +帯 +≈ +鐡 +舖 +權 +喫 +倆 +ˋ +該 +悅 +ā +俫 +. +f +s +b +m +k +g +u +j +貼 +淨 +濕 +針 +適 +備 +l +/ +給 +謢 +強 +觸 +衛 +與 +⊙ +$ +緯 +變 +⑴ +⑵ +⑶ +㎏ +殺 +∩ +幚 +─ +價 +▲ +離 +ú +ó +飄 +烏 +関 +閟 +﹝ +﹞ +邏 +輯 +鍵 +驗 +訣 +導 +歷 +屆 +層 +▼ +儱 +錄 +熳 +ē +艦 +吋 +錶 +辧 +飼 +顯 +④ +禦 +販 +気 +対 +枰 +閩 +紀 +幹 +瞓 +貊 +淚 +△ +眞 +墊 +Ω +獻 +褲 +縫 +緑 +亜 +鉅 +餠 +{ +} +◆ +蘆 +薈 +█ +◇ +溫 +彈 +晳 +粧 +犸 +穩 +訊 +崬 +凖 +熥 +П +舊 +條 +紋 +圍 +Ⅳ +筆 +尷 +難 +雜 +錯 +綁 +識 +頰 +鎖 +艶 +□ +殁 +殼 +⑧ +├ +▕ +鵬 +ǐ +ō +ǒ +糝 +綱 +▎ +μ +盜 +饅 +醬 +籤 +蓋 +釀 +鹽 +據 +à +ɡ +辦 +◥ +彐 +┌ +婦 +獸 +鲩 +伱 +ī +蒟 +蒻 +齊 +袆 +腦 +寧 +凈 +妳 +煥 +詢 +偽 +謹 +啫 +鯽 +騷 +鱸 +損 +傷 +鎻 +髮 +買 +冏 +儥 +両 +﹢ +∞ +載 +喰 +z +羙 +悵 +燙 +曉 +員 +組 +徹 +艷 +痠 +鋼 +鼙 +縮 +細 +嚒 +爯 +≠ +維 +" +鱻 +壇 +厍 +帰 +浥 +犇 +薡 +軎 +² +應 +醜 +刪 +緻 +鶴 +賜 +噁 +軌 +尨 +镔 +鷺 +槗 +彌 +葚 +濛 +請 +溇 +緹 +賢 +訪 +獴 +瑅 +資 +縤 +陣 +蕟 +栢 +韻 +祼 +恁 +伢 +謝 +劃 +涑 +總 +衖 +踺 +砋 +凉 +籃 +駿 +苼 +瘋 +昽 +紡 +驊 +腎 +﹗ +響 +杋 +剛 +嚴 +禪 +歓 +槍 +傘 +檸 +檫 +炣 +勢 +鏜 +鎢 +銑 +尐 +減 +奪 +惡 +θ +僮 +婭 +臘 +ū +ì +殻 +鉄 +∑ +蛲 +焼 +緖 +續 +紹 +懮 +縠 +篥 +炌 +鹡 +圐 +汆 +鳡 +圊 +惛 +瘅 +鬈 +轷 +徂 +歅 +恧 +湲 +辚 +牂 +玕 +圫 +𦝼 +髭 +鹾 +婍 +怊 +鲀 +碡 +禊 +苧 +栻 +窸 +埪 +矧 +𬶨 +哱 +嶓 +腙 +椠 +岠 +戡 +沨 +荇 +酴 +𫓹 +𩾃 +𬜬 +砉 +䴔 +珪 +蒇 +昡 +钤 +𫇭 +瀼 +爔 +遽 +薸 +飏 +梌 +砹 +魃 +笮 +哃 +癿 +埤 +蠼 +𫓧 +詈 +瘕 +岊 +劬 +橦 +洹 +峧 +猄 +骀 +邶 +埏 +鸻 +瑑 +嚯 +镃 +堉 +魆 +萆 +匼 +僎 +瘭 +荄 +鹎 +谂 +㵐 +颥 +掼 +慝 +髹 +禋 +崦 +斠 +𬮱 +𬶋 +茋 +芟 +矬 +𫘝 +陎 +癍 +黉 +硭 +畯 +铩 +鸰 +悆 +麹 +𬒔 +迨 +胼 +鲭 +咝 +沘 +𨭉 +鲖 +𪩘 +悫 +甑 +惔 +槚 +嵛 +昣 +俳 +霨 +龀 +蕖 +璥 +钆 +俶 +𫗧 +廨 +沇 +槜 +𫑡 +眢 +桲 +郄 +笱 +醮 +埫 +𬃊 +焞 +𬤇 +旴 +垙 +嫱 +藦 +嫜 +粝 +琎 +澌 +潆 +茛 +嗥 +觯 +儆 +鹇 +脿 +扆 +䓛 +舾 +岜 +鬒 +赀 +𠙶 +膙 +蹀 +龆 +飔 +溽 +郐 +𬯎 +玭 +衽 +嬿 +㮾 +蘅 +隈 +𬴂 +蝻 +铽 +僖 +黩 +笄 +邙 +𬂩 +脩 +棨 +昳 +墣 +滹 +蝲 +雱 +鼋 +轹 +穙 +厖 +晙 +蛩 +揶 +骒 +磲 +阋 +舠 +𬶠 +堍 +摛 +棬 +橞 +樘 +儇 +窬 +缯 +侉 +𬶭 +梼 +扃 +掮 +鸮 +佺 +怙 +殂 +滫 +怍 +祇 +璠 +椆 +𬍛 +汜 +眍 +𪤗 +赇 +陔 +蹜 +礓 +缒 +佥 +靿 +䴖 +殣 +澉 +胝 +屙 +舳 +懑 +棹 +舄 +枨 +絷 +𬕂 +璒 +轫 +缣 +僇 +𫍽 +晪 +胙 +襻 +扅 +屦 +簏 +崡 +囷 +偬 +殛 +鹲 +𬀪 +眚 +屾 +埼 +耋 +笾 +鄚 +崾 +甗 +柊 +婼 +垎 +纻 +晡 +𬶏 +嫫 +皞 +崶 +烀 +墡 +詟 +埴 +彀 +蜾 +孥 +蠲 +硌 +鬯 +塱 +弆 +翈 +洌 +裥 +𫄧 +𫐓 +鋆 +镴 +鼗 +讻 +柈 +㤘 +箢 +琫 +耩 +舲 +闶 +繄 +榑 +祊 +鹪 +慥 +伥 +珝 +裢 +荖 +缱 +匏 +啐 +抃 +蛸 +翂 +澛 +弇 +桤 +堨 +貘 +鸱 +隳 +㧐 +颙 +涴 +旒 +欹 +猢 +墐 +馘 +桫 +䗴 +硍 +帻 +侁 +祃 +揳 +讱 +𬬮 +眵 +晱 +姽 +柷 +觃 +耖 +𬱖 +菉 +瑆 +卣 +暾 +犨 +跂 +栟 +腘 +酤 +埽 +扺 +垧 +皛 +缛 +骈 +盉 +㛚 +𬳿 +𬭯 +炘 +渰 +镫 +旻 +趔 +疰 +𬘩 +啁 +螱 +肸 +阇 +傕 +踔 +螵 +䗛 +跞 +愦 +堐 +沚 +呣 +髫 +碛 +鹨 +窊 +汫 +乩 +吽 +摭 +鿍 +倨 +谇 +剀 +聱 +𬸚 +纩 +馐 +酹 +忉 +翛 +褛 +酎 +缲 +𨚕 +笤 +瓞 +旵 +孱 +锊 +姈 +峣 +玿 +翀 +倥 +𫷷 +芨 +镄 +𬭛 +骃 +缗 +岈 +鹐 +𬨎 +谲 +墚 +艅 +𪨶 +偓 +踯 +䓖 +偡 +琲 +珸 +赕 +赙 +鳇 +礞 +𫖮 +鳔 +絜 +耠 +䅟 +冁 +虼 +彘 +挈 +鬻 +嶷 +镵 +嚚 +锿 +铙 +冔 +蠊 +艎 +渼 +湜 +埙 +鳓 +竘 +锸 +牁 +檎 +喾 +褙 +镎 +剟 +䲟 +逦 +鲻 +肭 +浕 +猡 +祆 +玞 +曈 +仳 +窣 +觳 +烻 +攽 +渫 +帔 +谞 +硁 +螣 +㙍 +铚 +箧 +帙 +鲒 +莝 +谫 +柃 +朏 +裈 +羝 +楒 +疐 +黪 +畤 +坌 +鲣 +嵝 +砠 +𬩽 +𬌗 +鬘 +犴 +褡 +耔 +鲙 +𦙶 +偭 +筻 +剜 +赟 +狯 +幖 +硊 +锳 +𬟁 +轪 +觥 +晊 +墀 +瞵 +塅 +滃 +薿 +裉 +鹢 +瘌 +蓊 +茚 +鲊 +钹 +垵 +朓 +苊 +蓣 +杙 +铹 +筥 +氅 +曛 +肷 +泇 +毐 +躔 +妁 +煁 +瀌 +鿏 +箦 +瞋 +婌 +簕 +爟 +诨 +恝 +瘰 +擿 +耨 +嵚 +骱 +铴 +鋈 +饔 +蛃 +氇 +莸 +枘 +蘧 +裾 +奡 +柁 +洚 +䂮 +跣 +烠 +堙 +筘 +魍 +馌 +骘 +缶 +潖 +珹 +濩 +貆 +𤧛 +篾 +鄅 +凫 +鹘 +婞 +瘗 +昄 +恓 +艨 +棫 +槱 +簃 +枵 +罽 +𣲗 +旃 +牖 +瘵 +氆 +鲾 +妧 +赪 +僦 +旐 +珽 +屺 +鼢 +聍 +佽 +獍 +沄 +镥 +薮 +悢 +瑀 +勚 +缞 +遑 +稙 +佖 +贳 +虓 +裰 +㥄 +淯 +籀 +隩 +垈 +燊 +嶅 +摅 +漈 +梣 +鍪 +蒴 +幪 +鹁 +腧 +𬜯 +洎 +犄 +朸 +妭 +虒 +龃 +嚅 +搛 +芑 +泜 +葙 +𫛭 +禔 +峱 +酅 +祋 +汔 +穟 +坒 +燏 +哐 +槭 +锞 +艏 +藠 +茓 +蹰 +旞 +豢 +鼐 +䃅 +摏 +钔 +痃 +蛑 +泐 +漖 +劓 +箅 +靼 +筀 +凓 +刬 +耪 +宧 +嘚 +鹕 +瑳 +芄 +𬘓 +玘 +鞴 +蘩 +琇 +酏 +鄑 +栴 +晢 +噇 +匜 +隃 +曩 +䌹 +俜 +𥕢 +炟 +噀 +鬶 +籥 +倻 +楯 +巇 +伣 +昃 +羱 +鸲 +洈 +嬥 +韂 +橛 +蓠 +燠 +罾 +豮 +玱 +媖 +埇 +犒 +菔 +滗 +皦 +狳 +薅 +洘 +唝 +釐 +茝 +甪 +𬣡 +𫭢 +溵 +仫 +扽 +蟫 +钖 +荙 +翃 +亹 +昒 +鸺 +螭 +藨 +牝 +𨱇 +擤 +珫 +葎 +暝 +鲘 +丏 +镨 +酩 +壸 +缟 +瞢 +洢 +榱 +磻 +螗 +醅 +漤 +榅 +畬 +鹮 +舂 +蟛 +疔 +䗪 +佸 +薁 +偰 +溷 +硎 +亸 +柙 +蓁 +溍 +峃 +旰 +蒺 +玦 +琀 +泂 +敔 +鹴 +嚭 +廒 +鼯 +埆 +璲 +甡 +咡 +噔 +铗 +榇 +崟 +棻 +璘 +𬊈 +磙 +杄 +䗖 +敉 +侘 +湎 +荁 +鲞 +恚 +琈 +玙 +嶟 +迺 +诹 +澭 +谠 +傃 +梃 +珰 +奁 +𬷕 +筌 +忝 +黻 +嵖 +骦 +佴 +郪 +鲪 +鄘 +鹆 +㘎 +邘 +侹 +韨 +馔 +觏 +鄫 +螠 +莙 +坽 +蔊 +嫠 +槔 +䝙 +㬚 +矼 +氍 +鸼 +蟊 +弸 +鲃 +鼱 +瘳 +姶 +帨 +掞 +芴 +睎 +哢 +毪 +鳤 +蜢 +𦭜 +勖 +峂 +卬 +舻 +潏 +撖 +鳉 +蒹 +羖 +潩 +𬳵 +猱 +诐 +㿠 +斝 +堧 +嫕 +垞 +荦 +禤 +碜 +捭 +垾 +忭 +癃 +尜 +脬 +缵 +垿 +潾 +惇 +蕞 +庳 +珵 +琭 +𫸩 +揆 +辒 +魑 +枅 +鞲 +欸 +堞 +歃 +旿 +𥻗 +晫 +禘 +潟 +䁖 +蔀 +脎 +胲 +龅 +昈 +㸆 +醨 +篯 +戽 +𫍣 +罨 +纴 +觖 +礅 +枹 +馑 +筦 +岞 +泖 +粞 +𬸘 +埵 +驺 +滆 +𫚕 +圌 +趯 +雠 +劁 +刖 +炷 +𫓶 +𪾢 +濋 +瑃 +瑱 +䴕 +蚄 +唪 +毹 +衃 +瑔 +觱 +唿 +𬘬 +亶 +弨 +𫟼 +毖 +籴 +𡐓 +锬 +戣 +髃 +旄 +嶲 +蹾 +偲 +砗 +磜 +菂 +鳈 +㫰 +诮 +窭 +雊 +揄 +溘 +焜 +瘃 +巉 +苌 +洨 +螫 +𬇙 +陴 +欻 +靸 +龂 +腚 +揿 +𫰛 +瞀 +煋 +𫮃 +𬣞 +氾 +噫 +㧑 +镅 +𫍲 +骕 +羕 +庑 +闼 +褊 +愔 +祕 +跐 +庋 +𬭁 +叆 +𤩽 +𬬱 +邽 +稃 +髡 +洸 +袢 +漹 +馓 +禛 +镏 +馃 +珷 +鞫 +鲯 +嗵 +婠 +糇 +谼 +捽 +镮 +锒 +蛉 +鹬 +斶 +尪 +湝 +婫 +箜 +峗 +溦 +秫 +捩 +芠 +跬 +黡 +纡 +宬 +咴 +怃 +霪 +𫶇 +齇 +栌 +靽 +娵 +圲 +𨺙 +椪 +镡 +礵 +菰 +踽 +黼 +诓 +戆 +鲉 +儳 +糨 +挓 +艴 +簖 +玒 +鞡 +洇 +禒 +苉 +霅 +堲 +鄗 +躜 +钌 +珕 +诖 +琔 +綮 +舯 +鸤 +椓 +沺 +柰 +囵 +坉 +䏲 +碏 +咇 +稂 +垕 +圪 +傺 +洴 +澴 +嘏 +鱽 +觭 +侂 +棤 +檞 +蒱 +谝 +𫟦 +𫚭 +茽 +彟 +诇 +𫐄 +昉 +圉 +𬣳 +崿 +嗫 +倮 +㸌 +棁 +葖 +萑 +媱 +璆 +猊 +齑 +珋 +堼 +岣 +冱 +僬 +骢 +鞧 +鲋 +敩 +嗌 +脶 +𬬿 +尢 +蒐 +牥 +𬘫 +搡 +堾 +湔 +墘 +韪 +樯 +筅 +琟 +伭 +盦 +臜 +夤 +恫 +囫 +俅 +踶 +搋 +陧 +堠 +眄 +烔 +茺 +轵 +晐 +裼 +甍 +戥 +蚍 +嗄 +咉 +𬭳 +㶲 +蜩 +隺 +辁 +熛 +蜣 +媸 +殄 +栒 +勠 +蓏 +忤 +耰 +𣗋 +烝 +㟃 +踣 +焐 +呶 +篼 +鼷 +锇 +铘 +辏 +徭 +猰 +𦰡 +𪨰 +醢 +𬉼 +喟 +柢 +蓂 +璪 +昫 +萏 +煃 +㙘 +搌 +媪 +嶍 +滠 +蟥 +涐 +喑 +鬷 +珖 +犰 +觌 +淠 +窎 +锎 +筲 +翕 +猃 +狲 +睚 +趑 +𬇹 +阌 +撄 +槃 +镪 +缌 +蔃 +柝 +傉 +𦈡 +挦 +醯 +胈 +𬟽 +笞 +剕 +刎 +㛃 +舐 +螅 +簝 +浡 +𬬸 +葸 +逶 +僔 +杼 +裒 +鳂 +掎 +悛 +襫 +埘 +玚 +侪 +洣 +䎃 +漼 +揕 +澽 +毳 +跏 +呇 +𬞟 +𪟝 +擐 +膑 +叇 +戭 +麑 +婘 +嫄 +艟 +怄 +庱 +槠 +锪 +𬙊 +狎 +碈 +阍 +鄃 +𫔶 +趼 +虮 +泃 +橑 +芈 +㻬 +鲡 +岨 +𬤊 +攉 +酽 +褯 +欂 +溚 +澼 +舴 +苠 +枧 +㛹 +蝥 +檠 +谿 +葶 +姱 +赒 +螬 +鸶 +蜐 +𬹼 +葜 +矰 +虿 +倓 +𧿹 +裎 +蹯 +夐 +潵 +翚 +蝮 +屣 +隰 +簠 +蜎 +堽 +瑢 +晅 +鐾 +衎 +潲 +㳘 +臬 +胣 +蚰 +菼 +弁 +钍 +逡 +杧 +姮 +飐 +浟 +婻 +薳 +刭 +憺 +呒 +惝 +𬭩 +葰 +溠 +浰 +滧 +跸 +垴 +阘 +倕 +炻 +豸 +垱 +伋 +鳘 +䲢 +遄 +𫘧 +哂 +饳 +𬇕 +羑 +铫 +𬶍 +铏 +鹙 +喈 +诂 +浯 +彖 +熜 +腒 +伧 +谳 +畛 +畀 +䓫 +阼 +猹 +饫 +咺 +遹 +䶮 +齁 +獾 +筜 +罶 +䓨 +䴗 +䴙 +荩 +镋 +桴 +罅 +橥 +掭 +𫘦 +𨙸 +嫪 +跶 +𫠊 +舭 +氿 +簰 +朳 +徛 +浬 +蝤 +邠 +蹐 +艉 +渟 +稌 +芏 +旆 +蚆 +劐 +狺 +淴 +轾 +玃 +硔 +觋 +廋 +栲 +鹋 +琤 +讧 +祓 +鞁 +㑊 +嬛 +龉 +𪣻 +刳 +𬤝 +锜 +蹢 +寁 +疠 +𬬭 +羼 +珇 +颃 +溞 +砵 +秬 +髎 +㧟 +酢 +偁 +𬬻 +崌 +胂 +郤 +澂 +箓 +悒 +𫗴 +萩 +䐃 +蒎 +涘 +鞒 +劼 +忞 +𥔲 +睄 +筤 +枍 +泚 +𫌀 +珅 +𨱔 +岍 +蚺 +皭 +筮 +鳣 +锃 +璮 +篌 +栝 +撙 +𬪩 +鲝 +㑇 +甏 +煺 +踦 +赧 +浞 +绤 +䜣 +辔 +棼 +榃 +耇 +鲠 +珧 +觿 +媞 +爇 +礌 +廙 +睥 +褕 +襕 +楮 +𬘘 +坥 +漭 +湉 +𬺈 +㬎 +𬱟 +𬭚 +伛 +硿 +瑨 +嘡 +躞 +嶦 +圮 +伾 +鹀 +鲎 +茔 +搒 +讵 +屃 +铯 +躅 +鼫 +赍 +碃 +蝣 +浛 +舥 +痄 +弢 +婤 +洭 +仉 +禚 +瑂 +暕 +虺 +嵫 +忾 +刽 +蝰 +飑 +愐 +蕻 +眊 +蹅 +怩 +噙 +鹚 +挹 +圄 +笸 +暌 +牿 +婳 +翮 +椀 +莩 +篚 +瓖 +狁 +铼 +穄 +黧 +浉 +骟 +𥖨 +筢 +澪 +劄 +骣 +芤 +悭 +慭 +珒 +䢼 +虤 +䦃 +犏 +𫖯 +鲐 +蹩 +鱾 +蚲 +蓰 +苾 +倴 +鹱 +揠 +跽 +檑 +㬊 +磡 +鼹 +樗 +𫖳 +訄 +𣲘 +牾 +臌 +瞫 +珌 +苤 +鄜 +姞 +痓 +砮 +砑 +蹁 +嶝 +靬 +筼 +攮 +𫚖 +𬍡 +脔 +腨 +袷 +漶 +瓘 +鞬 +琄 +鲴 +瑖 +笳 +钭 +菥 +犋 +嚆 +粜 +梽 +悃 +眇 +埸 +炆 +轳 +褴 +嵁 +盍 +芰 +玹 +窅 +傧 +𫢸 +䣘 +唼 +檄 +螋 +闩 +𬯀 +蓍 +楙 +忪 +嚄 +夼 +膂 +呲 +迓 +瀔 +厾 +𬶟 +菹 +艽 +暶 +忸 +棂 +豨 +蝼 +锼 +椟 +蚋 +鳁 +鲕 +瑓 +臑 +呔 +峿 +秾 +侔 +憕 +锓 +畖 +鞮 +舣 +𬒗 +皤 +赗 +怼 +竑 +欤 +狻 +芼 +鄀 +桹 +蓐 +鲼 +邾 +伲 +恔 +荮 +瞽 +镕 +嶒 +蠋 +蝘 +鲺 +勔 +钫 +逴 +鲥 +玓 +痍 +縻 +憙 +愭 +酾 +𬨂 +桕 +诌 +埯 +滉 +皕 +蜞 +纮 +褫 +璬 +𨱑 +暵 +餍 +㭕 +竦 +觫 +玢 +鄠 +猯 +烶 +黇 +哙 +鳑 +谮 +蹚 +槊 +蕗 +𬙋 +䏝 +鹒 +赆 +谶 +铳 +姤 +菝 +椑 +岵 +嗐 +踟 +惎 +簉 +㭎 +辀 +嫘 +坰 +氕 +虸 +哕 +灈 +磏 +堋 +崁 +噘 +㕮 +孀 +馧 +锩 +萳 +蔈 +嵎 +洓 +麖 +绖 +龇 +拊 +𬳽 +墦 +罟 +敫 +砆 +翙 +趱 +酆 +糒 +锧 +窳 +柖 +莰 +玡 +穑 +圢 +鸧 +硇 +搦 +辇 +幞 +枲 +㰀 +𨐈 +䥽 +甦 +靺 +𬒈 +洧 +鹔 +𨟠 +珛 +碨 +弶 +崒 +诎 +蒨 +龁 +蟪 +崀 +怫 +曷 +砟 +甓 +垺 +瀱 +唵 +䓬 +荓 +栊 +珦 +𬘯 +劂 +𩾌 +藟 +𬺓 +踬 +麀 +廛 +𫭼 +竫 +訚 +垆 +羓 +䢺 +趿 +涄 +蟮 +痦 +𨱏 +𫫇 +缧 +酺 +鸩 +怛 +狝 +𫟅 +颟 +衠 +髀 +噍 +黢 +薷 +勍 +愃 +𩽾 +瑧 +胨 +砘 +鸫 +𬙂 +叵 +扂 +㴔 +𬭊 +诳 +煳 +筶 +疍 +漷 +笯 +峛 +𬬩 +鸹 +懔 +𬘡 +蒗 +鹯 +讦 +潽 +畋 +缡 +翷 +媂 +剋 +癯 +媆 +荑 +褟 +湣 +焆 +蛱 +狉 +袗 +钋 +齉 +𬴊 +墈 +嬬 +鲏 +镆 +哳 +悰 +𫍯 +摴 +鏊 +缳 +菍 +颋 +啷 +铥 +洫 +𫵷 +萹 +硗 +鹟 +鳒 +𫄸 +仂 +栳 +𬭎 +蠃 +薢 +溹 +聩 +邿 +稑 +錾 +豳 +镞 +阒 +蔹 +𬮿 +箨 +聒 +跱 +𫓯 +鹖 +萚 +𫘪 +梿 +𫘨 +噂 +玤 +诼 +俦 +搠 +燋 +愎 +瓀 +𬘭 +鲚 +偾 +狷 +喤 +剅 +𬶮 +慆 +睃 +㳇 +𫄨 +钲 +熇 +𫐐 +蜮 +猁 +骖 +僭 +鼒 +抔 +硙 +泙 +𦒍 +轸 +汈 +燔 +曌 +癀 +趄 +𬭤 +嘭 +瘼 +塥 +绹 +淟 +廆 +牚 +柽 +醭 +沆 +愍 +玼 +髽 +唣 +猺 +𫭟 +畎 +罴 +淏 +猇 +骉 +阏 +袯 +匦 +杪 +胩 +崚 +椸 +𫘜 +遆 +憷 +辎 +笥 +廑 +𠅤 +塝 +耤 +陑 +埒 +鬏 +垯 +𬍤 +𤫉 +鞳 +槁 +磹 +蜉 +鹠 +徼 +襜 +镩 +梠 +饻 +辌 +牻 +墕 +庼 +眬 +殪 +俣 +燹 +摽 +蔌 +帡 +镢 +爚 +玶 +趺 +漻 +瘥 +凘 +顸 +捯 +麇 +鹛 +锍 +慬 +筇 +苻 +邲 +銎 +芣 +枥 +癗 +锱 +穜 +拶 +佁 +逋 +酲 +鹝 +瓻 +硐 +铷 +窀 +暅 +湑 +侴 +馞 +佾 +毵 +鿎 +黾 +奭 +鞯 +抟 +髑 +𬸦 +撺 +疁 +𬭬 +鲹 +洿 +薤 +掾 +蒉 +俙 +拤 +鼍 +镲 +肫 +扊 +圬 +箖 +诔 +裣 +漋 +祏 +杓 +溲 +鄌 +溻 +𫞩 +縢 +玎 +殳 +镈 +糌 +佻 +赜 +遘 +昺 +镘 +谖 +䲠 +躐 +瀍 +郃 +浭 +訇 +铻 +蹽 +栐 +圙 +㠓 +骎 +𫔎 +仵 +㺄 +鸷 +梾 +襞 +霈 +腠 +嵅 +纥 +蝓 +锖 +埝 +聃 +脟 +踅 +𬭼 +陬 +𬶐 +煟 +驵 +帱 +鲿 +襦 +媓 +薜 +汋 +喁 +鳏 +滪 +阃 +舁 +𫘬 +嗾 +狨 +愆 +骙 +堌 +垍 +虷 +嵲 +卮 +桄 +葴 +咍 +疢 +茑 +矻 +櫆 +祾 +誊 +媵 +馝 +觜 +酃 +戗 +𬀩 +廪 +梴 +袼 +翯 +鹍 +庤 +砄 +戤 +疭 +鞨 +蓇 +顼 +醵 +蕺 +𬣙 +垲 +愀 +磉 +𬴃 +拃 +䴘 +媭 +尥 +鼩 +愠 +涍 +乂 +稆 +襚 +贽 +倞 +𫔍 +陞 +鳠 +诜 +孅 +矍 +啴 +滍 +禳 +坼 +儦 +耏 +暲 +疴 +碥 +郚 +鲬 +叚 +苈 +钘 +酂 +崞 +戕 +浲 +爿 +逖 +瞍 +馉 +瑬 +脞 +磔 +荛 +鲔 +馇 +爝 +黥 +楩 +楫 +䏡 +涢 +觚 +贶 +忳 +镠 +呖 +倧 +劢 +坬 +儴 +怿 +瘆 +堎 +萣 +鳛 +兕 +玠 +焓 +熻 +魋 +漦 +啭 +𠳐 +𬊤 +𬳶 +蘘 +忺 +狴 +荜 +蛞 +醑 +饩 +茕 +憭 +墁 +獬 +僰 +莿 +焌 +鲧 +罍 +惙 +缊 +麈 +蒯 +暿 +辿 +祧 +簟 +谵 +厣 +杌 +捃 +榰 +俍 +沩 +鞔 +嵴 +饧 +忮 +昪 +鹣 +𬬹 +杻 +迕 +鹈 +舢 +辂 +桊 +疬 +飧 +𬭶 +郈 +㽏 +𡎚 +笊 +轺 +䴓 +颀 +缑 +蓢 +棐 +蛘 +碹 +炱 +镤 +茀 +镚 +桯 +卺 +妘 +鄹 +鳊 +嘁 +㳚 +钐 +靰 +瘛 +糵 +崄 +驲 +汧 +𣸣 +澥 +鹩 +璱 +雩 +吣 +郇 +黹 +𬭸 +汭 +洑 +棪 +笪 +狃 +凼 +珢 +蟏 +衄 +溁 +螽 +𬸣 +跗 +圯 +髢 +𬸪 +咥 +鳢 +㙦 +酦 +郿 +耥 +棓 +漴 +畚 +垤 +悈 +踒 +阽 +祲 +墼 +蛄 +榖 +殍 +哿 +觟 +悝 +垏 +杕 +腯 +飗 +砫 +塄 +颎 +钷 +鸸 +鳀 +裛 +艋 +颏 +鲰 +龠 +翾 +剞 +醾 +㠇 +鲌 +糈 +斫 +赑 +𫟹 +衒 +淜 +䎖 +镬 +塆 +妣 +锾 +猞 +哏 +耢 +怵 +牮 +煓 +盷 +繇 +叕 +䃎 +鲦 +毌 +莶 +胠 +橐 +岬 +鳚 +锫 +榍 +嬖 +楪 +殓 +嗍 +骍 +钪 +峏 +茳 +𫠜 +嫽 +娀 +莛 +𫄷 +瑝 +琡 +瘐 +慊 +纼 +腽 +傒 +蒈 +嫭 +昤 +魈 +煴 +薨 +湴 +牤 +蕰 +跹 +坜 +箪 +鲗 +筚 +艚 +屼 +獯 +茈 +𫠆 diff --git a/source/containers/document-pii-detection/ocr_model/rec_standard.onnx b/source/containers/document-pii-detection/ocr_model/rec_standard.onnx new file mode 100644 index 00000000..f546d7cf Binary files /dev/null and b/source/containers/document-pii-detection/ocr_model/rec_standard.onnx differ diff --git a/source/containers/document-pii-detection/parser_factory.py b/source/containers/document-pii-detection/parser_factory.py index 9948c062..8f0f364a 100644 --- a/source/containers/document-pii-detection/parser_factory.py +++ b/source/containers/document-pii-detection/parser_factory.py @@ -23,7 +23,7 @@ def create_parser(file_type, s3_client): elif file_type.lower() in ['.eml']: return EmailParser(s3_client=s3_client) elif file_type.lower() in ['.jpg', '.jpeg', '.png', ".gif", ".bmp", ".tiff", ".tif"]: - return ImageParser(s3_client=s3_client, fd_model_path='./fd_model/', + return ImageParser(s3_client=s3_client, fd_model_path='./fd_model/', ocr_model_path='./ocr_model/') else: raise ValueError('Unsupported file type') \ No newline at end of file diff --git a/source/containers/document-pii-detection/parsers/doc_parser.py b/source/containers/document-pii-detection/parsers/doc_parser.py index 20f1d118..42be60ce 100644 --- a/source/containers/document-pii-detection/parsers/doc_parser.py +++ b/source/containers/document-pii-detection/parsers/doc_parser.py @@ -1,17 +1,18 @@ import docx +import io from .parser import BaseParser class DocParser(BaseParser): def __init__(self, s3_client): super().__init__(s3_client=s3_client) - def parse_file(self, doc_path): + def parse_file(self, doc_stream): """ Extracts text from a doc file and returns a string of content. """ - doc = docx.Document(doc_path) + doc = docx.Document(io.BytesIO(doc_stream)) file_content = "" for para in doc.paragraphs: file_content += para.text + "\n" diff --git a/source/containers/document-pii-detection/parsers/email_parser.py b/source/containers/document-pii-detection/parsers/email_parser.py index 45a35120..c1f23dfc 100644 --- a/source/containers/document-pii-detection/parsers/email_parser.py +++ b/source/containers/document-pii-detection/parsers/email_parser.py @@ -2,33 +2,40 @@ import os from .parser import BaseParser import quopri -from email.parser import Parser as PyEmailParser +from email.parser import BytesParser as PyEmailParser +import io +import chardet class EmailParser(BaseParser): def __init__(self, s3_client): super().__init__(s3_client=s3_client) - def parse_file(self, eml_path): + def parse_file(self, eml_stream): """ Extracts text from a eml file and returns a string of content. """ - file_encoding = self.get_encoding(eml_path) + # file_encoding = self.get_encoding(eml_stream) + result = chardet.detect(eml_stream) + file_encoding = result['encoding'] - with open(eml_path) as stream: - parser = PyEmailParser() - message = parser.parse(stream) + # with open(eml_stream) as stream: + parser = PyEmailParser() + # message = parser.parsebytes(io.BytesIO(eml_stream)) file_content = [] - for part in message.walk(): - if part.get_content_type().startswith('text/plain'): - part_payload = part.get_payload() - if file_encoding == 'us-ascii': - decoded_string = quopri.decodestring(part_payload).decode('utf-8', errors='ignore') - else: - decoded_string = part_payload - file_content.append(decoded_string) + eml_content = eml_stream.decode(file_encoding) # Decode the stream if needed + msg = parser.parsebytes(eml_content.encode()) + + # text = "" + if msg.is_multipart(): + for part in msg.walk(): + content_type = part.get_content_type() + if content_type == "text/plain": + file_content.append(part.get_payload(decode=True).decode()) + else: + file_content.append(msg.get_payload(decode=True).decode()) return ['\n'.join(file_content)] diff --git a/source/containers/document-pii-detection/parsers/html_parser.py b/source/containers/document-pii-detection/parsers/html_parser.py index 45f850b9..127c80d7 100644 --- a/source/containers/document-pii-detection/parsers/html_parser.py +++ b/source/containers/document-pii-detection/parsers/html_parser.py @@ -11,13 +11,12 @@ def __init__(self, s3_client): super().__init__(s3_client=s3_client) # additional PdfParser constructor code here - def parse_file(self, html_path): + def parse_file(self, html_stream): """ Extracts text from a html file and returns a string of content. """ - with open(html_path, "rb") as stream: - soup = BeautifulSoup(stream, 'lxml') + soup = BeautifulSoup(html_stream, 'lxml') # Convert tables to ASCII ones soup = self._replace_tables(soup) diff --git a/source/containers/document-pii-detection/parsers/image_analysis/face_detection/face_detection_main.py b/source/containers/document-pii-detection/parsers/image_analysis/face_detection/face_detection_main.py index 17fa0c16..4d18fa0f 100644 --- a/source/containers/document-pii-detection/parsers/image_analysis/face_detection/face_detection_main.py +++ b/source/containers/document-pii-detection/parsers/image_analysis/face_detection/face_detection_main.py @@ -5,6 +5,7 @@ import cv2 cuda_available = False +onnxruntime.set_default_logger_severity(3) def distance2bbox(points, distance, max_shape=None): """Decode distance prediction to bounding box. diff --git a/source/containers/document-pii-detection/parsers/image_analysis/general_ocr/ocr_main.py b/source/containers/document-pii-detection/parsers/image_analysis/general_ocr/ocr_main.py index 679545e5..b263faad 100644 --- a/source/containers/document-pii-detection/parsers/image_analysis/general_ocr/ocr_main.py +++ b/source/containers/document-pii-detection/parsers/image_analysis/general_ocr/ocr_main.py @@ -13,6 +13,8 @@ cuda_available = False +onnxruntime.set_default_logger_severity(3) + def sorted_boxes(dt_boxes): """ Sort text boxes in order from top to bottom, left to right diff --git a/source/containers/document-pii-detection/parsers/image_analysis/general_ocr/postprocess/db_postprocess.py b/source/containers/document-pii-detection/parsers/image_analysis/general_ocr/postprocess/db_postprocess.py index 741a2c88..a4c40c7f 100644 --- a/source/containers/document-pii-detection/parsers/image_analysis/general_ocr/postprocess/db_postprocess.py +++ b/source/containers/document-pii-detection/parsers/image_analysis/general_ocr/postprocess/db_postprocess.py @@ -107,10 +107,10 @@ def get_mini_boxes(self, contour): def box_score_fast(self, bitmap, _box): h, w = bitmap.shape[:2] box = _box.copy() - xmin = np.clip(np.floor(box[:, 0].min()).astype(np.int), 0, w - 1) - xmax = np.clip(np.ceil(box[:, 0].max()).astype(np.int), 0, w - 1) - ymin = np.clip(np.floor(box[:, 1].min()).astype(np.int), 0, h - 1) - ymax = np.clip(np.ceil(box[:, 1].max()).astype(np.int), 0, h - 1) + xmin = np.clip(np.floor(box[:, 0].min()).astype(np.int32), 0, w - 1) + xmax = np.clip(np.ceil(box[:, 0].max()).astype(np.int32), 0, w - 1) + ymin = np.clip(np.floor(box[:, 1].min()).astype(np.int32), 0, h - 1) + ymax = np.clip(np.ceil(box[:, 1].max()).astype(np.int32), 0, h - 1) mask = np.zeros((ymax - ymin + 1, xmax - xmin + 1), dtype=np.uint8) box[:, 0] = box[:, 0] - xmin diff --git a/source/containers/document-pii-detection/parsers/image_parser.py b/source/containers/document-pii-detection/parsers/image_parser.py index 2b51c2dd..a98dd4d9 100644 --- a/source/containers/document-pii-detection/parsers/image_parser.py +++ b/source/containers/document-pii-detection/parsers/image_parser.py @@ -4,6 +4,7 @@ from PIL import Image import numpy as np +import io from .image_analysis.face_detection import face_detection_main from .image_analysis.general_ocr import ocr_main @@ -33,6 +34,12 @@ def read_img(self, file_path): return img + def read_img_stream(self, stream): + with Image.open(io.BytesIO(stream)) as img: + img = np.array(img.convert('RGB'))[:, :, :3] + + return img + def face_detection_pipeline(self, img): bboxes, kpss = self.face_detection_model.detect(img) return bboxes, kpss @@ -43,9 +50,9 @@ def ocr_pipeline(self, img): dt_results = list(zip(dt_boxes, rec_res)) return dt_results - def parse_file(self, file_path): + def parse_file(self, file_stream): file_content = [] - img = self.read_img(file_path) + img = self.read_img_stream(file_stream) face_detection_result, _ = self.face_detection_pipeline(img) ocr_pipeline_result = self.ocr_pipeline(img) diff --git a/source/containers/document-pii-detection/parsers/parser.py b/source/containers/document-pii-detection/parsers/parser.py index e0f36edc..9f1725a1 100644 --- a/source/containers/document-pii-detection/parsers/parser.py +++ b/source/containers/document-pii-detection/parsers/parser.py @@ -2,6 +2,7 @@ import magic import re from tempfile import NamedTemporaryFile +import boto3 def merge_strings(substrings, delimiter='.', max_length=128, truncate_buffer=False): """ @@ -48,7 +49,7 @@ def parse_file(self, file_path, **kwargs): def load_content(self, bucket, object_key): """ Downloads the file from S3. - """ + # Create a temporary file with NamedTemporaryFile() as temp_file: self.s3_client.download_file(Bucket=bucket, Key=object_key, Filename=temp_file.name) @@ -60,6 +61,18 @@ def load_content(self, bucket, object_key): print(f"Failed to parse file {object_key}. Error: {e}") file_content = [] processed_content = self.postprocess_content(file_content) + """ + # begin download obj into memory + s3 = boto3.resource('s3', region_name='cn-northwest-1') + obj = s3.Object(bucket, object_key).get() + + try: + file_content = self.parse_file(obj['Body'].read()) + except Exception as e: + print(f"Failed to parse file {object_key}. Error: {e}") + file_content = [] + processed_content = self.postprocess_content(file_content) + # end download obj into memory return processed_content diff --git a/source/containers/document-pii-detection/parsers/pdf_parser.py b/source/containers/document-pii-detection/parsers/pdf_parser.py index e1a07bb1..10dc4fb1 100644 --- a/source/containers/document-pii-detection/parsers/pdf_parser.py +++ b/source/containers/document-pii-detection/parsers/pdf_parser.py @@ -2,6 +2,7 @@ import os import boto3 from pypdf import PdfReader +from io import BytesIO from .parser import BaseParser @@ -10,13 +11,13 @@ def __init__(self, s3_client): super().__init__(s3_client=s3_client) - def parse_file(self, pdf_path): + def parse_file(self, pdf_stream): """ Extracts text from a PDF file and returns a list of lines. """ # Create a PDF reader object - pdf_reader = PdfReader(pdf_path) + pdf_reader = PdfReader(BytesIO(pdf_stream)) file_content = [] # Loop through each page in the PDF file @@ -27,4 +28,5 @@ def parse_file(self, pdf_path): page_content = page.extract_text() file_content.append(page_content) + # print(file_content) return file_content diff --git a/source/containers/document-pii-detection/parsers/txt_parser.py b/source/containers/document-pii-detection/parsers/txt_parser.py index 68d663cc..483c8180 100644 --- a/source/containers/document-pii-detection/parsers/txt_parser.py +++ b/source/containers/document-pii-detection/parsers/txt_parser.py @@ -2,24 +2,26 @@ import os from .parser import BaseParser import quopri +import chardet class TxtParser(BaseParser): def __init__(self, s3_client): super().__init__(s3_client=s3_client) - def parse_file(self, txt_path): + def parse_file(self, txt_stream): """ Extracts text from a TXT file and returns a list of lines. """ - file_encoding = self.get_encoding(txt_path) + # file_encoding = self.get_encoding(txt_stream) # Read the file - with open(txt_path, 'rb') as file: - file_content_byte = file.read() - - file_content = file_content_byte.decode(file_encoding).encode('utf-8').decode('utf-8', errors='ignore') - + # with open(txt_stream, 'rb') as file: + # file_content_byte = file.read() + result = chardet.detect(txt_stream) + encoding = result['encoding'] + file_content = txt_stream.decode(encoding) + # print(file_content) # if file_encoding == 'us-ascii': # file_content = quopri.decodestring(file_content).decode('utf-8', errors='ignore') diff --git a/source/containers/document-pii-detection/requirements.txt b/source/containers/document-pii-detection/requirements.txt index 02028d4b..dafcb040 100644 --- a/source/containers/document-pii-detection/requirements.txt +++ b/source/containers/document-pii-detection/requirements.txt @@ -1,20 +1,17 @@ -requests -boto3 +boto3==1.34.63 six==1.16.0 -opencv-python-headless==4.5.3.56 -numpy<=1.23.5 -onnxruntime +numpy==1.26.4 +onnxruntime==1.17.1 Pillow==10.2.0 -pyclipper==1.3.0 -Shapely==1.7.1 -base64image==0.5.1 -urllib3==1.26.18 +pyclipper==1.3.0.post5 +Shapely==2.0.3 python-dateutil==2.8.2 -certifi==2023.7.22 -idna==2.10 -chardet==4.0.0 -pypdf==3.17.0 +chardet==5.2.0 +pypdf==4.1.0 python-magic==0.4.27 -python-docx==0.8.11 -bs4==0.0.1 -pandas==1.5.3 \ No newline at end of file +python-docx==1.1.0 +bs4==0.0.2 +pandas==2.2.1 +pyarrow==15.0.2 +psutil==5.9.8 +opencv-python-headless==4.9.0.80