From b0c8cb4083bd44461092e47e09b4f991d04f9bfb Mon Sep 17 00:00:00 2001 From: "Kalam :p" <63474858+YourKalamity@users.noreply.github.com> Date: Wed, 15 Jul 2020 17:41:07 +0100 Subject: [PATCH] added new gui --- 2.0.0.py | 395 + __pycache__/new Main.cpython-36.pyc | Bin 0 -> 23085 bytes chardet/__init__.py | 39 + chardet/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 831 bytes chardet/__pycache__/big5freq.cpython-38.pyc | Bin 0 -> 27160 bytes chardet/__pycache__/big5prober.cpython-38.pyc | Bin 0 -> 1115 bytes .../chardistribution.cpython-38.pyc | Bin 0 -> 6201 bytes .../charsetgroupprober.cpython-38.pyc | Bin 0 -> 2232 bytes .../__pycache__/charsetprober.cpython-38.pyc | Bin 0 -> 3464 bytes .../codingstatemachine.cpython-38.pyc | Bin 0 -> 2891 bytes chardet/__pycache__/compat.cpython-38.pyc | Bin 0 -> 336 bytes .../__pycache__/cp949prober.cpython-38.pyc | Bin 0 -> 1122 bytes chardet/__pycache__/enums.cpython-38.pyc | Bin 0 -> 2629 bytes chardet/__pycache__/escprober.cpython-38.pyc | Bin 0 -> 2614 bytes chardet/__pycache__/escsm.cpython-38.pyc | Bin 0 -> 7455 bytes .../__pycache__/eucjpprober.cpython-38.pyc | Bin 0 -> 2432 bytes chardet/__pycache__/euckrfreq.cpython-38.pyc | Bin 0 -> 12044 bytes .../__pycache__/euckrprober.cpython-38.pyc | Bin 0 -> 1123 bytes chardet/__pycache__/euctwfreq.cpython-38.pyc | Bin 0 -> 27164 bytes .../__pycache__/euctwprober.cpython-38.pyc | Bin 0 -> 1123 bytes chardet/__pycache__/gb2312freq.cpython-38.pyc | Bin 0 -> 19088 bytes .../__pycache__/gb2312prober.cpython-38.pyc | Bin 0 -> 1131 bytes .../__pycache__/hebrewprober.cpython-38.pyc | Bin 0 -> 3004 bytes chardet/__pycache__/jisfreq.cpython-38.pyc | Bin 0 -> 22116 bytes chardet/__pycache__/jpcntx.cpython-38.pyc | Bin 0 -> 37589 bytes .../langbulgarianmodel.cpython-38.pyc | Bin 0 -> 23613 bytes .../langcyrillicmodel.cpython-38.pyc | Bin 0 -> 29077 bytes .../__pycache__/langgreekmodel.cpython-38.pyc | Bin 0 -> 23571 bytes .../langhebrewmodel.cpython-38.pyc | Bin 0 -> 22198 bytes .../langhungarianmodel.cpython-38.pyc | Bin 0 -> 23602 bytes .../__pycache__/langthaimodel.cpython-38.pyc | Bin 0 -> 22177 bytes .../langturkishmodel.cpython-38.pyc | Bin 0 -> 22200 bytes .../__pycache__/latin1prober.cpython-38.pyc | Bin 0 -> 3384 bytes .../mbcharsetprober.cpython-38.pyc | Bin 0 -> 2247 bytes .../mbcsgroupprober.cpython-38.pyc | Bin 0 -> 1112 bytes chardet/__pycache__/mbcssm.cpython-38.pyc | Bin 0 -> 16735 bytes .../sbcharsetprober.cpython-38.pyc | Bin 0 -> 3000 bytes .../sbcsgroupprober.cpython-38.pyc | Bin 0 -> 1610 bytes chardet/__pycache__/sjisprober.cpython-38.pyc | Bin 0 -> 2468 bytes .../universaldetector.cpython-38.pyc | Bin 0 -> 5812 bytes chardet/__pycache__/utf8prober.cpython-38.pyc | Bin 0 -> 1973 bytes chardet/__pycache__/version.cpython-38.pyc | Bin 0 -> 420 bytes chardet/big5freq.py | 386 + chardet/big5prober.py | 47 + chardet/chardistribution.py | 233 + chardet/charsetgroupprober.py | 106 + chardet/charsetprober.py | 145 + chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 177 bytes .../cli/__pycache__/chardetect.cpython-38.pyc | Bin 0 -> 2642 bytes chardet/cli/chardetect.py | 85 + chardet/codingstatemachine.py | 88 + chardet/compat.py | 34 + chardet/cp949prober.py | 49 + chardet/enums.py | 76 + chardet/escprober.py | 101 + chardet/escsm.py | 246 + chardet/eucjpprober.py | 92 + chardet/euckrfreq.py | 195 + chardet/euckrprober.py | 47 + chardet/euctwfreq.py | 387 + chardet/euctwprober.py | 46 + chardet/gb2312freq.py | 283 + chardet/gb2312prober.py | 46 + chardet/hebrewprober.py | 292 + chardet/jisfreq.py | 325 + chardet/jpcntx.py | 233 + chardet/langbulgarianmodel.py | 228 + chardet/langcyrillicmodel.py | 333 + chardet/langgreekmodel.py | 225 + chardet/langhebrewmodel.py | 200 + chardet/langhungarianmodel.py | 225 + chardet/langthaimodel.py | 199 + chardet/langturkishmodel.py | 193 + chardet/latin1prober.py | 145 + chardet/mbcharsetprober.py | 91 + chardet/mbcsgroupprober.py | 54 + chardet/mbcssm.py | 572 ++ chardet/sbcharsetprober.py | 132 + chardet/sbcsgroupprober.py | 73 + chardet/sjisprober.py | 92 + chardet/universaldetector.py | 286 + chardet/utf8prober.py | 82 + chardet/version.py | 9 + idna/__init__.py | 2 + idna/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 236 bytes idna/__pycache__/codec.cpython-38.pyc | Bin 0 -> 2890 bytes idna/__pycache__/compat.cpython-38.pyc | Bin 0 -> 608 bytes idna/__pycache__/core.cpython-38.pyc | Bin 0 -> 9105 bytes idna/__pycache__/idnadata.cpython-38.pyc | Bin 0 -> 21514 bytes idna/__pycache__/intranges.cpython-38.pyc | Bin 0 -> 1788 bytes idna/__pycache__/package_data.cpython-38.pyc | Bin 0 -> 190 bytes idna/__pycache__/uts46data.cpython-38.pyc | Bin 0 -> 176716 bytes idna/codec.py | 118 + idna/compat.py | 12 + idna/core.py | 398 + idna/idnadata.py | 1991 ++++ idna/intranges.py | 53 + idna/package_data.py | 2 + idna/uts46data.py | 8317 +++++++++++++++++ main.py | 507 +- old version/2.0.0.py | 395 + 102 files changed, 18768 insertions(+), 143 deletions(-) create mode 100644 2.0.0.py create mode 100644 __pycache__/new Main.cpython-36.pyc create mode 100644 chardet/__init__.py create mode 100644 chardet/__pycache__/__init__.cpython-38.pyc create mode 100644 chardet/__pycache__/big5freq.cpython-38.pyc create mode 100644 chardet/__pycache__/big5prober.cpython-38.pyc create mode 100644 chardet/__pycache__/chardistribution.cpython-38.pyc create mode 100644 chardet/__pycache__/charsetgroupprober.cpython-38.pyc create mode 100644 chardet/__pycache__/charsetprober.cpython-38.pyc create mode 100644 chardet/__pycache__/codingstatemachine.cpython-38.pyc create mode 100644 chardet/__pycache__/compat.cpython-38.pyc create mode 100644 chardet/__pycache__/cp949prober.cpython-38.pyc create mode 100644 chardet/__pycache__/enums.cpython-38.pyc create mode 100644 chardet/__pycache__/escprober.cpython-38.pyc create mode 100644 chardet/__pycache__/escsm.cpython-38.pyc create mode 100644 chardet/__pycache__/eucjpprober.cpython-38.pyc create mode 100644 chardet/__pycache__/euckrfreq.cpython-38.pyc create mode 100644 chardet/__pycache__/euckrprober.cpython-38.pyc create mode 100644 chardet/__pycache__/euctwfreq.cpython-38.pyc create mode 100644 chardet/__pycache__/euctwprober.cpython-38.pyc create mode 100644 chardet/__pycache__/gb2312freq.cpython-38.pyc create mode 100644 chardet/__pycache__/gb2312prober.cpython-38.pyc create mode 100644 chardet/__pycache__/hebrewprober.cpython-38.pyc create mode 100644 chardet/__pycache__/jisfreq.cpython-38.pyc create mode 100644 chardet/__pycache__/jpcntx.cpython-38.pyc create mode 100644 chardet/__pycache__/langbulgarianmodel.cpython-38.pyc create mode 100644 chardet/__pycache__/langcyrillicmodel.cpython-38.pyc create mode 100644 chardet/__pycache__/langgreekmodel.cpython-38.pyc create mode 100644 chardet/__pycache__/langhebrewmodel.cpython-38.pyc create mode 100644 chardet/__pycache__/langhungarianmodel.cpython-38.pyc create mode 100644 chardet/__pycache__/langthaimodel.cpython-38.pyc create mode 100644 chardet/__pycache__/langturkishmodel.cpython-38.pyc create mode 100644 chardet/__pycache__/latin1prober.cpython-38.pyc create mode 100644 chardet/__pycache__/mbcharsetprober.cpython-38.pyc create mode 100644 chardet/__pycache__/mbcsgroupprober.cpython-38.pyc create mode 100644 chardet/__pycache__/mbcssm.cpython-38.pyc create mode 100644 chardet/__pycache__/sbcharsetprober.cpython-38.pyc create mode 100644 chardet/__pycache__/sbcsgroupprober.cpython-38.pyc create mode 100644 chardet/__pycache__/sjisprober.cpython-38.pyc create mode 100644 chardet/__pycache__/universaldetector.cpython-38.pyc create mode 100644 chardet/__pycache__/utf8prober.cpython-38.pyc create mode 100644 chardet/__pycache__/version.cpython-38.pyc create mode 100644 chardet/big5freq.py create mode 100644 chardet/big5prober.py create mode 100644 chardet/chardistribution.py create mode 100644 chardet/charsetgroupprober.py create mode 100644 chardet/charsetprober.py create mode 100644 chardet/cli/__init__.py create mode 100644 chardet/cli/__pycache__/__init__.cpython-38.pyc create mode 100644 chardet/cli/__pycache__/chardetect.cpython-38.pyc create mode 100644 chardet/cli/chardetect.py create mode 100644 chardet/codingstatemachine.py create mode 100644 chardet/compat.py create mode 100644 chardet/cp949prober.py create mode 100644 chardet/enums.py create mode 100644 chardet/escprober.py create mode 100644 chardet/escsm.py create mode 100644 chardet/eucjpprober.py create mode 100644 chardet/euckrfreq.py create mode 100644 chardet/euckrprober.py create mode 100644 chardet/euctwfreq.py create mode 100644 chardet/euctwprober.py create mode 100644 chardet/gb2312freq.py create mode 100644 chardet/gb2312prober.py create mode 100644 chardet/hebrewprober.py create mode 100644 chardet/jisfreq.py create mode 100644 chardet/jpcntx.py create mode 100644 chardet/langbulgarianmodel.py create mode 100644 chardet/langcyrillicmodel.py create mode 100644 chardet/langgreekmodel.py create mode 100644 chardet/langhebrewmodel.py create mode 100644 chardet/langhungarianmodel.py create mode 100644 chardet/langthaimodel.py create mode 100644 chardet/langturkishmodel.py create mode 100644 chardet/latin1prober.py create mode 100644 chardet/mbcharsetprober.py create mode 100644 chardet/mbcsgroupprober.py create mode 100644 chardet/mbcssm.py create mode 100644 chardet/sbcharsetprober.py create mode 100644 chardet/sbcsgroupprober.py create mode 100644 chardet/sjisprober.py create mode 100644 chardet/universaldetector.py create mode 100644 chardet/utf8prober.py create mode 100644 chardet/version.py create mode 100644 idna/__init__.py create mode 100644 idna/__pycache__/__init__.cpython-38.pyc create mode 100644 idna/__pycache__/codec.cpython-38.pyc create mode 100644 idna/__pycache__/compat.cpython-38.pyc create mode 100644 idna/__pycache__/core.cpython-38.pyc create mode 100644 idna/__pycache__/idnadata.cpython-38.pyc create mode 100644 idna/__pycache__/intranges.cpython-38.pyc create mode 100644 idna/__pycache__/package_data.cpython-38.pyc create mode 100644 idna/__pycache__/uts46data.cpython-38.pyc create mode 100644 idna/codec.py create mode 100644 idna/compat.py create mode 100644 idna/core.py create mode 100644 idna/idnadata.py create mode 100644 idna/intranges.py create mode 100644 idna/package_data.py create mode 100644 idna/uts46data.py create mode 100644 old version/2.0.0.py diff --git a/2.0.0.py b/2.0.0.py new file mode 100644 index 0000000..30bc165 --- /dev/null +++ b/2.0.0.py @@ -0,0 +1,395 @@ + +# Created by YourKalamity +#https://github.com/YourKalamity/lazy-dsi-file-downloader + + +#Import libraries +import tkinter +from tkinter import messagebox +from tkinter import filedialog +import tkinter.ttk +import os +import platform +import sys +import requests +import json +from pathlib import Path +import shutil +from subprocess import Popen +import zipfile +import distutils +from distutils import dir_util + + +#Memory Pit Links - Points to GitHub repo +dsiVersions = ["1.0 - 1.3 (USA, EUR, AUS, JPN)", "1.4 - 1.4.5 (USA, EUR, AUS, JPN)", "All versions (KOR, CHN)"] +memoryPitLinks = ["https://github.com/YourKalamity/just-a-dsi-cfw-installer/raw/master/assets/files/memoryPit/256/pit.bin","https://github.com/YourKalamity/just-a-dsi-cfw-installer/raw/master/assets/files/memoryPit/768_1024/pit.bin"] + +#Downloader +def downloadFile(link, destination): + r = requests.get(link, allow_redirects=True) + if link.find('/'): + fileName = link.rsplit('/', 1)[1] + downloadLocation = destination + fileName + open(downloadLocation, 'wb').write(r.content) + return downloadLocation + + +#Get link of latest Github Release +def getLatestGitHub(usernamerepo, assetNumber): + release = json.loads(requests.get("https://api.github.com/repos/"+usernamerepo+"/releases/latest").content) + url = release["assets"][assetNumber]["browser_download_url"] + return url + +#Push text to output box +def outputbox(message): + outputBox.configure(state='normal') + outputBox.insert('end', message) + outputBox.configure(state='disabled') + +#Check if directory exists and has write permissions +def validateDirectory(directory): + try: + directory = str(directory) + except TypeError: + outputbox("That's not a valid directory") + return False + try: + string = directory + "/test.file" + with open(string, 'w') as file: + file.close() + os.remove(string) + except FileNotFoundError: + outputbox("That's not a valid directory") + outputbox(" or you do not have the") + outputbox(" permission to write there") + return False + except PermissionError: + outputbox("You do not have write") + outputbox(" access to that folder") + return False + else: + return True + +def unzipper(unzipped, destination): + with zipfile.ZipFile(unzipped, 'r') as zip_ref: + zip_ref.extractall(destination) + zip_ref.close() + +def un7zipper(_7za, zipfile, destination): + proc = Popen([_7za,"x", "-aoa", zipfile, '-o'+destination]) + + ret_val = proc.wait() + + while True: + if ret_val == 0: + break + + + +def start(): + + #Clear outputBox + outputBox.configure(state='normal') + outputBox.delete('1.0', tkinter.END) + outputBox.configure(state='disabled') + + sysname = platform.system() + #Locate 7z binary + _7za = os.path.join(sysname, '7za') + _7z = None + if sysname in ["Darwin", "Linux"]: + #Chmod 7z binary to avoid a permission error + import stat + os.chmod(_7za, stat.S_IRWXU) + if sysname == "Windows": + #Search for 7z in the 64-bit Windows Registry + from winreg import OpenKey, QueryValueEx, HKEY_LOCAL_MACHINE, KEY_READ, KEY_WOW64_64KEY + print('Searching for 7-Zip in the Windows registry...') + + try: + with OpenKey(HKEY_LOCAL_MACHINE, 'SOFTWARE\\7-Zip', 0, KEY_READ | KEY_WOW64_64KEY) as hkey: + _7z = os.path.join(QueryValueEx(hkey, 'Path')[0], '7z.exe') + + if not os.path.exists(_7z): + raise WindowsError + + _7za = _7z + except WindowsError: + #Search for 7z in the 32-bit Windows Registry + print('Searching for 7-Zip in the 32-bit Windows registry...') + + try: + with OpenKey(HKEY_LOCAL_MACHINE, 'SOFTWARE\\7-Zip') as hkey: + _7z = os.path.join(QueryValueEx(hkey, 'Path')[0], '7z.exe') + + if not os.path.exists(_7z): + raise WindowsError + + _7za = _7z + except WindowsError: + print("7-Zip not found, please install it before using") + outputbox("7-Zip not found") + return + print("7-Zip found!") + + + + #Variables + directory = SDentry.get() + version = firmwareVersion.get() + unlaunchNeeded = unlaunch.get() + + #Validate directory + directoryValidated = validateDirectory(directory) + if directoryValidated == False: + return + if dsiVersions.index(version) == 1: + memoryPitDownload = memoryPitLinks[1] + elif dsiVersions.index(version) in [0,2]: + memoryPitDownload = memoryPitLinks[0] + + #Creates a path called "/lazy-dsi-file-downloader-tmp/" if it does not exist + cwdtemp = os.getcwd() + "/lazy-dsi-file-downloader-tmp/" + Path(cwdtemp).mkdir(parents=True,exist_ok=True) + + if downloadmemorypit.get() == 1: + #Download Memory Pit + memoryPitLocation = directory + "/private/ds/app/484E494A/" + Path(memoryPitLocation).mkdir(parents=True, exist_ok=True) + downloadFile(memoryPitDownload, memoryPitLocation) + outputbox("Memory Pit Downloaded ") + print("Memory Pit Downloaded") + + if downloadtwlmenu.get() == 1: + #Download TWiLight Menu + TWLmenuLocation = downloadFile(getLatestGitHub('DS-Homebrew/TWiLightMenu', 0),cwdtemp) + outputbox("TWiLight Menu ++ Downloaded ") + print("TWiLight Menu ++ Downloaded") + + #Extract TWiLight Menu + proc = Popen([_7za,"x", "-aoa", TWLmenuLocation, '-o'+cwdtemp, 'DSi - CFW users/SDNAND root/', '_nds', 'DSi&3DS - SD card users', 'roms', 'BOOT.NDS']) + ret_val = proc.wait() + + while True: + if ret_val == 0: + outputbox("TWiLight Menu ++ Extracted ") + print("TWiLight Menu ++ Extracted to", cwdtemp) + break + + #Move TWiLight Menu + shutil.copy(cwdtemp + "DSi&3DS - SD card users/BOOT.NDS", directory) + distutils.dir_util.copy_tree(cwdtemp + "_nds/" , directory +"/_nds/") + distutils.dir_util.copy_tree(cwdtemp + "DSi - CFW users/SDNAND root/hiya", directory+"/hiya/") + distutils.dir_util.copy_tree(cwdtemp + "DSi - CFW users/SDNAND root/title", directory+"/title/") + shutil.copy(cwdtemp + "DSi&3DS - SD card users/_nds/nds-bootstrap-hb-nightly.nds", directory + "/_nds") + shutil.copy(cwdtemp + "DSi&3DS - SD card users/_nds/nds-bootstrap-hb-release.nds", directory + "/_nds") + Path(directory + "/roms/").mkdir(parents=True,exist_ok=True) + #Some Homebrew write to the _nds folder so it is better to clear it first + shutil.rmtree(cwdtemp +"_nds/") + Path(cwdtemp +"_nds/").mkdir(parents=True,exist_ok=True) + + print("TWiLight Menu ++ placed in", directory) + outputbox("TWiLight Menu ++ placed ") + + #Download DeadSkullzJr's Cheat Database + Path(directory + "/_nds/TWiLightMenu/extras/").mkdir(parents=True,exist_ok=True) + downloadFile('https://bitbucket.org/DeadSkullzJr/nds-cheat-databases/raw/933c375545d3ff90854d1e210dcf4b3b31d9d585/Cheats/usrcheat.dat', directory + "/_nds/TWiLightMenu/extras/") + print("DeadSkullzJr's Cheat Database downloaded") + + + if downloaddumptool.get() == 1: + #Download dumpTool + downloadFile(getLatestGitHub('zoogie/dumpTool', 0), directory) + print("dumpTool downloaded") + outputbox("dumpTool Downloaded ") + + if unlaunchNeeded == 1 : + #Download Unlaunch + url = "https://problemkaputt.de/unlaunch.zip" + unlaunchLocation = downloadFile(url, cwdtemp) + print("Unlaunch Downloaded") + outputbox("Unlaunch Downloaded ") + + #Extract Unlaunch + unzipper(unlaunchLocation,directory) + + + + #Creates roms/nds if it does not exist + roms = directory +"/roms/nds/" + Path(roms).mkdir(parents=True,exist_ok=True) + + outputbox("Downloading other homebrew ") + print("Downloading other homebrew...") + + + for count, item in enumerate(homebrewDB): + if homebrewList[count].get() == 1: + print("Downloading "+item["title"]) + if item["github"] == "True": + downloadlink = getLatestGitHub(item["repo"], int(item["asset"])) + else: + downloadlink = item["link"] + if item["extension"] == "nds": + downloadFile(downloadlink, roms) + elif item["extension"] == "zip": + downloadLocation = downloadFile(downloadlink, cwdtemp) + if item["location"]["roms"] == "all": + unzipper(downloadLocation, roms) + elif item["extension"] == "7z": + downloadLocation = downloadFile(downloadlink, cwdtemp) + if item["location"]["roms"] == "all": + un7zipper(_7za, downloadLocation, roms) + else: + un7zipper(_7za, downloadLocation, cwdtemp) + if "root" in item["location"]: + Path(directory+(item["location"]["root"].split('/')).pop()).mkdir(parents=True,exist_ok=True) + shutil.copy(cwdtemp+item["location"]["root"],directory+((item["location"]["root"].split('/')).pop().pop(0))) + if "roms" in item["location"]: + shutil.copy(cwdtemp+item["location"]["roms"],roms) + + + + #Delete tmp folder + shutil.rmtree(cwdtemp) + + print("Done!") + outputbox("Done!") + + +def chooseDir(): + window.sourceFolder = filedialog.askdirectory(parent=window, initialdir= "/", title='Please select the directory of your SD card') + SDentry.delete(0, tkinter.END) + SDentry.insert(0, window.sourceFolder) + + +def okButtonPress(self): + self.destroy() + window.deiconify() + +def extraHomebrew(): + homebrewWindow = tkinter.Toplevel(window) + window.withdraw() + homebrewWindowLabel = tkinter.Label(homebrewWindow, text="Homebrew List",font=("Verdana",12,"bold")) + homebrewWindowLabel.pack(anchor = "w") + homebrewWindowLabel2 = tkinter.Label(homebrewWindow, text="Select additional homebrew for download then press OK") + homebrewWindowLabel2.pack(anchor = "w") + + vscrollbar = tkinter.Scrollbar(homebrewWindow) + canvas = tkinter.Canvas(homebrewWindow, yscrollcommand=vscrollbar.set) + vscrollbar.config(command=canvas.yview) + vscrollbar.pack(side=tkinter.RIGHT, fill=tkinter.Y) + + homebrewFrame = tkinter.Frame(canvas) + homebrewWindow.title("Homebrew List") + homebrewWindow.resizable(0,0) + canvas.pack(side="left", fill="both", expand=True) + canvas.create_window(0,0, window=homebrewFrame, anchor="n") + for count, x in enumerate(homebrewDB): + l = tkinter.Checkbutton(homebrewFrame, text=x["title"] + " by " + x["author"], variable=homebrewList[count]) + l.pack(anchor = "w") + + frame = tkinter.ttk.Frame(homebrewWindow, relief=tkinter.RAISED, borderwidth=1) + frame.pack(fill=tkinter.BOTH, expand=True) + + okButton = tkinter.Button(homebrewWindow, text = "OK", font=("Verdana",12,"bold"), command=lambda:okButtonPress(homebrewWindow)) + okButton.pack(side=tkinter.RIGHT, padx=5, pady=5) + homebrewWindow.update() + canvas.config(scrollregion=canvas.bbox("all")) + + homebrewWindow.protocol("WM_DELETE_WINDOW",lambda:okButtonPress(homebrewWindow)) + + + + +if(sys.version_info.major < 3): + print("This program will ONLY work on Python 3 and above") + sys.exit() + +#Create Window +window = tkinter.Tk() +window.sourceFolder = '' +window.sourceFile = '' + + +#Homebrew Links +#Homebrew Database +homebrewDB = json.loads(requests.get('https://raw.githubusercontent.com/YourKalamity/just-a-dsi-DB/master/just-a-dsi-DB.json').content) +homebrewList = [] +for x in homebrewDB: + homebrewList.append(tkinter.IntVar()) + +homebrewList[0] = tkinter.IntVar(value=1) + +# Title and Author +appTitle = tkinter.Label(text="Lazy DSi file downloader",font=('Verdana', 14), fg="white", bg="black") +appTitle.width = 100 +appAuthor = tkinter.Label(text="by YourKalamity",font=('Verdana', 10, 'italic'), anchor="w") +appAuthor.width = 100 + +#SD Directory entry +SDlabel = tkinter.Label(text = "Enter your SD card's directory") +SDlabel.width = 100 +SDentry = tkinter.Entry(width=30) +SDentry.width = 100 +#Button to select folder +b_chooseDir = tkinter.Button(window, text = "Click to select folder", width = 25, command = chooseDir) +b_chooseDir.width = 100 +b_chooseDir.height = 50 + +#Checkbox for Memory Pit +downloadmemorypit = tkinter.IntVar(value=1) +downloadmemorypitCheck = tkinter.Checkbutton(window, text = "Download Memory pit exploit?", variable = downloadmemorypit) + + +#DSi Firmware selector +firmwareLabel = tkinter.Label(text = "Select your DSi firmware : ") +firmwareLabel.width = 100 +firmwareVersion = tkinter.StringVar(window) +firmwareVersion.set(dsiVersions[0]) +selector = tkinter.OptionMenu(window, firmwareVersion, *dsiVersions) +selector.width = 100 + +#Checkbox for TWiLight Menu ++ +downloadtwlmenu = tkinter.IntVar(value=1) +downloadtwlmenuCheck = tkinter.Checkbutton(window, text = "Download / Update TWiLight menu?", variable = downloadtwlmenu) + +#Checkbox for dumpTool +downloaddumptool = tkinter.IntVar(value=1) +downloaddumptoolCheck = tkinter.Checkbutton(window, text ="Download dumpTool?", variable=downloaddumptool) + +#Checkbox for Unlaunch +unlaunch = tkinter.IntVar(value=1) +unlaunchCheck = tkinter.Checkbutton(window, text = "Download Unlaunch?", variable =unlaunch) + +#Button to launch Additional Homebrew box +buttonExtraHomebrew = tkinter.Button(window, text = "Additional homebrew...", width = 25, command = extraHomebrew) +buttonExtraHomebrew.width = 100 +buttonExtraHomebrew.height = 50 + +#Start button and Output box +startButton = tkinter.Button(window, text = "Start", font = ("TkDefaultFont",12,'bold'), width = 25, command = start) +outputLabel = tkinter.Label(text="Output") +outputLabel.width = 100 +outputBox = tkinter.Text(window,state='disabled', width = 30, height = 10) + +#Pack everything in to window +window.title("Lazy DSi file downloader") +window.resizable(0, 0) +appTitle.pack() +appAuthor.pack() +SDlabel.pack() +SDentry.pack() +b_chooseDir.pack() +downloadmemorypitCheck.pack() +firmwareLabel.pack() +selector.pack() +downloadtwlmenuCheck.pack() +downloaddumptoolCheck.pack() +unlaunchCheck.pack() +buttonExtraHomebrew.pack() +startButton.pack() +outputLabel.pack() +outputBox.pack() +window.mainloop() diff --git a/__pycache__/new Main.cpython-36.pyc b/__pycache__/new Main.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..008b6de54e7272a22b6abbfceee96b361a3bd450 GIT binary patch literal 23085 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 literal 0 HcmV?d00001 diff --git a/chardet/__init__.py b/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/chardet/__init__.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +from .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __version__, VERSION + + +def detect(byte_str): + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError('Expected object of type bytes or bytearray, got: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/chardet/__pycache__/__init__.cpython-38.pyc b/chardet/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64cdb1ea3f3df50b0e74a3737386ec030f1ca3db GIT binary patch literal 831 zcmYjP!H&}~5VeyuNdqfw;Q&V;sl-+l>;Y8>fp#l_gch{hA`wNTZsK+WNgN!v+Lrc0 z`H-zRap52M4PUvyFK~fz+Acei$20c4nP<=R_x3yl^5fU{cXw=rero5s7~njGRXze0 zqZp?s!#>Uo-@w{8QZuuBtFq0smf60YIlcqF71zEX-;M1v)O3DhfHw_gzJB{atA|aj z8vQ((GEvg>m`N5%E+F7W80xcx=V7RvH{H{-7q3ntjoyi7RD*Q{t9%Yhq6Lz8Wt8p8 zGQheg%@|)=vbI1gyv8g18RxFV+FK%Nuh0@N@TIdrYm518N&y!wuYz<6Dri<+gmBT(X-E$eY(m+`31nhKa>6cXmgKCp zfyr61iTRHrgMkK>g8|`U>rf%+Y%r)W^TX~%0pG=9!iVp{sJQL&lp3V*734k{bJ-!E z+RJ8Lc}bb%rKCVa)vrQSt*WN#JxI|Nf(vDjxX7qfmS!g`_+n*^7>iXcN_okkORmOf z%F2zmz59kl10w&N9(96#2`vmh(3EDuv!Xbrk_In%MAM+hvLYyw;-F%ZrU%pZd^i<{ z^B_8>0&-pLVVLBJ48vA2Q}(9FUET3pppfHX58K%O>zXd?9u~LZ^aLJhM?5R26naX8 x2}(64yD{5Q-8{+J&Y94|Bw+SYm85#bHKpq*_i@JKNy?t+GNq2)$2al5`45{g=;r_c literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/big5freq.cpython-38.pyc b/chardet/__pycache__/big5freq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48bcb5629e502aeef873c2732190e3cc8ec63a4e GIT binary patch literal 27160 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 Vk4_cyg%{`-et}V9M2`{ee*h&tr`rGk literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/big5prober.cpython-38.pyc b/chardet/__pycache__/big5prober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e44c731a856d7048ec8464a7580af6c5c41a8f5 GIT binary patch literal 1115 zcma)5O>fgM7`F4(tZK*DG~mDqPLX|UZ%t#<3A z{f%+lh5x|ch{TBt`~^*i%8;h#Hja5#fvAf`~xUg&T#UF(94r2L)Fh zT0H1al}&bMR(4Og9!UFMPexM1&1!cdl59M%+{!+WPm)Z+>7(6byxmKT)yZgTlS#Id zaWylEfxGtZ+r4cz=(GO2-kbdx0{k)Do1NJLAW1|8iJVJvOa&FrMHso#6Rz+s$bv>b z;4*8#!6orXgjqL=CWfz4jIn~-ff)VcG|#|TV(B?qI9JXmLWy;)w}3tKZLlD)HqOaa zh&O_OUwY74Dtt4|rPjbdDMH4QEU}Dfbf|qiTZ&6Qm`OGEqgWR;78pkw=292FmPXoZ zT6jjPV_26MixoG9v1{`4u=`?oWTZC3Q?7VA+{yDEw|uxiiMbjc$}}J5NxqR}#&V@L z&YsUlXL@TsjG;L~+TZI4XvoV>ZRRr_LOxGn8U%zc({_&D(nZA`OY_;-^@X zpg@LmPOmhn_};KVp!h%|Dra!s4*btpMgWg zv+-aywGt6@*UGf|sY;0z nD`kgkimF5wfENRbLj{(uYq{JtBz##F`06nxgd%9s@^OCwSLqEM literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/chardistribution.cpython-38.pyc b/chardet/__pycache__/chardistribution.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2f288acd5f555711f258fd1261be0dc6ab6e4e4 GIT binary patch literal 6201 zcmcgwNpBp-74CHwuERxKBv~3Qur-0D$g-71acprDMOzvwLlUtYgd4-DCN<(LRCUv` zCM1Hu3Vg^9a4tzCAQvWpklb^KkpTG%NuM0#k~#UFi}QWe!{H1yLnw%>9@Oi4wY+)t z>Z|u&^-6z#kA~-qe?R@`FXuJwUu0Sz3(R#C|L-6|6M9K2>yBPF9HVSHrp`8_WR-2l zF2|f$Iqt+&n^{VflTNbS)>@h8OSl9oAE*Ri~e8BWZt%q;)dow+%cbC(z08@ah3xr@2kxm=iv zdX}fAZ_T+&3(j1aZnS)OXJKaQmOHz!w47U*URhpP%(}TLyc+V}&vlcBoSz&nI%+sd*w}juOPyp5u)RgpDaCh{ zRKRYuJqEbzDE=)FPjhskIfl?3Qy7jVOve_M6BD+GJ<^=Gh>HZ?fQ{(EJ1KfaAKpEp zUku>gD+Wah?>;evtsf32X71+YY|#&7acw&&Rx4ALeCeTI^ottMzwvbbpS97aU%k8W zlTlV5y<0b-LxF(Ve^{r6GbsLL5TWg8ZbYFe>V~4GqL!lej`leAMB^b?()RRhCLWHs z1!&?1Rd-!__uZ-#o(y~4Aiq}fT)$ZJ!sEfitzscxaz%@}uFOO0&~`<&;)Q*fA7BJU z`IxOlMT{*y-wXEi(DJ>~`kp3VfvW#;X0ENS_@4AvH}j=@d39=QYc?O`S8rAEN2|+T zd24m6xOK5u@gcT!@#D+2wU6anwN=U#UeNw-QR~vy!!Y5x#Y!=7-AlC00ElMB^q7sJ zezh|*U2K18e`a?>k3pKym7xt#U62~W#HL!c(`v2hyxK}nzMd|Wyu1YeFpYHt-iJl6l=#peu(17Kr{=w8?{qiHCO*!AV~HfI#KcpA0MEy1MF@Z zaugWQcJwFuu352!v1{&_!rZjw@(z%9PZ!pA0V`MEF?Y0k#-=8h1yFMjqb9XYt1-%I zjIu-w3y;^%u6v$H=hNJtd?D~;`avI(4zP-LFz(iXe+QDvRi0Tmm3)Gr$96#Ve}c6p3n!3 z9(_Qsz0%c$oY%JT)VOKEWiYS{wcq;-~5A6qv~nQip4O`jmOMzs^# zuD-)LHf);R(bWta)-!4sq!(<DR}9%ybps`D{1c&pu1SvNDCYfWw}i3 z065{;?S<^Z?Umc^?9}pY@w{&yy)@&GGTFK41*+ogbh6%-eIJcBBB1`J>u+;{* z0|yFlwf-=OW{m-OeXyMMbqp4?%-U;RE!Zxj&6aK6stuq5aliFPgrXLanDp|S$-R> zVb6L|`Z&OFjV*hw7IhB&pP)pGvJ-HH6GrV^_eC{*@m@?)efb8-6%u723Jm)j_A7X$ z(!LE9#IACj`eW|MeH5R@Pw0IywMPXoZI9XD{#RVRpZi8}CEtQx@*NVjYMV8l7|D1X zp(@TAJ#6Hi)Y1>m8K?amIDO@WOjYyV^B3Tr_e#@27?bLroLXg$3gS2>|DY6~B&>zw6(?%L#6os%c zqjt9IvY!J;+=bs!Y!gUqc`-m*!k31Z0Hm8xI06!Hxe<^CSyOI^*Po+-^aVy70#Y~4 zI|GS9(L|x;dKsMsy8-)&u`;Mk1)a#N!*mI z9XhO@3A6x^y|{-~L=tt}9Ws5b5c?T)sQ-rKPb6QGd_}@w9N}!9>`%!OXBqn-i&7p< zPP6OP{r(7yr^ucI`5TJLn~B2|GQ^ZVjN4@&FlixE>}tK|z#}*F&lKOpBU@ew9+`%} zcjqMl@(wiqe*hVB{VH0tCf}V^?~F*Ik!6OGn7u}bJd}JR^r__AR>^nAKv;i_$x*tb zG9{HWH3K0&;qa406bR3=*1>6giS|b9YstF1tmZioLhJs6GMfltOEz;dOnTde-~qq7 zNdrxi7LXjJdN!r%Q5mdCUYWOsJsWHMs;jzaa;Xv+<}P7k4S`T~r~sv66T?y%zgP5C zyYe^6)uh-StFGPi3W2&fMmI5LB=R~5cR~`%lG?V|Nm-01D@?o{U3lN2O?}3`QKRv* NQVXdO^&3k~{udD5_(A{x literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/charsetgroupprober.cpython-38.pyc b/chardet/__pycache__/charsetgroupprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..576a5e6899d40361155eaac2fbbb0e0e8a5cf373 GIT binary patch literal 2232 zcmbtV&2Jk;6rY*>@Y=D{5YjfZNTjHUE}|7wNPMVJN=qvc7}O*e%P`t_CdSVCBQxtr zHJei{^@PNMKOi~w(*J=o|H0l67kc8(iQk)bNK$fRllT1I%cU$++~Q*%8iY z$w>C*WUoQUSjKbqSoB5C75|CC7dew&mx23=c%T?A_nHWBAx(x|x!p@MZJyJOaaaU) zGSFODQJ7cG!CWk2UyCAy;h6tHm&DjB`s7sAvAgM3bQPXDZIq!wa+nPCQ|^2(-97gC0!+M1wp=%h(0S|g>1$_rd-A&f=d@XY$+_F+JmexG z=ueWaHW#73=;bQbJ_Nn!d z<2P|DZb8%g&HE044vcZl0nRMLyTaerS{VXD5#9f0vw2T`u~8N|Krd#x2%Fz*$ge+l zKrKS)7GuAJXSDSw(^xX*Wn5q`6LS?mF8eE3y92UU!I*=o08GVPsyXNqU&Knp>wJ3g z3_y^Rr+`31hI+}R`4VHyf2Wd6~&P_(mZIdE8tgo`@(gmkFxxXs&tCfRD`OvC|f-_n_s2#F>I!`+R?SK|?|IkN=h}_>{=4S4rw3rXl#~YXu_Gjh6 zHY~xI*IWb{EdNXWDqft_?@oTG{v0^HA}B+*WHJLyzlaTB$$ z=1Szdg86fqO1Oj~M*IS(oIL2|D`%AM^r(n2L>B1tLX!fYmztD=k(#6=*QMN@Bx$+h zhPoScMT8-UFH`oYjEh1t1go;28}si>N2jTjC*bF1rW=>kk82<|E+f7e)@#6Dg(zBa s)3_N2MWFGCvt=tZ<`ZZ>e(B5L&YigaUx*jctulm9s4|v})p_0f2O~V;#sB~S literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/charsetprober.cpython-38.pyc b/chardet/__pycache__/charsetprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ccc5601dd63440e99e8634c7ad52bd1b59cbd6d GIT binary patch literal 3464 zcmai1&2JmW6`$EJQ8Xnxa_lrp8cdo`Hj$d5MSuvdV^wxz1A3aR?D3sxz=)b zJu|dJfAa=g;4L^`DD`{Dg~>j{}Qq@Kc|_zzL@@X%=tVq}<|mZ1wD>P01I8JKTLjxGS8; zcGKl_m(;!Iu#4};5t3ay&?HsQe+9F@#%RsA&bNoENU}!a%zrt6{db`A%qoHIoPDXyz9D)SEDHG9o@1Q5dPVj&1Ec z#ktGLE_p_G>R#^o3cbzG#X-{X+fl5A%opOc(}6(biyfi2VGgv4?)8O+M@gi8{{!^RgMm;F{)U%l0<%703-L@R56&?* zCN4FYXmTIpU|}4j3xv8YF>v|f^&5>FTa8;gUr5yPj7nrTz7@kVa=B7~aUa7}nefx$ z#aS!N_m@mSGmHtCwWaDp?khk#t)_-i0YxV8zbmy_!_`@BC)r-ghyS6pZW-@#yVY-> z*6p-~;D0D}(&5UiPW*hfgBZIJxnD+?nrO;-PP!)lJ}os_r(V=3f1yf8#MQfQ%(YZmWK)PUWjWIvw^)1p@tU)am-Iffjz6#DhNpr$R@GwM>Wa z%o;j($BeybE1rn4cMm3-JSK-!(_^S#V6$~-jjZeB-nBz}M33!}jfL~?*6ZXcr36;6 z#?_%Sa*my+L~V~8?i>)g&0V134k#;>Jh(hEMYaDKfTGIA&zFL6(T)Ku7oj6imHlZkXH&`2Pt~KwK%uxbmDhYIyCPBQxW|j=$5QM-0 z8^1qV`{5tceZ4>)2ni}43OUeSC~-{0O0c_M6&l9urJhDtfbguZ89<~hBnyLtwa}Hc z-|1?mQwGVTgD7DEgR&PDu02X6SKxLW^&%~JDXukOg#~JzHM)^v?S2xX6AX47C=^$m zCiosB4W#I9pr=Z7DJvF%(kz9zp5gsE+XNwKUexKQeFgSC=ws5G=#T9v#RXC@DY7^S z1&5p;mDAoDobl6&H7EfStDM9Sn<-8J~jD@DKs&s`Jm+`(7A7(;Y@wC^-RSI2mpiMnt0 z{uwl?%P^4hp6gNTg=1IfidUl-s6%Vk@WZ*log-)ly@=crz2Cy3Krg3<7Pk&<4Hx?e zI*rE^5S#!W$p~=D?bnFGtUGc6tCqZi{7DT~F05{H4>0fY1wirY$UU|J)vK`2K5*pG z$WljuYLo=XF6#hLc*Rr%BmK~RunL^V6HdN3<%IfI4Ss}@SDxx^q5CpXkXB)u4G{kO z`v9r^{UX1mKny`*La_r1WZlVJ9j8kvY*H9lkZ^{T($tb^c8)=VDUBHiMdgtY3A=Lj z1j{txHe;1S>K6t~GV}kdhuqo9|;bS6EWH`Wgb9d|3trNa}4Ao0BC^v;!8e(h$4Nyd^m-6=ax1ppazb|^s z{rzc-{vz@IlGyARyj?Zpm4^H^k`a450I0X%4ZRUGl5oexB9U+7R|Z4fD{i~rAcq$v zz79IMlS%O~chIQ30?9BJZf}g?_9)U_e|$6evCvrF@xE6mlGHpvm}6alzX~*k73$a* zteU-IRcY0B;61F*#oj!rb?A%FOZ>MZuljy3<^34D-kR?}=m+t*2VU8|`PbWxtve0B zar5>KSZrUH=V6P)b|9}n-k**P@0OqK&;rQ2||%^n0r4ZoRa1UxeB) W&C`@ut`z=W#d9@Xc7;|TkpBhmeS10p literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/codingstatemachine.cpython-38.pyc b/chardet/__pycache__/codingstatemachine.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..223c700c9e03796811081bddeced7f76664d3749 GIT binary patch literal 2891 zcmb7G%Wm676djU!(6X$id7uf}6w@w>2u*|lEf63m+N4R^P2v`|(}f_E7;{Dv9g0+D zMow%vtK=KHPL|p9ANm{IcGLVqH|@DY(Xwo{Kq$;`p6A{<=iZ?nZ)~&}oOT!v^bu-+>j%DQhLR0&i9p0h6h~m z-2+S*^>n7PSn*-5F*X(2Ch;s4nq$-f_xKOFc3=u1LcT)`@A#uf`5*0Nh-UnHs6P1SXtXR6$V-GbX>qI!G>=9V|aW08%N zfkkryZdVu>&NCY3Q?2%sd}ii5MMf^ovEgXtwL{m63zV-GSb)x8f7z-#5-rS!n6^qQ zV~J9Mr8Aq~s3^JJazNWVcei#*h}$?r0!-t4C{eKy4NaWcF%C}rr)nh9Wn~-`X?gry zOL`zh@O_acl0zlMr#bxTIuSvQ2GL6Mu`qmBDbOKRW|Lu}WUut>(SypZxnG$~V#Eo# z2i}RN<&!TEV0S5SPP^v-a85H-F-*q958;tpMp=px%t~dFQ3kPG*g0v0JqrbfX?2$K z92gqMG$uiq90wts z7Ar%HojO}d+5+-^mD`Ra^*l~z2r^>!EL^pV4|P5v6%2w!!vgZq4M8|$OxAN-V;?tP z^-w!NxrbtIqB`=9ScIDwwdZPIGPDC*dtJAUH#FWnVz0wD%)(AfR?&4i58qoxa zkQSXNo@pIX07Ou+>QnedsmhA=a^8h^(M+DaE;6lG$fqNr%lEJo_c zb7i}JQ8OwX7QUIhW%?Z4{d;il_TaHm+6BD*~^BA2Ywg-`~K<+E-g^!+R{k`CcuWw59qMDlzFz=(Vs7@=~SnUeC zh|!POi@^2kn5T6Jmm^kVdo|g(g`+wI`ZzZ?i}g4a#zdCBE-qGzP8AE~V9_pD3~_1Z zx>$EA%-7Q~yA55(%hBR^(if@QpsGppHAhw9#YM|Sor5b{E({%5NgxG`W3gyu>bZ^F z)b|)PgvWx8*M_#|{Ep}UQ}fSx9q;h!3VIiN&uC0KJB`UV;%A%b3utyd=cvAf_Gw=( zAn;vA;0qBEG02ghv9411ixn=c*mA~~<9MV0Tuv)!?Gm=AQF z=1H-A!m%&^%dr*v-p9Kz#XpOgK;Cm$Tg93F9237ByW+1*#0q7zyRO%S6on@D8Ta3-mFf$FNZ{)^z@HJ-Z z#=e3pZ*-yea=*hp2hL(L84;ZK&$q|gC*-4l{tw0H0?+i2M0zDj2#{w_(iPGBk|k97 z2?HO3B~1npBw@Xa4#k8)1pbffC!zH2NgQmkh1|t-%TTq4nBT-h$4qD3xCL#BrcR4` z**G?PIO=hXq17&2*G1k)a8V`}$^-hlq?0!TmS$7 literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/cp949prober.cpython-38.pyc b/chardet/__pycache__/cp949prober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd70d000d70847baeb3a0f2da6e686014c97d6fe GIT binary patch literal 1122 zcma)5&2AGh5VrR(+me=2C<2KSoGNJH&`S{lN>XuXQxGASRfOfN-FAg{v)E3hM7^a_ zU!xp*;T?F5y>fw9;KYp6s#_r>yt4hx_-Dr7eA`=Cm?zM_|NQppRfCWpXw+K(#%t)N z4TB(pDw5NLQpBF}azF7M_EnIFN$7B(qP&qbD0xdnD54W0A{kEoBo>V>S&e^DxN4PF z_qThkoe%BISe*?E zdp#UT4J(VS_nRA=tlMFockS)n6hd5U{)J^W07#NhK@#tj>{CI7cM>PQ41_O&6EdYq z2-xKfI65T(Nigq5b;HG&g-r1gmklunz;2$vV2P#2Wa^!HUkN4Fx4{%_7TRb^U~U|f zvlv$dfs5(h>Rc6?Q7N^K;BXZ)mKB+0Oyh+*MBiNM_+Td29@;CS#v9{E+(has)Y3?M zPOHF3wGZQO(J!XB=|HX}VhFbFC-+^Pr zi-QqAkWXttuRZi~!)lCW#QYem<{8U}Vx$l^8T&HgYPRC2t74!Mif_mIHe9P$V5k-@ z>Xu5SKnPa^EaDbq!D;0o0E2&UOq;O>#Cz2FQBq5;Y&Dt8l(Rfj5|r4=eD-HKomDsU o!3AZr(rPS86@k})>QII5>RK*W6^UQW9{BPBCWJa@Quq0P0E?jvV*mgE literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/enums.cpython-38.pyc b/chardet/__pycache__/enums.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a457ba92d2f07c1e45806900d3040c4ada44006 GIT binary patch literal 2629 zcmbtWOK;mo5T;%vMca9}#}?=UeV_swp(uKCgTi{yHe;DGB)Vt>q12kYmY7havP(Iz zfS!^+(@W32_HXdoOZ6A}o>@t@6FEkLtT3Y;?r?W@9^dd}Ys=DL{PxE$KmMd^+V3b_ zA4L#$f#e7n(|X#z#&RtGQe%0Zdr|1+K`yW&$VDX=KrS&IWL?QckPT*nY$~|~a+z5m zTT0eJ-e8*`Zz|bfTV1VkXC|y#6p`eNq$5u3csiCaqbZ?+ld0qkB#}&qqhy*Ym0&~# z<0+ZY;3*yQs%7oaX*x>84r$Vu)FT=z74ik6arJa1?heN^jH*F0u2=!w@RgARX%|R- z1dMCF9Na(8a=ik}_lm60E3slvXC<&#&nzdNOw(>kQ$Fij1co;XCE;K>5qu)Ja0ecwi68-3eacA~SJiHFFhQH6Me{r`w_;?b@5gk^ zeLu5&f1I#sg!4_`e>SDja>ej{mISDBeA2P~TDRdiS=sJ3R?`D#|G=+5_UxZEu?ZV1 z_Gi1X(?5}5QU588=(t~-Oqw*M{Zi^jt#IfaWd(S271_mX3(va) z>^_j(1_mK1Vn|j$GpE+qg7YpVv3V?#(=Z+`iemq5U4K~=6L_7k6@tM0xNuc#gZDnS1RMx9K}xrn_y=KeBIh$A_>j0eUq<@#*_H;fMyKFy;#A% zD=*7(yUU+Vc^vRo_>@QCC`s7thud8fU20-epahYI22j)FEQzAzIpmoFS3uhHFquk{ z#Lxr~hhKBj91RaJk5>cdNDUx~waRh;9{JhMj^OE3#Bv9)oD+aDOh-8Vnk@kU_%IP6 zpm-Q70}%46;x25X(yWrp3PB{Vr5qMtwmsyj51Rhf2H)cGnA}=n_Sw3Fs_SpK73;>_ zH(h(b<~iTnnR(*2oI|_yIMbK^=5f0V7y@e>K}4k-b7+!Gd=AH6vr%;dg%Y2@!q-3& z;bH~cfD-w9PT*Pq^vXa_?gGhAf!&rD3-|_4o7w%wDw>UjKQCs#-kuIuJ@m?f|hDMAw$g8_l2eU(cX#593#2h5vVe33%s4oSqN`uK=R zqwRW~c8fq`50Y4h4B9v&6f{!E#AT!Y5AHqx7ui3^{zmo}Ft<{^FBrL%iki@t_kn|Od3tVw4=Ayai$>|gLxKM3Z k!Mi|s6Ik9VmP-4k12XgB;``z|jIKJRXxuB`y9)&Tf3cW*K>z>% literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/escprober.cpython-38.pyc b/chardet/__pycache__/escprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f746bb52da9fc2c792523d5cbbd2942b83664d1 GIT binary patch literal 2614 zcma)7&2Jk;6rb5$uh*YROUiPO4GoG4BaS{a7T&iEtUT|2Yu zLM-Q$NWH)vaY`gEx%4mK!oRUM#D$)?bK<>O+esRbnAN;_`{vEZd++z&JS~;-1ln(Z zzWgSfBjgYKIo}NUc>q273J52h`XrzZrO0c(7U+(yc-=RGjFSmW#|*MgR>=(C3UW>^ z$UFI<;1q(QQ>5e};Tdio5pD{4s5>Q|ZIY_>io*6)nv|Biu55~UQ}%a+1VLrF&wF8~ z8N0DqcfD>e6jePbueo7o=yt?v&yR&nil{$TONtXkwWw+&g+~r+uCw)xmD*ZTsW&(7 z-Mx2jxp7(cc=NLC$<|Ef!5uF&bPl%YOCW+cloLne)Y19e3(}@s=f+XaF%*wRTTVup zJj<;ka!8#l@Hw7Wyu}N=cto5WFYz*r`4_|>P61pqpUl@H?}A%KzvgXd+udGdUzo6m zk%(;9zUB3~up_T40&&ZB2Lss$*V*m9w7H0d7lW&85rP&l(MM{x@47;Yoqb!lQP1DE zrSSTlus3pdd|`{oa|gnP?zQ*rxGN%9 zJw51-nr(QRa#~7|M>p!wqhla3iRqXeYP;H)a{416twY9y>0`2M#F<_50g)@f>&MyH zigSnb1T<#<`Po0}7C`sg*Z|qI zN@7BYM93vNL1vLysA@f4+FU|inZsZ6$;MV~sUb08lQ|cn_*}r=%Y`<>Dx$C&54QN-9O`MbG%zx6Z{GHN|@ zeK%+=4F)T2?6%hWp6j=^MKEX$dV|}&5O(za+t2TgcAm>mMlC!Z?lKzzJpe#R=R1Ra zS%%Ah2t9fm2%!~f(juLQ4=HwY@{O*)4*NS($9h;SrVRmvep3K?49pZj#~OwVL%c%1 zUOb><8r|Gm;4m^{Ow-xDg*by6hX6Tds$gdowI-q7uI6M3HdUdOi^xHhgjl5RPjp{| zaskCxkz4~()#P>LQBS^w1WlDUkl+UQp+^-UgqCTZ8dL*|^I*G4N7pXdtip7`U^E{4 zGW5s<0tNssPif;fcp1^_h3ZiZ{05{)nfWrpj|sQfuLce4Oa3nV!W z0*}2(U?*IkhxKL9C@2m6xOjpUtOTc(VVrw?&7Of0@R!k8m58BN(BX+mv3e8uBp-_J z5N?E8kU@FKB&4Rw zD+_8#Udb(5(MDG<1r>Lw(nht26&rH`Dt4Z+pwEXs@hOR%E$uh?K9%HJ2sXR_B zsA^F4<9+!aTBA(*0J)EWB&A6y^@Q)kva@7VB|%jKd@gXQssMtz4o;Dv33Z`?wnYDo6V*q_WSG0aW*z4NtW zY-TGS$?I?0xfgMoh}%wt&2JvBPF|QAE6luhH4>esDth6~>q7DAlOm0m08lNG*J!$J zAj@hE(1Af{#vwYWJvcUL+5*INMY;BSWVQ^_b7{4Qx`ZYS)H^&uhb}HdAXkTRE7I}c za(v>O5%_Z}S-S&p&g*a5N#-;MlgL3n8R??hNro_|>CO6Hp}1Bo7D~I$+wFKzbXWp6 zyx37t)D8p7Fy0MgiDZ@#z%2mO9`XXN=0F+#MI#;EomL)J&U7{j82Qi9JD-YvyKMMk z=!4R&eVW)peFQJL;{??Jctj_ofU0>ZfC^lTo~bceOc68UAI20)r%(!S8561lA2x2+ zsJ4A<64cwxFVh(5opdb|zHL#hqPI%bI*rvE>$L`rm20&1L zdaYG0@3tE2ud8L62FXrqXK$lirCIhq3$L@KUG6J0B$@HbkP7%%7)ma<+S(s+#Ymqk z5RQi9xdOdlRNJ)?SB&(z0%5o-&~sgVmCQ$QkkFm&m7X`>TEw)PACZB&&GmkN0}W8K zdfY}vvq8H3X8)*PIO?%aDTYz_w03&%$$WO&gpVnh48%yRw$**y|4b7vy2tp$ATJ*< z_tqRcmW-l4R3%kXSaTm)%pA@L&Gcl@b(#XBOY^y)eLl|Aq^c;gc+RyrtO*{(GqMKb zUP;56!qSb=SzT~1$c4nw|D&eI8K;@JJmgTDEM-2m%?13j&eh!U%%E2<(uIAFwDvq>2zsE~ncSMe6QI z?;Q<`perhHo1Z`yDcq#UKgi$MGHK#2bsA@8kFqES26EKS&g^SuznzB;ip2tf@Atoc z{o$7qA%CK<{Fxv;fR_9SgcD9f645q|SesFlS!hIN+tj=fT9MthHE)Kw$Z0#8x59i> zXcshZhbxiWb}4y8c#b<~gge5V8to#_H%X=NmV%lJQ|_J|9QNXFGxbxU+#NqS?!`h& z6{@c9jKZ|{&1ovC$G&We6juugGi%iWKi{_41f!evgX+`0S}#du?{Jj%2Jyq#4^NX` z0+ZMDWOWdy;$^xtUee=UbI04+t<|3eVA!S4SV+kpFoLuxCvEnc98pd=J9FBG<_&HF zZwiZB+&&{y+O~n$HwQk)^Sp3I+74ggF7)}=#3bzkAW>8+T7P!40AV@*kVoa%l6yc> zlF|v8vKgBbN>U>=ryzS)YEKFDxzy2penMsiT)|0`yrGTCin5Z?P)M1FLzLrry||Zp zp0q%e4vysm4X2kx(nfimFJb8U2;vy_=WwnZWDvd|R+bcrNZ(LpCL%n7KJR%!=qHKi zy&?Y`RKMyRBtj;g6F>B$&corb=BIw=*&y)4PD@0?&agM!?!`&!hvD{%yW_(b^4_=; zz>{;4zVF2-=nse50qzV>r3<#)hL&i*rX^aS4*bU1GiPw#Ilt=1as332xQy$B^oOa=tOIOb~aSCq1 z8e<#wZ9m=1&ep25miMZZiwFVmUhGHWE^cQ)2pexKYg}IRzZ5IysXz2%c+!unc0xby zj{L4bw>(#S3HkE{fwl?lf)5=IeMsN+3%IpLo=)LcBj5k=iUIa)W=!aWZIU^CWlX@w z`_>7Q4VbZKIS&5bccA4bY!1mNE%aBw^C8VV|NFVCR~KRR5sa5U7+-~PSD#;=lUL@1 zaRwv5O(2LjA$s~(xN#r*wb@maCgvOxA8^-}WzdnW01LUXL6F`cKj8_>>pwCJyD2vp z+L+e14wha&VLwxOSD$=iPBMPBF-Ps2Cnn10_kodh@D8gnzI8j>P#dy9xmbgj4V;H%t(IE7ae$_Pa)i!iPVF{DBd;w}{uvy8Ip`}@25$_@wJ zu8_*&;&9ZJH}IfMB>0%hZtS+aow~BKoyvaFYNG6XyL-^6c~4r(YPKHkx75`xIA<`D zQpC`Mvw~t(@E|i}qK+bE9tpuE)Fe=^O;Pz;y;ZNao-`h*)$SnmL_8REk39}qLzVQI zgZQY&MH~pV)_lCX->M$8yw>CWItb5d6-%z+X$}GbHcCZ%5G;!frwfgP)_91+<(QHc z*!U&1}_k84s*^ExgIt3~RJQGSz zdb;F22(CoMs<G^sv#Cy`SgSsRmS9G8sGD<5MhgZu=a$aIjY>&bA|6GF z_RGwJSEIv4#>+xOVjfm&+3Rcfin9MPboGN`hE-;%*k$$4?hk`FeVG+J8;(q%GGe97 bO2CD^7undkpJDPfR+I#*QyCp0`x*ZNHakoB literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/euckrfreq.cpython-38.pyc b/chardet/__pycache__/euckrfreq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f1e03fd8e29a68b7056dacb11049349b57cf2ff GIT binary patch literal 12044 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 OVf`LNLdxVRQ~VFms!v}4 literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/euckrprober.cpython-38.pyc b/chardet/__pycache__/euckrprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db6ad96ee54942cd1f02522d0dbbda0876cd3664 GIT binary patch literal 1123 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 literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/euctwprober.cpython-38.pyc b/chardet/__pycache__/euctwprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49170b0ce5334690858d0def79415832f638205b GIT binary patch literal 1123 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 literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/gb2312prober.cpython-38.pyc b/chardet/__pycache__/gb2312prober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3407547dfe794d429cc49707fae5e2d9e77c85e7 GIT binary patch literal 1131 zcma)5%Wl&^6rJ%aZj_c%R3s1^SP_Xi$V z#1lavGCgQ7mA)AlQfpv=lp$kjo?6B<2Gl<8EhQBy%w!r_Dc8jU5{x4hQ>jZ|OC#+i zEj=UE5zI@BC5juv*d_V(q4Od>G*X-R6IVQocZ#CREsys{30LuZnH6!778_}9ELUpd z-lwpbYA7^(yS?7MjYd%xzefEvyMzWjW8}W7shc7~)Lt-N?Fl>;E!0I;c1R>7S`X z#q;5q4<#}^PkXc3`HgmnWMYYol}*O7kr*rVTa0}kb5);I_?02x2@jiDqatk1e0qvm{tI!LzT$2*MtQ&mw01HAfv}pA>zX1&p4b=bu literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/hebrewprober.cpython-38.pyc b/chardet/__pycache__/hebrewprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..749232ac747d899ccf47420a37bcaec6d6fe30c8 GIT binary patch literal 3004 zcmZuzTTdHD6rP#AuwE92Yq&O-syA1GCTVC%(xxTg5UXG!45_rDT^Y~X7>w=A8d6+G zsuZO3H{=PVzVH%Nedv3o{)&04`chi;BK7i+7kbXD?bwiA?KkJlZO_bi&Y4;1>aqzu zKm79S^XPko{ESNLql5A>e8D9EPB<-)E$UK=GApnx&DAKGBV6P99^txAA8W48jTDKQ zM-+y{sO*|qPm7daxhG0%zJLk`rF=1$s-!D^20FDpT3rkFLGX!7IdK`MuErV6thol) zU6UJb2RB`dceoL5xi*iuo!oXE-syI6$BptX_Y9A^-A_oC@-w`9&vJWs5AWS0ZZGfS z{ZRJt0e%+Bem=;Dpd8@Cd<4p~{vaRaV|(N=b%#KHg`ZRMFv#cm1tpI>Av$qKVU-u9 zbJt%J{=;x}N56v6N53Kbj_?PL8c^pIn>&; zlMl9=ErwSX{*H9KH9reIL+wm+cv*RZjC%D!b=?qt;8zZ*)C0eeg)-uKnL;`UJnxV^ zzdv(hbtUjcu)3Kpq_% zIQJ{fa$V6C{&J$cD|%tQPjMf+0SJv!v*oQ0w6Z(V*p*XcFc><6lZ*jypu!80at1O} z2!w#cXvrh!LY~tLFE8s5Y8fuAe?K$d6b3$zJV{W00`Qro3z^7W}Di)Oe1=* zAIeR`aCJ3hSPe~rs7euml`$p;p%6nTYhn}%*;OYxbZY5@JcZf`+hh-L=53X@UjUjh z!h>fpMSyOEmR8TTS$V2+1}$tnD4Xy#w-PPh0B_#F671g4;M23lrrEIGkdZry*d`ObSf-$6U#rmr`iR!(Ecxu~N2~_98QP1; z3rL!H3VjUF%mXTxYB1qO2WRhtBYGVVunjVgY6BVCBK5XN@lt&T);7aaHNTp*wKvWI zUaTu$HXmF7>ueQV;v(2B)XCEc84XVuf$NfHa&g&Ph|7U&z5sRJdOo-At?gEPuT(7T zhM|XNTo{QeFt4DB(J3Rd@#Xl;aw0j`h!9H+4JtxvnQd{B4?XMq{6`oWya7N)9cD6{ zS=3^-=CE$+Xx*Ak?PEsGW2QwZwCL5IHkNRPwlssQz)!LB1qiSQDl&!$vH=>~G{hK` z8t|m_PO?eG1k~ur+=j7l9$?vlC5!^@K(jV=LsUvh~E2&)Jl7u zN<=c6gM^YP6|;Hn7c;&}OtKf}URa!s&o`%SQlSp0V0%qkDh+{jk`D(D0Zcu`^p<}N zmIs(%iSAGvQj|kY4H!7qSzXgDNU+uRsA-*{jTiJa{1h)3KAeIlvZORaK0{kxlGUYE zNEdV4>6||T;{%lk*@+C(=yB?g&Ak2={1MoJ3|V0t8bso&$khuCYf}Ue?qp%UH^Y2? z6$Yx%5bvUdnMzC|yu?(2ozJ0_>b3|T>l`z7>IhQd78}Fc18y|j9&8VfhV25%j^{mq zD?->JUdLaJBVdS#34}Kh-a)`siOUEv0O{1zpGw@~I@W)Pa1-GM0-oaPm=v#}q#{|x z?-Z!gf|CjEHkDoRF}B`Dz$MA9`VAxF7Yd%&;x>4W3w8D)rC-4pTm!I}PEWmtZs=Ig z9NV%j9p0#QlTmvFK8;azqe{jM*;V(U@R$@xp)~yB_Er$`fPZQ+LEQn+1ZjN`ZsIMp LN}a3@bu#}0JZ7sJ literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/jisfreq.cpython-38.pyc b/chardet/__pycache__/jisfreq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..395b5e0fd4dd63ca22b6d0f67861ff58affdbc00 GIT binary patch literal 22116 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 literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc b/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efbe4745370458cf28037db50e9fa9e47e39fe91 GIT binary patch literal 29077 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 literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/langgreekmodel.cpython-38.pyc b/chardet/__pycache__/langgreekmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f893030aaac3077272f27fe2de96bd85c1d53f2 GIT binary patch literal 23571 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 literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/langhebrewmodel.cpython-38.pyc b/chardet/__pycache__/langhebrewmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9462472e4923d779b4283d7803c5ee08e3d5fdab GIT binary patch literal 22198 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 Ta~M}`TJ=z4^@@oLf1m$1b^(&| literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/langhungarianmodel.cpython-38.pyc b/chardet/__pycache__/langhungarianmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c92175b593ff0c3e4df8fe9716f29167ba01627 GIT binary patch literal 23602 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 literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/langthaimodel.cpython-38.pyc b/chardet/__pycache__/langthaimodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8aa324914196f59561aa1392c4239a88a63253e3 GIT binary patch literal 22177 zcmeI4S(Dsl8O1w$L?Q+d1rc{m)L=wJMTB4wMH5hyh{lnzNw>+E+3e{=Nm=Cw@GE%9 zjW>EH;tqG}mAj7nPOG@$7S}!piyt}lzU{wf1FVGN@GR#!?|Gi?NmVY$p>5mFX$^nf zbKggAyW~Z!)=!i?{MVLYvS;}3!ev9~v<|mA>khB$wz}&&>pL4d8#|jin?Jny@cPb{ z1FfA~ceK{ET7!QNnZ04q7zY13lf3@SbR4M$?+*Sc`3)-ugMUbB<2dlYA0K>ts5f|z z;JBb8xJ&Q}!QFzc;5NZ01)ma33uXkff;qvb1)mXoR`7Pgq+nj~Ucu)CpBLOCxOWJn zFErRA-s=T733`Gz2o?l=!Mg=-7JNZ)LU34cRB*H4ErNFmz9@Ky;1vQ&{uD;U2w7B`GRW&PZwMz*d=(J z;E96uf>#U96Z}?iuHXfN%LV5Po+Q{O(9go)HG=B|7YWW0=qGvb9Kn+X+XOoVPZc~v z@NB_b1-}#gUhoIO9|aEx9xu35uv73f!7~Ma5?mp8u3)o3zkdz(3ib=0CwQme&w{@Q zZVEF;tD1h=*`h zYVf!P0B_`!-As0BaEd%+W~rfEjY64KF;1;%guiNp6b})(8?&z2EuC0^7>iR=Iyj@*p~wbEToX18hzB_gNQ8r@RFH5}P#M5Lp;=COH@omOjfE#Q=h z)HOeZE7w>bDQYIi`W|C8x=t+>v!lI)HAHE+7Acjw<1Ol;nY1ZV@9yB5%jWMV01|`zcSk%0XYvGw|1O>7uNd36U zZiHS~3reWab;GkE;09fyDvt@sQ5!#vGqJvH&}9YJ{E)YF8eLB3hEpaO3mz(r@tOtP z;7J5{BPJMgRO-6X6zl-9^)Q4#whW3>j8{`r0F-$xR7`Qr6q|&C0HSn>*v%6LYAYD| zNjv2R5k<-b5fq$KGtb~IX{iRq5h-I<_6^*13YiFsYfgER)X{Rl4g&m;YZ%8GjZ$PU zH1O;QH z(O`lo$Ot$py~b=QTA71|a$JMYmxd?247G4iY5}Ju;9xw&TGY&ohV{Zd)*>S1NotOk z4RI3NwMiOIX|RH$NLjx$2HD1g%x-=h2W%Mvp@INBtMCweAR3V;qE<~Yi87me%qcZ^ zF&n98UBkU=2sko@ha3fPjS%2TCLmj$#_C0W5-;q_f_Q=FC{oky!DFL=y0^2~;seuKfM%R&NA=^ty4;8v5d)Bqss8q8`@K!ku ze|Ckn*u3h62~$>PkCjoWdR}&e)7fe125~=9?u<&QhDq}P8jebh>ixngQdS{t5RE?( zqIg-Nl(+P(rT8dN_LE#A8exdEDUXS@i0sNx+B^eMG_+1usWS%4Qst{vNt%m^e)JkK_au?TPj59Gojn|?!R$6jk0S#-XSpkUGw$Ke{`irH|0JQK)M8$VhZm3SBTmN&$$ zm|*F+3$rGZqUQ*yptyl3-Oxjz6qVj6@v5~DDDj{W!Q(>i@q+zE4O}C5{mN*tFkIt0c{I%daG}gByW-aO(jaZ)s4xqRejYuI!6ud}F zWGFQF2xA*Bj2iYu+ht4vMG;=B}OHarP>nZ8;r&28cdv}{P%y!_aWlD z=9I5bq@{@MT6LM2D7`_=DxRQrHfr^% z-?j0NQ~jXEms;Wk%kW7PSrkesX>vnrzCe z3amwAEe^I8d#v;u@lEt+S^7YOH@=OM=xCMytB_I?ll(*zffyTm!+RU1%(t4)Ru!c9oTi%6}uNV9z52b+PQgg`;lYq-eiAn za<13u_9kcA^NZW(d)*`5PIvZ5cbNBkQ}18AsDH=&)RFe|8y} zxPE^AhIYR_v2Si@Z{lEgW`1IRYJS($>_WdiJ-zGX?o+p)>|J?kLY_L^{zLzjtN!qX o89jOV{2hy1uNj6Xrn}ebuY_DUe+U~d-uS`RruFL{`seh20Cu{?-v9sr literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/langturkishmodel.cpython-38.pyc b/chardet/__pycache__/langturkishmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc0f07269c68c3020bac9adf889ff11e4ebf2005 GIT binary patch literal 22200 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 A3IG5A literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/latin1prober.cpython-38.pyc b/chardet/__pycache__/latin1prober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16c6720c4d2e66f6eee1af2a577d516faf61d4a6 GIT binary patch literal 3384 zcmeHJ&2Jk;6rY*>@Ora$(-7K*7AQi3S|SydiYTa}iQErBX;N^~!^(8J@r+%k>yONi zi)x$;iPR(f3GK0${txhH>L=Zt^(xD-x$g`Mrtk4493TMknsWkXooM!j16~~-T0I-H?|vJG`@E%d$HZ~^BUkq zZXnb+k|iLLgcK^CJs?dgs9-x@XbDT$J0!HFBOKxGkZl^ez!!vP_<|@3AM~D>5&`@c z9}t^_KE%G121}7{ch6-pZ=kRH19`j|zvMk2nrJ#A+w38GM6eT$2)7KiN93WC$>2=7 zTyaw;8T6%60c=Y>&fDF#<~*I|ag=D@fIQ<3V3V}On@Vo-MsLv7Ql*ZPiPVp2Y9}&o z!f%mhhMYep&u&&ft*<3gCH1>e9Chl8{r=@hNA;y%BZ}**veU2k+x_`=H_=fX&)@rS zxPDKaAJ*|cA@%d$*gUy!()?`yzAA&45xx@hm(VhGVGduPMCR=N8xDo2iknXZ(Fh8J zrA0NHH2`V*p)(?nOzQ@4*s>`MK*(BI{ahV^J!x?D>nmUJ>f$P2Uc0WQL8P$4)KMfe zNRB-x$M+R2U=qwy0=@=xIFs|%!1y;;F`~v*EM-BBJ464A+RFTe3m<(le=fV{kQ>tg zA%w{AZq$)6>`u@_!iICXYbUK<>h^T+ZHL|I#Zk94h+48gabG?t`xXu34SECvs|-K$ z(%Zm5c9Ic&M7QXOUMAmsxy2xl*&NxjG#il(OWP1C>o@_4J+cM8%hZB)He3j0fs)M- zY`l@}fL^eVp&TxPHRk?i88k&e(aM5qI!DD%Pd3{zBs2fEt?zKzZN=^64v(b ziB|#8)n3&U!E^?qSzPZ48E1J>tS&9qY9=YL22*!=WtCsQlDZu78xF%vfkH#R;;7ef z<*nb>64WZCjnv0*?A4i#Wp*HsQoAXo(6BE#0fbPWdN6&;{&X2~Hl3j!8y?NY82992 zi@xD!@U8;`s6eOKV1VN^W|;=GHtcPKKcGw08Ns$#_Y_KnHHY@_e+;1O%#srjsgq=j zjhJ9yc>^thcV~?Zur4gOzMFk=?bqSXB`g6mvOgb~-Fu?*3$6MOKR-QF|NRmm^DZb9 zdZ^w3l3K~2W3a1O8EB5~LB9aFdfjGQ$ZkU(1ghME)E}$Ahhz323#iQyHkTa(*ld8! zwmdpKnS(69yE26x5eo@AqR)A!Ck8R{0q2{8D9$vdDVY|KdeEt$ndyGW`O(@NM`K%ovXbuIDi7Tljfp)1#LwN7K??^=5t1w4l_H z-9abGz?*~3skL_bs={nZt;JduNexK#CXy9gB3D~cr@=(Mh2(7{=)r_*rk|l}sdq7Z n{%3E(Dmevp9MFK-%!cI4O^cD-q`4Jg|F8es`26C&Zl5Z~SVle2Sn(skkCY8&pV#kKQptl^PAnMRLTU}?|=RJ z{YHh5KT$Z{ToAs1Ufc#Eh@dIy(TGyyS;~4&b||{ z#s01;fw}jf7Xc7LXQ>b0@Xhlhx_ErH4rb1AL;fVFcR)A}>H!-Q3W3~l)D5I3va1$B zb|NIFBsi_6aR3paLLkqn0!$E9MKXirGLl&!x1blehR`Y; zr)>N1^$QMVmA`T#Jk=8FK{qt{5%RhTHXCp^bB$cD_WG&p$xKVJqExQb94wo-apH>! zkHXEfxFIlcb>d8Fpi?iD2Gc@SW>4&tu-|6oc0z;*)Yr4buLEz;$k zX@FEn$>TpBhjw)ZR&T+0^*`g6U_7+?XU62II|4Yu$S(j@um$6ng>wi0XAkC38o6U| z5OhvPz$4)-5Tw`0Pq^cFo(lJ9KePMi!S)r<{L=2cIwr^+TpOeAg-5P>dF&g=^H2!9 z#_+A1MGbxvAl0@LU4sIUt6HpUn^2`-&Ze=#GovYATsWjlmcp(E%K%1mDb8qYqfFDTXpkx@W;?0z5qUr3_6V{f{c0wGd!( zb9BK1H>LI=k zSPS5FD0AM+#UMpK`5C Un>4|l$&o(4fu=B{LptO91E_f*ApigX literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc b/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9dd9229b084f97597c4251423b866f263e244f3 GIT binary patch literal 1112 zcmZ8f&2G~`5Z?7qer%_u;YXaf2dNd5BDDx1XbKetqKY&^SW#Dw?S!=J#OyjnR5>7} zQct`C9DCs%c#Rb|F7O736Eho=rd?~s^UdyR_M2~7m5M`PegE}s|3{IKp9toc1>iB5 z`~)r{5#=PIKBX8N+(=B{)UnB}#P)3+TfC4I{i2R-UP{V-S;qzLB(Cr3xX8Vv;#YKB z;tR>5zo_FfzmhEZOO$Mr$cfw&61g#*n0__#nxt0wP2m|es;c#OfoR6rwiu4mT`}y$ z0Rqoh^$l6rI8VtCuQF}B^L25pku4WSDW?b9EnC~=-X3=aS6-> zlUv|2lF>1l7zf6fM)WhtkeL&bSztC;0jvmC0xN?#6VfY<33JEfi}#gagQ2R?fL6IY z81z`T&ok&;McHzc#zMGILzNio5BeEn0_zGSBy4mAbTA}D;G;wt9Zrubrdk21Y!S;i zs~O6YG4BcwHqWRkGZykdO2*E}-?#M#?Usy%Y##fF8ho5F{~U%3&-SMk9`~$JqN(z^6O9jH=|E!kBaD)HNtLbybY6qr+y_ zz@(OuYTT$@RaK+{ZJK+%z$3~TW!?2D9o>56$b-Jj6DWgn<575!GuE0Yuh+pj&JUqN z`p}`sGbopG!xW}D&!Be7>A*ne3Di+v%0A>76jeWWj+bVLyj1Dov@wrx!X@(c=%vs6 E2jH?5D*ylh literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/mbcssm.cpython-38.pyc b/chardet/__pycache__/mbcssm.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d98ec2032217dfe1e50a605780e58203fcf2db8a GIT binary patch literal 16735 zcmeHN>2BLb5SC<8mSoFkeB^MP!*Q%6E|N4UlANhVS9F>=hBQdft01TGOtLWW-Jy3{`KikZ7JQ*^kpcvLDBKa?uPZ5OXv z(`3q;p;KgN2+Ae)@LC4g6`EkYn>*ita&=eV(&DaCv&Lz z3^{F`B_^3>_CO9{dq$gw+7}u;HA(PG;6xwuktutuCH0tO9w?~O!E;U_h1F<(@s@Rt zoUzW+vyA&3Jx|V}-3!d_3y7FzWj9uv%o>;n%nxhm^AV>6yFmIpyA+z>5|(nB7lev6>mp^g(nWfaoJZ@I$byw}@W7|~cz|3W!(@?MWLiPHdBE&ESY4LV_pBKk@3fD4 z#9S4*?doT_7_Lr{5SegwiWB_ZV43&v5;D4}$zrD{w(fX!ic|T?1+~{syCYgE|DecGEI>by+kjQOSmVlkjt4+>PkJ#&RwanJ-nVTJm1-+nOeR^mqKi`0+gPM zIujDA4D=wX7wn--p-UgsBQR+rD7x?gtXmyjXM+Fwx2R)uM#0FS`2YC8UDcGS=Pry& zpw}TPZDVEU%bO|F9x9ab)oQMme^#RQFz*!eh1!dXJyeC9>X1eX&-0aBiS9amV>e$u z%zVqu?ImaSf_<0ymZ#~rk}3vaf45t-_CdQ+-X5Q?eHhf3#YSMheOc7eFQZ^z$3;B` zurasjSU~40C8EyWY^kRK^mA}Ha9n~p2e&RnT`Hj@T{qt<$1v$P1VXnCZy0TJb>sGp z+x+-?IGI51!!G5afG)8Cte?+*2OLXfmmH7b(72xs!sHnx5P62Bx0=EMU1) zQT@3KqX^>(tlp2Nw^o-QZ5-mW{`-FR^gUSxgo9or_2)j)tZE}E__E;UlZ7weQ4r9K zqfqpp&;g5_GMb$@d5V0z$y4OvOh$%Om-0|Rm)HQ-;XS^e93~^Dmli(N_adM*7E?>> z#};`OeOI?dG!m7|gdDV5yuF1rPYvqFJ8g5I2jQK{e(c+2`m(TG`{w;TTXr5wtv7<^ z=b+nu630x038ydLX7=Yh*1)Pmd;6^>PTx%q8`_TEU%CF_wd?O^#`JYfmxLfiwx1$3 zU!li+?_iSIm*pr3(u|JG+D9wtMoyOr|79dN*V4ghl*Np^3k9ur;tg+f^8ac!yGd$?k|XQN z7n=RqlG&?2UxMIwSn{*1&RgS<+9hm)b?ZYgHr=YI4+CEkSY}002M^WJAnCOkprQ_t zml{(Jr;3N8QV;6 zZa&?#%}n;rX4Z~A%w}@yX?qaqnXEm@86Vu)%&n!L^OcM zh0PAv!AfF}6+6vW1zHUm$IVJ~`Aa0qxT!yYaWJcum@o#aDaV3Jb>EU~qkxxSL-TAem% z6~kWesNnFx*AzHw3pflnfdhwt!yWz>HyT@DG#~N;lbq_nehgI}K!ii_W@Gi^?X4=U zRJXs*m-6N9J9~R~^R@i;+KWQIw4J5pz3si7z2%)<_DyrCwEXJo{`RIB9=_P(=YpOjyamnHh?DJH+V!FIy1VJsLSxFT4xR+#tQQt$t5M2$!!>|B3E zW5$$`^+n0*E8Hhe;P4egF62v^Zds!n<2pG zj%6)vXd+R!Nyoo2;>|Up2bk7|wa_Ir)u4Dn=YM02Xc`w?UEFUvLhm=mm9ui(PtCjl z8eAXZO35B;u{o$0tR%l2l+s6A|1c8T9NgFeTx$zZf+G>+qYhVtqt~T7mb-n&vrQ~O zx!i+by(Y0?pXpw0tIw_TpP}$_YY()-a|ylRxlfzN?ZNhQf49~TJk8}Jg|C6`&tHu> HHD>+=W*n^w literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/sbcharsetprober.cpython-38.pyc b/chardet/__pycache__/sbcharsetprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15c303d963b99a4dfb5b57240ff8319b991fde8f GIT binary patch literal 3000 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 literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/sjisprober.cpython-38.pyc b/chardet/__pycache__/sjisprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58b32339662728e8703aa0fd2a87d0ee01e18e9a GIT binary patch literal 2468 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 Ytn!;Qb9u{3_t6#`8p02@PyVI;3+n?Q=>Px# literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/utf8prober.cpython-38.pyc b/chardet/__pycache__/utf8prober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e4d81bbb60cce33211aead551ecc9d7a7f6eee7 GIT binary patch literal 1973 zcma)7&2A$_5bmBokDYN6k`+G^;;=}Ij5ZNSAhHM%g6&NrCHBgmTr5LtGTq7Ao|!m3 z;}x--QzGqcPdq?!+)Lhp7vKT<1mZ$YaOOl+kCQkHNQ~4qRXyEZRbN+qvsW&c2s}Ui ze)av&p#6r%>|=rP4UBXP1SgzEB&HooQ8ywZHali)bu4Y0ksUi7N9$Hph~17$$tK}8 zcg_iS1U)l5MP6u=ihE7rxC&L}>hnOhMfOY{?F(5kl!sa`Ic#S^CX}}ugwK14&=xFT zsvhy1kJC?h$e#anjkR~#ZnIY33E|{>k2$qc9~414l#`CZX~%p?4k$OcdG2;Bty|m% z-4+gac;TF!(M|z$mlw6}@)DmrCy;{2%kVC}Bo^t+K|1rQgdyZf9OmwRSr0MCn+J6a z1V{QYh>T=(Le7i}_y1s~q-C=LI(o51Th@zDjpN#ik$j`=IJe!N`_C3lD)`t2P zSBEFE2q8U!k-8uVou?)0(DCveN~q>e09z@2HAQqqEZUY1{#_!Ddn_ct2+^T6d|K`z+g5+=%9E#6pyv?G2^F7p& zU^MVxPB?UeKY}u$HS*oTsR6i?3pz0_>8Uv}Gox<~4EZ>-`Zm@oCCAaRrRNJUUxRt~ zjrk(XTl$pJCBQbY(XvQ?jvHSPgRnW+Px>D0EW^rIQ2q0l&ABzBu}8cm<=)|HblP|mjBM%#Vb+-ua>wy*5A zztQs5@*&(&IFeE%@P_)1M4}4_norYFu~zr%Re!s&spj?CqvW8+MG^|N)ZS{g{OX?1 z{H<0UjGbD=lJn@_-9O0$_?C)>Pz%#G)v>-&DAs`x{0ZzyKLA0fOFd{D7h2~=&eKK1 zgLZO_@xn~;;J$lBg9u^r`YKmJ;q(+*rVpe&Ao9@!b!{(`C*+iJb3)$*s+mAV>!z|A zhgX}wjvrk8v3`vWG9|S?*DFSjNV(alv+CAHi#=;KzlB+ysxwNW-azE7aN7X#A)K%S zBh~*JYC$@Sn8JHADcr}i;vvalzc8jsjKxQM6rt`hc03BA{EMu>p_*%SJ1Z9m2uLzJ zkq_|0+bBLlfdK$5=Cl`zC<5xd!(KCkCIw{I4`HNexzsW|$FmJuGI6-enp_%{k}6NT zH77iYXe(O)>!!No@)}&quUeN*od3r(Un?ix57RW(yq)vaT`aetDfg>9>960%fRNif JK+U6`^*3IKyH@}J literal 0 HcmV?d00001 diff --git a/chardet/__pycache__/version.cpython-38.pyc b/chardet/__pycache__/version.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d3f3108e46a823d66aa0e8200373f0b3ae07225 GIT binary patch literal 420 zcmYjNu};G<5KY>YqM)wKH`1X|B|23I6(|D|DuT8QRYc^(Ze!K4E!zpSUjrix3tzx* zWMyGyWWp^0anik~r#tE1y=klEJGS0FUhY0Ezi-6we#5Z|uB z0Y*HCf8}72A)e#h+w+_8#ntH9 zQ9Cw +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/chardet/big5prober.py b/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import BIG5_SM_MODEL + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/chardet/chardistribution.py b/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/chardet/chardistribution.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) + + +class CharDistributionAnalysis(object): + ENOUGH_DATA_THRESHOLD = 1024 + SURE_YES = 0.99 + SURE_NO = 0.01 + MINIMUM_DATA_THRESHOLD = 3 + + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._char_to_freq_order = None + self._table_size = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self.typical_distribution_ratio = None + self._done = None + self._total_chars = None + self._freq_chars = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + self._total_chars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._freq_chars = 0 + + def feed(self, char, char_len): + """feed a character with known length""" + if char_len == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(char) + else: + order = -1 + if order >= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/chardet/charsetgroupprober.py b/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self, lang_filter=None): + super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers = [] + self._best_guess_prober = None + + def reset(self): + super(CharSetGroupProber, self).reset() + self._active_num = 0 + for prober in self.probers: + if prober: + prober.reset() + prober.active = True + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name + + @property + def language(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.language + + def feed(self, byte_str): + for prober in self.probers: + if not prober: + continue + if not prober.active: + continue + state = prober.feed(byte_str) + if not state: + continue + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + return self.state + elif state == ProbingState.NOT_ME: + prober.active = False + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state + + def get_confidence(self): + state = self.state + if state == ProbingState.FOUND_IT: + return 0.99 + elif state == ProbingState.NOT_ME: + return 0.01 + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: + if not prober: + continue + if not prober.active: + self.logger.debug('%s not active', prober.charset_name) + continue + conf = prober.get_confidence() + self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: + return 0.0 + return best_conf diff --git a/chardet/charsetprober.py b/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re + +from .enums import ProbingState + + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self): + self._state = ProbingState.DETECTING + + @property + def charset_name(self): + return None + + def feed(self, buf): + pass + + @property + def state(self): + return self._state + + def get_confidence(self): + return 0.0 + + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/chardet/cli/__init__.py b/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/chardet/cli/__pycache__/__init__.cpython-38.pyc b/chardet/cli/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c968220edeb87de5b76955e8e589ad822567ce9 GIT binary patch literal 177 zcmWIL<>g`kf`c#C#W4cu#~=Ah36cPAQ)3oQYX%}=8%Y*K5Hzq`G=L!(iCi?SlItO7C|&9P zd1fd@G__Kf^*e~@s+%tQ27Qg$X4Aex(ZK!Akd$e7(<^Z9%(-XI%sJ;f-_g^Zoy5cQ z&wu^>`+s2eBP}+c5R2d7rxga_4L#wDAoq)47!=_!ETUoLlPt^|!-jju!x--=i}tXM`HpCbtv~z29nleq*v70QZ;AG4pi0@f@}LoZ<8^QGJHF>7 z-;7mO8+Lx2jgOh(r&6=3l&n&$sFY-rESIe2=2$ac3Z`UTDMKpE9Lr2GA&ndxDH2(Z zE0L8)I!S)}125`a4hBiW@O;F^$6PHHnXU@yY|^BH4Mi)bxBfI>=UFMLbKSfD;L`_K zm}54s%1I`0hGh5ppWdk77#J|F$65B4^8Nn3B>8H>%4+Qde5zG-24iB6WoG4a2A{IB zo*Fh$Rl&4@EBz$-H&WwuLwk#lbd^tyOtXRlU^}(SN|R2e<=A9ZX?Le(2LEN6XGSWX z>;0~8x6|}YDvj@Hie>oZ+Xr~P^R&!J%=1Ssc9pUXciuRl(^gLd?-;*__~{u2<6U`| z!Q6Y~ea9|CTY64}K?MgWdd8Q3Xmj*NW->o`r|Pf0z^&3<=VHIYucMHl5t@e3PG zq!cz1s5{#j=arT=UTQ0XfQ^MDY}rs>X!|}wLQY_AWU;=GjVF~Vxal@*!#QIk^1=F3 z8_`q>ccv#ds(Rs&-32d zz1iqYeKI>-mGSF$o~`EyWxu|#oh2k{ifdX;eumTZ9SmL)`z`z>LG05k_9K56@3tSm zibC~sXpBKdH&28aMaiN6FPIqb#3z1y=>xm|NgzTI8Sgq2jfF2_6REqVaT1p?jVH|` zUo>AffPc~i7mDP%WwxNX{W2se(CsaJR8w%Wje7bRbrfE=7oIvZJE9F69kKH=@IA9* zZq4!SWcMn#LXAB?6dhvD*^dqvzXu~C5x`PW5IIty8COSBqy>CJA|y)#z{HCHJy&4L zH$e~evjKa&s*9V=d*Cycp-^f$&L)`@E5==))uXePl|U7A^MLC10i!+k>=^*kC+mN@ zKltw1GnQ#K)v!ZZl^nOAJp)%o%R6k;ru#Pg!@>XC4N##Qt>ES|Z%o!m)kKUNFtH8C zyR+|qN1f*U80ddp?dOnG)0{$kDv1xMi>QKpf5Z6Oi@QQjIO=V%E%*zz1;cc{Tmkh7 zEtPF^AyRyG;I%Ev#sNa)7)ZSfUsVf(jYreTL@MVT z+8E6Z8(fjA51>FffcBY<-A?6J+WHg6PRoIq!$t+q%Fi&a?j?^c#vz4Z_m)fqocGutU?%HOWifWvuHc8RB(aU6-Dr&ka zq=86B{h9`H*EUzFbY2cSt5qMxj(>+-ScbRPLUjLSOJDw%Qz^&sOPALdB0k1>#K0Sa ibF}q&QHg0Tzo5%#3T@PRFMxAF8x+|NlMj self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/chardet/euckrfreq.py b/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/chardet/euckrprober.py b/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKR_SM_MODEL + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + super(EUCKRProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-KR" + + @property + def language(self): + return "Korean" diff --git a/chardet/euctwfreq.py b/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/chardet/euctwprober.py b/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/chardet/gb2312freq.py b/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/chardet/gb2312prober.py b/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/chardet/hebrewprober.py b/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/chardet/jisfreq.py b/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/chardet/jpcntx.py b/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/chardet/langbulgarianmodel.py b/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', +} + +Win1251BulgarianModel = { + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', +} diff --git a/chardet/langcyrillicmodel.py b/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/chardet/langgreekmodel.py b/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/chardet/langhebrewmodel.py b/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/chardet/langhebrewmodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +WIN1255_CHAR_TO_ORDER_MAP = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HEBREW_LANG_MODEL = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', +} diff --git a/chardet/langhungarianmodel.py b/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', +} + +Win1250HungarianModel = { + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', +} diff --git a/chardet/langthaimodel.py b/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/chardet/langthaimodel.py @@ -0,0 +1,199 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', +} diff --git a/chardet/langturkishmodel.py b/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/chardet/latin1prober.py b/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None + self.reset() + + def reset(self): + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + @property + def charset_name(self): + return "ISO-8859-1" + + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self): + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/chardet/mbcharsetprober.py b/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/chardet/mbcsgroupprober.py b/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/chardet/mbcssm.py b/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +# BIG5 + +BIG5_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} + +# CP949 + +CP949_CLS = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_CLS = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/chardet/sbcharsetprober.py b/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None + self.reset() + + def reset(self): + super(SingleByteCharSetProber, self).reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] + + @property + def language(self): + if self._name_prober: + return self._name_prober.language + else: + return self._model.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order + + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self): + r = 0.01 + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/chardet/sbcsgroupprober.py b/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/chardet/sbcsgroupprober.py @@ -0,0 +1,73 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + self.probers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), + ] + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) + + self.reset() diff --git a/chardet/sjisprober.py b/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + super(SJISProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return self.context_analyzer.charset_name + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/chardet/universaldetector.py b/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re + +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None + self.reset() + + def reset(self): + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not len(byte_str): + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} + + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug('no data received!') + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/chardet/utf8prober.py b/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/chardet/version.py b/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/idna/__init__.py b/idna/__init__.py new file mode 100644 index 0000000..847bf93 --- /dev/null +++ b/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/idna/__pycache__/__init__.cpython-38.pyc b/idna/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..885db81e2d5fc8b79ab9f3c17fd6898452444e15 GIT binary patch literal 236 zcmWIL<>g`kf>(wdC7xZ~r?Qj3Z+^Yh~4fm}u{KTYOaJOzo#*@@|?@hOQViA5k2Z?Poj7p1Ob zC}IP0z{D>fXRDadVxZob?8KbJ+!)7#0vDk27@z#)#GIIr)ZBuYg3JQl%)H`~#GD-6 vGJ~q5vLchJn9P*CL0qQlUu52SPzwT&&H`By767c4yW_ z4eP3^dqRTG;M~Xs@d4n%r$BSKj3y+d0Zom-NX@`Zt-wm{z@~&5%uJlX(Qh|!xjXWh zwM&D_M}*nTc}$qYoo#<;20mz9=7Gio%^YZ|ps6q)G(KqNK~n?G9IJw+%2Bs4w1NfD z&9fTlYFf7lx<$6Y79W$~1T)u3^TbmM%WT@p;aSvWTse%F?=T5Bc%qzs`L3+3wr<=M zqAQ-l2c*>p-^mwCPaZyc_Vf48e%ZYpp?dZ)p|K1_Hb8I^P(}g++yJ*9)4*ilEVH3z zF$We>QT7VhkCY>G5l4B1pHCjFTToV@$R!Yk!RQ@RoXTMrN3<|@>5x961(oN~tK2A{ zotr2(jdikTwL}HJ`m=E>ll@+=D{{^n9Gz)=6=p1nv#rL(Z!Qlm?iq>*7lt-1;lN8d zn_ZEHxiGL{COq3Sl_hzysVo-eA#5AYBKL?mi3ZkI-fQ2IT*&qv*uS)Wqt{!7VeOB* zQJAzp&sku}QL9Py)=yrx@;aR?OnIlH z{7xtBvVMZ~YNvCzA0}mw_Pw+|wW({`um?u*j3grA8NM%26G1uf;E^puk@)34f0P*j zzp3H3RDCUr1W$Pe$8l2!fQWF`$%6-g0jmkX;8Ao*vo3TB@HFuH;MHQM zpT$UGhjnw=5nS1_m&Cbp!d{POOyC}AGL*I5jkCRqIDwiv3S>grn{gIG_Rz^gs%kF6 z7{d%FRF2@XpX3lo@eWL_#~h+d)jAvf%}p*kCFtj2Qh6B!p_54PDZ~S`bTJ%kVT53R zDa{(K(wz%Ok9g_e+%16q6wEA6qj&|y8z_!r?+kRj21O!W9u?UB&*ZJ@l=~0l{RUQE zL|y?2Z)k`sxizv&2D5X(3Z%e+PKC@G8o&}A+0532Y9hr0pwb0G6J~2d-7%qBuL*sC zJ(^JO0HJQ~%@Fzn5Ly`%TG=P`TV{{^1B6zJ!-V>W2~~C|qc|3?g4dc>aTaSB@+GQs zGpPEp)Y&wPxN^tTigP#=k4c$un+SwQU>KLl>~*X)P)tu46U&sjGIxCdI{6NWedbJ` zR!xuk)E|@fT=tA3?2Qk3pS?+bJi^{3FgUZaY2JGiI<7;Ru!rp<>|rb~;~2^$w;%&Qy^NoSW_P;Uu2@e?<6>p=-;|yVNZ_gOQ z_7Ovvk5_O|14K@?DWkbDB-^HzkTY{92QHcMoeLhDEoI@&+H{qLH_P;1QT2G5_{$6< z4(Q6$5vmIOz?OZjw`|e^4fq0oSsZ;^OI6W#@>&Le7Vs*X+R^zz;6Vx8IDt+b=e?TS z;$UbCE+TP1g+UTiDS3)*H~Sy5NaxKrk1O*sB*5m!Md1Jbq|b<HBZR+fYIo3Z8tgV=x542YG+;UXowlo3z{e1mt7={@2kCn0A z2~5Y4vSF^J$VFiVzcoe~*rw%gK!1B0$G_z}0zc|_RU=hKR374|bz=;Y8%*!qgFiF% WZ~d!W@tG9YINN%rKJ^{n_1z!k2!GiC literal 0 HcmV?d00001 diff --git a/idna/__pycache__/core.cpython-38.pyc b/idna/__pycache__/core.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a774d4963f6013aaa4debcdafda7ceda4967ce5 GIT binary patch literal 9105 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 GTH$|PSg`kfb$ zG7EGw^NLFnb8>Xc462gKicG3vGE?#rAw)r9a&}^RYJ3V%n_fZXEe@O9{FKt1R6CHH IJ_9iW02(+m-T(jq literal 0 HcmV?d00001 diff --git a/idna/__pycache__/uts46data.cpython-38.pyc b/idna/__pycache__/uts46data.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ea66609577b404b306d75130e111508347c0b43 GIT binary patch literal 176716 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 Sme{tSYiw(9YivvK-~R(NSz$~7 literal 0 HcmV?d00001 diff --git a/idna/codec.py b/idna/codec.py new file mode 100644 index 0000000..98c65ea --- /dev/null +++ b/idna/codec.py @@ -0,0 +1,118 @@ +from .core import encode, decode, alabel, ulabel, IDNAError +import codecs +import re + +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +class Codec(codecs.Codec): + + def encode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return "", 0 + + return encode(data), len(data) + + def decode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return u"", 0 + + return decode(data), len(data) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return ("", 0) + + labels = _unicode_dots_re.split(data) + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return (u"", 0) + + # IDNA allows decoding to operate on Unicode strings, too. + if isinstance(data, unicode): + labels = _unicode_dots_re.split(data) + else: + # Must be ASCII string + data = str(data) + unicode(data, "ascii") + labels = data.split(".") + + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = u'.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = u'.' + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result = u".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + +class StreamReader(Codec, codecs.StreamReader): + pass + +def getregentry(): + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/idna/compat.py b/idna/compat.py new file mode 100644 index 0000000..4d47f33 --- /dev/null +++ b/idna/compat.py @@ -0,0 +1,12 @@ +from .core import * +from .codec import * + +def ToASCII(label): + return encode(label) + +def ToUnicode(label): + return decode(label) + +def nameprep(s): + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") + diff --git a/idna/core.py b/idna/core.py new file mode 100644 index 0000000..9c3bba2 --- /dev/null +++ b/idna/core.py @@ -0,0 +1,398 @@ +from . import idnadata +import bisect +import unicodedata +import re +import sys +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b'xn--' +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +if sys.version_info[0] >= 3: + unicode = str + unichr = chr + +class IDNAError(UnicodeError): + """ Base exception for all IDNA-encoding related problems """ + pass + + +class IDNABidiError(IDNAError): + """ Exception when bidirectional requirements are not satisfied """ + pass + + +class InvalidCodepoint(IDNAError): + """ Exception when a disallowed or unallocated codepoint is used """ + pass + + +class InvalidCodepointContext(IDNAError): + """ Exception when the codepoint is not valid in the context it is used """ + pass + + +def _combining_class(cp): + v = unicodedata.combining(unichr(cp)) + if v == 0: + if not unicodedata.name(unichr(cp)): + raise ValueError("Unknown character in unicodedata") + return v + +def _is_script(cp, script): + return intranges_contain(ord(cp), idnadata.scripts[script]) + +def _punycode(s): + return s.encode('punycode') + +def _unot(s): + return 'U+{0:04X}'.format(s) + + +def valid_label_length(label): + + if len(label) > 63: + return False + return True + + +def valid_string_length(label, trailing_dot): + + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label, check_ltr=False): + + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == '': + # String likely comes from a newer version of Unicode + raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) + if direction in ['R', 'AL', 'AN']: + bidi_label = True + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ['R', 'AL']: + rtl = True + elif direction == 'L': + rtl = False + else: + raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) + + valid_ending = False + number_type = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) + # Bidi rule 3 + if direction in ['R', 'AL', 'EN', 'AN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + # Bidi rule 4 + if direction in ['AN', 'EN']: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError('Can not mix numeral types in a right-to-left label') + else: + # Bidi rule 5 + if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) + # Bidi rule 6 + if direction in ['L', 'EN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + + if not valid_ending: + raise IDNABidiError('Label ends with illegal codepoint directionality') + + return True + + +def check_initial_combiner(label): + + if unicodedata.category(label[0])[0] == 'M': + raise IDNAError('Label begins with an illegal combining character') + return True + + +def check_hyphen_ok(label): + + if label[2:4] == '--': + raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') + if label[0] == '-' or label[-1] == '-': + raise IDNAError('Label must not start or end with a hyphen') + return True + + +def check_nfc(label): + + if unicodedata.normalize('NFC', label) != label: + raise IDNAError('Label must be in Normalization Form C') + + +def valid_contextj(label, pos): + + cp_value = ord(label[pos]) + + if cp_value == 0x200c: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos-1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('L'), ord('D')]: + ok = True + break + + if not ok: + return False + + ok = False + for i in range(pos+1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('R'), ord('D')]: + ok = True + break + return ok + + if cp_value == 0x200d: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + + return False + + +def valid_contexto(label, pos, exception=False): + + cp_value = ord(label[pos]) + + if cp_value == 0x00b7: + if 0 < pos < len(label)-1: + if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label)-1 and len(label) > 1: + return _is_script(label[pos + 1], 'Greek') + return False + + elif cp_value == 0x05f3 or cp_value == 0x05f4: + if pos > 0: + return _is_script(label[pos - 1], 'Hebrew') + return False + + elif cp_value == 0x30fb: + for cp in label: + if cp == u'\u30fb': + continue + if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6f0 <= ord(cp) <= 0x06f9: + return False + return True + + elif 0x6f0 <= cp_value <= 0x6f9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + +def check_label(label): + + if isinstance(label, (bytes, bytearray)): + label = label.decode('utf-8') + if len(label) == 0: + raise IDNAError('Empty Label') + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for (pos, cp) in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + except ValueError: + raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): + raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + else: + raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) + + check_bidi(label) + + +def alabel(label): + + try: + label = label.encode('ascii') + ulabel(label) + if not valid_label_length(label): + raise IDNAError('Label too long') + return label + except UnicodeEncodeError: + pass + + if not label: + raise IDNAError('No Input') + + label = unicode(label) + check_label(label) + label = _punycode(label) + label = _alabel_prefix + label + + if not valid_label_length(label): + raise IDNAError('Label too long') + + return label + + +def ulabel(label): + + if not isinstance(label, (bytes, bytearray)): + try: + label = label.encode('ascii') + except UnicodeEncodeError: + check_label(label) + return label + + label = label.lower() + if label.startswith(_alabel_prefix): + label = label[len(_alabel_prefix):] + if label.decode('ascii')[-1] == '-': + raise IDNAError('A-label must not end with a hyphen') + else: + check_label(label) + return label.decode('ascii') + + label = label.decode('punycode') + check_label(label) + return label + + +def uts46_remap(domain, std3_rules=True, transitional=False): + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + output = u"" + try: + for pos, char in enumerate(domain): + code_point = ord(char) + uts46row = uts46data[code_point if code_point < 256 else + bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement = uts46row[2] if len(uts46row) == 3 else None + if (status == "V" or + (status == "D" and not transitional) or + (status == "3" and not std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == "M" or + (status == "3" and not std3_rules) or + (status == "D" and transitional)): + output += replacement + elif status != "I": + raise IndexError() + return unicodedata.normalize("NFC", output) + except IndexError: + raise InvalidCodepoint( + "Codepoint {0} not allowed at position {1} in {2}".format( + _unot(code_point), pos + 1, repr(domain))) + + +def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split('.') + else: + labels = _unicode_dots_re.split(s) + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(b'') + s = b'.'.join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError('Domain too long') + return s + + +def decode(s, strict=False, uts46=False, std3_rules=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(u'.') + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(u'') + return u'.'.join(result) diff --git a/idna/idnadata.py b/idna/idnadata.py new file mode 100644 index 0000000..2b81c52 --- /dev/null +++ b/idna/idnadata.py @@ -0,0 +1,1991 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "12.1.0" +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x37f00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038b, + 0x38c0000038d, + 0x38e000003a2, + 0x3a3000003e2, + 0x3f000000400, + 0x1d2600001d2b, + 0x1d5d00001d62, + 0x1d6600001d6b, + 0x1dbf00001dc0, + 0x1f0000001f16, + 0x1f1800001f1e, + 0x1f2000001f46, + 0x1f4800001f4e, + 0x1f5000001f58, + 0x1f5900001f5a, + 0x1f5b00001f5c, + 0x1f5d00001f5e, + 0x1f5f00001f7e, + 0x1f8000001fb5, + 0x1fb600001fc5, + 0x1fc600001fd4, + 0x1fd600001fdc, + 0x1fdd00001ff0, + 0x1ff200001ff5, + 0x1ff600001fff, + 0x212600002127, + 0xab650000ab66, + 0x101400001018f, + 0x101a0000101a1, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004db6, + 0x4e0000009ff0, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5ef000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b11f, + 0x1b1500001b153, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1b0000001b001, + 0x1b1640001b168, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x605: 85, + 0x608: 85, + 0x60b: 85, + 0x620: 68, + 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62a: 68, + 0x62b: 68, + 0x62c: 68, + 0x62d: 68, + 0x62e: 68, + 0x62f: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63a: 68, + 0x63b: 68, + 0x63c: 68, + 0x63d: 68, + 0x63e: 68, + 0x63f: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64a: 68, + 0x66e: 68, + 0x66f: 68, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67a: 68, + 0x67b: 68, + 0x67c: 68, + 0x67d: 68, + 0x67e: 68, + 0x67f: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68a: 82, + 0x68b: 82, + 0x68c: 82, + 0x68d: 82, + 0x68e: 82, + 0x68f: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69a: 68, + 0x69b: 68, + 0x69c: 68, + 0x69d: 68, + 0x69e: 68, + 0x69f: 68, + 0x6a0: 68, + 0x6a1: 68, + 0x6a2: 68, + 0x6a3: 68, + 0x6a4: 68, + 0x6a5: 68, + 0x6a6: 68, + 0x6a7: 68, + 0x6a8: 68, + 0x6a9: 68, + 0x6aa: 68, + 0x6ab: 68, + 0x6ac: 68, + 0x6ad: 68, + 0x6ae: 68, + 0x6af: 68, + 0x6b0: 68, + 0x6b1: 68, + 0x6b2: 68, + 0x6b3: 68, + 0x6b4: 68, + 0x6b5: 68, + 0x6b6: 68, + 0x6b7: 68, + 0x6b8: 68, + 0x6b9: 68, + 0x6ba: 68, + 0x6bb: 68, + 0x6bc: 68, + 0x6bd: 68, + 0x6be: 68, + 0x6bf: 68, + 0x6c0: 82, + 0x6c1: 68, + 0x6c2: 68, + 0x6c3: 82, + 0x6c4: 82, + 0x6c5: 82, + 0x6c6: 82, + 0x6c7: 82, + 0x6c8: 82, + 0x6c9: 82, + 0x6ca: 82, + 0x6cb: 82, + 0x6cc: 68, + 0x6cd: 82, + 0x6ce: 68, + 0x6cf: 82, + 0x6d0: 68, + 0x6d1: 68, + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, + 0x6dd: 85, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, + 0x6fb: 68, + 0x6fc: 68, + 0x6ff: 68, + 0x70f: 84, + 0x710: 82, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71a: 68, + 0x71b: 68, + 0x71c: 68, + 0x71d: 68, + 0x71e: 82, + 0x71f: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72a: 82, + 0x72b: 68, + 0x72c: 82, + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75a: 82, + 0x75b: 82, + 0x75c: 68, + 0x75d: 68, + 0x75e: 68, + 0x75f: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76a: 68, + 0x76b: 82, + 0x76c: 82, + 0x76d: 68, + 0x76e: 68, + 0x76f: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77a: 68, + 0x77b: 68, + 0x77c: 68, + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, + 0x7cd: 68, + 0x7ce: 68, + 0x7cf: 68, + 0x7d0: 68, + 0x7d1: 68, + 0x7d2: 68, + 0x7d3: 68, + 0x7d4: 68, + 0x7d5: 68, + 0x7d6: 68, + 0x7d7: 68, + 0x7d8: 68, + 0x7d9: 68, + 0x7da: 68, + 0x7db: 68, + 0x7dc: 68, + 0x7dd: 68, + 0x7de: 68, + 0x7df: 68, + 0x7e0: 68, + 0x7e1: 68, + 0x7e2: 68, + 0x7e3: 68, + 0x7e4: 68, + 0x7e5: 68, + 0x7e6: 68, + 0x7e7: 68, + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, + 0x7fa: 67, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 85, + 0x857: 85, + 0x858: 85, + 0x860: 68, + 0x861: 85, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x866: 85, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86a: 82, + 0x8a0: 68, + 0x8a1: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x8ad: 85, + 0x8ae: 82, + 0x8af: 68, + 0x8b0: 68, + 0x8b1: 82, + 0x8b2: 82, + 0x8b3: 68, + 0x8b4: 68, + 0x8b6: 68, + 0x8b7: 68, + 0x8b8: 68, + 0x8b9: 82, + 0x8ba: 68, + 0x8bb: 68, + 0x8bc: 68, + 0x8bd: 68, + 0x8e2: 85, + 0x1806: 85, + 0x1807: 68, + 0x180a: 67, + 0x180e: 85, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182a: 68, + 0x182b: 68, + 0x182c: 68, + 0x182d: 68, + 0x182e: 68, + 0x182f: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183a: 68, + 0x183b: 68, + 0x183c: 68, + 0x183d: 68, + 0x183e: 68, + 0x183f: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184a: 68, + 0x184b: 68, + 0x184c: 68, + 0x184d: 68, + 0x184e: 68, + 0x184f: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185a: 68, + 0x185b: 68, + 0x185c: 68, + 0x185d: 68, + 0x185e: 68, + 0x185f: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186a: 68, + 0x186b: 68, + 0x186c: 68, + 0x186d: 68, + 0x186e: 68, + 0x186f: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1878: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188a: 68, + 0x188b: 68, + 0x188c: 68, + 0x188d: 68, + 0x188e: 68, + 0x188f: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189a: 68, + 0x189b: 68, + 0x189c: 68, + 0x189d: 68, + 0x189e: 68, + 0x189f: 68, + 0x18a0: 68, + 0x18a1: 68, + 0x18a2: 68, + 0x18a3: 68, + 0x18a4: 68, + 0x18a5: 68, + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, + 0x18aa: 68, + 0x200c: 85, + 0x200d: 67, + 0x202f: 85, + 0x2066: 85, + 0x2067: 85, + 0x2068: 85, + 0x2069: 85, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, + 0xa843: 68, + 0xa844: 68, + 0xa845: 68, + 0xa846: 68, + 0xa847: 68, + 0xa848: 68, + 0xa849: 68, + 0xa84a: 68, + 0xa84b: 68, + 0xa84c: 68, + 0xa84d: 68, + 0xa84e: 68, + 0xa84f: 68, + 0xa850: 68, + 0xa851: 68, + 0xa852: 68, + 0xa853: 68, + 0xa854: 68, + 0xa855: 68, + 0xa856: 68, + 0xa857: 68, + 0xa858: 68, + 0xa859: 68, + 0xa85a: 68, + 0xa85b: 68, + 0xa85c: 68, + 0xa85d: 68, + 0xa85e: 68, + 0xa85f: 68, + 0xa860: 68, + 0xa861: 68, + 0xa862: 68, + 0xa863: 68, + 0xa864: 68, + 0xa865: 68, + 0xa866: 68, + 0xa867: 68, + 0xa868: 68, + 0xa869: 68, + 0xa86a: 68, + 0xa86b: 68, + 0xa86c: 68, + 0xa86d: 68, + 0xa86e: 68, + 0xa86f: 68, + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, + 0xa873: 85, + 0x10ac0: 68, + 0x10ac1: 68, + 0x10ac2: 68, + 0x10ac3: 68, + 0x10ac4: 68, + 0x10ac5: 82, + 0x10ac6: 85, + 0x10ac7: 82, + 0x10ac8: 85, + 0x10ac9: 82, + 0x10aca: 82, + 0x10acb: 85, + 0x10acc: 85, + 0x10acd: 76, + 0x10ace: 82, + 0x10acf: 82, + 0x10ad0: 82, + 0x10ad1: 82, + 0x10ad2: 82, + 0x10ad3: 68, + 0x10ad4: 68, + 0x10ad5: 68, + 0x10ad6: 68, + 0x10ad7: 76, + 0x10ad8: 68, + 0x10ad9: 68, + 0x10ada: 68, + 0x10adb: 68, + 0x10adc: 68, + 0x10add: 82, + 0x10ade: 68, + 0x10adf: 68, + 0x10ae0: 68, + 0x10ae1: 82, + 0x10ae2: 85, + 0x10ae3: 85, + 0x10ae4: 82, + 0x10aeb: 68, + 0x10aec: 68, + 0x10aed: 68, + 0x10aee: 68, + 0x10aef: 82, + 0x10b80: 68, + 0x10b81: 82, + 0x10b82: 68, + 0x10b83: 82, + 0x10b84: 82, + 0x10b85: 82, + 0x10b86: 68, + 0x10b87: 68, + 0x10b88: 68, + 0x10b89: 82, + 0x10b8a: 68, + 0x10b8b: 68, + 0x10b8c: 82, + 0x10b8d: 68, + 0x10b8e: 82, + 0x10b8f: 82, + 0x10b90: 68, + 0x10b91: 82, + 0x10ba9: 82, + 0x10baa: 82, + 0x10bab: 82, + 0x10bac: 82, + 0x10bad: 68, + 0x10bae: 68, + 0x10baf: 85, + 0x10d00: 76, + 0x10d01: 68, + 0x10d02: 68, + 0x10d03: 68, + 0x10d04: 68, + 0x10d05: 68, + 0x10d06: 68, + 0x10d07: 68, + 0x10d08: 68, + 0x10d09: 68, + 0x10d0a: 68, + 0x10d0b: 68, + 0x10d0c: 68, + 0x10d0d: 68, + 0x10d0e: 68, + 0x10d0f: 68, + 0x10d10: 68, + 0x10d11: 68, + 0x10d12: 68, + 0x10d13: 68, + 0x10d14: 68, + 0x10d15: 68, + 0x10d16: 68, + 0x10d17: 68, + 0x10d18: 68, + 0x10d19: 68, + 0x10d1a: 68, + 0x10d1b: 68, + 0x10d1c: 68, + 0x10d1d: 68, + 0x10d1e: 68, + 0x10d1f: 68, + 0x10d20: 68, + 0x10d21: 68, + 0x10d22: 82, + 0x10d23: 68, + 0x10f30: 68, + 0x10f31: 68, + 0x10f32: 68, + 0x10f33: 82, + 0x10f34: 68, + 0x10f35: 68, + 0x10f36: 68, + 0x10f37: 68, + 0x10f38: 68, + 0x10f39: 68, + 0x10f3a: 68, + 0x10f3b: 68, + 0x10f3c: 68, + 0x10f3d: 68, + 0x10f3e: 68, + 0x10f3f: 68, + 0x10f40: 68, + 0x10f41: 68, + 0x10f42: 68, + 0x10f43: 68, + 0x10f44: 68, + 0x10f45: 85, + 0x10f51: 68, + 0x10f52: 68, + 0x10f53: 68, + 0x10f54: 82, + 0x110bd: 85, + 0x110cd: 85, + 0x1e900: 68, + 0x1e901: 68, + 0x1e902: 68, + 0x1e903: 68, + 0x1e904: 68, + 0x1e905: 68, + 0x1e906: 68, + 0x1e907: 68, + 0x1e908: 68, + 0x1e909: 68, + 0x1e90a: 68, + 0x1e90b: 68, + 0x1e90c: 68, + 0x1e90d: 68, + 0x1e90e: 68, + 0x1e90f: 68, + 0x1e910: 68, + 0x1e911: 68, + 0x1e912: 68, + 0x1e913: 68, + 0x1e914: 68, + 0x1e915: 68, + 0x1e916: 68, + 0x1e917: 68, + 0x1e918: 68, + 0x1e919: 68, + 0x1e91a: 68, + 0x1e91b: 68, + 0x1e91c: 68, + 0x1e91d: 68, + 0x1e91e: 68, + 0x1e91f: 68, + 0x1e920: 68, + 0x1e921: 68, + 0x1e922: 68, + 0x1e923: 68, + 0x1e924: 68, + 0x1e925: 68, + 0x1e926: 68, + 0x1e927: 68, + 0x1e928: 68, + 0x1e929: 68, + 0x1e92a: 68, + 0x1e92b: 68, + 0x1e92c: 68, + 0x1e92d: 68, + 0x1e92e: 68, + 0x1e92f: 68, + 0x1e930: 68, + 0x1e931: 68, + 0x1e932: 68, + 0x1e933: 68, + 0x1e934: 68, + 0x1e935: 68, + 0x1e936: 68, + 0x1e937: 68, + 0x1e938: 68, + 0x1e939: 68, + 0x1e93a: 68, + 0x1e93b: 68, + 0x1e93c: 68, + 0x1e93d: 68, + 0x1e93e: 68, + 0x1e93f: 68, + 0x1e940: 68, + 0x1e941: 68, + 0x1e942: 68, + 0x1e943: 68, + 0x1e94b: 84, +} +codepoint_classes = { + 'PVALID': ( + 0x2d0000002e, + 0x300000003a, + 0x610000007b, + 0xdf000000f7, + 0xf800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010a, + 0x10b0000010c, + 0x10d0000010e, + 0x10f00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011a, + 0x11b0000011c, + 0x11d0000011e, + 0x11f00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012a, + 0x12b0000012c, + 0x12d0000012e, + 0x12f00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13a0000013b, + 0x13c0000013d, + 0x13e0000013f, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14b0000014c, + 0x14d0000014e, + 0x14f00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015a, + 0x15b0000015c, + 0x15d0000015e, + 0x15f00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016a, + 0x16b0000016c, + 0x16d0000016e, + 0x16f00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17a0000017b, + 0x17c0000017d, + 0x17e0000017f, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18c0000018e, + 0x19200000193, + 0x19500000196, + 0x1990000019c, + 0x19e0000019f, + 0x1a1000001a2, + 0x1a3000001a4, + 0x1a5000001a6, + 0x1a8000001a9, + 0x1aa000001ac, + 0x1ad000001ae, + 0x1b0000001b1, + 0x1b4000001b5, + 0x1b6000001b7, + 0x1b9000001bc, + 0x1bd000001c4, + 0x1ce000001cf, + 0x1d0000001d1, + 0x1d2000001d3, + 0x1d4000001d5, + 0x1d6000001d7, + 0x1d8000001d9, + 0x1da000001db, + 0x1dc000001de, + 0x1df000001e0, + 0x1e1000001e2, + 0x1e3000001e4, + 0x1e5000001e6, + 0x1e7000001e8, + 0x1e9000001ea, + 0x1eb000001ec, + 0x1ed000001ee, + 0x1ef000001f1, + 0x1f5000001f6, + 0x1f9000001fa, + 0x1fb000001fc, + 0x1fd000001fe, + 0x1ff00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020a, + 0x20b0000020c, + 0x20d0000020e, + 0x20f00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021a, + 0x21b0000021c, + 0x21d0000021e, + 0x21f00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022a, + 0x22b0000022c, + 0x22d0000022e, + 0x22f00000230, + 0x23100000232, + 0x2330000023a, + 0x23c0000023d, + 0x23f00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024a, + 0x24b0000024c, + 0x24d0000024e, + 0x24f000002b0, + 0x2b9000002c2, + 0x2c6000002d2, + 0x2ec000002ed, + 0x2ee000002ef, + 0x30000000340, + 0x34200000343, + 0x3460000034f, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37b0000037e, + 0x39000000391, + 0x3ac000003cf, + 0x3d7000003d8, + 0x3d9000003da, + 0x3db000003dc, + 0x3dd000003de, + 0x3df000003e0, + 0x3e1000003e2, + 0x3e3000003e4, + 0x3e5000003e6, + 0x3e7000003e8, + 0x3e9000003ea, + 0x3eb000003ec, + 0x3ed000003ee, + 0x3ef000003f0, + 0x3f3000003f4, + 0x3f8000003f9, + 0x3fb000003fd, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046a, + 0x46b0000046c, + 0x46d0000046e, + 0x46f00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047a, + 0x47b0000047c, + 0x47d0000047e, + 0x47f00000480, + 0x48100000482, + 0x48300000488, + 0x48b0000048c, + 0x48d0000048e, + 0x48f00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049a, + 0x49b0000049c, + 0x49d0000049e, + 0x49f000004a0, + 0x4a1000004a2, + 0x4a3000004a4, + 0x4a5000004a6, + 0x4a7000004a8, + 0x4a9000004aa, + 0x4ab000004ac, + 0x4ad000004ae, + 0x4af000004b0, + 0x4b1000004b2, + 0x4b3000004b4, + 0x4b5000004b6, + 0x4b7000004b8, + 0x4b9000004ba, + 0x4bb000004bc, + 0x4bd000004be, + 0x4bf000004c0, + 0x4c2000004c3, + 0x4c4000004c5, + 0x4c6000004c7, + 0x4c8000004c9, + 0x4ca000004cb, + 0x4cc000004cd, + 0x4ce000004d0, + 0x4d1000004d2, + 0x4d3000004d4, + 0x4d5000004d6, + 0x4d7000004d8, + 0x4d9000004da, + 0x4db000004dc, + 0x4dd000004de, + 0x4df000004e0, + 0x4e1000004e2, + 0x4e3000004e4, + 0x4e5000004e6, + 0x4e7000004e8, + 0x4e9000004ea, + 0x4eb000004ec, + 0x4ed000004ee, + 0x4ef000004f0, + 0x4f1000004f2, + 0x4f3000004f4, + 0x4f5000004f6, + 0x4f7000004f8, + 0x4f9000004fa, + 0x4fb000004fc, + 0x4fd000004fe, + 0x4ff00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050a, + 0x50b0000050c, + 0x50d0000050e, + 0x50f00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051a, + 0x51b0000051c, + 0x51d0000051e, + 0x51f00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052a, + 0x52b0000052c, + 0x52d0000052e, + 0x52f00000530, + 0x5590000055a, + 0x56000000587, + 0x58800000589, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5ef000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x7fd000007fe, + 0x8000000082e, + 0x8400000085c, + 0x8600000086b, + 0x8a0000008b5, + 0x8b6000008be, + 0x8d3000008e2, + 0x8e300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0x9fc000009fd, + 0x9fe000009ff, + 0xa0100000a04, + 0xa0500000a0b, + 0xa0f00000a11, + 0xa1300000a29, + 0xa2a00000a31, + 0xa3200000a33, + 0xa3500000a36, + 0xa3800000a3a, + 0xa3c00000a3d, + 0xa3e00000a43, + 0xa4700000a49, + 0xa4b00000a4e, + 0xa5100000a52, + 0xa5c00000a5d, + 0xa6600000a76, + 0xa8100000a84, + 0xa8500000a8e, + 0xa8f00000a92, + 0xa9300000aa9, + 0xaaa00000ab1, + 0xab200000ab4, + 0xab500000aba, + 0xabc00000ac6, + 0xac700000aca, + 0xacb00000ace, + 0xad000000ad1, + 0xae000000ae4, + 0xae600000af0, + 0xaf900000b00, + 0xb0100000b04, + 0xb0500000b0d, + 0xb0f00000b11, + 0xb1300000b29, + 0xb2a00000b31, + 0xb3200000b34, + 0xb3500000b3a, + 0xb3c00000b45, + 0xb4700000b49, + 0xb4b00000b4e, + 0xb5600000b58, + 0xb5f00000b64, + 0xb6600000b70, + 0xb7100000b72, + 0xb8200000b84, + 0xb8500000b8b, + 0xb8e00000b91, + 0xb9200000b96, + 0xb9900000b9b, + 0xb9c00000b9d, + 0xb9e00000ba0, + 0xba300000ba5, + 0xba800000bab, + 0xbae00000bba, + 0xbbe00000bc3, + 0xbc600000bc9, + 0xbca00000bce, + 0xbd000000bd1, + 0xbd700000bd8, + 0xbe600000bf0, + 0xc0000000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c3a, + 0xc3d00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5b, + 0xc6000000c64, + 0xc6600000c70, + 0xc8000000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcde00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0000000d04, + 0xd0500000d0d, + 0xd0e00000d11, + 0xd1200000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5400000d58, + 0xd5f00000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8200000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xde600000df0, + 0xdf200000df4, + 0xe0100000e33, + 0xe3400000e3b, + 0xe4000000e4f, + 0xe5000000e5a, + 0xe8100000e83, + 0xe8400000e85, + 0xe8600000e8b, + 0xe8c00000ea4, + 0xea500000ea6, + 0xea700000eb3, + 0xeb400000ebe, + 0xec000000ec5, + 0xec600000ec7, + 0xec800000ece, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, + 0xf0b00000f0c, + 0xf1800000f1a, + 0xf2000000f2a, + 0xf3500000f36, + 0xf3700000f38, + 0xf3900000f3a, + 0xf3e00000f43, + 0xf4400000f48, + 0xf4900000f4d, + 0xf4e00000f52, + 0xf5300000f57, + 0xf5800000f5c, + 0xf5d00000f69, + 0xf6a00000f6d, + 0xf7100000f73, + 0xf7400000f75, + 0xf7a00000f81, + 0xf8200000f85, + 0xf8600000f93, + 0xf9400000f98, + 0xf9900000f9d, + 0xf9e00000fa2, + 0xfa300000fa7, + 0xfa800000fac, + 0xfad00000fb9, + 0xfba00000fbd, + 0xfc600000fc7, + 0x10000000104a, + 0x10500000109e, + 0x10d0000010fb, + 0x10fd00001100, + 0x120000001249, + 0x124a0000124e, + 0x125000001257, + 0x125800001259, + 0x125a0000125e, + 0x126000001289, + 0x128a0000128e, + 0x1290000012b1, + 0x12b2000012b6, + 0x12b8000012bf, + 0x12c0000012c1, + 0x12c2000012c6, + 0x12c8000012d7, + 0x12d800001311, + 0x131200001316, + 0x13180000135b, + 0x135d00001360, + 0x138000001390, + 0x13a0000013f6, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x16f1000016f9, + 0x17000000170d, + 0x170e00001715, + 0x172000001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001879, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191f, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1ab000001abe, + 0x1b0000001b4c, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cfb, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001dfa, + 0x1dfb00001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, + 0x1e0700001e08, + 0x1e0900001e0a, + 0x1e0b00001e0c, + 0x1e0d00001e0e, + 0x1e0f00001e10, + 0x1e1100001e12, + 0x1e1300001e14, + 0x1e1500001e16, + 0x1e1700001e18, + 0x1e1900001e1a, + 0x1e1b00001e1c, + 0x1e1d00001e1e, + 0x1e1f00001e20, + 0x1e2100001e22, + 0x1e2300001e24, + 0x1e2500001e26, + 0x1e2700001e28, + 0x1e2900001e2a, + 0x1e2b00001e2c, + 0x1e2d00001e2e, + 0x1e2f00001e30, + 0x1e3100001e32, + 0x1e3300001e34, + 0x1e3500001e36, + 0x1e3700001e38, + 0x1e3900001e3a, + 0x1e3b00001e3c, + 0x1e3d00001e3e, + 0x1e3f00001e40, + 0x1e4100001e42, + 0x1e4300001e44, + 0x1e4500001e46, + 0x1e4700001e48, + 0x1e4900001e4a, + 0x1e4b00001e4c, + 0x1e4d00001e4e, + 0x1e4f00001e50, + 0x1e5100001e52, + 0x1e5300001e54, + 0x1e5500001e56, + 0x1e5700001e58, + 0x1e5900001e5a, + 0x1e5b00001e5c, + 0x1e5d00001e5e, + 0x1e5f00001e60, + 0x1e6100001e62, + 0x1e6300001e64, + 0x1e6500001e66, + 0x1e6700001e68, + 0x1e6900001e6a, + 0x1e6b00001e6c, + 0x1e6d00001e6e, + 0x1e6f00001e70, + 0x1e7100001e72, + 0x1e7300001e74, + 0x1e7500001e76, + 0x1e7700001e78, + 0x1e7900001e7a, + 0x1e7b00001e7c, + 0x1e7d00001e7e, + 0x1e7f00001e80, + 0x1e8100001e82, + 0x1e8300001e84, + 0x1e8500001e86, + 0x1e8700001e88, + 0x1e8900001e8a, + 0x1e8b00001e8c, + 0x1e8d00001e8e, + 0x1e8f00001e90, + 0x1e9100001e92, + 0x1e9300001e94, + 0x1e9500001e9a, + 0x1e9c00001e9e, + 0x1e9f00001ea0, + 0x1ea100001ea2, + 0x1ea300001ea4, + 0x1ea500001ea6, + 0x1ea700001ea8, + 0x1ea900001eaa, + 0x1eab00001eac, + 0x1ead00001eae, + 0x1eaf00001eb0, + 0x1eb100001eb2, + 0x1eb300001eb4, + 0x1eb500001eb6, + 0x1eb700001eb8, + 0x1eb900001eba, + 0x1ebb00001ebc, + 0x1ebd00001ebe, + 0x1ebf00001ec0, + 0x1ec100001ec2, + 0x1ec300001ec4, + 0x1ec500001ec6, + 0x1ec700001ec8, + 0x1ec900001eca, + 0x1ecb00001ecc, + 0x1ecd00001ece, + 0x1ecf00001ed0, + 0x1ed100001ed2, + 0x1ed300001ed4, + 0x1ed500001ed6, + 0x1ed700001ed8, + 0x1ed900001eda, + 0x1edb00001edc, + 0x1edd00001ede, + 0x1edf00001ee0, + 0x1ee100001ee2, + 0x1ee300001ee4, + 0x1ee500001ee6, + 0x1ee700001ee8, + 0x1ee900001eea, + 0x1eeb00001eec, + 0x1eed00001eee, + 0x1eef00001ef0, + 0x1ef100001ef2, + 0x1ef300001ef4, + 0x1ef500001ef6, + 0x1ef700001ef8, + 0x1ef900001efa, + 0x1efb00001efc, + 0x1efd00001efe, + 0x1eff00001f08, + 0x1f1000001f16, + 0x1f2000001f28, + 0x1f3000001f38, + 0x1f4000001f46, + 0x1f5000001f58, + 0x1f6000001f68, + 0x1f7000001f71, + 0x1f7200001f73, + 0x1f7400001f75, + 0x1f7600001f77, + 0x1f7800001f79, + 0x1f7a00001f7b, + 0x1f7c00001f7d, + 0x1fb000001fb2, + 0x1fb600001fb7, + 0x1fc600001fc7, + 0x1fd000001fd3, + 0x1fd600001fd8, + 0x1fe000001fe3, + 0x1fe400001fe8, + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, + 0x2c3000002c5f, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, + 0x2c6a00002c6b, + 0x2c6c00002c6d, + 0x2c7100002c72, + 0x2c7300002c75, + 0x2c7600002c7c, + 0x2c8100002c82, + 0x2c8300002c84, + 0x2c8500002c86, + 0x2c8700002c88, + 0x2c8900002c8a, + 0x2c8b00002c8c, + 0x2c8d00002c8e, + 0x2c8f00002c90, + 0x2c9100002c92, + 0x2c9300002c94, + 0x2c9500002c96, + 0x2c9700002c98, + 0x2c9900002c9a, + 0x2c9b00002c9c, + 0x2c9d00002c9e, + 0x2c9f00002ca0, + 0x2ca100002ca2, + 0x2ca300002ca4, + 0x2ca500002ca6, + 0x2ca700002ca8, + 0x2ca900002caa, + 0x2cab00002cac, + 0x2cad00002cae, + 0x2caf00002cb0, + 0x2cb100002cb2, + 0x2cb300002cb4, + 0x2cb500002cb6, + 0x2cb700002cb8, + 0x2cb900002cba, + 0x2cbb00002cbc, + 0x2cbd00002cbe, + 0x2cbf00002cc0, + 0x2cc100002cc2, + 0x2cc300002cc4, + 0x2cc500002cc6, + 0x2cc700002cc8, + 0x2cc900002cca, + 0x2ccb00002ccc, + 0x2ccd00002cce, + 0x2ccf00002cd0, + 0x2cd100002cd2, + 0x2cd300002cd4, + 0x2cd500002cd6, + 0x2cd700002cd8, + 0x2cd900002cda, + 0x2cdb00002cdc, + 0x2cdd00002cde, + 0x2cdf00002ce0, + 0x2ce100002ce2, + 0x2ce300002ce5, + 0x2cec00002ced, + 0x2cee00002cf2, + 0x2cf300002cf4, + 0x2d0000002d26, + 0x2d2700002d28, + 0x2d2d00002d2e, + 0x2d3000002d68, + 0x2d7f00002d97, + 0x2da000002da7, + 0x2da800002daf, + 0x2db000002db7, + 0x2db800002dbf, + 0x2dc000002dc7, + 0x2dc800002dcf, + 0x2dd000002dd7, + 0x2dd800002ddf, + 0x2de000002e00, + 0x2e2f00002e30, + 0x300500003008, + 0x302a0000302e, + 0x303c0000303d, + 0x304100003097, + 0x30990000309b, + 0x309d0000309f, + 0x30a1000030fb, + 0x30fc000030ff, + 0x310500003130, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009ff0, + 0xa0000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, + 0xa6410000a642, + 0xa6430000a644, + 0xa6450000a646, + 0xa6470000a648, + 0xa6490000a64a, + 0xa64b0000a64c, + 0xa64d0000a64e, + 0xa64f0000a650, + 0xa6510000a652, + 0xa6530000a654, + 0xa6550000a656, + 0xa6570000a658, + 0xa6590000a65a, + 0xa65b0000a65c, + 0xa65d0000a65e, + 0xa65f0000a660, + 0xa6610000a662, + 0xa6630000a664, + 0xa6650000a666, + 0xa6670000a668, + 0xa6690000a66a, + 0xa66b0000a66c, + 0xa66d0000a670, + 0xa6740000a67e, + 0xa67f0000a680, + 0xa6810000a682, + 0xa6830000a684, + 0xa6850000a686, + 0xa6870000a688, + 0xa6890000a68a, + 0xa68b0000a68c, + 0xa68d0000a68e, + 0xa68f0000a690, + 0xa6910000a692, + 0xa6930000a694, + 0xa6950000a696, + 0xa6970000a698, + 0xa6990000a69a, + 0xa69b0000a69c, + 0xa69e0000a6e6, + 0xa6f00000a6f2, + 0xa7170000a720, + 0xa7230000a724, + 0xa7250000a726, + 0xa7270000a728, + 0xa7290000a72a, + 0xa72b0000a72c, + 0xa72d0000a72e, + 0xa72f0000a732, + 0xa7330000a734, + 0xa7350000a736, + 0xa7370000a738, + 0xa7390000a73a, + 0xa73b0000a73c, + 0xa73d0000a73e, + 0xa73f0000a740, + 0xa7410000a742, + 0xa7430000a744, + 0xa7450000a746, + 0xa7470000a748, + 0xa7490000a74a, + 0xa74b0000a74c, + 0xa74d0000a74e, + 0xa74f0000a750, + 0xa7510000a752, + 0xa7530000a754, + 0xa7550000a756, + 0xa7570000a758, + 0xa7590000a75a, + 0xa75b0000a75c, + 0xa75d0000a75e, + 0xa75f0000a760, + 0xa7610000a762, + 0xa7630000a764, + 0xa7650000a766, + 0xa7670000a768, + 0xa7690000a76a, + 0xa76b0000a76c, + 0xa76d0000a76e, + 0xa76f0000a770, + 0xa7710000a779, + 0xa77a0000a77b, + 0xa77c0000a77d, + 0xa77f0000a780, + 0xa7810000a782, + 0xa7830000a784, + 0xa7850000a786, + 0xa7870000a789, + 0xa78c0000a78d, + 0xa78e0000a790, + 0xa7910000a792, + 0xa7930000a796, + 0xa7970000a798, + 0xa7990000a79a, + 0xa79b0000a79c, + 0xa79d0000a79e, + 0xa79f0000a7a0, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7af0000a7b0, + 0xa7b50000a7b6, + 0xa7b70000a7b8, + 0xa7b90000a7ba, + 0xa7bb0000a7bc, + 0xa7bd0000a7be, + 0xa7bf0000a7c0, + 0xa7c30000a7c4, + 0xa7f70000a7f8, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c6, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa8fd0000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xa9e00000a9ff, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xab300000ab5b, + 0xab600000ab68, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe30, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x102e0000102e1, + 0x1030000010320, + 0x1032d00010341, + 0x103420001034a, + 0x103500001037b, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x104d8000104fc, + 0x1050000010528, + 0x1053000010564, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1086000010877, + 0x108800001089f, + 0x108e0000108f3, + 0x108f4000108f6, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a36, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10a8000010a9d, + 0x10ac000010ac8, + 0x10ac900010ae7, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10b8000010b92, + 0x10c0000010c49, + 0x10cc000010cf3, + 0x10d0000010d28, + 0x10d3000010d3a, + 0x10f0000010f1d, + 0x10f2700010f28, + 0x10f3000010f51, + 0x10fe000010ff7, + 0x1100000011047, + 0x1106600011070, + 0x1107f000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x1114400011147, + 0x1115000011174, + 0x1117600011177, + 0x11180000111c5, + 0x111c9000111cd, + 0x111d0000111db, + 0x111dc000111dd, + 0x1120000011212, + 0x1121300011238, + 0x1123e0001123f, + 0x1128000011287, + 0x1128800011289, + 0x1128a0001128e, + 0x1128f0001129e, + 0x1129f000112a9, + 0x112b0000112eb, + 0x112f0000112fa, + 0x1130000011304, + 0x113050001130d, + 0x1130f00011311, + 0x1131300011329, + 0x1132a00011331, + 0x1133200011334, + 0x113350001133a, + 0x1133b00011345, + 0x1134700011349, + 0x1134b0001134e, + 0x1135000011351, + 0x1135700011358, + 0x1135d00011364, + 0x113660001136d, + 0x1137000011375, + 0x114000001144b, + 0x114500001145a, + 0x1145e00011460, + 0x11480000114c6, + 0x114c7000114c8, + 0x114d0000114da, + 0x11580000115b6, + 0x115b8000115c1, + 0x115d8000115de, + 0x1160000011641, + 0x1164400011645, + 0x116500001165a, + 0x11680000116b9, + 0x116c0000116ca, + 0x117000001171b, + 0x1171d0001172c, + 0x117300001173a, + 0x118000001183b, + 0x118c0000118ea, + 0x118ff00011900, + 0x119a0000119a8, + 0x119aa000119d8, + 0x119da000119e2, + 0x119e3000119e5, + 0x11a0000011a3f, + 0x11a4700011a48, + 0x11a5000011a9a, + 0x11a9d00011a9e, + 0x11ac000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, + 0x11c5000011c5a, + 0x11c7200011c90, + 0x11c9200011ca8, + 0x11ca900011cb7, + 0x11d0000011d07, + 0x11d0800011d0a, + 0x11d0b00011d37, + 0x11d3a00011d3b, + 0x11d3c00011d3e, + 0x11d3f00011d48, + 0x11d5000011d5a, + 0x11d6000011d66, + 0x11d6700011d69, + 0x11d6a00011d8f, + 0x11d9000011d92, + 0x11d9300011d99, + 0x11da000011daa, + 0x11ee000011ef7, + 0x120000001239a, + 0x1248000012544, + 0x130000001342f, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, + 0x16b4000016b44, + 0x16b5000016b5a, + 0x16b6300016b78, + 0x16b7d00016b90, + 0x16e6000016e80, + 0x16f0000016f4b, + 0x16f4f00016f88, + 0x16f8f00016fa0, + 0x16fe000016fe2, + 0x16fe300016fe4, + 0x17000000187f8, + 0x1880000018af3, + 0x1b0000001b11f, + 0x1b1500001b153, + 0x1b1640001b168, + 0x1b1700001b2fc, + 0x1bc000001bc6b, + 0x1bc700001bc7d, + 0x1bc800001bc89, + 0x1bc900001bc9a, + 0x1bc9d0001bc9f, + 0x1da000001da37, + 0x1da3b0001da6d, + 0x1da750001da76, + 0x1da840001da85, + 0x1da9b0001daa0, + 0x1daa10001dab0, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, + 0x1e1000001e12d, + 0x1e1300001e13e, + 0x1e1400001e14a, + 0x1e14e0001e14f, + 0x1e2c00001e2fa, + 0x1e8000001e8c5, + 0x1e8d00001e8d7, + 0x1e9220001e94c, + 0x1e9500001e95a, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/idna/intranges.py b/idna/intranges.py new file mode 100644 index 0000000..fa8a735 --- /dev/null +++ b/idna/intranges.py @@ -0,0 +1,53 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect + +def intranges_from_list(list_): + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i+1 < len(sorted_list): + if sorted_list[i] == sorted_list[i+1]-1: + continue + current_range = sorted_list[last_write+1:i+1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + +def _encode_range(start, end): + return (start << 32) | end + +def _decode_range(r): + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_, ranges): + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos-1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/idna/package_data.py b/idna/package_data.py new file mode 100644 index 0000000..b5d8216 --- /dev/null +++ b/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.9' + diff --git a/idna/uts46data.py b/idna/uts46data.py new file mode 100644 index 0000000..2711136 --- /dev/null +++ b/idna/uts46data.py @@ -0,0 +1,8317 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "12.1.0" +def _seg_0(): + return [ + (0x0, '3'), + (0x1, '3'), + (0x2, '3'), + (0x3, '3'), + (0x4, '3'), + (0x5, '3'), + (0x6, '3'), + (0x7, '3'), + (0x8, '3'), + (0x9, '3'), + (0xA, '3'), + (0xB, '3'), + (0xC, '3'), + (0xD, '3'), + (0xE, '3'), + (0xF, '3'), + (0x10, '3'), + (0x11, '3'), + (0x12, '3'), + (0x13, '3'), + (0x14, '3'), + (0x15, '3'), + (0x16, '3'), + (0x17, '3'), + (0x18, '3'), + (0x19, '3'), + (0x1A, '3'), + (0x1B, '3'), + (0x1C, '3'), + (0x1D, '3'), + (0x1E, '3'), + (0x1F, '3'), + (0x20, '3'), + (0x21, '3'), + (0x22, '3'), + (0x23, '3'), + (0x24, '3'), + (0x25, '3'), + (0x26, '3'), + (0x27, '3'), + (0x28, '3'), + (0x29, '3'), + (0x2A, '3'), + (0x2B, '3'), + (0x2C, '3'), + (0x2D, 'V'), + (0x2E, 'V'), + (0x2F, '3'), + (0x30, 'V'), + (0x31, 'V'), + (0x32, 'V'), + (0x33, 'V'), + (0x34, 'V'), + (0x35, 'V'), + (0x36, 'V'), + (0x37, 'V'), + (0x38, 'V'), + (0x39, 'V'), + (0x3A, '3'), + (0x3B, '3'), + (0x3C, '3'), + (0x3D, '3'), + (0x3E, '3'), + (0x3F, '3'), + (0x40, '3'), + (0x41, 'M', u'a'), + (0x42, 'M', u'b'), + (0x43, 'M', u'c'), + (0x44, 'M', u'd'), + (0x45, 'M', u'e'), + (0x46, 'M', u'f'), + (0x47, 'M', u'g'), + (0x48, 'M', u'h'), + (0x49, 'M', u'i'), + (0x4A, 'M', u'j'), + (0x4B, 'M', u'k'), + (0x4C, 'M', u'l'), + (0x4D, 'M', u'm'), + (0x4E, 'M', u'n'), + (0x4F, 'M', u'o'), + (0x50, 'M', u'p'), + (0x51, 'M', u'q'), + (0x52, 'M', u'r'), + (0x53, 'M', u's'), + (0x54, 'M', u't'), + (0x55, 'M', u'u'), + (0x56, 'M', u'v'), + (0x57, 'M', u'w'), + (0x58, 'M', u'x'), + (0x59, 'M', u'y'), + (0x5A, 'M', u'z'), + (0x5B, '3'), + (0x5C, '3'), + (0x5D, '3'), + (0x5E, '3'), + (0x5F, '3'), + (0x60, '3'), + (0x61, 'V'), + (0x62, 'V'), + (0x63, 'V'), + ] + +def _seg_1(): + return [ + (0x64, 'V'), + (0x65, 'V'), + (0x66, 'V'), + (0x67, 'V'), + (0x68, 'V'), + (0x69, 'V'), + (0x6A, 'V'), + (0x6B, 'V'), + (0x6C, 'V'), + (0x6D, 'V'), + (0x6E, 'V'), + (0x6F, 'V'), + (0x70, 'V'), + (0x71, 'V'), + (0x72, 'V'), + (0x73, 'V'), + (0x74, 'V'), + (0x75, 'V'), + (0x76, 'V'), + (0x77, 'V'), + (0x78, 'V'), + (0x79, 'V'), + (0x7A, 'V'), + (0x7B, '3'), + (0x7C, '3'), + (0x7D, '3'), + (0x7E, '3'), + (0x7F, '3'), + (0x80, 'X'), + (0x81, 'X'), + (0x82, 'X'), + (0x83, 'X'), + (0x84, 'X'), + (0x85, 'X'), + (0x86, 'X'), + (0x87, 'X'), + (0x88, 'X'), + (0x89, 'X'), + (0x8A, 'X'), + (0x8B, 'X'), + (0x8C, 'X'), + (0x8D, 'X'), + (0x8E, 'X'), + (0x8F, 'X'), + (0x90, 'X'), + (0x91, 'X'), + (0x92, 'X'), + (0x93, 'X'), + (0x94, 'X'), + (0x95, 'X'), + (0x96, 'X'), + (0x97, 'X'), + (0x98, 'X'), + (0x99, 'X'), + (0x9A, 'X'), + (0x9B, 'X'), + (0x9C, 'X'), + (0x9D, 'X'), + (0x9E, 'X'), + (0x9F, 'X'), + (0xA0, '3', u' '), + (0xA1, 'V'), + (0xA2, 'V'), + (0xA3, 'V'), + (0xA4, 'V'), + (0xA5, 'V'), + (0xA6, 'V'), + (0xA7, 'V'), + (0xA8, '3', u' ̈'), + (0xA9, 'V'), + (0xAA, 'M', u'a'), + (0xAB, 'V'), + (0xAC, 'V'), + (0xAD, 'I'), + (0xAE, 'V'), + (0xAF, '3', u' ̄'), + (0xB0, 'V'), + (0xB1, 'V'), + (0xB2, 'M', u'2'), + (0xB3, 'M', u'3'), + (0xB4, '3', u' ́'), + (0xB5, 'M', u'μ'), + (0xB6, 'V'), + (0xB7, 'V'), + (0xB8, '3', u' ̧'), + (0xB9, 'M', u'1'), + (0xBA, 'M', u'o'), + (0xBB, 'V'), + (0xBC, 'M', u'1⁄4'), + (0xBD, 'M', u'1⁄2'), + (0xBE, 'M', u'3⁄4'), + (0xBF, 'V'), + (0xC0, 'M', u'à'), + (0xC1, 'M', u'á'), + (0xC2, 'M', u'â'), + (0xC3, 'M', u'ã'), + (0xC4, 'M', u'ä'), + (0xC5, 'M', u'å'), + (0xC6, 'M', u'æ'), + (0xC7, 'M', u'ç'), + ] + +def _seg_2(): + return [ + (0xC8, 'M', u'è'), + (0xC9, 'M', u'é'), + (0xCA, 'M', u'ê'), + (0xCB, 'M', u'ë'), + (0xCC, 'M', u'ì'), + (0xCD, 'M', u'í'), + (0xCE, 'M', u'î'), + (0xCF, 'M', u'ï'), + (0xD0, 'M', u'ð'), + (0xD1, 'M', u'ñ'), + (0xD2, 'M', u'ò'), + (0xD3, 'M', u'ó'), + (0xD4, 'M', u'ô'), + (0xD5, 'M', u'õ'), + (0xD6, 'M', u'ö'), + (0xD7, 'V'), + (0xD8, 'M', u'ø'), + (0xD9, 'M', u'ù'), + (0xDA, 'M', u'ú'), + (0xDB, 'M', u'û'), + (0xDC, 'M', u'ü'), + (0xDD, 'M', u'ý'), + (0xDE, 'M', u'þ'), + (0xDF, 'D', u'ss'), + (0xE0, 'V'), + (0xE1, 'V'), + (0xE2, 'V'), + (0xE3, 'V'), + (0xE4, 'V'), + (0xE5, 'V'), + (0xE6, 'V'), + (0xE7, 'V'), + (0xE8, 'V'), + (0xE9, 'V'), + (0xEA, 'V'), + (0xEB, 'V'), + (0xEC, 'V'), + (0xED, 'V'), + (0xEE, 'V'), + (0xEF, 'V'), + (0xF0, 'V'), + (0xF1, 'V'), + (0xF2, 'V'), + (0xF3, 'V'), + (0xF4, 'V'), + (0xF5, 'V'), + (0xF6, 'V'), + (0xF7, 'V'), + (0xF8, 'V'), + (0xF9, 'V'), + (0xFA, 'V'), + (0xFB, 'V'), + (0xFC, 'V'), + (0xFD, 'V'), + (0xFE, 'V'), + (0xFF, 'V'), + (0x100, 'M', u'ā'), + (0x101, 'V'), + (0x102, 'M', u'ă'), + (0x103, 'V'), + (0x104, 'M', u'ą'), + (0x105, 'V'), + (0x106, 'M', u'ć'), + (0x107, 'V'), + (0x108, 'M', u'ĉ'), + (0x109, 'V'), + (0x10A, 'M', u'ċ'), + (0x10B, 'V'), + (0x10C, 'M', u'č'), + (0x10D, 'V'), + (0x10E, 'M', u'ď'), + (0x10F, 'V'), + (0x110, 'M', u'đ'), + (0x111, 'V'), + (0x112, 'M', u'ē'), + (0x113, 'V'), + (0x114, 'M', u'ĕ'), + (0x115, 'V'), + (0x116, 'M', u'ė'), + (0x117, 'V'), + (0x118, 'M', u'ę'), + (0x119, 'V'), + (0x11A, 'M', u'ě'), + (0x11B, 'V'), + (0x11C, 'M', u'ĝ'), + (0x11D, 'V'), + (0x11E, 'M', u'ğ'), + (0x11F, 'V'), + (0x120, 'M', u'ġ'), + (0x121, 'V'), + (0x122, 'M', u'ģ'), + (0x123, 'V'), + (0x124, 'M', u'ĥ'), + (0x125, 'V'), + (0x126, 'M', u'ħ'), + (0x127, 'V'), + (0x128, 'M', u'ĩ'), + (0x129, 'V'), + (0x12A, 'M', u'ī'), + (0x12B, 'V'), + ] + +def _seg_3(): + return [ + (0x12C, 'M', u'ĭ'), + (0x12D, 'V'), + (0x12E, 'M', u'į'), + (0x12F, 'V'), + (0x130, 'M', u'i̇'), + (0x131, 'V'), + (0x132, 'M', u'ij'), + (0x134, 'M', u'ĵ'), + (0x135, 'V'), + (0x136, 'M', u'ķ'), + (0x137, 'V'), + (0x139, 'M', u'ĺ'), + (0x13A, 'V'), + (0x13B, 'M', u'ļ'), + (0x13C, 'V'), + (0x13D, 'M', u'ľ'), + (0x13E, 'V'), + (0x13F, 'M', u'l·'), + (0x141, 'M', u'ł'), + (0x142, 'V'), + (0x143, 'M', u'ń'), + (0x144, 'V'), + (0x145, 'M', u'ņ'), + (0x146, 'V'), + (0x147, 'M', u'ň'), + (0x148, 'V'), + (0x149, 'M', u'ʼn'), + (0x14A, 'M', u'ŋ'), + (0x14B, 'V'), + (0x14C, 'M', u'ō'), + (0x14D, 'V'), + (0x14E, 'M', u'ŏ'), + (0x14F, 'V'), + (0x150, 'M', u'ő'), + (0x151, 'V'), + (0x152, 'M', u'œ'), + (0x153, 'V'), + (0x154, 'M', u'ŕ'), + (0x155, 'V'), + (0x156, 'M', u'ŗ'), + (0x157, 'V'), + (0x158, 'M', u'ř'), + (0x159, 'V'), + (0x15A, 'M', u'ś'), + (0x15B, 'V'), + (0x15C, 'M', u'ŝ'), + (0x15D, 'V'), + (0x15E, 'M', u'ş'), + (0x15F, 'V'), + (0x160, 'M', u'š'), + (0x161, 'V'), + (0x162, 'M', u'ţ'), + (0x163, 'V'), + (0x164, 'M', u'ť'), + (0x165, 'V'), + (0x166, 'M', u'ŧ'), + (0x167, 'V'), + (0x168, 'M', u'ũ'), + (0x169, 'V'), + (0x16A, 'M', u'ū'), + (0x16B, 'V'), + (0x16C, 'M', u'ŭ'), + (0x16D, 'V'), + (0x16E, 'M', u'ů'), + (0x16F, 'V'), + (0x170, 'M', u'ű'), + (0x171, 'V'), + (0x172, 'M', u'ų'), + (0x173, 'V'), + (0x174, 'M', u'ŵ'), + (0x175, 'V'), + (0x176, 'M', u'ŷ'), + (0x177, 'V'), + (0x178, 'M', u'ÿ'), + (0x179, 'M', u'ź'), + (0x17A, 'V'), + (0x17B, 'M', u'ż'), + (0x17C, 'V'), + (0x17D, 'M', u'ž'), + (0x17E, 'V'), + (0x17F, 'M', u's'), + (0x180, 'V'), + (0x181, 'M', u'ɓ'), + (0x182, 'M', u'ƃ'), + (0x183, 'V'), + (0x184, 'M', u'ƅ'), + (0x185, 'V'), + (0x186, 'M', u'ɔ'), + (0x187, 'M', u'ƈ'), + (0x188, 'V'), + (0x189, 'M', u'ɖ'), + (0x18A, 'M', u'ɗ'), + (0x18B, 'M', u'ƌ'), + (0x18C, 'V'), + (0x18E, 'M', u'ǝ'), + (0x18F, 'M', u'ə'), + (0x190, 'M', u'ɛ'), + (0x191, 'M', u'ƒ'), + (0x192, 'V'), + (0x193, 'M', u'ɠ'), + ] + +def _seg_4(): + return [ + (0x194, 'M', u'ɣ'), + (0x195, 'V'), + (0x196, 'M', u'ɩ'), + (0x197, 'M', u'ɨ'), + (0x198, 'M', u'ƙ'), + (0x199, 'V'), + (0x19C, 'M', u'ɯ'), + (0x19D, 'M', u'ɲ'), + (0x19E, 'V'), + (0x19F, 'M', u'ɵ'), + (0x1A0, 'M', u'ơ'), + (0x1A1, 'V'), + (0x1A2, 'M', u'ƣ'), + (0x1A3, 'V'), + (0x1A4, 'M', u'ƥ'), + (0x1A5, 'V'), + (0x1A6, 'M', u'ʀ'), + (0x1A7, 'M', u'ƨ'), + (0x1A8, 'V'), + (0x1A9, 'M', u'ʃ'), + (0x1AA, 'V'), + (0x1AC, 'M', u'ƭ'), + (0x1AD, 'V'), + (0x1AE, 'M', u'ʈ'), + (0x1AF, 'M', u'ư'), + (0x1B0, 'V'), + (0x1B1, 'M', u'ʊ'), + (0x1B2, 'M', u'ʋ'), + (0x1B3, 'M', u'ƴ'), + (0x1B4, 'V'), + (0x1B5, 'M', u'ƶ'), + (0x1B6, 'V'), + (0x1B7, 'M', u'ʒ'), + (0x1B8, 'M', u'ƹ'), + (0x1B9, 'V'), + (0x1BC, 'M', u'ƽ'), + (0x1BD, 'V'), + (0x1C4, 'M', u'dž'), + (0x1C7, 'M', u'lj'), + (0x1CA, 'M', u'nj'), + (0x1CD, 'M', u'ǎ'), + (0x1CE, 'V'), + (0x1CF, 'M', u'ǐ'), + (0x1D0, 'V'), + (0x1D1, 'M', u'ǒ'), + (0x1D2, 'V'), + (0x1D3, 'M', u'ǔ'), + (0x1D4, 'V'), + (0x1D5, 'M', u'ǖ'), + (0x1D6, 'V'), + (0x1D7, 'M', u'ǘ'), + (0x1D8, 'V'), + (0x1D9, 'M', u'ǚ'), + (0x1DA, 'V'), + (0x1DB, 'M', u'ǜ'), + (0x1DC, 'V'), + (0x1DE, 'M', u'ǟ'), + (0x1DF, 'V'), + (0x1E0, 'M', u'ǡ'), + (0x1E1, 'V'), + (0x1E2, 'M', u'ǣ'), + (0x1E3, 'V'), + (0x1E4, 'M', u'ǥ'), + (0x1E5, 'V'), + (0x1E6, 'M', u'ǧ'), + (0x1E7, 'V'), + (0x1E8, 'M', u'ǩ'), + (0x1E9, 'V'), + (0x1EA, 'M', u'ǫ'), + (0x1EB, 'V'), + (0x1EC, 'M', u'ǭ'), + (0x1ED, 'V'), + (0x1EE, 'M', u'ǯ'), + (0x1EF, 'V'), + (0x1F1, 'M', u'dz'), + (0x1F4, 'M', u'ǵ'), + (0x1F5, 'V'), + (0x1F6, 'M', u'ƕ'), + (0x1F7, 'M', u'ƿ'), + (0x1F8, 'M', u'ǹ'), + (0x1F9, 'V'), + (0x1FA, 'M', u'ǻ'), + (0x1FB, 'V'), + (0x1FC, 'M', u'ǽ'), + (0x1FD, 'V'), + (0x1FE, 'M', u'ǿ'), + (0x1FF, 'V'), + (0x200, 'M', u'ȁ'), + (0x201, 'V'), + (0x202, 'M', u'ȃ'), + (0x203, 'V'), + (0x204, 'M', u'ȅ'), + (0x205, 'V'), + (0x206, 'M', u'ȇ'), + (0x207, 'V'), + (0x208, 'M', u'ȉ'), + (0x209, 'V'), + (0x20A, 'M', u'ȋ'), + (0x20B, 'V'), + (0x20C, 'M', u'ȍ'), + ] + +def _seg_5(): + return [ + (0x20D, 'V'), + (0x20E, 'M', u'ȏ'), + (0x20F, 'V'), + (0x210, 'M', u'ȑ'), + (0x211, 'V'), + (0x212, 'M', u'ȓ'), + (0x213, 'V'), + (0x214, 'M', u'ȕ'), + (0x215, 'V'), + (0x216, 'M', u'ȗ'), + (0x217, 'V'), + (0x218, 'M', u'ș'), + (0x219, 'V'), + (0x21A, 'M', u'ț'), + (0x21B, 'V'), + (0x21C, 'M', u'ȝ'), + (0x21D, 'V'), + (0x21E, 'M', u'ȟ'), + (0x21F, 'V'), + (0x220, 'M', u'ƞ'), + (0x221, 'V'), + (0x222, 'M', u'ȣ'), + (0x223, 'V'), + (0x224, 'M', u'ȥ'), + (0x225, 'V'), + (0x226, 'M', u'ȧ'), + (0x227, 'V'), + (0x228, 'M', u'ȩ'), + (0x229, 'V'), + (0x22A, 'M', u'ȫ'), + (0x22B, 'V'), + (0x22C, 'M', u'ȭ'), + (0x22D, 'V'), + (0x22E, 'M', u'ȯ'), + (0x22F, 'V'), + (0x230, 'M', u'ȱ'), + (0x231, 'V'), + (0x232, 'M', u'ȳ'), + (0x233, 'V'), + (0x23A, 'M', u'ⱥ'), + (0x23B, 'M', u'ȼ'), + (0x23C, 'V'), + (0x23D, 'M', u'ƚ'), + (0x23E, 'M', u'ⱦ'), + (0x23F, 'V'), + (0x241, 'M', u'ɂ'), + (0x242, 'V'), + (0x243, 'M', u'ƀ'), + (0x244, 'M', u'ʉ'), + (0x245, 'M', u'ʌ'), + (0x246, 'M', u'ɇ'), + (0x247, 'V'), + (0x248, 'M', u'ɉ'), + (0x249, 'V'), + (0x24A, 'M', u'ɋ'), + (0x24B, 'V'), + (0x24C, 'M', u'ɍ'), + (0x24D, 'V'), + (0x24E, 'M', u'ɏ'), + (0x24F, 'V'), + (0x2B0, 'M', u'h'), + (0x2B1, 'M', u'ɦ'), + (0x2B2, 'M', u'j'), + (0x2B3, 'M', u'r'), + (0x2B4, 'M', u'ɹ'), + (0x2B5, 'M', u'ɻ'), + (0x2B6, 'M', u'ʁ'), + (0x2B7, 'M', u'w'), + (0x2B8, 'M', u'y'), + (0x2B9, 'V'), + (0x2D8, '3', u' ̆'), + (0x2D9, '3', u' ̇'), + (0x2DA, '3', u' ̊'), + (0x2DB, '3', u' ̨'), + (0x2DC, '3', u' ̃'), + (0x2DD, '3', u' ̋'), + (0x2DE, 'V'), + (0x2E0, 'M', u'ɣ'), + (0x2E1, 'M', u'l'), + (0x2E2, 'M', u's'), + (0x2E3, 'M', u'x'), + (0x2E4, 'M', u'ʕ'), + (0x2E5, 'V'), + (0x340, 'M', u'̀'), + (0x341, 'M', u'́'), + (0x342, 'V'), + (0x343, 'M', u'̓'), + (0x344, 'M', u'̈́'), + (0x345, 'M', u'ι'), + (0x346, 'V'), + (0x34F, 'I'), + (0x350, 'V'), + (0x370, 'M', u'ͱ'), + (0x371, 'V'), + (0x372, 'M', u'ͳ'), + (0x373, 'V'), + (0x374, 'M', u'ʹ'), + (0x375, 'V'), + (0x376, 'M', u'ͷ'), + (0x377, 'V'), + ] + +def _seg_6(): + return [ + (0x378, 'X'), + (0x37A, '3', u' ι'), + (0x37B, 'V'), + (0x37E, '3', u';'), + (0x37F, 'M', u'ϳ'), + (0x380, 'X'), + (0x384, '3', u' ́'), + (0x385, '3', u' ̈́'), + (0x386, 'M', u'ά'), + (0x387, 'M', u'·'), + (0x388, 'M', u'έ'), + (0x389, 'M', u'ή'), + (0x38A, 'M', u'ί'), + (0x38B, 'X'), + (0x38C, 'M', u'ό'), + (0x38D, 'X'), + (0x38E, 'M', u'ύ'), + (0x38F, 'M', u'ώ'), + (0x390, 'V'), + (0x391, 'M', u'α'), + (0x392, 'M', u'β'), + (0x393, 'M', u'γ'), + (0x394, 'M', u'δ'), + (0x395, 'M', u'ε'), + (0x396, 'M', u'ζ'), + (0x397, 'M', u'η'), + (0x398, 'M', u'θ'), + (0x399, 'M', u'ι'), + (0x39A, 'M', u'κ'), + (0x39B, 'M', u'λ'), + (0x39C, 'M', u'μ'), + (0x39D, 'M', u'ν'), + (0x39E, 'M', u'ξ'), + (0x39F, 'M', u'ο'), + (0x3A0, 'M', u'π'), + (0x3A1, 'M', u'ρ'), + (0x3A2, 'X'), + (0x3A3, 'M', u'σ'), + (0x3A4, 'M', u'τ'), + (0x3A5, 'M', u'υ'), + (0x3A6, 'M', u'φ'), + (0x3A7, 'M', u'χ'), + (0x3A8, 'M', u'ψ'), + (0x3A9, 'M', u'ω'), + (0x3AA, 'M', u'ϊ'), + (0x3AB, 'M', u'ϋ'), + (0x3AC, 'V'), + (0x3C2, 'D', u'σ'), + (0x3C3, 'V'), + (0x3CF, 'M', u'ϗ'), + (0x3D0, 'M', u'β'), + (0x3D1, 'M', u'θ'), + (0x3D2, 'M', u'υ'), + (0x3D3, 'M', u'ύ'), + (0x3D4, 'M', u'ϋ'), + (0x3D5, 'M', u'φ'), + (0x3D6, 'M', u'π'), + (0x3D7, 'V'), + (0x3D8, 'M', u'ϙ'), + (0x3D9, 'V'), + (0x3DA, 'M', u'ϛ'), + (0x3DB, 'V'), + (0x3DC, 'M', u'ϝ'), + (0x3DD, 'V'), + (0x3DE, 'M', u'ϟ'), + (0x3DF, 'V'), + (0x3E0, 'M', u'ϡ'), + (0x3E1, 'V'), + (0x3E2, 'M', u'ϣ'), + (0x3E3, 'V'), + (0x3E4, 'M', u'ϥ'), + (0x3E5, 'V'), + (0x3E6, 'M', u'ϧ'), + (0x3E7, 'V'), + (0x3E8, 'M', u'ϩ'), + (0x3E9, 'V'), + (0x3EA, 'M', u'ϫ'), + (0x3EB, 'V'), + (0x3EC, 'M', u'ϭ'), + (0x3ED, 'V'), + (0x3EE, 'M', u'ϯ'), + (0x3EF, 'V'), + (0x3F0, 'M', u'κ'), + (0x3F1, 'M', u'ρ'), + (0x3F2, 'M', u'σ'), + (0x3F3, 'V'), + (0x3F4, 'M', u'θ'), + (0x3F5, 'M', u'ε'), + (0x3F6, 'V'), + (0x3F7, 'M', u'ϸ'), + (0x3F8, 'V'), + (0x3F9, 'M', u'σ'), + (0x3FA, 'M', u'ϻ'), + (0x3FB, 'V'), + (0x3FD, 'M', u'ͻ'), + (0x3FE, 'M', u'ͼ'), + (0x3FF, 'M', u'ͽ'), + (0x400, 'M', u'ѐ'), + (0x401, 'M', u'ё'), + (0x402, 'M', u'ђ'), + ] + +def _seg_7(): + return [ + (0x403, 'M', u'ѓ'), + (0x404, 'M', u'є'), + (0x405, 'M', u'ѕ'), + (0x406, 'M', u'і'), + (0x407, 'M', u'ї'), + (0x408, 'M', u'ј'), + (0x409, 'M', u'љ'), + (0x40A, 'M', u'њ'), + (0x40B, 'M', u'ћ'), + (0x40C, 'M', u'ќ'), + (0x40D, 'M', u'ѝ'), + (0x40E, 'M', u'ў'), + (0x40F, 'M', u'џ'), + (0x410, 'M', u'а'), + (0x411, 'M', u'б'), + (0x412, 'M', u'в'), + (0x413, 'M', u'г'), + (0x414, 'M', u'д'), + (0x415, 'M', u'е'), + (0x416, 'M', u'ж'), + (0x417, 'M', u'з'), + (0x418, 'M', u'и'), + (0x419, 'M', u'й'), + (0x41A, 'M', u'к'), + (0x41B, 'M', u'л'), + (0x41C, 'M', u'м'), + (0x41D, 'M', u'н'), + (0x41E, 'M', u'о'), + (0x41F, 'M', u'п'), + (0x420, 'M', u'р'), + (0x421, 'M', u'с'), + (0x422, 'M', u'т'), + (0x423, 'M', u'у'), + (0x424, 'M', u'ф'), + (0x425, 'M', u'х'), + (0x426, 'M', u'ц'), + (0x427, 'M', u'ч'), + (0x428, 'M', u'ш'), + (0x429, 'M', u'щ'), + (0x42A, 'M', u'ъ'), + (0x42B, 'M', u'ы'), + (0x42C, 'M', u'ь'), + (0x42D, 'M', u'э'), + (0x42E, 'M', u'ю'), + (0x42F, 'M', u'я'), + (0x430, 'V'), + (0x460, 'M', u'ѡ'), + (0x461, 'V'), + (0x462, 'M', u'ѣ'), + (0x463, 'V'), + (0x464, 'M', u'ѥ'), + (0x465, 'V'), + (0x466, 'M', u'ѧ'), + (0x467, 'V'), + (0x468, 'M', u'ѩ'), + (0x469, 'V'), + (0x46A, 'M', u'ѫ'), + (0x46B, 'V'), + (0x46C, 'M', u'ѭ'), + (0x46D, 'V'), + (0x46E, 'M', u'ѯ'), + (0x46F, 'V'), + (0x470, 'M', u'ѱ'), + (0x471, 'V'), + (0x472, 'M', u'ѳ'), + (0x473, 'V'), + (0x474, 'M', u'ѵ'), + (0x475, 'V'), + (0x476, 'M', u'ѷ'), + (0x477, 'V'), + (0x478, 'M', u'ѹ'), + (0x479, 'V'), + (0x47A, 'M', u'ѻ'), + (0x47B, 'V'), + (0x47C, 'M', u'ѽ'), + (0x47D, 'V'), + (0x47E, 'M', u'ѿ'), + (0x47F, 'V'), + (0x480, 'M', u'ҁ'), + (0x481, 'V'), + (0x48A, 'M', u'ҋ'), + (0x48B, 'V'), + (0x48C, 'M', u'ҍ'), + (0x48D, 'V'), + (0x48E, 'M', u'ҏ'), + (0x48F, 'V'), + (0x490, 'M', u'ґ'), + (0x491, 'V'), + (0x492, 'M', u'ғ'), + (0x493, 'V'), + (0x494, 'M', u'ҕ'), + (0x495, 'V'), + (0x496, 'M', u'җ'), + (0x497, 'V'), + (0x498, 'M', u'ҙ'), + (0x499, 'V'), + (0x49A, 'M', u'қ'), + (0x49B, 'V'), + (0x49C, 'M', u'ҝ'), + (0x49D, 'V'), + ] + +def _seg_8(): + return [ + (0x49E, 'M', u'ҟ'), + (0x49F, 'V'), + (0x4A0, 'M', u'ҡ'), + (0x4A1, 'V'), + (0x4A2, 'M', u'ң'), + (0x4A3, 'V'), + (0x4A4, 'M', u'ҥ'), + (0x4A5, 'V'), + (0x4A6, 'M', u'ҧ'), + (0x4A7, 'V'), + (0x4A8, 'M', u'ҩ'), + (0x4A9, 'V'), + (0x4AA, 'M', u'ҫ'), + (0x4AB, 'V'), + (0x4AC, 'M', u'ҭ'), + (0x4AD, 'V'), + (0x4AE, 'M', u'ү'), + (0x4AF, 'V'), + (0x4B0, 'M', u'ұ'), + (0x4B1, 'V'), + (0x4B2, 'M', u'ҳ'), + (0x4B3, 'V'), + (0x4B4, 'M', u'ҵ'), + (0x4B5, 'V'), + (0x4B6, 'M', u'ҷ'), + (0x4B7, 'V'), + (0x4B8, 'M', u'ҹ'), + (0x4B9, 'V'), + (0x4BA, 'M', u'һ'), + (0x4BB, 'V'), + (0x4BC, 'M', u'ҽ'), + (0x4BD, 'V'), + (0x4BE, 'M', u'ҿ'), + (0x4BF, 'V'), + (0x4C0, 'X'), + (0x4C1, 'M', u'ӂ'), + (0x4C2, 'V'), + (0x4C3, 'M', u'ӄ'), + (0x4C4, 'V'), + (0x4C5, 'M', u'ӆ'), + (0x4C6, 'V'), + (0x4C7, 'M', u'ӈ'), + (0x4C8, 'V'), + (0x4C9, 'M', u'ӊ'), + (0x4CA, 'V'), + (0x4CB, 'M', u'ӌ'), + (0x4CC, 'V'), + (0x4CD, 'M', u'ӎ'), + (0x4CE, 'V'), + (0x4D0, 'M', u'ӑ'), + (0x4D1, 'V'), + (0x4D2, 'M', u'ӓ'), + (0x4D3, 'V'), + (0x4D4, 'M', u'ӕ'), + (0x4D5, 'V'), + (0x4D6, 'M', u'ӗ'), + (0x4D7, 'V'), + (0x4D8, 'M', u'ә'), + (0x4D9, 'V'), + (0x4DA, 'M', u'ӛ'), + (0x4DB, 'V'), + (0x4DC, 'M', u'ӝ'), + (0x4DD, 'V'), + (0x4DE, 'M', u'ӟ'), + (0x4DF, 'V'), + (0x4E0, 'M', u'ӡ'), + (0x4E1, 'V'), + (0x4E2, 'M', u'ӣ'), + (0x4E3, 'V'), + (0x4E4, 'M', u'ӥ'), + (0x4E5, 'V'), + (0x4E6, 'M', u'ӧ'), + (0x4E7, 'V'), + (0x4E8, 'M', u'ө'), + (0x4E9, 'V'), + (0x4EA, 'M', u'ӫ'), + (0x4EB, 'V'), + (0x4EC, 'M', u'ӭ'), + (0x4ED, 'V'), + (0x4EE, 'M', u'ӯ'), + (0x4EF, 'V'), + (0x4F0, 'M', u'ӱ'), + (0x4F1, 'V'), + (0x4F2, 'M', u'ӳ'), + (0x4F3, 'V'), + (0x4F4, 'M', u'ӵ'), + (0x4F5, 'V'), + (0x4F6, 'M', u'ӷ'), + (0x4F7, 'V'), + (0x4F8, 'M', u'ӹ'), + (0x4F9, 'V'), + (0x4FA, 'M', u'ӻ'), + (0x4FB, 'V'), + (0x4FC, 'M', u'ӽ'), + (0x4FD, 'V'), + (0x4FE, 'M', u'ӿ'), + (0x4FF, 'V'), + (0x500, 'M', u'ԁ'), + (0x501, 'V'), + (0x502, 'M', u'ԃ'), + ] + +def _seg_9(): + return [ + (0x503, 'V'), + (0x504, 'M', u'ԅ'), + (0x505, 'V'), + (0x506, 'M', u'ԇ'), + (0x507, 'V'), + (0x508, 'M', u'ԉ'), + (0x509, 'V'), + (0x50A, 'M', u'ԋ'), + (0x50B, 'V'), + (0x50C, 'M', u'ԍ'), + (0x50D, 'V'), + (0x50E, 'M', u'ԏ'), + (0x50F, 'V'), + (0x510, 'M', u'ԑ'), + (0x511, 'V'), + (0x512, 'M', u'ԓ'), + (0x513, 'V'), + (0x514, 'M', u'ԕ'), + (0x515, 'V'), + (0x516, 'M', u'ԗ'), + (0x517, 'V'), + (0x518, 'M', u'ԙ'), + (0x519, 'V'), + (0x51A, 'M', u'ԛ'), + (0x51B, 'V'), + (0x51C, 'M', u'ԝ'), + (0x51D, 'V'), + (0x51E, 'M', u'ԟ'), + (0x51F, 'V'), + (0x520, 'M', u'ԡ'), + (0x521, 'V'), + (0x522, 'M', u'ԣ'), + (0x523, 'V'), + (0x524, 'M', u'ԥ'), + (0x525, 'V'), + (0x526, 'M', u'ԧ'), + (0x527, 'V'), + (0x528, 'M', u'ԩ'), + (0x529, 'V'), + (0x52A, 'M', u'ԫ'), + (0x52B, 'V'), + (0x52C, 'M', u'ԭ'), + (0x52D, 'V'), + (0x52E, 'M', u'ԯ'), + (0x52F, 'V'), + (0x530, 'X'), + (0x531, 'M', u'ա'), + (0x532, 'M', u'բ'), + (0x533, 'M', u'գ'), + (0x534, 'M', u'դ'), + (0x535, 'M', u'ե'), + (0x536, 'M', u'զ'), + (0x537, 'M', u'է'), + (0x538, 'M', u'ը'), + (0x539, 'M', u'թ'), + (0x53A, 'M', u'ժ'), + (0x53B, 'M', u'ի'), + (0x53C, 'M', u'լ'), + (0x53D, 'M', u'խ'), + (0x53E, 'M', u'ծ'), + (0x53F, 'M', u'կ'), + (0x540, 'M', u'հ'), + (0x541, 'M', u'ձ'), + (0x542, 'M', u'ղ'), + (0x543, 'M', u'ճ'), + (0x544, 'M', u'մ'), + (0x545, 'M', u'յ'), + (0x546, 'M', u'ն'), + (0x547, 'M', u'շ'), + (0x548, 'M', u'ո'), + (0x549, 'M', u'չ'), + (0x54A, 'M', u'պ'), + (0x54B, 'M', u'ջ'), + (0x54C, 'M', u'ռ'), + (0x54D, 'M', u'ս'), + (0x54E, 'M', u'վ'), + (0x54F, 'M', u'տ'), + (0x550, 'M', u'ր'), + (0x551, 'M', u'ց'), + (0x552, 'M', u'ւ'), + (0x553, 'M', u'փ'), + (0x554, 'M', u'ք'), + (0x555, 'M', u'օ'), + (0x556, 'M', u'ֆ'), + (0x557, 'X'), + (0x559, 'V'), + (0x587, 'M', u'եւ'), + (0x588, 'V'), + (0x58B, 'X'), + (0x58D, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5EF, 'V'), + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), + ] + +def _seg_10(): + return [ + (0x675, 'M', u'اٴ'), + (0x676, 'M', u'وٴ'), + (0x677, 'M', u'ۇٴ'), + (0x678, 'M', u'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x7FD, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x860, 'V'), + (0x86B, 'X'), + (0x8A0, 'V'), + (0x8B5, 'X'), + (0x8B6, 'V'), + (0x8BE, 'X'), + (0x8D3, 'V'), + (0x8E2, 'X'), + (0x8E3, 'V'), + (0x958, 'M', u'क़'), + (0x959, 'M', u'ख़'), + (0x95A, 'M', u'ग़'), + (0x95B, 'M', u'ज़'), + (0x95C, 'M', u'ड़'), + (0x95D, 'M', u'ढ़'), + (0x95E, 'M', u'फ़'), + (0x95F, 'M', u'य़'), + (0x960, 'V'), + (0x984, 'X'), + (0x985, 'V'), + (0x98D, 'X'), + (0x98F, 'V'), + (0x991, 'X'), + (0x993, 'V'), + (0x9A9, 'X'), + (0x9AA, 'V'), + (0x9B1, 'X'), + (0x9B2, 'V'), + (0x9B3, 'X'), + (0x9B6, 'V'), + (0x9BA, 'X'), + (0x9BC, 'V'), + (0x9C5, 'X'), + (0x9C7, 'V'), + (0x9C9, 'X'), + (0x9CB, 'V'), + (0x9CF, 'X'), + (0x9D7, 'V'), + (0x9D8, 'X'), + (0x9DC, 'M', u'ড়'), + (0x9DD, 'M', u'ঢ়'), + (0x9DE, 'X'), + (0x9DF, 'M', u'য়'), + (0x9E0, 'V'), + (0x9E4, 'X'), + (0x9E6, 'V'), + (0x9FF, 'X'), + (0xA01, 'V'), + (0xA04, 'X'), + (0xA05, 'V'), + (0xA0B, 'X'), + (0xA0F, 'V'), + (0xA11, 'X'), + (0xA13, 'V'), + (0xA29, 'X'), + (0xA2A, 'V'), + (0xA31, 'X'), + (0xA32, 'V'), + (0xA33, 'M', u'ਲ਼'), + (0xA34, 'X'), + (0xA35, 'V'), + (0xA36, 'M', u'ਸ਼'), + (0xA37, 'X'), + (0xA38, 'V'), + (0xA3A, 'X'), + (0xA3C, 'V'), + (0xA3D, 'X'), + (0xA3E, 'V'), + (0xA43, 'X'), + (0xA47, 'V'), + (0xA49, 'X'), + (0xA4B, 'V'), + (0xA4E, 'X'), + (0xA51, 'V'), + (0xA52, 'X'), + (0xA59, 'M', u'ਖ਼'), + (0xA5A, 'M', u'ਗ਼'), + (0xA5B, 'M', u'ਜ਼'), + ] + +def _seg_11(): + return [ + (0xA5C, 'V'), + (0xA5D, 'X'), + (0xA5E, 'M', u'ਫ਼'), + (0xA5F, 'X'), + (0xA66, 'V'), + (0xA77, 'X'), + (0xA81, 'V'), + (0xA84, 'X'), + (0xA85, 'V'), + (0xA8E, 'X'), + (0xA8F, 'V'), + (0xA92, 'X'), + (0xA93, 'V'), + (0xAA9, 'X'), + (0xAAA, 'V'), + (0xAB1, 'X'), + (0xAB2, 'V'), + (0xAB4, 'X'), + (0xAB5, 'V'), + (0xABA, 'X'), + (0xABC, 'V'), + (0xAC6, 'X'), + (0xAC7, 'V'), + (0xACA, 'X'), + (0xACB, 'V'), + (0xACE, 'X'), + (0xAD0, 'V'), + (0xAD1, 'X'), + (0xAE0, 'V'), + (0xAE4, 'X'), + (0xAE6, 'V'), + (0xAF2, 'X'), + (0xAF9, 'V'), + (0xB00, 'X'), + (0xB01, 'V'), + (0xB04, 'X'), + (0xB05, 'V'), + (0xB0D, 'X'), + (0xB0F, 'V'), + (0xB11, 'X'), + (0xB13, 'V'), + (0xB29, 'X'), + (0xB2A, 'V'), + (0xB31, 'X'), + (0xB32, 'V'), + (0xB34, 'X'), + (0xB35, 'V'), + (0xB3A, 'X'), + (0xB3C, 'V'), + (0xB45, 'X'), + (0xB47, 'V'), + (0xB49, 'X'), + (0xB4B, 'V'), + (0xB4E, 'X'), + (0xB56, 'V'), + (0xB58, 'X'), + (0xB5C, 'M', u'ଡ଼'), + (0xB5D, 'M', u'ଢ଼'), + (0xB5E, 'X'), + (0xB5F, 'V'), + (0xB64, 'X'), + (0xB66, 'V'), + (0xB78, 'X'), + (0xB82, 'V'), + (0xB84, 'X'), + (0xB85, 'V'), + (0xB8B, 'X'), + (0xB8E, 'V'), + (0xB91, 'X'), + (0xB92, 'V'), + (0xB96, 'X'), + (0xB99, 'V'), + (0xB9B, 'X'), + (0xB9C, 'V'), + (0xB9D, 'X'), + (0xB9E, 'V'), + (0xBA0, 'X'), + (0xBA3, 'V'), + (0xBA5, 'X'), + (0xBA8, 'V'), + (0xBAB, 'X'), + (0xBAE, 'V'), + (0xBBA, 'X'), + (0xBBE, 'V'), + (0xBC3, 'X'), + (0xBC6, 'V'), + (0xBC9, 'X'), + (0xBCA, 'V'), + (0xBCE, 'X'), + (0xBD0, 'V'), + (0xBD1, 'X'), + (0xBD7, 'V'), + (0xBD8, 'X'), + (0xBE6, 'V'), + (0xBFB, 'X'), + (0xC00, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + ] + +def _seg_12(): + return [ + (0xC29, 'X'), + (0xC2A, 'V'), + (0xC3A, 'X'), + (0xC3D, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5B, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC77, 'V'), + (0xC8D, 'X'), + (0xC8E, 'V'), + (0xC91, 'X'), + (0xC92, 'V'), + (0xCA9, 'X'), + (0xCAA, 'V'), + (0xCB4, 'X'), + (0xCB5, 'V'), + (0xCBA, 'X'), + (0xCBC, 'V'), + (0xCC5, 'X'), + (0xCC6, 'V'), + (0xCC9, 'X'), + (0xCCA, 'V'), + (0xCCE, 'X'), + (0xCD5, 'V'), + (0xCD7, 'X'), + (0xCDE, 'V'), + (0xCDF, 'X'), + (0xCE0, 'V'), + (0xCE4, 'X'), + (0xCE6, 'V'), + (0xCF0, 'X'), + (0xCF1, 'V'), + (0xCF3, 'X'), + (0xD00, 'V'), + (0xD04, 'X'), + (0xD05, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD50, 'X'), + (0xD54, 'V'), + (0xD64, 'X'), + (0xD66, 'V'), + (0xD80, 'X'), + (0xD82, 'V'), + (0xD84, 'X'), + (0xD85, 'V'), + (0xD97, 'X'), + (0xD9A, 'V'), + (0xDB2, 'X'), + (0xDB3, 'V'), + (0xDBC, 'X'), + (0xDBD, 'V'), + (0xDBE, 'X'), + (0xDC0, 'V'), + (0xDC7, 'X'), + (0xDCA, 'V'), + (0xDCB, 'X'), + (0xDCF, 'V'), + (0xDD5, 'X'), + (0xDD6, 'V'), + (0xDD7, 'X'), + (0xDD8, 'V'), + (0xDE0, 'X'), + (0xDE6, 'V'), + (0xDF0, 'X'), + (0xDF2, 'V'), + (0xDF5, 'X'), + (0xE01, 'V'), + (0xE33, 'M', u'ํา'), + (0xE34, 'V'), + (0xE3B, 'X'), + (0xE3F, 'V'), + (0xE5C, 'X'), + (0xE81, 'V'), + (0xE83, 'X'), + (0xE84, 'V'), + (0xE85, 'X'), + (0xE86, 'V'), + (0xE8B, 'X'), + (0xE8C, 'V'), + (0xEA4, 'X'), + (0xEA5, 'V'), + (0xEA6, 'X'), + (0xEA7, 'V'), + ] + +def _seg_13(): + return [ + (0xEB3, 'M', u'ໍາ'), + (0xEB4, 'V'), + (0xEBE, 'X'), + (0xEC0, 'V'), + (0xEC5, 'X'), + (0xEC6, 'V'), + (0xEC7, 'X'), + (0xEC8, 'V'), + (0xECE, 'X'), + (0xED0, 'V'), + (0xEDA, 'X'), + (0xEDC, 'M', u'ຫນ'), + (0xEDD, 'M', u'ຫມ'), + (0xEDE, 'V'), + (0xEE0, 'X'), + (0xF00, 'V'), + (0xF0C, 'M', u'་'), + (0xF0D, 'V'), + (0xF43, 'M', u'གྷ'), + (0xF44, 'V'), + (0xF48, 'X'), + (0xF49, 'V'), + (0xF4D, 'M', u'ཌྷ'), + (0xF4E, 'V'), + (0xF52, 'M', u'དྷ'), + (0xF53, 'V'), + (0xF57, 'M', u'བྷ'), + (0xF58, 'V'), + (0xF5C, 'M', u'ཛྷ'), + (0xF5D, 'V'), + (0xF69, 'M', u'ཀྵ'), + (0xF6A, 'V'), + (0xF6D, 'X'), + (0xF71, 'V'), + (0xF73, 'M', u'ཱི'), + (0xF74, 'V'), + (0xF75, 'M', u'ཱུ'), + (0xF76, 'M', u'ྲྀ'), + (0xF77, 'M', u'ྲཱྀ'), + (0xF78, 'M', u'ླྀ'), + (0xF79, 'M', u'ླཱྀ'), + (0xF7A, 'V'), + (0xF81, 'M', u'ཱྀ'), + (0xF82, 'V'), + (0xF93, 'M', u'ྒྷ'), + (0xF94, 'V'), + (0xF98, 'X'), + (0xF99, 'V'), + (0xF9D, 'M', u'ྜྷ'), + (0xF9E, 'V'), + (0xFA2, 'M', u'ྡྷ'), + (0xFA3, 'V'), + (0xFA7, 'M', u'ྦྷ'), + (0xFA8, 'V'), + (0xFAC, 'M', u'ྫྷ'), + (0xFAD, 'V'), + (0xFB9, 'M', u'ྐྵ'), + (0xFBA, 'V'), + (0xFBD, 'X'), + (0xFBE, 'V'), + (0xFCD, 'X'), + (0xFCE, 'V'), + (0xFDB, 'X'), + (0x1000, 'V'), + (0x10A0, 'X'), + (0x10C7, 'M', u'ⴧ'), + (0x10C8, 'X'), + (0x10CD, 'M', u'ⴭ'), + (0x10CE, 'X'), + (0x10D0, 'V'), + (0x10FC, 'M', u'ნ'), + (0x10FD, 'V'), + (0x115F, 'X'), + (0x1161, 'V'), + (0x1249, 'X'), + (0x124A, 'V'), + (0x124E, 'X'), + (0x1250, 'V'), + (0x1257, 'X'), + (0x1258, 'V'), + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + (0x128E, 'X'), + (0x1290, 'V'), + (0x12B1, 'X'), + (0x12B2, 'V'), + (0x12B6, 'X'), + (0x12B8, 'V'), + (0x12BF, 'X'), + (0x12C0, 'V'), + (0x12C1, 'X'), + (0x12C2, 'V'), + (0x12C6, 'X'), + (0x12C8, 'V'), + (0x12D7, 'X'), + (0x12D8, 'V'), + ] + +def _seg_14(): + return [ + (0x1311, 'X'), + (0x1312, 'V'), + (0x1316, 'X'), + (0x1318, 'V'), + (0x135B, 'X'), + (0x135D, 'V'), + (0x137D, 'X'), + (0x1380, 'V'), + (0x139A, 'X'), + (0x13A0, 'V'), + (0x13F6, 'X'), + (0x13F8, 'M', u'Ᏸ'), + (0x13F9, 'M', u'Ᏹ'), + (0x13FA, 'M', u'Ᏺ'), + (0x13FB, 'M', u'Ᏻ'), + (0x13FC, 'M', u'Ᏼ'), + (0x13FD, 'M', u'Ᏽ'), + (0x13FE, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F9, 'X'), + (0x1700, 'V'), + (0x170D, 'X'), + (0x170E, 'V'), + (0x1715, 'X'), + (0x1720, 'V'), + (0x1737, 'X'), + (0x1740, 'V'), + (0x1754, 'X'), + (0x1760, 'V'), + (0x176D, 'X'), + (0x176E, 'V'), + (0x1771, 'X'), + (0x1772, 'V'), + (0x1774, 'X'), + (0x1780, 'V'), + (0x17B4, 'X'), + (0x17B6, 'V'), + (0x17DE, 'X'), + (0x17E0, 'V'), + (0x17EA, 'X'), + (0x17F0, 'V'), + (0x17FA, 'X'), + (0x1800, 'V'), + (0x1806, 'X'), + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), + (0x1810, 'V'), + (0x181A, 'X'), + (0x1820, 'V'), + (0x1879, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191F, 'X'), + (0x1920, 'V'), + (0x192C, 'X'), + (0x1930, 'V'), + (0x193C, 'X'), + (0x1940, 'V'), + (0x1941, 'X'), + (0x1944, 'V'), + (0x196E, 'X'), + (0x1970, 'V'), + (0x1975, 'X'), + (0x1980, 'V'), + (0x19AC, 'X'), + (0x19B0, 'V'), + (0x19CA, 'X'), + (0x19D0, 'V'), + (0x19DB, 'X'), + (0x19DE, 'V'), + (0x1A1C, 'X'), + (0x1A1E, 'V'), + (0x1A5F, 'X'), + (0x1A60, 'V'), + (0x1A7D, 'X'), + (0x1A7F, 'V'), + (0x1A8A, 'X'), + (0x1A90, 'V'), + (0x1A9A, 'X'), + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1AB0, 'V'), + (0x1ABF, 'X'), + (0x1B00, 'V'), + (0x1B4C, 'X'), + (0x1B50, 'V'), + (0x1B7D, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + ] + +def _seg_15(): + return [ + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'M', u'в'), + (0x1C81, 'M', u'д'), + (0x1C82, 'M', u'о'), + (0x1C83, 'M', u'с'), + (0x1C84, 'M', u'т'), + (0x1C86, 'M', u'ъ'), + (0x1C87, 'M', u'ѣ'), + (0x1C88, 'M', u'ꙋ'), + (0x1C89, 'X'), + (0x1C90, 'M', u'ა'), + (0x1C91, 'M', u'ბ'), + (0x1C92, 'M', u'გ'), + (0x1C93, 'M', u'დ'), + (0x1C94, 'M', u'ე'), + (0x1C95, 'M', u'ვ'), + (0x1C96, 'M', u'ზ'), + (0x1C97, 'M', u'თ'), + (0x1C98, 'M', u'ი'), + (0x1C99, 'M', u'კ'), + (0x1C9A, 'M', u'ლ'), + (0x1C9B, 'M', u'მ'), + (0x1C9C, 'M', u'ნ'), + (0x1C9D, 'M', u'ო'), + (0x1C9E, 'M', u'პ'), + (0x1C9F, 'M', u'ჟ'), + (0x1CA0, 'M', u'რ'), + (0x1CA1, 'M', u'ს'), + (0x1CA2, 'M', u'ტ'), + (0x1CA3, 'M', u'უ'), + (0x1CA4, 'M', u'ფ'), + (0x1CA5, 'M', u'ქ'), + (0x1CA6, 'M', u'ღ'), + (0x1CA7, 'M', u'ყ'), + (0x1CA8, 'M', u'შ'), + (0x1CA9, 'M', u'ჩ'), + (0x1CAA, 'M', u'ც'), + (0x1CAB, 'M', u'ძ'), + (0x1CAC, 'M', u'წ'), + (0x1CAD, 'M', u'ჭ'), + (0x1CAE, 'M', u'ხ'), + (0x1CAF, 'M', u'ჯ'), + (0x1CB0, 'M', u'ჰ'), + (0x1CB1, 'M', u'ჱ'), + (0x1CB2, 'M', u'ჲ'), + (0x1CB3, 'M', u'ჳ'), + (0x1CB4, 'M', u'ჴ'), + (0x1CB5, 'M', u'ჵ'), + (0x1CB6, 'M', u'ჶ'), + (0x1CB7, 'M', u'ჷ'), + (0x1CB8, 'M', u'ჸ'), + (0x1CB9, 'M', u'ჹ'), + (0x1CBA, 'M', u'ჺ'), + (0x1CBB, 'X'), + (0x1CBD, 'M', u'ჽ'), + (0x1CBE, 'M', u'ჾ'), + (0x1CBF, 'M', u'ჿ'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CFB, 'X'), + (0x1D00, 'V'), + (0x1D2C, 'M', u'a'), + (0x1D2D, 'M', u'æ'), + (0x1D2E, 'M', u'b'), + (0x1D2F, 'V'), + (0x1D30, 'M', u'd'), + (0x1D31, 'M', u'e'), + (0x1D32, 'M', u'ǝ'), + (0x1D33, 'M', u'g'), + (0x1D34, 'M', u'h'), + (0x1D35, 'M', u'i'), + (0x1D36, 'M', u'j'), + (0x1D37, 'M', u'k'), + (0x1D38, 'M', u'l'), + (0x1D39, 'M', u'm'), + (0x1D3A, 'M', u'n'), + (0x1D3B, 'V'), + (0x1D3C, 'M', u'o'), + (0x1D3D, 'M', u'ȣ'), + (0x1D3E, 'M', u'p'), + (0x1D3F, 'M', u'r'), + (0x1D40, 'M', u't'), + (0x1D41, 'M', u'u'), + (0x1D42, 'M', u'w'), + (0x1D43, 'M', u'a'), + (0x1D44, 'M', u'ɐ'), + (0x1D45, 'M', u'ɑ'), + (0x1D46, 'M', u'ᴂ'), + (0x1D47, 'M', u'b'), + (0x1D48, 'M', u'd'), + (0x1D49, 'M', u'e'), + (0x1D4A, 'M', u'ə'), + (0x1D4B, 'M', u'ɛ'), + (0x1D4C, 'M', u'ɜ'), + (0x1D4D, 'M', u'g'), + (0x1D4E, 'V'), + (0x1D4F, 'M', u'k'), + (0x1D50, 'M', u'm'), + ] + +def _seg_16(): + return [ + (0x1D51, 'M', u'ŋ'), + (0x1D52, 'M', u'o'), + (0x1D53, 'M', u'ɔ'), + (0x1D54, 'M', u'ᴖ'), + (0x1D55, 'M', u'ᴗ'), + (0x1D56, 'M', u'p'), + (0x1D57, 'M', u't'), + (0x1D58, 'M', u'u'), + (0x1D59, 'M', u'ᴝ'), + (0x1D5A, 'M', u'ɯ'), + (0x1D5B, 'M', u'v'), + (0x1D5C, 'M', u'ᴥ'), + (0x1D5D, 'M', u'β'), + (0x1D5E, 'M', u'γ'), + (0x1D5F, 'M', u'δ'), + (0x1D60, 'M', u'φ'), + (0x1D61, 'M', u'χ'), + (0x1D62, 'M', u'i'), + (0x1D63, 'M', u'r'), + (0x1D64, 'M', u'u'), + (0x1D65, 'M', u'v'), + (0x1D66, 'M', u'β'), + (0x1D67, 'M', u'γ'), + (0x1D68, 'M', u'ρ'), + (0x1D69, 'M', u'φ'), + (0x1D6A, 'M', u'χ'), + (0x1D6B, 'V'), + (0x1D78, 'M', u'н'), + (0x1D79, 'V'), + (0x1D9B, 'M', u'ɒ'), + (0x1D9C, 'M', u'c'), + (0x1D9D, 'M', u'ɕ'), + (0x1D9E, 'M', u'ð'), + (0x1D9F, 'M', u'ɜ'), + (0x1DA0, 'M', u'f'), + (0x1DA1, 'M', u'ɟ'), + (0x1DA2, 'M', u'ɡ'), + (0x1DA3, 'M', u'ɥ'), + (0x1DA4, 'M', u'ɨ'), + (0x1DA5, 'M', u'ɩ'), + (0x1DA6, 'M', u'ɪ'), + (0x1DA7, 'M', u'ᵻ'), + (0x1DA8, 'M', u'ʝ'), + (0x1DA9, 'M', u'ɭ'), + (0x1DAA, 'M', u'ᶅ'), + (0x1DAB, 'M', u'ʟ'), + (0x1DAC, 'M', u'ɱ'), + (0x1DAD, 'M', u'ɰ'), + (0x1DAE, 'M', u'ɲ'), + (0x1DAF, 'M', u'ɳ'), + (0x1DB0, 'M', u'ɴ'), + (0x1DB1, 'M', u'ɵ'), + (0x1DB2, 'M', u'ɸ'), + (0x1DB3, 'M', u'ʂ'), + (0x1DB4, 'M', u'ʃ'), + (0x1DB5, 'M', u'ƫ'), + (0x1DB6, 'M', u'ʉ'), + (0x1DB7, 'M', u'ʊ'), + (0x1DB8, 'M', u'ᴜ'), + (0x1DB9, 'M', u'ʋ'), + (0x1DBA, 'M', u'ʌ'), + (0x1DBB, 'M', u'z'), + (0x1DBC, 'M', u'ʐ'), + (0x1DBD, 'M', u'ʑ'), + (0x1DBE, 'M', u'ʒ'), + (0x1DBF, 'M', u'θ'), + (0x1DC0, 'V'), + (0x1DFA, 'X'), + (0x1DFB, 'V'), + (0x1E00, 'M', u'ḁ'), + (0x1E01, 'V'), + (0x1E02, 'M', u'ḃ'), + (0x1E03, 'V'), + (0x1E04, 'M', u'ḅ'), + (0x1E05, 'V'), + (0x1E06, 'M', u'ḇ'), + (0x1E07, 'V'), + (0x1E08, 'M', u'ḉ'), + (0x1E09, 'V'), + (0x1E0A, 'M', u'ḋ'), + (0x1E0B, 'V'), + (0x1E0C, 'M', u'ḍ'), + (0x1E0D, 'V'), + (0x1E0E, 'M', u'ḏ'), + (0x1E0F, 'V'), + (0x1E10, 'M', u'ḑ'), + (0x1E11, 'V'), + (0x1E12, 'M', u'ḓ'), + (0x1E13, 'V'), + (0x1E14, 'M', u'ḕ'), + (0x1E15, 'V'), + (0x1E16, 'M', u'ḗ'), + (0x1E17, 'V'), + (0x1E18, 'M', u'ḙ'), + (0x1E19, 'V'), + (0x1E1A, 'M', u'ḛ'), + (0x1E1B, 'V'), + (0x1E1C, 'M', u'ḝ'), + (0x1E1D, 'V'), + (0x1E1E, 'M', u'ḟ'), + ] + +def _seg_17(): + return [ + (0x1E1F, 'V'), + (0x1E20, 'M', u'ḡ'), + (0x1E21, 'V'), + (0x1E22, 'M', u'ḣ'), + (0x1E23, 'V'), + (0x1E24, 'M', u'ḥ'), + (0x1E25, 'V'), + (0x1E26, 'M', u'ḧ'), + (0x1E27, 'V'), + (0x1E28, 'M', u'ḩ'), + (0x1E29, 'V'), + (0x1E2A, 'M', u'ḫ'), + (0x1E2B, 'V'), + (0x1E2C, 'M', u'ḭ'), + (0x1E2D, 'V'), + (0x1E2E, 'M', u'ḯ'), + (0x1E2F, 'V'), + (0x1E30, 'M', u'ḱ'), + (0x1E31, 'V'), + (0x1E32, 'M', u'ḳ'), + (0x1E33, 'V'), + (0x1E34, 'M', u'ḵ'), + (0x1E35, 'V'), + (0x1E36, 'M', u'ḷ'), + (0x1E37, 'V'), + (0x1E38, 'M', u'ḹ'), + (0x1E39, 'V'), + (0x1E3A, 'M', u'ḻ'), + (0x1E3B, 'V'), + (0x1E3C, 'M', u'ḽ'), + (0x1E3D, 'V'), + (0x1E3E, 'M', u'ḿ'), + (0x1E3F, 'V'), + (0x1E40, 'M', u'ṁ'), + (0x1E41, 'V'), + (0x1E42, 'M', u'ṃ'), + (0x1E43, 'V'), + (0x1E44, 'M', u'ṅ'), + (0x1E45, 'V'), + (0x1E46, 'M', u'ṇ'), + (0x1E47, 'V'), + (0x1E48, 'M', u'ṉ'), + (0x1E49, 'V'), + (0x1E4A, 'M', u'ṋ'), + (0x1E4B, 'V'), + (0x1E4C, 'M', u'ṍ'), + (0x1E4D, 'V'), + (0x1E4E, 'M', u'ṏ'), + (0x1E4F, 'V'), + (0x1E50, 'M', u'ṑ'), + (0x1E51, 'V'), + (0x1E52, 'M', u'ṓ'), + (0x1E53, 'V'), + (0x1E54, 'M', u'ṕ'), + (0x1E55, 'V'), + (0x1E56, 'M', u'ṗ'), + (0x1E57, 'V'), + (0x1E58, 'M', u'ṙ'), + (0x1E59, 'V'), + (0x1E5A, 'M', u'ṛ'), + (0x1E5B, 'V'), + (0x1E5C, 'M', u'ṝ'), + (0x1E5D, 'V'), + (0x1E5E, 'M', u'ṟ'), + (0x1E5F, 'V'), + (0x1E60, 'M', u'ṡ'), + (0x1E61, 'V'), + (0x1E62, 'M', u'ṣ'), + (0x1E63, 'V'), + (0x1E64, 'M', u'ṥ'), + (0x1E65, 'V'), + (0x1E66, 'M', u'ṧ'), + (0x1E67, 'V'), + (0x1E68, 'M', u'ṩ'), + (0x1E69, 'V'), + (0x1E6A, 'M', u'ṫ'), + (0x1E6B, 'V'), + (0x1E6C, 'M', u'ṭ'), + (0x1E6D, 'V'), + (0x1E6E, 'M', u'ṯ'), + (0x1E6F, 'V'), + (0x1E70, 'M', u'ṱ'), + (0x1E71, 'V'), + (0x1E72, 'M', u'ṳ'), + (0x1E73, 'V'), + (0x1E74, 'M', u'ṵ'), + (0x1E75, 'V'), + (0x1E76, 'M', u'ṷ'), + (0x1E77, 'V'), + (0x1E78, 'M', u'ṹ'), + (0x1E79, 'V'), + (0x1E7A, 'M', u'ṻ'), + (0x1E7B, 'V'), + (0x1E7C, 'M', u'ṽ'), + (0x1E7D, 'V'), + (0x1E7E, 'M', u'ṿ'), + (0x1E7F, 'V'), + (0x1E80, 'M', u'ẁ'), + (0x1E81, 'V'), + (0x1E82, 'M', u'ẃ'), + ] + +def _seg_18(): + return [ + (0x1E83, 'V'), + (0x1E84, 'M', u'ẅ'), + (0x1E85, 'V'), + (0x1E86, 'M', u'ẇ'), + (0x1E87, 'V'), + (0x1E88, 'M', u'ẉ'), + (0x1E89, 'V'), + (0x1E8A, 'M', u'ẋ'), + (0x1E8B, 'V'), + (0x1E8C, 'M', u'ẍ'), + (0x1E8D, 'V'), + (0x1E8E, 'M', u'ẏ'), + (0x1E8F, 'V'), + (0x1E90, 'M', u'ẑ'), + (0x1E91, 'V'), + (0x1E92, 'M', u'ẓ'), + (0x1E93, 'V'), + (0x1E94, 'M', u'ẕ'), + (0x1E95, 'V'), + (0x1E9A, 'M', u'aʾ'), + (0x1E9B, 'M', u'ṡ'), + (0x1E9C, 'V'), + (0x1E9E, 'M', u'ss'), + (0x1E9F, 'V'), + (0x1EA0, 'M', u'ạ'), + (0x1EA1, 'V'), + (0x1EA2, 'M', u'ả'), + (0x1EA3, 'V'), + (0x1EA4, 'M', u'ấ'), + (0x1EA5, 'V'), + (0x1EA6, 'M', u'ầ'), + (0x1EA7, 'V'), + (0x1EA8, 'M', u'ẩ'), + (0x1EA9, 'V'), + (0x1EAA, 'M', u'ẫ'), + (0x1EAB, 'V'), + (0x1EAC, 'M', u'ậ'), + (0x1EAD, 'V'), + (0x1EAE, 'M', u'ắ'), + (0x1EAF, 'V'), + (0x1EB0, 'M', u'ằ'), + (0x1EB1, 'V'), + (0x1EB2, 'M', u'ẳ'), + (0x1EB3, 'V'), + (0x1EB4, 'M', u'ẵ'), + (0x1EB5, 'V'), + (0x1EB6, 'M', u'ặ'), + (0x1EB7, 'V'), + (0x1EB8, 'M', u'ẹ'), + (0x1EB9, 'V'), + (0x1EBA, 'M', u'ẻ'), + (0x1EBB, 'V'), + (0x1EBC, 'M', u'ẽ'), + (0x1EBD, 'V'), + (0x1EBE, 'M', u'ế'), + (0x1EBF, 'V'), + (0x1EC0, 'M', u'ề'), + (0x1EC1, 'V'), + (0x1EC2, 'M', u'ể'), + (0x1EC3, 'V'), + (0x1EC4, 'M', u'ễ'), + (0x1EC5, 'V'), + (0x1EC6, 'M', u'ệ'), + (0x1EC7, 'V'), + (0x1EC8, 'M', u'ỉ'), + (0x1EC9, 'V'), + (0x1ECA, 'M', u'ị'), + (0x1ECB, 'V'), + (0x1ECC, 'M', u'ọ'), + (0x1ECD, 'V'), + (0x1ECE, 'M', u'ỏ'), + (0x1ECF, 'V'), + (0x1ED0, 'M', u'ố'), + (0x1ED1, 'V'), + (0x1ED2, 'M', u'ồ'), + (0x1ED3, 'V'), + (0x1ED4, 'M', u'ổ'), + (0x1ED5, 'V'), + (0x1ED6, 'M', u'ỗ'), + (0x1ED7, 'V'), + (0x1ED8, 'M', u'ộ'), + (0x1ED9, 'V'), + (0x1EDA, 'M', u'ớ'), + (0x1EDB, 'V'), + (0x1EDC, 'M', u'ờ'), + (0x1EDD, 'V'), + (0x1EDE, 'M', u'ở'), + (0x1EDF, 'V'), + (0x1EE0, 'M', u'ỡ'), + (0x1EE1, 'V'), + (0x1EE2, 'M', u'ợ'), + (0x1EE3, 'V'), + (0x1EE4, 'M', u'ụ'), + (0x1EE5, 'V'), + (0x1EE6, 'M', u'ủ'), + (0x1EE7, 'V'), + (0x1EE8, 'M', u'ứ'), + (0x1EE9, 'V'), + (0x1EEA, 'M', u'ừ'), + (0x1EEB, 'V'), + ] + +def _seg_19(): + return [ + (0x1EEC, 'M', u'ử'), + (0x1EED, 'V'), + (0x1EEE, 'M', u'ữ'), + (0x1EEF, 'V'), + (0x1EF0, 'M', u'ự'), + (0x1EF1, 'V'), + (0x1EF2, 'M', u'ỳ'), + (0x1EF3, 'V'), + (0x1EF4, 'M', u'ỵ'), + (0x1EF5, 'V'), + (0x1EF6, 'M', u'ỷ'), + (0x1EF7, 'V'), + (0x1EF8, 'M', u'ỹ'), + (0x1EF9, 'V'), + (0x1EFA, 'M', u'ỻ'), + (0x1EFB, 'V'), + (0x1EFC, 'M', u'ỽ'), + (0x1EFD, 'V'), + (0x1EFE, 'M', u'ỿ'), + (0x1EFF, 'V'), + (0x1F08, 'M', u'ἀ'), + (0x1F09, 'M', u'ἁ'), + (0x1F0A, 'M', u'ἂ'), + (0x1F0B, 'M', u'ἃ'), + (0x1F0C, 'M', u'ἄ'), + (0x1F0D, 'M', u'ἅ'), + (0x1F0E, 'M', u'ἆ'), + (0x1F0F, 'M', u'ἇ'), + (0x1F10, 'V'), + (0x1F16, 'X'), + (0x1F18, 'M', u'ἐ'), + (0x1F19, 'M', u'ἑ'), + (0x1F1A, 'M', u'ἒ'), + (0x1F1B, 'M', u'ἓ'), + (0x1F1C, 'M', u'ἔ'), + (0x1F1D, 'M', u'ἕ'), + (0x1F1E, 'X'), + (0x1F20, 'V'), + (0x1F28, 'M', u'ἠ'), + (0x1F29, 'M', u'ἡ'), + (0x1F2A, 'M', u'ἢ'), + (0x1F2B, 'M', u'ἣ'), + (0x1F2C, 'M', u'ἤ'), + (0x1F2D, 'M', u'ἥ'), + (0x1F2E, 'M', u'ἦ'), + (0x1F2F, 'M', u'ἧ'), + (0x1F30, 'V'), + (0x1F38, 'M', u'ἰ'), + (0x1F39, 'M', u'ἱ'), + (0x1F3A, 'M', u'ἲ'), + (0x1F3B, 'M', u'ἳ'), + (0x1F3C, 'M', u'ἴ'), + (0x1F3D, 'M', u'ἵ'), + (0x1F3E, 'M', u'ἶ'), + (0x1F3F, 'M', u'ἷ'), + (0x1F40, 'V'), + (0x1F46, 'X'), + (0x1F48, 'M', u'ὀ'), + (0x1F49, 'M', u'ὁ'), + (0x1F4A, 'M', u'ὂ'), + (0x1F4B, 'M', u'ὃ'), + (0x1F4C, 'M', u'ὄ'), + (0x1F4D, 'M', u'ὅ'), + (0x1F4E, 'X'), + (0x1F50, 'V'), + (0x1F58, 'X'), + (0x1F59, 'M', u'ὑ'), + (0x1F5A, 'X'), + (0x1F5B, 'M', u'ὓ'), + (0x1F5C, 'X'), + (0x1F5D, 'M', u'ὕ'), + (0x1F5E, 'X'), + (0x1F5F, 'M', u'ὗ'), + (0x1F60, 'V'), + (0x1F68, 'M', u'ὠ'), + (0x1F69, 'M', u'ὡ'), + (0x1F6A, 'M', u'ὢ'), + (0x1F6B, 'M', u'ὣ'), + (0x1F6C, 'M', u'ὤ'), + (0x1F6D, 'M', u'ὥ'), + (0x1F6E, 'M', u'ὦ'), + (0x1F6F, 'M', u'ὧ'), + (0x1F70, 'V'), + (0x1F71, 'M', u'ά'), + (0x1F72, 'V'), + (0x1F73, 'M', u'έ'), + (0x1F74, 'V'), + (0x1F75, 'M', u'ή'), + (0x1F76, 'V'), + (0x1F77, 'M', u'ί'), + (0x1F78, 'V'), + (0x1F79, 'M', u'ό'), + (0x1F7A, 'V'), + (0x1F7B, 'M', u'ύ'), + (0x1F7C, 'V'), + (0x1F7D, 'M', u'ώ'), + (0x1F7E, 'X'), + (0x1F80, 'M', u'ἀι'), + (0x1F81, 'M', u'ἁι'), + (0x1F82, 'M', u'ἂι'), + ] + +def _seg_20(): + return [ + (0x1F83, 'M', u'ἃι'), + (0x1F84, 'M', u'ἄι'), + (0x1F85, 'M', u'ἅι'), + (0x1F86, 'M', u'ἆι'), + (0x1F87, 'M', u'ἇι'), + (0x1F88, 'M', u'ἀι'), + (0x1F89, 'M', u'ἁι'), + (0x1F8A, 'M', u'ἂι'), + (0x1F8B, 'M', u'ἃι'), + (0x1F8C, 'M', u'ἄι'), + (0x1F8D, 'M', u'ἅι'), + (0x1F8E, 'M', u'ἆι'), + (0x1F8F, 'M', u'ἇι'), + (0x1F90, 'M', u'ἠι'), + (0x1F91, 'M', u'ἡι'), + (0x1F92, 'M', u'ἢι'), + (0x1F93, 'M', u'ἣι'), + (0x1F94, 'M', u'ἤι'), + (0x1F95, 'M', u'ἥι'), + (0x1F96, 'M', u'ἦι'), + (0x1F97, 'M', u'ἧι'), + (0x1F98, 'M', u'ἠι'), + (0x1F99, 'M', u'ἡι'), + (0x1F9A, 'M', u'ἢι'), + (0x1F9B, 'M', u'ἣι'), + (0x1F9C, 'M', u'ἤι'), + (0x1F9D, 'M', u'ἥι'), + (0x1F9E, 'M', u'ἦι'), + (0x1F9F, 'M', u'ἧι'), + (0x1FA0, 'M', u'ὠι'), + (0x1FA1, 'M', u'ὡι'), + (0x1FA2, 'M', u'ὢι'), + (0x1FA3, 'M', u'ὣι'), + (0x1FA4, 'M', u'ὤι'), + (0x1FA5, 'M', u'ὥι'), + (0x1FA6, 'M', u'ὦι'), + (0x1FA7, 'M', u'ὧι'), + (0x1FA8, 'M', u'ὠι'), + (0x1FA9, 'M', u'ὡι'), + (0x1FAA, 'M', u'ὢι'), + (0x1FAB, 'M', u'ὣι'), + (0x1FAC, 'M', u'ὤι'), + (0x1FAD, 'M', u'ὥι'), + (0x1FAE, 'M', u'ὦι'), + (0x1FAF, 'M', u'ὧι'), + (0x1FB0, 'V'), + (0x1FB2, 'M', u'ὰι'), + (0x1FB3, 'M', u'αι'), + (0x1FB4, 'M', u'άι'), + (0x1FB5, 'X'), + (0x1FB6, 'V'), + (0x1FB7, 'M', u'ᾶι'), + (0x1FB8, 'M', u'ᾰ'), + (0x1FB9, 'M', u'ᾱ'), + (0x1FBA, 'M', u'ὰ'), + (0x1FBB, 'M', u'ά'), + (0x1FBC, 'M', u'αι'), + (0x1FBD, '3', u' ̓'), + (0x1FBE, 'M', u'ι'), + (0x1FBF, '3', u' ̓'), + (0x1FC0, '3', u' ͂'), + (0x1FC1, '3', u' ̈͂'), + (0x1FC2, 'M', u'ὴι'), + (0x1FC3, 'M', u'ηι'), + (0x1FC4, 'M', u'ήι'), + (0x1FC5, 'X'), + (0x1FC6, 'V'), + (0x1FC7, 'M', u'ῆι'), + (0x1FC8, 'M', u'ὲ'), + (0x1FC9, 'M', u'έ'), + (0x1FCA, 'M', u'ὴ'), + (0x1FCB, 'M', u'ή'), + (0x1FCC, 'M', u'ηι'), + (0x1FCD, '3', u' ̓̀'), + (0x1FCE, '3', u' ̓́'), + (0x1FCF, '3', u' ̓͂'), + (0x1FD0, 'V'), + (0x1FD3, 'M', u'ΐ'), + (0x1FD4, 'X'), + (0x1FD6, 'V'), + (0x1FD8, 'M', u'ῐ'), + (0x1FD9, 'M', u'ῑ'), + (0x1FDA, 'M', u'ὶ'), + (0x1FDB, 'M', u'ί'), + (0x1FDC, 'X'), + (0x1FDD, '3', u' ̔̀'), + (0x1FDE, '3', u' ̔́'), + (0x1FDF, '3', u' ̔͂'), + (0x1FE0, 'V'), + (0x1FE3, 'M', u'ΰ'), + (0x1FE4, 'V'), + (0x1FE8, 'M', u'ῠ'), + (0x1FE9, 'M', u'ῡ'), + (0x1FEA, 'M', u'ὺ'), + (0x1FEB, 'M', u'ύ'), + (0x1FEC, 'M', u'ῥ'), + (0x1FED, '3', u' ̈̀'), + (0x1FEE, '3', u' ̈́'), + (0x1FEF, '3', u'`'), + (0x1FF0, 'X'), + ] + +def _seg_21(): + return [ + (0x1FF2, 'M', u'ὼι'), + (0x1FF3, 'M', u'ωι'), + (0x1FF4, 'M', u'ώι'), + (0x1FF5, 'X'), + (0x1FF6, 'V'), + (0x1FF7, 'M', u'ῶι'), + (0x1FF8, 'M', u'ὸ'), + (0x1FF9, 'M', u'ό'), + (0x1FFA, 'M', u'ὼ'), + (0x1FFB, 'M', u'ώ'), + (0x1FFC, 'M', u'ωι'), + (0x1FFD, '3', u' ́'), + (0x1FFE, '3', u' ̔'), + (0x1FFF, 'X'), + (0x2000, '3', u' '), + (0x200B, 'I'), + (0x200C, 'D', u''), + (0x200E, 'X'), + (0x2010, 'V'), + (0x2011, 'M', u'‐'), + (0x2012, 'V'), + (0x2017, '3', u' ̳'), + (0x2018, 'V'), + (0x2024, 'X'), + (0x2027, 'V'), + (0x2028, 'X'), + (0x202F, '3', u' '), + (0x2030, 'V'), + (0x2033, 'M', u'′′'), + (0x2034, 'M', u'′′′'), + (0x2035, 'V'), + (0x2036, 'M', u'‵‵'), + (0x2037, 'M', u'‵‵‵'), + (0x2038, 'V'), + (0x203C, '3', u'!!'), + (0x203D, 'V'), + (0x203E, '3', u' ̅'), + (0x203F, 'V'), + (0x2047, '3', u'??'), + (0x2048, '3', u'?!'), + (0x2049, '3', u'!?'), + (0x204A, 'V'), + (0x2057, 'M', u'′′′′'), + (0x2058, 'V'), + (0x205F, '3', u' '), + (0x2060, 'I'), + (0x2061, 'X'), + (0x2064, 'I'), + (0x2065, 'X'), + (0x2070, 'M', u'0'), + (0x2071, 'M', u'i'), + (0x2072, 'X'), + (0x2074, 'M', u'4'), + (0x2075, 'M', u'5'), + (0x2076, 'M', u'6'), + (0x2077, 'M', u'7'), + (0x2078, 'M', u'8'), + (0x2079, 'M', u'9'), + (0x207A, '3', u'+'), + (0x207B, 'M', u'−'), + (0x207C, '3', u'='), + (0x207D, '3', u'('), + (0x207E, '3', u')'), + (0x207F, 'M', u'n'), + (0x2080, 'M', u'0'), + (0x2081, 'M', u'1'), + (0x2082, 'M', u'2'), + (0x2083, 'M', u'3'), + (0x2084, 'M', u'4'), + (0x2085, 'M', u'5'), + (0x2086, 'M', u'6'), + (0x2087, 'M', u'7'), + (0x2088, 'M', u'8'), + (0x2089, 'M', u'9'), + (0x208A, '3', u'+'), + (0x208B, 'M', u'−'), + (0x208C, '3', u'='), + (0x208D, '3', u'('), + (0x208E, '3', u')'), + (0x208F, 'X'), + (0x2090, 'M', u'a'), + (0x2091, 'M', u'e'), + (0x2092, 'M', u'o'), + (0x2093, 'M', u'x'), + (0x2094, 'M', u'ə'), + (0x2095, 'M', u'h'), + (0x2096, 'M', u'k'), + (0x2097, 'M', u'l'), + (0x2098, 'M', u'm'), + (0x2099, 'M', u'n'), + (0x209A, 'M', u'p'), + (0x209B, 'M', u's'), + (0x209C, 'M', u't'), + (0x209D, 'X'), + (0x20A0, 'V'), + (0x20A8, 'M', u'rs'), + (0x20A9, 'V'), + (0x20C0, 'X'), + (0x20D0, 'V'), + (0x20F1, 'X'), + ] + +def _seg_22(): + return [ + (0x2100, '3', u'a/c'), + (0x2101, '3', u'a/s'), + (0x2102, 'M', u'c'), + (0x2103, 'M', u'°c'), + (0x2104, 'V'), + (0x2105, '3', u'c/o'), + (0x2106, '3', u'c/u'), + (0x2107, 'M', u'ɛ'), + (0x2108, 'V'), + (0x2109, 'M', u'°f'), + (0x210A, 'M', u'g'), + (0x210B, 'M', u'h'), + (0x210F, 'M', u'ħ'), + (0x2110, 'M', u'i'), + (0x2112, 'M', u'l'), + (0x2114, 'V'), + (0x2115, 'M', u'n'), + (0x2116, 'M', u'no'), + (0x2117, 'V'), + (0x2119, 'M', u'p'), + (0x211A, 'M', u'q'), + (0x211B, 'M', u'r'), + (0x211E, 'V'), + (0x2120, 'M', u'sm'), + (0x2121, 'M', u'tel'), + (0x2122, 'M', u'tm'), + (0x2123, 'V'), + (0x2124, 'M', u'z'), + (0x2125, 'V'), + (0x2126, 'M', u'ω'), + (0x2127, 'V'), + (0x2128, 'M', u'z'), + (0x2129, 'V'), + (0x212A, 'M', u'k'), + (0x212B, 'M', u'å'), + (0x212C, 'M', u'b'), + (0x212D, 'M', u'c'), + (0x212E, 'V'), + (0x212F, 'M', u'e'), + (0x2131, 'M', u'f'), + (0x2132, 'X'), + (0x2133, 'M', u'm'), + (0x2134, 'M', u'o'), + (0x2135, 'M', u'א'), + (0x2136, 'M', u'ב'), + (0x2137, 'M', u'ג'), + (0x2138, 'M', u'ד'), + (0x2139, 'M', u'i'), + (0x213A, 'V'), + (0x213B, 'M', u'fax'), + (0x213C, 'M', u'π'), + (0x213D, 'M', u'γ'), + (0x213F, 'M', u'π'), + (0x2140, 'M', u'∑'), + (0x2141, 'V'), + (0x2145, 'M', u'd'), + (0x2147, 'M', u'e'), + (0x2148, 'M', u'i'), + (0x2149, 'M', u'j'), + (0x214A, 'V'), + (0x2150, 'M', u'1⁄7'), + (0x2151, 'M', u'1⁄9'), + (0x2152, 'M', u'1⁄10'), + (0x2153, 'M', u'1⁄3'), + (0x2154, 'M', u'2⁄3'), + (0x2155, 'M', u'1⁄5'), + (0x2156, 'M', u'2⁄5'), + (0x2157, 'M', u'3⁄5'), + (0x2158, 'M', u'4⁄5'), + (0x2159, 'M', u'1⁄6'), + (0x215A, 'M', u'5⁄6'), + (0x215B, 'M', u'1⁄8'), + (0x215C, 'M', u'3⁄8'), + (0x215D, 'M', u'5⁄8'), + (0x215E, 'M', u'7⁄8'), + (0x215F, 'M', u'1⁄'), + (0x2160, 'M', u'i'), + (0x2161, 'M', u'ii'), + (0x2162, 'M', u'iii'), + (0x2163, 'M', u'iv'), + (0x2164, 'M', u'v'), + (0x2165, 'M', u'vi'), + (0x2166, 'M', u'vii'), + (0x2167, 'M', u'viii'), + (0x2168, 'M', u'ix'), + (0x2169, 'M', u'x'), + (0x216A, 'M', u'xi'), + (0x216B, 'M', u'xii'), + (0x216C, 'M', u'l'), + (0x216D, 'M', u'c'), + (0x216E, 'M', u'd'), + (0x216F, 'M', u'm'), + (0x2170, 'M', u'i'), + (0x2171, 'M', u'ii'), + (0x2172, 'M', u'iii'), + (0x2173, 'M', u'iv'), + (0x2174, 'M', u'v'), + (0x2175, 'M', u'vi'), + (0x2176, 'M', u'vii'), + (0x2177, 'M', u'viii'), + ] + +def _seg_23(): + return [ + (0x2178, 'M', u'ix'), + (0x2179, 'M', u'x'), + (0x217A, 'M', u'xi'), + (0x217B, 'M', u'xii'), + (0x217C, 'M', u'l'), + (0x217D, 'M', u'c'), + (0x217E, 'M', u'd'), + (0x217F, 'M', u'm'), + (0x2180, 'V'), + (0x2183, 'X'), + (0x2184, 'V'), + (0x2189, 'M', u'0⁄3'), + (0x218A, 'V'), + (0x218C, 'X'), + (0x2190, 'V'), + (0x222C, 'M', u'∫∫'), + (0x222D, 'M', u'∫∫∫'), + (0x222E, 'V'), + (0x222F, 'M', u'∮∮'), + (0x2230, 'M', u'∮∮∮'), + (0x2231, 'V'), + (0x2260, '3'), + (0x2261, 'V'), + (0x226E, '3'), + (0x2270, 'V'), + (0x2329, 'M', u'〈'), + (0x232A, 'M', u'〉'), + (0x232B, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', u'1'), + (0x2461, 'M', u'2'), + (0x2462, 'M', u'3'), + (0x2463, 'M', u'4'), + (0x2464, 'M', u'5'), + (0x2465, 'M', u'6'), + (0x2466, 'M', u'7'), + (0x2467, 'M', u'8'), + (0x2468, 'M', u'9'), + (0x2469, 'M', u'10'), + (0x246A, 'M', u'11'), + (0x246B, 'M', u'12'), + (0x246C, 'M', u'13'), + (0x246D, 'M', u'14'), + (0x246E, 'M', u'15'), + (0x246F, 'M', u'16'), + (0x2470, 'M', u'17'), + (0x2471, 'M', u'18'), + (0x2472, 'M', u'19'), + (0x2473, 'M', u'20'), + (0x2474, '3', u'(1)'), + (0x2475, '3', u'(2)'), + (0x2476, '3', u'(3)'), + (0x2477, '3', u'(4)'), + (0x2478, '3', u'(5)'), + (0x2479, '3', u'(6)'), + (0x247A, '3', u'(7)'), + (0x247B, '3', u'(8)'), + (0x247C, '3', u'(9)'), + (0x247D, '3', u'(10)'), + (0x247E, '3', u'(11)'), + (0x247F, '3', u'(12)'), + (0x2480, '3', u'(13)'), + (0x2481, '3', u'(14)'), + (0x2482, '3', u'(15)'), + (0x2483, '3', u'(16)'), + (0x2484, '3', u'(17)'), + (0x2485, '3', u'(18)'), + (0x2486, '3', u'(19)'), + (0x2487, '3', u'(20)'), + (0x2488, 'X'), + (0x249C, '3', u'(a)'), + (0x249D, '3', u'(b)'), + (0x249E, '3', u'(c)'), + (0x249F, '3', u'(d)'), + (0x24A0, '3', u'(e)'), + (0x24A1, '3', u'(f)'), + (0x24A2, '3', u'(g)'), + (0x24A3, '3', u'(h)'), + (0x24A4, '3', u'(i)'), + (0x24A5, '3', u'(j)'), + (0x24A6, '3', u'(k)'), + (0x24A7, '3', u'(l)'), + (0x24A8, '3', u'(m)'), + (0x24A9, '3', u'(n)'), + (0x24AA, '3', u'(o)'), + (0x24AB, '3', u'(p)'), + (0x24AC, '3', u'(q)'), + (0x24AD, '3', u'(r)'), + (0x24AE, '3', u'(s)'), + (0x24AF, '3', u'(t)'), + (0x24B0, '3', u'(u)'), + (0x24B1, '3', u'(v)'), + (0x24B2, '3', u'(w)'), + (0x24B3, '3', u'(x)'), + (0x24B4, '3', u'(y)'), + (0x24B5, '3', u'(z)'), + (0x24B6, 'M', u'a'), + (0x24B7, 'M', u'b'), + ] + +def _seg_24(): + return [ + (0x24B8, 'M', u'c'), + (0x24B9, 'M', u'd'), + (0x24BA, 'M', u'e'), + (0x24BB, 'M', u'f'), + (0x24BC, 'M', u'g'), + (0x24BD, 'M', u'h'), + (0x24BE, 'M', u'i'), + (0x24BF, 'M', u'j'), + (0x24C0, 'M', u'k'), + (0x24C1, 'M', u'l'), + (0x24C2, 'M', u'm'), + (0x24C3, 'M', u'n'), + (0x24C4, 'M', u'o'), + (0x24C5, 'M', u'p'), + (0x24C6, 'M', u'q'), + (0x24C7, 'M', u'r'), + (0x24C8, 'M', u's'), + (0x24C9, 'M', u't'), + (0x24CA, 'M', u'u'), + (0x24CB, 'M', u'v'), + (0x24CC, 'M', u'w'), + (0x24CD, 'M', u'x'), + (0x24CE, 'M', u'y'), + (0x24CF, 'M', u'z'), + (0x24D0, 'M', u'a'), + (0x24D1, 'M', u'b'), + (0x24D2, 'M', u'c'), + (0x24D3, 'M', u'd'), + (0x24D4, 'M', u'e'), + (0x24D5, 'M', u'f'), + (0x24D6, 'M', u'g'), + (0x24D7, 'M', u'h'), + (0x24D8, 'M', u'i'), + (0x24D9, 'M', u'j'), + (0x24DA, 'M', u'k'), + (0x24DB, 'M', u'l'), + (0x24DC, 'M', u'm'), + (0x24DD, 'M', u'n'), + (0x24DE, 'M', u'o'), + (0x24DF, 'M', u'p'), + (0x24E0, 'M', u'q'), + (0x24E1, 'M', u'r'), + (0x24E2, 'M', u's'), + (0x24E3, 'M', u't'), + (0x24E4, 'M', u'u'), + (0x24E5, 'M', u'v'), + (0x24E6, 'M', u'w'), + (0x24E7, 'M', u'x'), + (0x24E8, 'M', u'y'), + (0x24E9, 'M', u'z'), + (0x24EA, 'M', u'0'), + (0x24EB, 'V'), + (0x2A0C, 'M', u'∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', u'::='), + (0x2A75, '3', u'=='), + (0x2A76, '3', u'==='), + (0x2A77, 'V'), + (0x2ADC, 'M', u'⫝̸'), + (0x2ADD, 'V'), + (0x2B74, 'X'), + (0x2B76, 'V'), + (0x2B96, 'X'), + (0x2B98, 'V'), + (0x2C00, 'M', u'ⰰ'), + (0x2C01, 'M', u'ⰱ'), + (0x2C02, 'M', u'ⰲ'), + (0x2C03, 'M', u'ⰳ'), + (0x2C04, 'M', u'ⰴ'), + (0x2C05, 'M', u'ⰵ'), + (0x2C06, 'M', u'ⰶ'), + (0x2C07, 'M', u'ⰷ'), + (0x2C08, 'M', u'ⰸ'), + (0x2C09, 'M', u'ⰹ'), + (0x2C0A, 'M', u'ⰺ'), + (0x2C0B, 'M', u'ⰻ'), + (0x2C0C, 'M', u'ⰼ'), + (0x2C0D, 'M', u'ⰽ'), + (0x2C0E, 'M', u'ⰾ'), + (0x2C0F, 'M', u'ⰿ'), + (0x2C10, 'M', u'ⱀ'), + (0x2C11, 'M', u'ⱁ'), + (0x2C12, 'M', u'ⱂ'), + (0x2C13, 'M', u'ⱃ'), + (0x2C14, 'M', u'ⱄ'), + (0x2C15, 'M', u'ⱅ'), + (0x2C16, 'M', u'ⱆ'), + (0x2C17, 'M', u'ⱇ'), + (0x2C18, 'M', u'ⱈ'), + (0x2C19, 'M', u'ⱉ'), + (0x2C1A, 'M', u'ⱊ'), + (0x2C1B, 'M', u'ⱋ'), + (0x2C1C, 'M', u'ⱌ'), + (0x2C1D, 'M', u'ⱍ'), + (0x2C1E, 'M', u'ⱎ'), + (0x2C1F, 'M', u'ⱏ'), + (0x2C20, 'M', u'ⱐ'), + (0x2C21, 'M', u'ⱑ'), + (0x2C22, 'M', u'ⱒ'), + (0x2C23, 'M', u'ⱓ'), + ] + +def _seg_25(): + return [ + (0x2C24, 'M', u'ⱔ'), + (0x2C25, 'M', u'ⱕ'), + (0x2C26, 'M', u'ⱖ'), + (0x2C27, 'M', u'ⱗ'), + (0x2C28, 'M', u'ⱘ'), + (0x2C29, 'M', u'ⱙ'), + (0x2C2A, 'M', u'ⱚ'), + (0x2C2B, 'M', u'ⱛ'), + (0x2C2C, 'M', u'ⱜ'), + (0x2C2D, 'M', u'ⱝ'), + (0x2C2E, 'M', u'ⱞ'), + (0x2C2F, 'X'), + (0x2C30, 'V'), + (0x2C5F, 'X'), + (0x2C60, 'M', u'ⱡ'), + (0x2C61, 'V'), + (0x2C62, 'M', u'ɫ'), + (0x2C63, 'M', u'ᵽ'), + (0x2C64, 'M', u'ɽ'), + (0x2C65, 'V'), + (0x2C67, 'M', u'ⱨ'), + (0x2C68, 'V'), + (0x2C69, 'M', u'ⱪ'), + (0x2C6A, 'V'), + (0x2C6B, 'M', u'ⱬ'), + (0x2C6C, 'V'), + (0x2C6D, 'M', u'ɑ'), + (0x2C6E, 'M', u'ɱ'), + (0x2C6F, 'M', u'ɐ'), + (0x2C70, 'M', u'ɒ'), + (0x2C71, 'V'), + (0x2C72, 'M', u'ⱳ'), + (0x2C73, 'V'), + (0x2C75, 'M', u'ⱶ'), + (0x2C76, 'V'), + (0x2C7C, 'M', u'j'), + (0x2C7D, 'M', u'v'), + (0x2C7E, 'M', u'ȿ'), + (0x2C7F, 'M', u'ɀ'), + (0x2C80, 'M', u'ⲁ'), + (0x2C81, 'V'), + (0x2C82, 'M', u'ⲃ'), + (0x2C83, 'V'), + (0x2C84, 'M', u'ⲅ'), + (0x2C85, 'V'), + (0x2C86, 'M', u'ⲇ'), + (0x2C87, 'V'), + (0x2C88, 'M', u'ⲉ'), + (0x2C89, 'V'), + (0x2C8A, 'M', u'ⲋ'), + (0x2C8B, 'V'), + (0x2C8C, 'M', u'ⲍ'), + (0x2C8D, 'V'), + (0x2C8E, 'M', u'ⲏ'), + (0x2C8F, 'V'), + (0x2C90, 'M', u'ⲑ'), + (0x2C91, 'V'), + (0x2C92, 'M', u'ⲓ'), + (0x2C93, 'V'), + (0x2C94, 'M', u'ⲕ'), + (0x2C95, 'V'), + (0x2C96, 'M', u'ⲗ'), + (0x2C97, 'V'), + (0x2C98, 'M', u'ⲙ'), + (0x2C99, 'V'), + (0x2C9A, 'M', u'ⲛ'), + (0x2C9B, 'V'), + (0x2C9C, 'M', u'ⲝ'), + (0x2C9D, 'V'), + (0x2C9E, 'M', u'ⲟ'), + (0x2C9F, 'V'), + (0x2CA0, 'M', u'ⲡ'), + (0x2CA1, 'V'), + (0x2CA2, 'M', u'ⲣ'), + (0x2CA3, 'V'), + (0x2CA4, 'M', u'ⲥ'), + (0x2CA5, 'V'), + (0x2CA6, 'M', u'ⲧ'), + (0x2CA7, 'V'), + (0x2CA8, 'M', u'ⲩ'), + (0x2CA9, 'V'), + (0x2CAA, 'M', u'ⲫ'), + (0x2CAB, 'V'), + (0x2CAC, 'M', u'ⲭ'), + (0x2CAD, 'V'), + (0x2CAE, 'M', u'ⲯ'), + (0x2CAF, 'V'), + (0x2CB0, 'M', u'ⲱ'), + (0x2CB1, 'V'), + (0x2CB2, 'M', u'ⲳ'), + (0x2CB3, 'V'), + (0x2CB4, 'M', u'ⲵ'), + (0x2CB5, 'V'), + (0x2CB6, 'M', u'ⲷ'), + (0x2CB7, 'V'), + (0x2CB8, 'M', u'ⲹ'), + (0x2CB9, 'V'), + (0x2CBA, 'M', u'ⲻ'), + (0x2CBB, 'V'), + (0x2CBC, 'M', u'ⲽ'), + ] + +def _seg_26(): + return [ + (0x2CBD, 'V'), + (0x2CBE, 'M', u'ⲿ'), + (0x2CBF, 'V'), + (0x2CC0, 'M', u'ⳁ'), + (0x2CC1, 'V'), + (0x2CC2, 'M', u'ⳃ'), + (0x2CC3, 'V'), + (0x2CC4, 'M', u'ⳅ'), + (0x2CC5, 'V'), + (0x2CC6, 'M', u'ⳇ'), + (0x2CC7, 'V'), + (0x2CC8, 'M', u'ⳉ'), + (0x2CC9, 'V'), + (0x2CCA, 'M', u'ⳋ'), + (0x2CCB, 'V'), + (0x2CCC, 'M', u'ⳍ'), + (0x2CCD, 'V'), + (0x2CCE, 'M', u'ⳏ'), + (0x2CCF, 'V'), + (0x2CD0, 'M', u'ⳑ'), + (0x2CD1, 'V'), + (0x2CD2, 'M', u'ⳓ'), + (0x2CD3, 'V'), + (0x2CD4, 'M', u'ⳕ'), + (0x2CD5, 'V'), + (0x2CD6, 'M', u'ⳗ'), + (0x2CD7, 'V'), + (0x2CD8, 'M', u'ⳙ'), + (0x2CD9, 'V'), + (0x2CDA, 'M', u'ⳛ'), + (0x2CDB, 'V'), + (0x2CDC, 'M', u'ⳝ'), + (0x2CDD, 'V'), + (0x2CDE, 'M', u'ⳟ'), + (0x2CDF, 'V'), + (0x2CE0, 'M', u'ⳡ'), + (0x2CE1, 'V'), + (0x2CE2, 'M', u'ⳣ'), + (0x2CE3, 'V'), + (0x2CEB, 'M', u'ⳬ'), + (0x2CEC, 'V'), + (0x2CED, 'M', u'ⳮ'), + (0x2CEE, 'V'), + (0x2CF2, 'M', u'ⳳ'), + (0x2CF3, 'V'), + (0x2CF4, 'X'), + (0x2CF9, 'V'), + (0x2D26, 'X'), + (0x2D27, 'V'), + (0x2D28, 'X'), + (0x2D2D, 'V'), + (0x2D2E, 'X'), + (0x2D30, 'V'), + (0x2D68, 'X'), + (0x2D6F, 'M', u'ⵡ'), + (0x2D70, 'V'), + (0x2D71, 'X'), + (0x2D7F, 'V'), + (0x2D97, 'X'), + (0x2DA0, 'V'), + (0x2DA7, 'X'), + (0x2DA8, 'V'), + (0x2DAF, 'X'), + (0x2DB0, 'V'), + (0x2DB7, 'X'), + (0x2DB8, 'V'), + (0x2DBF, 'X'), + (0x2DC0, 'V'), + (0x2DC7, 'X'), + (0x2DC8, 'V'), + (0x2DCF, 'X'), + (0x2DD0, 'V'), + (0x2DD7, 'X'), + (0x2DD8, 'V'), + (0x2DDF, 'X'), + (0x2DE0, 'V'), + (0x2E50, 'X'), + (0x2E80, 'V'), + (0x2E9A, 'X'), + (0x2E9B, 'V'), + (0x2E9F, 'M', u'母'), + (0x2EA0, 'V'), + (0x2EF3, 'M', u'龟'), + (0x2EF4, 'X'), + (0x2F00, 'M', u'一'), + (0x2F01, 'M', u'丨'), + (0x2F02, 'M', u'丶'), + (0x2F03, 'M', u'丿'), + (0x2F04, 'M', u'乙'), + (0x2F05, 'M', u'亅'), + (0x2F06, 'M', u'二'), + (0x2F07, 'M', u'亠'), + (0x2F08, 'M', u'人'), + (0x2F09, 'M', u'儿'), + (0x2F0A, 'M', u'入'), + (0x2F0B, 'M', u'八'), + (0x2F0C, 'M', u'冂'), + (0x2F0D, 'M', u'冖'), + (0x2F0E, 'M', u'冫'), + (0x2F0F, 'M', u'几'), + ] + +def _seg_27(): + return [ + (0x2F10, 'M', u'凵'), + (0x2F11, 'M', u'刀'), + (0x2F12, 'M', u'力'), + (0x2F13, 'M', u'勹'), + (0x2F14, 'M', u'匕'), + (0x2F15, 'M', u'匚'), + (0x2F16, 'M', u'匸'), + (0x2F17, 'M', u'十'), + (0x2F18, 'M', u'卜'), + (0x2F19, 'M', u'卩'), + (0x2F1A, 'M', u'厂'), + (0x2F1B, 'M', u'厶'), + (0x2F1C, 'M', u'又'), + (0x2F1D, 'M', u'口'), + (0x2F1E, 'M', u'囗'), + (0x2F1F, 'M', u'土'), + (0x2F20, 'M', u'士'), + (0x2F21, 'M', u'夂'), + (0x2F22, 'M', u'夊'), + (0x2F23, 'M', u'夕'), + (0x2F24, 'M', u'大'), + (0x2F25, 'M', u'女'), + (0x2F26, 'M', u'子'), + (0x2F27, 'M', u'宀'), + (0x2F28, 'M', u'寸'), + (0x2F29, 'M', u'小'), + (0x2F2A, 'M', u'尢'), + (0x2F2B, 'M', u'尸'), + (0x2F2C, 'M', u'屮'), + (0x2F2D, 'M', u'山'), + (0x2F2E, 'M', u'巛'), + (0x2F2F, 'M', u'工'), + (0x2F30, 'M', u'己'), + (0x2F31, 'M', u'巾'), + (0x2F32, 'M', u'干'), + (0x2F33, 'M', u'幺'), + (0x2F34, 'M', u'广'), + (0x2F35, 'M', u'廴'), + (0x2F36, 'M', u'廾'), + (0x2F37, 'M', u'弋'), + (0x2F38, 'M', u'弓'), + (0x2F39, 'M', u'彐'), + (0x2F3A, 'M', u'彡'), + (0x2F3B, 'M', u'彳'), + (0x2F3C, 'M', u'心'), + (0x2F3D, 'M', u'戈'), + (0x2F3E, 'M', u'戶'), + (0x2F3F, 'M', u'手'), + (0x2F40, 'M', u'支'), + (0x2F41, 'M', u'攴'), + (0x2F42, 'M', u'文'), + (0x2F43, 'M', u'斗'), + (0x2F44, 'M', u'斤'), + (0x2F45, 'M', u'方'), + (0x2F46, 'M', u'无'), + (0x2F47, 'M', u'日'), + (0x2F48, 'M', u'曰'), + (0x2F49, 'M', u'月'), + (0x2F4A, 'M', u'木'), + (0x2F4B, 'M', u'欠'), + (0x2F4C, 'M', u'止'), + (0x2F4D, 'M', u'歹'), + (0x2F4E, 'M', u'殳'), + (0x2F4F, 'M', u'毋'), + (0x2F50, 'M', u'比'), + (0x2F51, 'M', u'毛'), + (0x2F52, 'M', u'氏'), + (0x2F53, 'M', u'气'), + (0x2F54, 'M', u'水'), + (0x2F55, 'M', u'火'), + (0x2F56, 'M', u'爪'), + (0x2F57, 'M', u'父'), + (0x2F58, 'M', u'爻'), + (0x2F59, 'M', u'爿'), + (0x2F5A, 'M', u'片'), + (0x2F5B, 'M', u'牙'), + (0x2F5C, 'M', u'牛'), + (0x2F5D, 'M', u'犬'), + (0x2F5E, 'M', u'玄'), + (0x2F5F, 'M', u'玉'), + (0x2F60, 'M', u'瓜'), + (0x2F61, 'M', u'瓦'), + (0x2F62, 'M', u'甘'), + (0x2F63, 'M', u'生'), + (0x2F64, 'M', u'用'), + (0x2F65, 'M', u'田'), + (0x2F66, 'M', u'疋'), + (0x2F67, 'M', u'疒'), + (0x2F68, 'M', u'癶'), + (0x2F69, 'M', u'白'), + (0x2F6A, 'M', u'皮'), + (0x2F6B, 'M', u'皿'), + (0x2F6C, 'M', u'目'), + (0x2F6D, 'M', u'矛'), + (0x2F6E, 'M', u'矢'), + (0x2F6F, 'M', u'石'), + (0x2F70, 'M', u'示'), + (0x2F71, 'M', u'禸'), + (0x2F72, 'M', u'禾'), + (0x2F73, 'M', u'穴'), + ] + +def _seg_28(): + return [ + (0x2F74, 'M', u'立'), + (0x2F75, 'M', u'竹'), + (0x2F76, 'M', u'米'), + (0x2F77, 'M', u'糸'), + (0x2F78, 'M', u'缶'), + (0x2F79, 'M', u'网'), + (0x2F7A, 'M', u'羊'), + (0x2F7B, 'M', u'羽'), + (0x2F7C, 'M', u'老'), + (0x2F7D, 'M', u'而'), + (0x2F7E, 'M', u'耒'), + (0x2F7F, 'M', u'耳'), + (0x2F80, 'M', u'聿'), + (0x2F81, 'M', u'肉'), + (0x2F82, 'M', u'臣'), + (0x2F83, 'M', u'自'), + (0x2F84, 'M', u'至'), + (0x2F85, 'M', u'臼'), + (0x2F86, 'M', u'舌'), + (0x2F87, 'M', u'舛'), + (0x2F88, 'M', u'舟'), + (0x2F89, 'M', u'艮'), + (0x2F8A, 'M', u'色'), + (0x2F8B, 'M', u'艸'), + (0x2F8C, 'M', u'虍'), + (0x2F8D, 'M', u'虫'), + (0x2F8E, 'M', u'血'), + (0x2F8F, 'M', u'行'), + (0x2F90, 'M', u'衣'), + (0x2F91, 'M', u'襾'), + (0x2F92, 'M', u'見'), + (0x2F93, 'M', u'角'), + (0x2F94, 'M', u'言'), + (0x2F95, 'M', u'谷'), + (0x2F96, 'M', u'豆'), + (0x2F97, 'M', u'豕'), + (0x2F98, 'M', u'豸'), + (0x2F99, 'M', u'貝'), + (0x2F9A, 'M', u'赤'), + (0x2F9B, 'M', u'走'), + (0x2F9C, 'M', u'足'), + (0x2F9D, 'M', u'身'), + (0x2F9E, 'M', u'車'), + (0x2F9F, 'M', u'辛'), + (0x2FA0, 'M', u'辰'), + (0x2FA1, 'M', u'辵'), + (0x2FA2, 'M', u'邑'), + (0x2FA3, 'M', u'酉'), + (0x2FA4, 'M', u'釆'), + (0x2FA5, 'M', u'里'), + (0x2FA6, 'M', u'金'), + (0x2FA7, 'M', u'長'), + (0x2FA8, 'M', u'門'), + (0x2FA9, 'M', u'阜'), + (0x2FAA, 'M', u'隶'), + (0x2FAB, 'M', u'隹'), + (0x2FAC, 'M', u'雨'), + (0x2FAD, 'M', u'靑'), + (0x2FAE, 'M', u'非'), + (0x2FAF, 'M', u'面'), + (0x2FB0, 'M', u'革'), + (0x2FB1, 'M', u'韋'), + (0x2FB2, 'M', u'韭'), + (0x2FB3, 'M', u'音'), + (0x2FB4, 'M', u'頁'), + (0x2FB5, 'M', u'風'), + (0x2FB6, 'M', u'飛'), + (0x2FB7, 'M', u'食'), + (0x2FB8, 'M', u'首'), + (0x2FB9, 'M', u'香'), + (0x2FBA, 'M', u'馬'), + (0x2FBB, 'M', u'骨'), + (0x2FBC, 'M', u'高'), + (0x2FBD, 'M', u'髟'), + (0x2FBE, 'M', u'鬥'), + (0x2FBF, 'M', u'鬯'), + (0x2FC0, 'M', u'鬲'), + (0x2FC1, 'M', u'鬼'), + (0x2FC2, 'M', u'魚'), + (0x2FC3, 'M', u'鳥'), + (0x2FC4, 'M', u'鹵'), + (0x2FC5, 'M', u'鹿'), + (0x2FC6, 'M', u'麥'), + (0x2FC7, 'M', u'麻'), + (0x2FC8, 'M', u'黃'), + (0x2FC9, 'M', u'黍'), + (0x2FCA, 'M', u'黑'), + (0x2FCB, 'M', u'黹'), + (0x2FCC, 'M', u'黽'), + (0x2FCD, 'M', u'鼎'), + (0x2FCE, 'M', u'鼓'), + (0x2FCF, 'M', u'鼠'), + (0x2FD0, 'M', u'鼻'), + (0x2FD1, 'M', u'齊'), + (0x2FD2, 'M', u'齒'), + (0x2FD3, 'M', u'龍'), + (0x2FD4, 'M', u'龜'), + (0x2FD5, 'M', u'龠'), + (0x2FD6, 'X'), + (0x3000, '3', u' '), + ] + +def _seg_29(): + return [ + (0x3001, 'V'), + (0x3002, 'M', u'.'), + (0x3003, 'V'), + (0x3036, 'M', u'〒'), + (0x3037, 'V'), + (0x3038, 'M', u'十'), + (0x3039, 'M', u'卄'), + (0x303A, 'M', u'卅'), + (0x303B, 'V'), + (0x3040, 'X'), + (0x3041, 'V'), + (0x3097, 'X'), + (0x3099, 'V'), + (0x309B, '3', u' ゙'), + (0x309C, '3', u' ゚'), + (0x309D, 'V'), + (0x309F, 'M', u'より'), + (0x30A0, 'V'), + (0x30FF, 'M', u'コト'), + (0x3100, 'X'), + (0x3105, 'V'), + (0x3130, 'X'), + (0x3131, 'M', u'ᄀ'), + (0x3132, 'M', u'ᄁ'), + (0x3133, 'M', u'ᆪ'), + (0x3134, 'M', u'ᄂ'), + (0x3135, 'M', u'ᆬ'), + (0x3136, 'M', u'ᆭ'), + (0x3137, 'M', u'ᄃ'), + (0x3138, 'M', u'ᄄ'), + (0x3139, 'M', u'ᄅ'), + (0x313A, 'M', u'ᆰ'), + (0x313B, 'M', u'ᆱ'), + (0x313C, 'M', u'ᆲ'), + (0x313D, 'M', u'ᆳ'), + (0x313E, 'M', u'ᆴ'), + (0x313F, 'M', u'ᆵ'), + (0x3140, 'M', u'ᄚ'), + (0x3141, 'M', u'ᄆ'), + (0x3142, 'M', u'ᄇ'), + (0x3143, 'M', u'ᄈ'), + (0x3144, 'M', u'ᄡ'), + (0x3145, 'M', u'ᄉ'), + (0x3146, 'M', u'ᄊ'), + (0x3147, 'M', u'ᄋ'), + (0x3148, 'M', u'ᄌ'), + (0x3149, 'M', u'ᄍ'), + (0x314A, 'M', u'ᄎ'), + (0x314B, 'M', u'ᄏ'), + (0x314C, 'M', u'ᄐ'), + (0x314D, 'M', u'ᄑ'), + (0x314E, 'M', u'ᄒ'), + (0x314F, 'M', u'ᅡ'), + (0x3150, 'M', u'ᅢ'), + (0x3151, 'M', u'ᅣ'), + (0x3152, 'M', u'ᅤ'), + (0x3153, 'M', u'ᅥ'), + (0x3154, 'M', u'ᅦ'), + (0x3155, 'M', u'ᅧ'), + (0x3156, 'M', u'ᅨ'), + (0x3157, 'M', u'ᅩ'), + (0x3158, 'M', u'ᅪ'), + (0x3159, 'M', u'ᅫ'), + (0x315A, 'M', u'ᅬ'), + (0x315B, 'M', u'ᅭ'), + (0x315C, 'M', u'ᅮ'), + (0x315D, 'M', u'ᅯ'), + (0x315E, 'M', u'ᅰ'), + (0x315F, 'M', u'ᅱ'), + (0x3160, 'M', u'ᅲ'), + (0x3161, 'M', u'ᅳ'), + (0x3162, 'M', u'ᅴ'), + (0x3163, 'M', u'ᅵ'), + (0x3164, 'X'), + (0x3165, 'M', u'ᄔ'), + (0x3166, 'M', u'ᄕ'), + (0x3167, 'M', u'ᇇ'), + (0x3168, 'M', u'ᇈ'), + (0x3169, 'M', u'ᇌ'), + (0x316A, 'M', u'ᇎ'), + (0x316B, 'M', u'ᇓ'), + (0x316C, 'M', u'ᇗ'), + (0x316D, 'M', u'ᇙ'), + (0x316E, 'M', u'ᄜ'), + (0x316F, 'M', u'ᇝ'), + (0x3170, 'M', u'ᇟ'), + (0x3171, 'M', u'ᄝ'), + (0x3172, 'M', u'ᄞ'), + (0x3173, 'M', u'ᄠ'), + (0x3174, 'M', u'ᄢ'), + (0x3175, 'M', u'ᄣ'), + (0x3176, 'M', u'ᄧ'), + (0x3177, 'M', u'ᄩ'), + (0x3178, 'M', u'ᄫ'), + (0x3179, 'M', u'ᄬ'), + (0x317A, 'M', u'ᄭ'), + (0x317B, 'M', u'ᄮ'), + (0x317C, 'M', u'ᄯ'), + (0x317D, 'M', u'ᄲ'), + (0x317E, 'M', u'ᄶ'), + ] + +def _seg_30(): + return [ + (0x317F, 'M', u'ᅀ'), + (0x3180, 'M', u'ᅇ'), + (0x3181, 'M', u'ᅌ'), + (0x3182, 'M', u'ᇱ'), + (0x3183, 'M', u'ᇲ'), + (0x3184, 'M', u'ᅗ'), + (0x3185, 'M', u'ᅘ'), + (0x3186, 'M', u'ᅙ'), + (0x3187, 'M', u'ᆄ'), + (0x3188, 'M', u'ᆅ'), + (0x3189, 'M', u'ᆈ'), + (0x318A, 'M', u'ᆑ'), + (0x318B, 'M', u'ᆒ'), + (0x318C, 'M', u'ᆔ'), + (0x318D, 'M', u'ᆞ'), + (0x318E, 'M', u'ᆡ'), + (0x318F, 'X'), + (0x3190, 'V'), + (0x3192, 'M', u'一'), + (0x3193, 'M', u'二'), + (0x3194, 'M', u'三'), + (0x3195, 'M', u'四'), + (0x3196, 'M', u'上'), + (0x3197, 'M', u'中'), + (0x3198, 'M', u'下'), + (0x3199, 'M', u'甲'), + (0x319A, 'M', u'乙'), + (0x319B, 'M', u'丙'), + (0x319C, 'M', u'丁'), + (0x319D, 'M', u'天'), + (0x319E, 'M', u'地'), + (0x319F, 'M', u'人'), + (0x31A0, 'V'), + (0x31BB, 'X'), + (0x31C0, 'V'), + (0x31E4, 'X'), + (0x31F0, 'V'), + (0x3200, '3', u'(ᄀ)'), + (0x3201, '3', u'(ᄂ)'), + (0x3202, '3', u'(ᄃ)'), + (0x3203, '3', u'(ᄅ)'), + (0x3204, '3', u'(ᄆ)'), + (0x3205, '3', u'(ᄇ)'), + (0x3206, '3', u'(ᄉ)'), + (0x3207, '3', u'(ᄋ)'), + (0x3208, '3', u'(ᄌ)'), + (0x3209, '3', u'(ᄎ)'), + (0x320A, '3', u'(ᄏ)'), + (0x320B, '3', u'(ᄐ)'), + (0x320C, '3', u'(ᄑ)'), + (0x320D, '3', u'(ᄒ)'), + (0x320E, '3', u'(가)'), + (0x320F, '3', u'(나)'), + (0x3210, '3', u'(다)'), + (0x3211, '3', u'(라)'), + (0x3212, '3', u'(마)'), + (0x3213, '3', u'(바)'), + (0x3214, '3', u'(사)'), + (0x3215, '3', u'(아)'), + (0x3216, '3', u'(자)'), + (0x3217, '3', u'(차)'), + (0x3218, '3', u'(카)'), + (0x3219, '3', u'(타)'), + (0x321A, '3', u'(파)'), + (0x321B, '3', u'(하)'), + (0x321C, '3', u'(주)'), + (0x321D, '3', u'(오전)'), + (0x321E, '3', u'(오후)'), + (0x321F, 'X'), + (0x3220, '3', u'(一)'), + (0x3221, '3', u'(二)'), + (0x3222, '3', u'(三)'), + (0x3223, '3', u'(四)'), + (0x3224, '3', u'(五)'), + (0x3225, '3', u'(六)'), + (0x3226, '3', u'(七)'), + (0x3227, '3', u'(八)'), + (0x3228, '3', u'(九)'), + (0x3229, '3', u'(十)'), + (0x322A, '3', u'(月)'), + (0x322B, '3', u'(火)'), + (0x322C, '3', u'(水)'), + (0x322D, '3', u'(木)'), + (0x322E, '3', u'(金)'), + (0x322F, '3', u'(土)'), + (0x3230, '3', u'(日)'), + (0x3231, '3', u'(株)'), + (0x3232, '3', u'(有)'), + (0x3233, '3', u'(社)'), + (0x3234, '3', u'(名)'), + (0x3235, '3', u'(特)'), + (0x3236, '3', u'(財)'), + (0x3237, '3', u'(祝)'), + (0x3238, '3', u'(労)'), + (0x3239, '3', u'(代)'), + (0x323A, '3', u'(呼)'), + (0x323B, '3', u'(学)'), + (0x323C, '3', u'(監)'), + (0x323D, '3', u'(企)'), + (0x323E, '3', u'(資)'), + ] + +def _seg_31(): + return [ + (0x323F, '3', u'(協)'), + (0x3240, '3', u'(祭)'), + (0x3241, '3', u'(休)'), + (0x3242, '3', u'(自)'), + (0x3243, '3', u'(至)'), + (0x3244, 'M', u'問'), + (0x3245, 'M', u'幼'), + (0x3246, 'M', u'文'), + (0x3247, 'M', u'箏'), + (0x3248, 'V'), + (0x3250, 'M', u'pte'), + (0x3251, 'M', u'21'), + (0x3252, 'M', u'22'), + (0x3253, 'M', u'23'), + (0x3254, 'M', u'24'), + (0x3255, 'M', u'25'), + (0x3256, 'M', u'26'), + (0x3257, 'M', u'27'), + (0x3258, 'M', u'28'), + (0x3259, 'M', u'29'), + (0x325A, 'M', u'30'), + (0x325B, 'M', u'31'), + (0x325C, 'M', u'32'), + (0x325D, 'M', u'33'), + (0x325E, 'M', u'34'), + (0x325F, 'M', u'35'), + (0x3260, 'M', u'ᄀ'), + (0x3261, 'M', u'ᄂ'), + (0x3262, 'M', u'ᄃ'), + (0x3263, 'M', u'ᄅ'), + (0x3264, 'M', u'ᄆ'), + (0x3265, 'M', u'ᄇ'), + (0x3266, 'M', u'ᄉ'), + (0x3267, 'M', u'ᄋ'), + (0x3268, 'M', u'ᄌ'), + (0x3269, 'M', u'ᄎ'), + (0x326A, 'M', u'ᄏ'), + (0x326B, 'M', u'ᄐ'), + (0x326C, 'M', u'ᄑ'), + (0x326D, 'M', u'ᄒ'), + (0x326E, 'M', u'가'), + (0x326F, 'M', u'나'), + (0x3270, 'M', u'다'), + (0x3271, 'M', u'라'), + (0x3272, 'M', u'마'), + (0x3273, 'M', u'바'), + (0x3274, 'M', u'사'), + (0x3275, 'M', u'아'), + (0x3276, 'M', u'자'), + (0x3277, 'M', u'차'), + (0x3278, 'M', u'카'), + (0x3279, 'M', u'타'), + (0x327A, 'M', u'파'), + (0x327B, 'M', u'하'), + (0x327C, 'M', u'참고'), + (0x327D, 'M', u'주의'), + (0x327E, 'M', u'우'), + (0x327F, 'V'), + (0x3280, 'M', u'一'), + (0x3281, 'M', u'二'), + (0x3282, 'M', u'三'), + (0x3283, 'M', u'四'), + (0x3284, 'M', u'五'), + (0x3285, 'M', u'六'), + (0x3286, 'M', u'七'), + (0x3287, 'M', u'八'), + (0x3288, 'M', u'九'), + (0x3289, 'M', u'十'), + (0x328A, 'M', u'月'), + (0x328B, 'M', u'火'), + (0x328C, 'M', u'水'), + (0x328D, 'M', u'木'), + (0x328E, 'M', u'金'), + (0x328F, 'M', u'土'), + (0x3290, 'M', u'日'), + (0x3291, 'M', u'株'), + (0x3292, 'M', u'有'), + (0x3293, 'M', u'社'), + (0x3294, 'M', u'名'), + (0x3295, 'M', u'特'), + (0x3296, 'M', u'財'), + (0x3297, 'M', u'祝'), + (0x3298, 'M', u'労'), + (0x3299, 'M', u'秘'), + (0x329A, 'M', u'男'), + (0x329B, 'M', u'女'), + (0x329C, 'M', u'適'), + (0x329D, 'M', u'優'), + (0x329E, 'M', u'印'), + (0x329F, 'M', u'注'), + (0x32A0, 'M', u'項'), + (0x32A1, 'M', u'休'), + (0x32A2, 'M', u'写'), + (0x32A3, 'M', u'正'), + (0x32A4, 'M', u'上'), + (0x32A5, 'M', u'中'), + (0x32A6, 'M', u'下'), + (0x32A7, 'M', u'左'), + (0x32A8, 'M', u'右'), + (0x32A9, 'M', u'医'), + ] + +def _seg_32(): + return [ + (0x32AA, 'M', u'宗'), + (0x32AB, 'M', u'学'), + (0x32AC, 'M', u'監'), + (0x32AD, 'M', u'企'), + (0x32AE, 'M', u'資'), + (0x32AF, 'M', u'協'), + (0x32B0, 'M', u'夜'), + (0x32B1, 'M', u'36'), + (0x32B2, 'M', u'37'), + (0x32B3, 'M', u'38'), + (0x32B4, 'M', u'39'), + (0x32B5, 'M', u'40'), + (0x32B6, 'M', u'41'), + (0x32B7, 'M', u'42'), + (0x32B8, 'M', u'43'), + (0x32B9, 'M', u'44'), + (0x32BA, 'M', u'45'), + (0x32BB, 'M', u'46'), + (0x32BC, 'M', u'47'), + (0x32BD, 'M', u'48'), + (0x32BE, 'M', u'49'), + (0x32BF, 'M', u'50'), + (0x32C0, 'M', u'1月'), + (0x32C1, 'M', u'2月'), + (0x32C2, 'M', u'3月'), + (0x32C3, 'M', u'4月'), + (0x32C4, 'M', u'5月'), + (0x32C5, 'M', u'6月'), + (0x32C6, 'M', u'7月'), + (0x32C7, 'M', u'8月'), + (0x32C8, 'M', u'9月'), + (0x32C9, 'M', u'10月'), + (0x32CA, 'M', u'11月'), + (0x32CB, 'M', u'12月'), + (0x32CC, 'M', u'hg'), + (0x32CD, 'M', u'erg'), + (0x32CE, 'M', u'ev'), + (0x32CF, 'M', u'ltd'), + (0x32D0, 'M', u'ア'), + (0x32D1, 'M', u'イ'), + (0x32D2, 'M', u'ウ'), + (0x32D3, 'M', u'エ'), + (0x32D4, 'M', u'オ'), + (0x32D5, 'M', u'カ'), + (0x32D6, 'M', u'キ'), + (0x32D7, 'M', u'ク'), + (0x32D8, 'M', u'ケ'), + (0x32D9, 'M', u'コ'), + (0x32DA, 'M', u'サ'), + (0x32DB, 'M', u'シ'), + (0x32DC, 'M', u'ス'), + (0x32DD, 'M', u'セ'), + (0x32DE, 'M', u'ソ'), + (0x32DF, 'M', u'タ'), + (0x32E0, 'M', u'チ'), + (0x32E1, 'M', u'ツ'), + (0x32E2, 'M', u'テ'), + (0x32E3, 'M', u'ト'), + (0x32E4, 'M', u'ナ'), + (0x32E5, 'M', u'ニ'), + (0x32E6, 'M', u'ヌ'), + (0x32E7, 'M', u'ネ'), + (0x32E8, 'M', u'ノ'), + (0x32E9, 'M', u'ハ'), + (0x32EA, 'M', u'ヒ'), + (0x32EB, 'M', u'フ'), + (0x32EC, 'M', u'ヘ'), + (0x32ED, 'M', u'ホ'), + (0x32EE, 'M', u'マ'), + (0x32EF, 'M', u'ミ'), + (0x32F0, 'M', u'ム'), + (0x32F1, 'M', u'メ'), + (0x32F2, 'M', u'モ'), + (0x32F3, 'M', u'ヤ'), + (0x32F4, 'M', u'ユ'), + (0x32F5, 'M', u'ヨ'), + (0x32F6, 'M', u'ラ'), + (0x32F7, 'M', u'リ'), + (0x32F8, 'M', u'ル'), + (0x32F9, 'M', u'レ'), + (0x32FA, 'M', u'ロ'), + (0x32FB, 'M', u'ワ'), + (0x32FC, 'M', u'ヰ'), + (0x32FD, 'M', u'ヱ'), + (0x32FE, 'M', u'ヲ'), + (0x32FF, 'M', u'令和'), + (0x3300, 'M', u'アパート'), + (0x3301, 'M', u'アルファ'), + (0x3302, 'M', u'アンペア'), + (0x3303, 'M', u'アール'), + (0x3304, 'M', u'イニング'), + (0x3305, 'M', u'インチ'), + (0x3306, 'M', u'ウォン'), + (0x3307, 'M', u'エスクード'), + (0x3308, 'M', u'エーカー'), + (0x3309, 'M', u'オンス'), + (0x330A, 'M', u'オーム'), + (0x330B, 'M', u'カイリ'), + (0x330C, 'M', u'カラット'), + (0x330D, 'M', u'カロリー'), + ] + +def _seg_33(): + return [ + (0x330E, 'M', u'ガロン'), + (0x330F, 'M', u'ガンマ'), + (0x3310, 'M', u'ギガ'), + (0x3311, 'M', u'ギニー'), + (0x3312, 'M', u'キュリー'), + (0x3313, 'M', u'ギルダー'), + (0x3314, 'M', u'キロ'), + (0x3315, 'M', u'キログラム'), + (0x3316, 'M', u'キロメートル'), + (0x3317, 'M', u'キロワット'), + (0x3318, 'M', u'グラム'), + (0x3319, 'M', u'グラムトン'), + (0x331A, 'M', u'クルゼイロ'), + (0x331B, 'M', u'クローネ'), + (0x331C, 'M', u'ケース'), + (0x331D, 'M', u'コルナ'), + (0x331E, 'M', u'コーポ'), + (0x331F, 'M', u'サイクル'), + (0x3320, 'M', u'サンチーム'), + (0x3321, 'M', u'シリング'), + (0x3322, 'M', u'センチ'), + (0x3323, 'M', u'セント'), + (0x3324, 'M', u'ダース'), + (0x3325, 'M', u'デシ'), + (0x3326, 'M', u'ドル'), + (0x3327, 'M', u'トン'), + (0x3328, 'M', u'ナノ'), + (0x3329, 'M', u'ノット'), + (0x332A, 'M', u'ハイツ'), + (0x332B, 'M', u'パーセント'), + (0x332C, 'M', u'パーツ'), + (0x332D, 'M', u'バーレル'), + (0x332E, 'M', u'ピアストル'), + (0x332F, 'M', u'ピクル'), + (0x3330, 'M', u'ピコ'), + (0x3331, 'M', u'ビル'), + (0x3332, 'M', u'ファラッド'), + (0x3333, 'M', u'フィート'), + (0x3334, 'M', u'ブッシェル'), + (0x3335, 'M', u'フラン'), + (0x3336, 'M', u'ヘクタール'), + (0x3337, 'M', u'ペソ'), + (0x3338, 'M', u'ペニヒ'), + (0x3339, 'M', u'ヘルツ'), + (0x333A, 'M', u'ペンス'), + (0x333B, 'M', u'ページ'), + (0x333C, 'M', u'ベータ'), + (0x333D, 'M', u'ポイント'), + (0x333E, 'M', u'ボルト'), + (0x333F, 'M', u'ホン'), + (0x3340, 'M', u'ポンド'), + (0x3341, 'M', u'ホール'), + (0x3342, 'M', u'ホーン'), + (0x3343, 'M', u'マイクロ'), + (0x3344, 'M', u'マイル'), + (0x3345, 'M', u'マッハ'), + (0x3346, 'M', u'マルク'), + (0x3347, 'M', u'マンション'), + (0x3348, 'M', u'ミクロン'), + (0x3349, 'M', u'ミリ'), + (0x334A, 'M', u'ミリバール'), + (0x334B, 'M', u'メガ'), + (0x334C, 'M', u'メガトン'), + (0x334D, 'M', u'メートル'), + (0x334E, 'M', u'ヤード'), + (0x334F, 'M', u'ヤール'), + (0x3350, 'M', u'ユアン'), + (0x3351, 'M', u'リットル'), + (0x3352, 'M', u'リラ'), + (0x3353, 'M', u'ルピー'), + (0x3354, 'M', u'ルーブル'), + (0x3355, 'M', u'レム'), + (0x3356, 'M', u'レントゲン'), + (0x3357, 'M', u'ワット'), + (0x3358, 'M', u'0点'), + (0x3359, 'M', u'1点'), + (0x335A, 'M', u'2点'), + (0x335B, 'M', u'3点'), + (0x335C, 'M', u'4点'), + (0x335D, 'M', u'5点'), + (0x335E, 'M', u'6点'), + (0x335F, 'M', u'7点'), + (0x3360, 'M', u'8点'), + (0x3361, 'M', u'9点'), + (0x3362, 'M', u'10点'), + (0x3363, 'M', u'11点'), + (0x3364, 'M', u'12点'), + (0x3365, 'M', u'13点'), + (0x3366, 'M', u'14点'), + (0x3367, 'M', u'15点'), + (0x3368, 'M', u'16点'), + (0x3369, 'M', u'17点'), + (0x336A, 'M', u'18点'), + (0x336B, 'M', u'19点'), + (0x336C, 'M', u'20点'), + (0x336D, 'M', u'21点'), + (0x336E, 'M', u'22点'), + (0x336F, 'M', u'23点'), + (0x3370, 'M', u'24点'), + (0x3371, 'M', u'hpa'), + ] + +def _seg_34(): + return [ + (0x3372, 'M', u'da'), + (0x3373, 'M', u'au'), + (0x3374, 'M', u'bar'), + (0x3375, 'M', u'ov'), + (0x3376, 'M', u'pc'), + (0x3377, 'M', u'dm'), + (0x3378, 'M', u'dm2'), + (0x3379, 'M', u'dm3'), + (0x337A, 'M', u'iu'), + (0x337B, 'M', u'平成'), + (0x337C, 'M', u'昭和'), + (0x337D, 'M', u'大正'), + (0x337E, 'M', u'明治'), + (0x337F, 'M', u'株式会社'), + (0x3380, 'M', u'pa'), + (0x3381, 'M', u'na'), + (0x3382, 'M', u'μa'), + (0x3383, 'M', u'ma'), + (0x3384, 'M', u'ka'), + (0x3385, 'M', u'kb'), + (0x3386, 'M', u'mb'), + (0x3387, 'M', u'gb'), + (0x3388, 'M', u'cal'), + (0x3389, 'M', u'kcal'), + (0x338A, 'M', u'pf'), + (0x338B, 'M', u'nf'), + (0x338C, 'M', u'μf'), + (0x338D, 'M', u'μg'), + (0x338E, 'M', u'mg'), + (0x338F, 'M', u'kg'), + (0x3390, 'M', u'hz'), + (0x3391, 'M', u'khz'), + (0x3392, 'M', u'mhz'), + (0x3393, 'M', u'ghz'), + (0x3394, 'M', u'thz'), + (0x3395, 'M', u'μl'), + (0x3396, 'M', u'ml'), + (0x3397, 'M', u'dl'), + (0x3398, 'M', u'kl'), + (0x3399, 'M', u'fm'), + (0x339A, 'M', u'nm'), + (0x339B, 'M', u'μm'), + (0x339C, 'M', u'mm'), + (0x339D, 'M', u'cm'), + (0x339E, 'M', u'km'), + (0x339F, 'M', u'mm2'), + (0x33A0, 'M', u'cm2'), + (0x33A1, 'M', u'm2'), + (0x33A2, 'M', u'km2'), + (0x33A3, 'M', u'mm3'), + (0x33A4, 'M', u'cm3'), + (0x33A5, 'M', u'm3'), + (0x33A6, 'M', u'km3'), + (0x33A7, 'M', u'm∕s'), + (0x33A8, 'M', u'm∕s2'), + (0x33A9, 'M', u'pa'), + (0x33AA, 'M', u'kpa'), + (0x33AB, 'M', u'mpa'), + (0x33AC, 'M', u'gpa'), + (0x33AD, 'M', u'rad'), + (0x33AE, 'M', u'rad∕s'), + (0x33AF, 'M', u'rad∕s2'), + (0x33B0, 'M', u'ps'), + (0x33B1, 'M', u'ns'), + (0x33B2, 'M', u'μs'), + (0x33B3, 'M', u'ms'), + (0x33B4, 'M', u'pv'), + (0x33B5, 'M', u'nv'), + (0x33B6, 'M', u'μv'), + (0x33B7, 'M', u'mv'), + (0x33B8, 'M', u'kv'), + (0x33B9, 'M', u'mv'), + (0x33BA, 'M', u'pw'), + (0x33BB, 'M', u'nw'), + (0x33BC, 'M', u'μw'), + (0x33BD, 'M', u'mw'), + (0x33BE, 'M', u'kw'), + (0x33BF, 'M', u'mw'), + (0x33C0, 'M', u'kω'), + (0x33C1, 'M', u'mω'), + (0x33C2, 'X'), + (0x33C3, 'M', u'bq'), + (0x33C4, 'M', u'cc'), + (0x33C5, 'M', u'cd'), + (0x33C6, 'M', u'c∕kg'), + (0x33C7, 'X'), + (0x33C8, 'M', u'db'), + (0x33C9, 'M', u'gy'), + (0x33CA, 'M', u'ha'), + (0x33CB, 'M', u'hp'), + (0x33CC, 'M', u'in'), + (0x33CD, 'M', u'kk'), + (0x33CE, 'M', u'km'), + (0x33CF, 'M', u'kt'), + (0x33D0, 'M', u'lm'), + (0x33D1, 'M', u'ln'), + (0x33D2, 'M', u'log'), + (0x33D3, 'M', u'lx'), + (0x33D4, 'M', u'mb'), + (0x33D5, 'M', u'mil'), + ] + +def _seg_35(): + return [ + (0x33D6, 'M', u'mol'), + (0x33D7, 'M', u'ph'), + (0x33D8, 'X'), + (0x33D9, 'M', u'ppm'), + (0x33DA, 'M', u'pr'), + (0x33DB, 'M', u'sr'), + (0x33DC, 'M', u'sv'), + (0x33DD, 'M', u'wb'), + (0x33DE, 'M', u'v∕m'), + (0x33DF, 'M', u'a∕m'), + (0x33E0, 'M', u'1日'), + (0x33E1, 'M', u'2日'), + (0x33E2, 'M', u'3日'), + (0x33E3, 'M', u'4日'), + (0x33E4, 'M', u'5日'), + (0x33E5, 'M', u'6日'), + (0x33E6, 'M', u'7日'), + (0x33E7, 'M', u'8日'), + (0x33E8, 'M', u'9日'), + (0x33E9, 'M', u'10日'), + (0x33EA, 'M', u'11日'), + (0x33EB, 'M', u'12日'), + (0x33EC, 'M', u'13日'), + (0x33ED, 'M', u'14日'), + (0x33EE, 'M', u'15日'), + (0x33EF, 'M', u'16日'), + (0x33F0, 'M', u'17日'), + (0x33F1, 'M', u'18日'), + (0x33F2, 'M', u'19日'), + (0x33F3, 'M', u'20日'), + (0x33F4, 'M', u'21日'), + (0x33F5, 'M', u'22日'), + (0x33F6, 'M', u'23日'), + (0x33F7, 'M', u'24日'), + (0x33F8, 'M', u'25日'), + (0x33F9, 'M', u'26日'), + (0x33FA, 'M', u'27日'), + (0x33FB, 'M', u'28日'), + (0x33FC, 'M', u'29日'), + (0x33FD, 'M', u'30日'), + (0x33FE, 'M', u'31日'), + (0x33FF, 'M', u'gal'), + (0x3400, 'V'), + (0x4DB6, 'X'), + (0x4DC0, 'V'), + (0x9FF0, 'X'), + (0xA000, 'V'), + (0xA48D, 'X'), + (0xA490, 'V'), + (0xA4C7, 'X'), + (0xA4D0, 'V'), + (0xA62C, 'X'), + (0xA640, 'M', u'ꙁ'), + (0xA641, 'V'), + (0xA642, 'M', u'ꙃ'), + (0xA643, 'V'), + (0xA644, 'M', u'ꙅ'), + (0xA645, 'V'), + (0xA646, 'M', u'ꙇ'), + (0xA647, 'V'), + (0xA648, 'M', u'ꙉ'), + (0xA649, 'V'), + (0xA64A, 'M', u'ꙋ'), + (0xA64B, 'V'), + (0xA64C, 'M', u'ꙍ'), + (0xA64D, 'V'), + (0xA64E, 'M', u'ꙏ'), + (0xA64F, 'V'), + (0xA650, 'M', u'ꙑ'), + (0xA651, 'V'), + (0xA652, 'M', u'ꙓ'), + (0xA653, 'V'), + (0xA654, 'M', u'ꙕ'), + (0xA655, 'V'), + (0xA656, 'M', u'ꙗ'), + (0xA657, 'V'), + (0xA658, 'M', u'ꙙ'), + (0xA659, 'V'), + (0xA65A, 'M', u'ꙛ'), + (0xA65B, 'V'), + (0xA65C, 'M', u'ꙝ'), + (0xA65D, 'V'), + (0xA65E, 'M', u'ꙟ'), + (0xA65F, 'V'), + (0xA660, 'M', u'ꙡ'), + (0xA661, 'V'), + (0xA662, 'M', u'ꙣ'), + (0xA663, 'V'), + (0xA664, 'M', u'ꙥ'), + (0xA665, 'V'), + (0xA666, 'M', u'ꙧ'), + (0xA667, 'V'), + (0xA668, 'M', u'ꙩ'), + (0xA669, 'V'), + (0xA66A, 'M', u'ꙫ'), + (0xA66B, 'V'), + (0xA66C, 'M', u'ꙭ'), + (0xA66D, 'V'), + (0xA680, 'M', u'ꚁ'), + (0xA681, 'V'), + ] + +def _seg_36(): + return [ + (0xA682, 'M', u'ꚃ'), + (0xA683, 'V'), + (0xA684, 'M', u'ꚅ'), + (0xA685, 'V'), + (0xA686, 'M', u'ꚇ'), + (0xA687, 'V'), + (0xA688, 'M', u'ꚉ'), + (0xA689, 'V'), + (0xA68A, 'M', u'ꚋ'), + (0xA68B, 'V'), + (0xA68C, 'M', u'ꚍ'), + (0xA68D, 'V'), + (0xA68E, 'M', u'ꚏ'), + (0xA68F, 'V'), + (0xA690, 'M', u'ꚑ'), + (0xA691, 'V'), + (0xA692, 'M', u'ꚓ'), + (0xA693, 'V'), + (0xA694, 'M', u'ꚕ'), + (0xA695, 'V'), + (0xA696, 'M', u'ꚗ'), + (0xA697, 'V'), + (0xA698, 'M', u'ꚙ'), + (0xA699, 'V'), + (0xA69A, 'M', u'ꚛ'), + (0xA69B, 'V'), + (0xA69C, 'M', u'ъ'), + (0xA69D, 'M', u'ь'), + (0xA69E, 'V'), + (0xA6F8, 'X'), + (0xA700, 'V'), + (0xA722, 'M', u'ꜣ'), + (0xA723, 'V'), + (0xA724, 'M', u'ꜥ'), + (0xA725, 'V'), + (0xA726, 'M', u'ꜧ'), + (0xA727, 'V'), + (0xA728, 'M', u'ꜩ'), + (0xA729, 'V'), + (0xA72A, 'M', u'ꜫ'), + (0xA72B, 'V'), + (0xA72C, 'M', u'ꜭ'), + (0xA72D, 'V'), + (0xA72E, 'M', u'ꜯ'), + (0xA72F, 'V'), + (0xA732, 'M', u'ꜳ'), + (0xA733, 'V'), + (0xA734, 'M', u'ꜵ'), + (0xA735, 'V'), + (0xA736, 'M', u'ꜷ'), + (0xA737, 'V'), + (0xA738, 'M', u'ꜹ'), + (0xA739, 'V'), + (0xA73A, 'M', u'ꜻ'), + (0xA73B, 'V'), + (0xA73C, 'M', u'ꜽ'), + (0xA73D, 'V'), + (0xA73E, 'M', u'ꜿ'), + (0xA73F, 'V'), + (0xA740, 'M', u'ꝁ'), + (0xA741, 'V'), + (0xA742, 'M', u'ꝃ'), + (0xA743, 'V'), + (0xA744, 'M', u'ꝅ'), + (0xA745, 'V'), + (0xA746, 'M', u'ꝇ'), + (0xA747, 'V'), + (0xA748, 'M', u'ꝉ'), + (0xA749, 'V'), + (0xA74A, 'M', u'ꝋ'), + (0xA74B, 'V'), + (0xA74C, 'M', u'ꝍ'), + (0xA74D, 'V'), + (0xA74E, 'M', u'ꝏ'), + (0xA74F, 'V'), + (0xA750, 'M', u'ꝑ'), + (0xA751, 'V'), + (0xA752, 'M', u'ꝓ'), + (0xA753, 'V'), + (0xA754, 'M', u'ꝕ'), + (0xA755, 'V'), + (0xA756, 'M', u'ꝗ'), + (0xA757, 'V'), + (0xA758, 'M', u'ꝙ'), + (0xA759, 'V'), + (0xA75A, 'M', u'ꝛ'), + (0xA75B, 'V'), + (0xA75C, 'M', u'ꝝ'), + (0xA75D, 'V'), + (0xA75E, 'M', u'ꝟ'), + (0xA75F, 'V'), + (0xA760, 'M', u'ꝡ'), + (0xA761, 'V'), + (0xA762, 'M', u'ꝣ'), + (0xA763, 'V'), + (0xA764, 'M', u'ꝥ'), + (0xA765, 'V'), + (0xA766, 'M', u'ꝧ'), + (0xA767, 'V'), + (0xA768, 'M', u'ꝩ'), + ] + +def _seg_37(): + return [ + (0xA769, 'V'), + (0xA76A, 'M', u'ꝫ'), + (0xA76B, 'V'), + (0xA76C, 'M', u'ꝭ'), + (0xA76D, 'V'), + (0xA76E, 'M', u'ꝯ'), + (0xA76F, 'V'), + (0xA770, 'M', u'ꝯ'), + (0xA771, 'V'), + (0xA779, 'M', u'ꝺ'), + (0xA77A, 'V'), + (0xA77B, 'M', u'ꝼ'), + (0xA77C, 'V'), + (0xA77D, 'M', u'ᵹ'), + (0xA77E, 'M', u'ꝿ'), + (0xA77F, 'V'), + (0xA780, 'M', u'ꞁ'), + (0xA781, 'V'), + (0xA782, 'M', u'ꞃ'), + (0xA783, 'V'), + (0xA784, 'M', u'ꞅ'), + (0xA785, 'V'), + (0xA786, 'M', u'ꞇ'), + (0xA787, 'V'), + (0xA78B, 'M', u'ꞌ'), + (0xA78C, 'V'), + (0xA78D, 'M', u'ɥ'), + (0xA78E, 'V'), + (0xA790, 'M', u'ꞑ'), + (0xA791, 'V'), + (0xA792, 'M', u'ꞓ'), + (0xA793, 'V'), + (0xA796, 'M', u'ꞗ'), + (0xA797, 'V'), + (0xA798, 'M', u'ꞙ'), + (0xA799, 'V'), + (0xA79A, 'M', u'ꞛ'), + (0xA79B, 'V'), + (0xA79C, 'M', u'ꞝ'), + (0xA79D, 'V'), + (0xA79E, 'M', u'ꞟ'), + (0xA79F, 'V'), + (0xA7A0, 'M', u'ꞡ'), + (0xA7A1, 'V'), + (0xA7A2, 'M', u'ꞣ'), + (0xA7A3, 'V'), + (0xA7A4, 'M', u'ꞥ'), + (0xA7A5, 'V'), + (0xA7A6, 'M', u'ꞧ'), + (0xA7A7, 'V'), + (0xA7A8, 'M', u'ꞩ'), + (0xA7A9, 'V'), + (0xA7AA, 'M', u'ɦ'), + (0xA7AB, 'M', u'ɜ'), + (0xA7AC, 'M', u'ɡ'), + (0xA7AD, 'M', u'ɬ'), + (0xA7AE, 'M', u'ɪ'), + (0xA7AF, 'V'), + (0xA7B0, 'M', u'ʞ'), + (0xA7B1, 'M', u'ʇ'), + (0xA7B2, 'M', u'ʝ'), + (0xA7B3, 'M', u'ꭓ'), + (0xA7B4, 'M', u'ꞵ'), + (0xA7B5, 'V'), + (0xA7B6, 'M', u'ꞷ'), + (0xA7B7, 'V'), + (0xA7B8, 'M', u'ꞹ'), + (0xA7B9, 'V'), + (0xA7BA, 'M', u'ꞻ'), + (0xA7BB, 'V'), + (0xA7BC, 'M', u'ꞽ'), + (0xA7BD, 'V'), + (0xA7BE, 'M', u'ꞿ'), + (0xA7BF, 'V'), + (0xA7C0, 'X'), + (0xA7C2, 'M', u'ꟃ'), + (0xA7C3, 'V'), + (0xA7C4, 'M', u'ꞔ'), + (0xA7C5, 'M', u'ʂ'), + (0xA7C6, 'M', u'ᶎ'), + (0xA7C7, 'X'), + (0xA7F7, 'V'), + (0xA7F8, 'M', u'ħ'), + (0xA7F9, 'M', u'œ'), + (0xA7FA, 'V'), + (0xA82C, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C6, 'X'), + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + ] + +def _seg_38(): + return [ + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9FF, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, 'V'), + (0xAAC3, 'X'), + (0xAADB, 'V'), + (0xAAF7, 'X'), + (0xAB01, 'V'), + (0xAB07, 'X'), + (0xAB09, 'V'), + (0xAB0F, 'X'), + (0xAB11, 'V'), + (0xAB17, 'X'), + (0xAB20, 'V'), + (0xAB27, 'X'), + (0xAB28, 'V'), + (0xAB2F, 'X'), + (0xAB30, 'V'), + (0xAB5C, 'M', u'ꜧ'), + (0xAB5D, 'M', u'ꬷ'), + (0xAB5E, 'M', u'ɫ'), + (0xAB5F, 'M', u'ꭒ'), + (0xAB60, 'V'), + (0xAB68, 'X'), + (0xAB70, 'M', u'Ꭰ'), + (0xAB71, 'M', u'Ꭱ'), + (0xAB72, 'M', u'Ꭲ'), + (0xAB73, 'M', u'Ꭳ'), + (0xAB74, 'M', u'Ꭴ'), + (0xAB75, 'M', u'Ꭵ'), + (0xAB76, 'M', u'Ꭶ'), + (0xAB77, 'M', u'Ꭷ'), + (0xAB78, 'M', u'Ꭸ'), + (0xAB79, 'M', u'Ꭹ'), + (0xAB7A, 'M', u'Ꭺ'), + (0xAB7B, 'M', u'Ꭻ'), + (0xAB7C, 'M', u'Ꭼ'), + (0xAB7D, 'M', u'Ꭽ'), + (0xAB7E, 'M', u'Ꭾ'), + (0xAB7F, 'M', u'Ꭿ'), + (0xAB80, 'M', u'Ꮀ'), + (0xAB81, 'M', u'Ꮁ'), + (0xAB82, 'M', u'Ꮂ'), + (0xAB83, 'M', u'Ꮃ'), + (0xAB84, 'M', u'Ꮄ'), + (0xAB85, 'M', u'Ꮅ'), + (0xAB86, 'M', u'Ꮆ'), + (0xAB87, 'M', u'Ꮇ'), + (0xAB88, 'M', u'Ꮈ'), + (0xAB89, 'M', u'Ꮉ'), + (0xAB8A, 'M', u'Ꮊ'), + (0xAB8B, 'M', u'Ꮋ'), + (0xAB8C, 'M', u'Ꮌ'), + (0xAB8D, 'M', u'Ꮍ'), + (0xAB8E, 'M', u'Ꮎ'), + (0xAB8F, 'M', u'Ꮏ'), + (0xAB90, 'M', u'Ꮐ'), + (0xAB91, 'M', u'Ꮑ'), + (0xAB92, 'M', u'Ꮒ'), + (0xAB93, 'M', u'Ꮓ'), + (0xAB94, 'M', u'Ꮔ'), + (0xAB95, 'M', u'Ꮕ'), + (0xAB96, 'M', u'Ꮖ'), + (0xAB97, 'M', u'Ꮗ'), + (0xAB98, 'M', u'Ꮘ'), + (0xAB99, 'M', u'Ꮙ'), + (0xAB9A, 'M', u'Ꮚ'), + (0xAB9B, 'M', u'Ꮛ'), + (0xAB9C, 'M', u'Ꮜ'), + (0xAB9D, 'M', u'Ꮝ'), + (0xAB9E, 'M', u'Ꮞ'), + (0xAB9F, 'M', u'Ꮟ'), + (0xABA0, 'M', u'Ꮠ'), + (0xABA1, 'M', u'Ꮡ'), + (0xABA2, 'M', u'Ꮢ'), + (0xABA3, 'M', u'Ꮣ'), + (0xABA4, 'M', u'Ꮤ'), + (0xABA5, 'M', u'Ꮥ'), + (0xABA6, 'M', u'Ꮦ'), + (0xABA7, 'M', u'Ꮧ'), + (0xABA8, 'M', u'Ꮨ'), + (0xABA9, 'M', u'Ꮩ'), + (0xABAA, 'M', u'Ꮪ'), + (0xABAB, 'M', u'Ꮫ'), + (0xABAC, 'M', u'Ꮬ'), + (0xABAD, 'M', u'Ꮭ'), + (0xABAE, 'M', u'Ꮮ'), + (0xABAF, 'M', u'Ꮯ'), + (0xABB0, 'M', u'Ꮰ'), + (0xABB1, 'M', u'Ꮱ'), + (0xABB2, 'M', u'Ꮲ'), + (0xABB3, 'M', u'Ꮳ'), + (0xABB4, 'M', u'Ꮴ'), + ] + +def _seg_39(): + return [ + (0xABB5, 'M', u'Ꮵ'), + (0xABB6, 'M', u'Ꮶ'), + (0xABB7, 'M', u'Ꮷ'), + (0xABB8, 'M', u'Ꮸ'), + (0xABB9, 'M', u'Ꮹ'), + (0xABBA, 'M', u'Ꮺ'), + (0xABBB, 'M', u'Ꮻ'), + (0xABBC, 'M', u'Ꮼ'), + (0xABBD, 'M', u'Ꮽ'), + (0xABBE, 'M', u'Ꮾ'), + (0xABBF, 'M', u'Ꮿ'), + (0xABC0, 'V'), + (0xABEE, 'X'), + (0xABF0, 'V'), + (0xABFA, 'X'), + (0xAC00, 'V'), + (0xD7A4, 'X'), + (0xD7B0, 'V'), + (0xD7C7, 'X'), + (0xD7CB, 'V'), + (0xD7FC, 'X'), + (0xF900, 'M', u'豈'), + (0xF901, 'M', u'更'), + (0xF902, 'M', u'車'), + (0xF903, 'M', u'賈'), + (0xF904, 'M', u'滑'), + (0xF905, 'M', u'串'), + (0xF906, 'M', u'句'), + (0xF907, 'M', u'龜'), + (0xF909, 'M', u'契'), + (0xF90A, 'M', u'金'), + (0xF90B, 'M', u'喇'), + (0xF90C, 'M', u'奈'), + (0xF90D, 'M', u'懶'), + (0xF90E, 'M', u'癩'), + (0xF90F, 'M', u'羅'), + (0xF910, 'M', u'蘿'), + (0xF911, 'M', u'螺'), + (0xF912, 'M', u'裸'), + (0xF913, 'M', u'邏'), + (0xF914, 'M', u'樂'), + (0xF915, 'M', u'洛'), + (0xF916, 'M', u'烙'), + (0xF917, 'M', u'珞'), + (0xF918, 'M', u'落'), + (0xF919, 'M', u'酪'), + (0xF91A, 'M', u'駱'), + (0xF91B, 'M', u'亂'), + (0xF91C, 'M', u'卵'), + (0xF91D, 'M', u'欄'), + (0xF91E, 'M', u'爛'), + (0xF91F, 'M', u'蘭'), + (0xF920, 'M', u'鸞'), + (0xF921, 'M', u'嵐'), + (0xF922, 'M', u'濫'), + (0xF923, 'M', u'藍'), + (0xF924, 'M', u'襤'), + (0xF925, 'M', u'拉'), + (0xF926, 'M', u'臘'), + (0xF927, 'M', u'蠟'), + (0xF928, 'M', u'廊'), + (0xF929, 'M', u'朗'), + (0xF92A, 'M', u'浪'), + (0xF92B, 'M', u'狼'), + (0xF92C, 'M', u'郎'), + (0xF92D, 'M', u'來'), + (0xF92E, 'M', u'冷'), + (0xF92F, 'M', u'勞'), + (0xF930, 'M', u'擄'), + (0xF931, 'M', u'櫓'), + (0xF932, 'M', u'爐'), + (0xF933, 'M', u'盧'), + (0xF934, 'M', u'老'), + (0xF935, 'M', u'蘆'), + (0xF936, 'M', u'虜'), + (0xF937, 'M', u'路'), + (0xF938, 'M', u'露'), + (0xF939, 'M', u'魯'), + (0xF93A, 'M', u'鷺'), + (0xF93B, 'M', u'碌'), + (0xF93C, 'M', u'祿'), + (0xF93D, 'M', u'綠'), + (0xF93E, 'M', u'菉'), + (0xF93F, 'M', u'錄'), + (0xF940, 'M', u'鹿'), + (0xF941, 'M', u'論'), + (0xF942, 'M', u'壟'), + (0xF943, 'M', u'弄'), + (0xF944, 'M', u'籠'), + (0xF945, 'M', u'聾'), + (0xF946, 'M', u'牢'), + (0xF947, 'M', u'磊'), + (0xF948, 'M', u'賂'), + (0xF949, 'M', u'雷'), + (0xF94A, 'M', u'壘'), + (0xF94B, 'M', u'屢'), + (0xF94C, 'M', u'樓'), + (0xF94D, 'M', u'淚'), + (0xF94E, 'M', u'漏'), + (0xF94F, 'M', u'累'), + ] + +def _seg_40(): + return [ + (0xF950, 'M', u'縷'), + (0xF951, 'M', u'陋'), + (0xF952, 'M', u'勒'), + (0xF953, 'M', u'肋'), + (0xF954, 'M', u'凜'), + (0xF955, 'M', u'凌'), + (0xF956, 'M', u'稜'), + (0xF957, 'M', u'綾'), + (0xF958, 'M', u'菱'), + (0xF959, 'M', u'陵'), + (0xF95A, 'M', u'讀'), + (0xF95B, 'M', u'拏'), + (0xF95C, 'M', u'樂'), + (0xF95D, 'M', u'諾'), + (0xF95E, 'M', u'丹'), + (0xF95F, 'M', u'寧'), + (0xF960, 'M', u'怒'), + (0xF961, 'M', u'率'), + (0xF962, 'M', u'異'), + (0xF963, 'M', u'北'), + (0xF964, 'M', u'磻'), + (0xF965, 'M', u'便'), + (0xF966, 'M', u'復'), + (0xF967, 'M', u'不'), + (0xF968, 'M', u'泌'), + (0xF969, 'M', u'數'), + (0xF96A, 'M', u'索'), + (0xF96B, 'M', u'參'), + (0xF96C, 'M', u'塞'), + (0xF96D, 'M', u'省'), + (0xF96E, 'M', u'葉'), + (0xF96F, 'M', u'說'), + (0xF970, 'M', u'殺'), + (0xF971, 'M', u'辰'), + (0xF972, 'M', u'沈'), + (0xF973, 'M', u'拾'), + (0xF974, 'M', u'若'), + (0xF975, 'M', u'掠'), + (0xF976, 'M', u'略'), + (0xF977, 'M', u'亮'), + (0xF978, 'M', u'兩'), + (0xF979, 'M', u'凉'), + (0xF97A, 'M', u'梁'), + (0xF97B, 'M', u'糧'), + (0xF97C, 'M', u'良'), + (0xF97D, 'M', u'諒'), + (0xF97E, 'M', u'量'), + (0xF97F, 'M', u'勵'), + (0xF980, 'M', u'呂'), + (0xF981, 'M', u'女'), + (0xF982, 'M', u'廬'), + (0xF983, 'M', u'旅'), + (0xF984, 'M', u'濾'), + (0xF985, 'M', u'礪'), + (0xF986, 'M', u'閭'), + (0xF987, 'M', u'驪'), + (0xF988, 'M', u'麗'), + (0xF989, 'M', u'黎'), + (0xF98A, 'M', u'力'), + (0xF98B, 'M', u'曆'), + (0xF98C, 'M', u'歷'), + (0xF98D, 'M', u'轢'), + (0xF98E, 'M', u'年'), + (0xF98F, 'M', u'憐'), + (0xF990, 'M', u'戀'), + (0xF991, 'M', u'撚'), + (0xF992, 'M', u'漣'), + (0xF993, 'M', u'煉'), + (0xF994, 'M', u'璉'), + (0xF995, 'M', u'秊'), + (0xF996, 'M', u'練'), + (0xF997, 'M', u'聯'), + (0xF998, 'M', u'輦'), + (0xF999, 'M', u'蓮'), + (0xF99A, 'M', u'連'), + (0xF99B, 'M', u'鍊'), + (0xF99C, 'M', u'列'), + (0xF99D, 'M', u'劣'), + (0xF99E, 'M', u'咽'), + (0xF99F, 'M', u'烈'), + (0xF9A0, 'M', u'裂'), + (0xF9A1, 'M', u'說'), + (0xF9A2, 'M', u'廉'), + (0xF9A3, 'M', u'念'), + (0xF9A4, 'M', u'捻'), + (0xF9A5, 'M', u'殮'), + (0xF9A6, 'M', u'簾'), + (0xF9A7, 'M', u'獵'), + (0xF9A8, 'M', u'令'), + (0xF9A9, 'M', u'囹'), + (0xF9AA, 'M', u'寧'), + (0xF9AB, 'M', u'嶺'), + (0xF9AC, 'M', u'怜'), + (0xF9AD, 'M', u'玲'), + (0xF9AE, 'M', u'瑩'), + (0xF9AF, 'M', u'羚'), + (0xF9B0, 'M', u'聆'), + (0xF9B1, 'M', u'鈴'), + (0xF9B2, 'M', u'零'), + (0xF9B3, 'M', u'靈'), + ] + +def _seg_41(): + return [ + (0xF9B4, 'M', u'領'), + (0xF9B5, 'M', u'例'), + (0xF9B6, 'M', u'禮'), + (0xF9B7, 'M', u'醴'), + (0xF9B8, 'M', u'隸'), + (0xF9B9, 'M', u'惡'), + (0xF9BA, 'M', u'了'), + (0xF9BB, 'M', u'僚'), + (0xF9BC, 'M', u'寮'), + (0xF9BD, 'M', u'尿'), + (0xF9BE, 'M', u'料'), + (0xF9BF, 'M', u'樂'), + (0xF9C0, 'M', u'燎'), + (0xF9C1, 'M', u'療'), + (0xF9C2, 'M', u'蓼'), + (0xF9C3, 'M', u'遼'), + (0xF9C4, 'M', u'龍'), + (0xF9C5, 'M', u'暈'), + (0xF9C6, 'M', u'阮'), + (0xF9C7, 'M', u'劉'), + (0xF9C8, 'M', u'杻'), + (0xF9C9, 'M', u'柳'), + (0xF9CA, 'M', u'流'), + (0xF9CB, 'M', u'溜'), + (0xF9CC, 'M', u'琉'), + (0xF9CD, 'M', u'留'), + (0xF9CE, 'M', u'硫'), + (0xF9CF, 'M', u'紐'), + (0xF9D0, 'M', u'類'), + (0xF9D1, 'M', u'六'), + (0xF9D2, 'M', u'戮'), + (0xF9D3, 'M', u'陸'), + (0xF9D4, 'M', u'倫'), + (0xF9D5, 'M', u'崙'), + (0xF9D6, 'M', u'淪'), + (0xF9D7, 'M', u'輪'), + (0xF9D8, 'M', u'律'), + (0xF9D9, 'M', u'慄'), + (0xF9DA, 'M', u'栗'), + (0xF9DB, 'M', u'率'), + (0xF9DC, 'M', u'隆'), + (0xF9DD, 'M', u'利'), + (0xF9DE, 'M', u'吏'), + (0xF9DF, 'M', u'履'), + (0xF9E0, 'M', u'易'), + (0xF9E1, 'M', u'李'), + (0xF9E2, 'M', u'梨'), + (0xF9E3, 'M', u'泥'), + (0xF9E4, 'M', u'理'), + (0xF9E5, 'M', u'痢'), + (0xF9E6, 'M', u'罹'), + (0xF9E7, 'M', u'裏'), + (0xF9E8, 'M', u'裡'), + (0xF9E9, 'M', u'里'), + (0xF9EA, 'M', u'離'), + (0xF9EB, 'M', u'匿'), + (0xF9EC, 'M', u'溺'), + (0xF9ED, 'M', u'吝'), + (0xF9EE, 'M', u'燐'), + (0xF9EF, 'M', u'璘'), + (0xF9F0, 'M', u'藺'), + (0xF9F1, 'M', u'隣'), + (0xF9F2, 'M', u'鱗'), + (0xF9F3, 'M', u'麟'), + (0xF9F4, 'M', u'林'), + (0xF9F5, 'M', u'淋'), + (0xF9F6, 'M', u'臨'), + (0xF9F7, 'M', u'立'), + (0xF9F8, 'M', u'笠'), + (0xF9F9, 'M', u'粒'), + (0xF9FA, 'M', u'狀'), + (0xF9FB, 'M', u'炙'), + (0xF9FC, 'M', u'識'), + (0xF9FD, 'M', u'什'), + (0xF9FE, 'M', u'茶'), + (0xF9FF, 'M', u'刺'), + (0xFA00, 'M', u'切'), + (0xFA01, 'M', u'度'), + (0xFA02, 'M', u'拓'), + (0xFA03, 'M', u'糖'), + (0xFA04, 'M', u'宅'), + (0xFA05, 'M', u'洞'), + (0xFA06, 'M', u'暴'), + (0xFA07, 'M', u'輻'), + (0xFA08, 'M', u'行'), + (0xFA09, 'M', u'降'), + (0xFA0A, 'M', u'見'), + (0xFA0B, 'M', u'廓'), + (0xFA0C, 'M', u'兀'), + (0xFA0D, 'M', u'嗀'), + (0xFA0E, 'V'), + (0xFA10, 'M', u'塚'), + (0xFA11, 'V'), + (0xFA12, 'M', u'晴'), + (0xFA13, 'V'), + (0xFA15, 'M', u'凞'), + (0xFA16, 'M', u'猪'), + (0xFA17, 'M', u'益'), + (0xFA18, 'M', u'礼'), + (0xFA19, 'M', u'神'), + ] + +def _seg_42(): + return [ + (0xFA1A, 'M', u'祥'), + (0xFA1B, 'M', u'福'), + (0xFA1C, 'M', u'靖'), + (0xFA1D, 'M', u'精'), + (0xFA1E, 'M', u'羽'), + (0xFA1F, 'V'), + (0xFA20, 'M', u'蘒'), + (0xFA21, 'V'), + (0xFA22, 'M', u'諸'), + (0xFA23, 'V'), + (0xFA25, 'M', u'逸'), + (0xFA26, 'M', u'都'), + (0xFA27, 'V'), + (0xFA2A, 'M', u'飯'), + (0xFA2B, 'M', u'飼'), + (0xFA2C, 'M', u'館'), + (0xFA2D, 'M', u'鶴'), + (0xFA2E, 'M', u'郞'), + (0xFA2F, 'M', u'隷'), + (0xFA30, 'M', u'侮'), + (0xFA31, 'M', u'僧'), + (0xFA32, 'M', u'免'), + (0xFA33, 'M', u'勉'), + (0xFA34, 'M', u'勤'), + (0xFA35, 'M', u'卑'), + (0xFA36, 'M', u'喝'), + (0xFA37, 'M', u'嘆'), + (0xFA38, 'M', u'器'), + (0xFA39, 'M', u'塀'), + (0xFA3A, 'M', u'墨'), + (0xFA3B, 'M', u'層'), + (0xFA3C, 'M', u'屮'), + (0xFA3D, 'M', u'悔'), + (0xFA3E, 'M', u'慨'), + (0xFA3F, 'M', u'憎'), + (0xFA40, 'M', u'懲'), + (0xFA41, 'M', u'敏'), + (0xFA42, 'M', u'既'), + (0xFA43, 'M', u'暑'), + (0xFA44, 'M', u'梅'), + (0xFA45, 'M', u'海'), + (0xFA46, 'M', u'渚'), + (0xFA47, 'M', u'漢'), + (0xFA48, 'M', u'煮'), + (0xFA49, 'M', u'爫'), + (0xFA4A, 'M', u'琢'), + (0xFA4B, 'M', u'碑'), + (0xFA4C, 'M', u'社'), + (0xFA4D, 'M', u'祉'), + (0xFA4E, 'M', u'祈'), + (0xFA4F, 'M', u'祐'), + (0xFA50, 'M', u'祖'), + (0xFA51, 'M', u'祝'), + (0xFA52, 'M', u'禍'), + (0xFA53, 'M', u'禎'), + (0xFA54, 'M', u'穀'), + (0xFA55, 'M', u'突'), + (0xFA56, 'M', u'節'), + (0xFA57, 'M', u'練'), + (0xFA58, 'M', u'縉'), + (0xFA59, 'M', u'繁'), + (0xFA5A, 'M', u'署'), + (0xFA5B, 'M', u'者'), + (0xFA5C, 'M', u'臭'), + (0xFA5D, 'M', u'艹'), + (0xFA5F, 'M', u'著'), + (0xFA60, 'M', u'褐'), + (0xFA61, 'M', u'視'), + (0xFA62, 'M', u'謁'), + (0xFA63, 'M', u'謹'), + (0xFA64, 'M', u'賓'), + (0xFA65, 'M', u'贈'), + (0xFA66, 'M', u'辶'), + (0xFA67, 'M', u'逸'), + (0xFA68, 'M', u'難'), + (0xFA69, 'M', u'響'), + (0xFA6A, 'M', u'頻'), + (0xFA6B, 'M', u'恵'), + (0xFA6C, 'M', u'𤋮'), + (0xFA6D, 'M', u'舘'), + (0xFA6E, 'X'), + (0xFA70, 'M', u'並'), + (0xFA71, 'M', u'况'), + (0xFA72, 'M', u'全'), + (0xFA73, 'M', u'侀'), + (0xFA74, 'M', u'充'), + (0xFA75, 'M', u'冀'), + (0xFA76, 'M', u'勇'), + (0xFA77, 'M', u'勺'), + (0xFA78, 'M', u'喝'), + (0xFA79, 'M', u'啕'), + (0xFA7A, 'M', u'喙'), + (0xFA7B, 'M', u'嗢'), + (0xFA7C, 'M', u'塚'), + (0xFA7D, 'M', u'墳'), + (0xFA7E, 'M', u'奄'), + (0xFA7F, 'M', u'奔'), + (0xFA80, 'M', u'婢'), + (0xFA81, 'M', u'嬨'), + (0xFA82, 'M', u'廒'), + ] + +def _seg_43(): + return [ + (0xFA83, 'M', u'廙'), + (0xFA84, 'M', u'彩'), + (0xFA85, 'M', u'徭'), + (0xFA86, 'M', u'惘'), + (0xFA87, 'M', u'慎'), + (0xFA88, 'M', u'愈'), + (0xFA89, 'M', u'憎'), + (0xFA8A, 'M', u'慠'), + (0xFA8B, 'M', u'懲'), + (0xFA8C, 'M', u'戴'), + (0xFA8D, 'M', u'揄'), + (0xFA8E, 'M', u'搜'), + (0xFA8F, 'M', u'摒'), + (0xFA90, 'M', u'敖'), + (0xFA91, 'M', u'晴'), + (0xFA92, 'M', u'朗'), + (0xFA93, 'M', u'望'), + (0xFA94, 'M', u'杖'), + (0xFA95, 'M', u'歹'), + (0xFA96, 'M', u'殺'), + (0xFA97, 'M', u'流'), + (0xFA98, 'M', u'滛'), + (0xFA99, 'M', u'滋'), + (0xFA9A, 'M', u'漢'), + (0xFA9B, 'M', u'瀞'), + (0xFA9C, 'M', u'煮'), + (0xFA9D, 'M', u'瞧'), + (0xFA9E, 'M', u'爵'), + (0xFA9F, 'M', u'犯'), + (0xFAA0, 'M', u'猪'), + (0xFAA1, 'M', u'瑱'), + (0xFAA2, 'M', u'甆'), + (0xFAA3, 'M', u'画'), + (0xFAA4, 'M', u'瘝'), + (0xFAA5, 'M', u'瘟'), + (0xFAA6, 'M', u'益'), + (0xFAA7, 'M', u'盛'), + (0xFAA8, 'M', u'直'), + (0xFAA9, 'M', u'睊'), + (0xFAAA, 'M', u'着'), + (0xFAAB, 'M', u'磌'), + (0xFAAC, 'M', u'窱'), + (0xFAAD, 'M', u'節'), + (0xFAAE, 'M', u'类'), + (0xFAAF, 'M', u'絛'), + (0xFAB0, 'M', u'練'), + (0xFAB1, 'M', u'缾'), + (0xFAB2, 'M', u'者'), + (0xFAB3, 'M', u'荒'), + (0xFAB4, 'M', u'華'), + (0xFAB5, 'M', u'蝹'), + (0xFAB6, 'M', u'襁'), + (0xFAB7, 'M', u'覆'), + (0xFAB8, 'M', u'視'), + (0xFAB9, 'M', u'調'), + (0xFABA, 'M', u'諸'), + (0xFABB, 'M', u'請'), + (0xFABC, 'M', u'謁'), + (0xFABD, 'M', u'諾'), + (0xFABE, 'M', u'諭'), + (0xFABF, 'M', u'謹'), + (0xFAC0, 'M', u'變'), + (0xFAC1, 'M', u'贈'), + (0xFAC2, 'M', u'輸'), + (0xFAC3, 'M', u'遲'), + (0xFAC4, 'M', u'醙'), + (0xFAC5, 'M', u'鉶'), + (0xFAC6, 'M', u'陼'), + (0xFAC7, 'M', u'難'), + (0xFAC8, 'M', u'靖'), + (0xFAC9, 'M', u'韛'), + (0xFACA, 'M', u'響'), + (0xFACB, 'M', u'頋'), + (0xFACC, 'M', u'頻'), + (0xFACD, 'M', u'鬒'), + (0xFACE, 'M', u'龜'), + (0xFACF, 'M', u'𢡊'), + (0xFAD0, 'M', u'𢡄'), + (0xFAD1, 'M', u'𣏕'), + (0xFAD2, 'M', u'㮝'), + (0xFAD3, 'M', u'䀘'), + (0xFAD4, 'M', u'䀹'), + (0xFAD5, 'M', u'𥉉'), + (0xFAD6, 'M', u'𥳐'), + (0xFAD7, 'M', u'𧻓'), + (0xFAD8, 'M', u'齃'), + (0xFAD9, 'M', u'龎'), + (0xFADA, 'X'), + (0xFB00, 'M', u'ff'), + (0xFB01, 'M', u'fi'), + (0xFB02, 'M', u'fl'), + (0xFB03, 'M', u'ffi'), + (0xFB04, 'M', u'ffl'), + (0xFB05, 'M', u'st'), + (0xFB07, 'X'), + (0xFB13, 'M', u'մն'), + (0xFB14, 'M', u'մե'), + (0xFB15, 'M', u'մի'), + (0xFB16, 'M', u'վն'), + (0xFB17, 'M', u'մխ'), + ] + +def _seg_44(): + return [ + (0xFB18, 'X'), + (0xFB1D, 'M', u'יִ'), + (0xFB1E, 'V'), + (0xFB1F, 'M', u'ײַ'), + (0xFB20, 'M', u'ע'), + (0xFB21, 'M', u'א'), + (0xFB22, 'M', u'ד'), + (0xFB23, 'M', u'ה'), + (0xFB24, 'M', u'כ'), + (0xFB25, 'M', u'ל'), + (0xFB26, 'M', u'ם'), + (0xFB27, 'M', u'ר'), + (0xFB28, 'M', u'ת'), + (0xFB29, '3', u'+'), + (0xFB2A, 'M', u'שׁ'), + (0xFB2B, 'M', u'שׂ'), + (0xFB2C, 'M', u'שּׁ'), + (0xFB2D, 'M', u'שּׂ'), + (0xFB2E, 'M', u'אַ'), + (0xFB2F, 'M', u'אָ'), + (0xFB30, 'M', u'אּ'), + (0xFB31, 'M', u'בּ'), + (0xFB32, 'M', u'גּ'), + (0xFB33, 'M', u'דּ'), + (0xFB34, 'M', u'הּ'), + (0xFB35, 'M', u'וּ'), + (0xFB36, 'M', u'זּ'), + (0xFB37, 'X'), + (0xFB38, 'M', u'טּ'), + (0xFB39, 'M', u'יּ'), + (0xFB3A, 'M', u'ךּ'), + (0xFB3B, 'M', u'כּ'), + (0xFB3C, 'M', u'לּ'), + (0xFB3D, 'X'), + (0xFB3E, 'M', u'מּ'), + (0xFB3F, 'X'), + (0xFB40, 'M', u'נּ'), + (0xFB41, 'M', u'סּ'), + (0xFB42, 'X'), + (0xFB43, 'M', u'ףּ'), + (0xFB44, 'M', u'פּ'), + (0xFB45, 'X'), + (0xFB46, 'M', u'צּ'), + (0xFB47, 'M', u'קּ'), + (0xFB48, 'M', u'רּ'), + (0xFB49, 'M', u'שּ'), + (0xFB4A, 'M', u'תּ'), + (0xFB4B, 'M', u'וֹ'), + (0xFB4C, 'M', u'בֿ'), + (0xFB4D, 'M', u'כֿ'), + (0xFB4E, 'M', u'פֿ'), + (0xFB4F, 'M', u'אל'), + (0xFB50, 'M', u'ٱ'), + (0xFB52, 'M', u'ٻ'), + (0xFB56, 'M', u'پ'), + (0xFB5A, 'M', u'ڀ'), + (0xFB5E, 'M', u'ٺ'), + (0xFB62, 'M', u'ٿ'), + (0xFB66, 'M', u'ٹ'), + (0xFB6A, 'M', u'ڤ'), + (0xFB6E, 'M', u'ڦ'), + (0xFB72, 'M', u'ڄ'), + (0xFB76, 'M', u'ڃ'), + (0xFB7A, 'M', u'چ'), + (0xFB7E, 'M', u'ڇ'), + (0xFB82, 'M', u'ڍ'), + (0xFB84, 'M', u'ڌ'), + (0xFB86, 'M', u'ڎ'), + (0xFB88, 'M', u'ڈ'), + (0xFB8A, 'M', u'ژ'), + (0xFB8C, 'M', u'ڑ'), + (0xFB8E, 'M', u'ک'), + (0xFB92, 'M', u'گ'), + (0xFB96, 'M', u'ڳ'), + (0xFB9A, 'M', u'ڱ'), + (0xFB9E, 'M', u'ں'), + (0xFBA0, 'M', u'ڻ'), + (0xFBA4, 'M', u'ۀ'), + (0xFBA6, 'M', u'ہ'), + (0xFBAA, 'M', u'ھ'), + (0xFBAE, 'M', u'ے'), + (0xFBB0, 'M', u'ۓ'), + (0xFBB2, 'V'), + (0xFBC2, 'X'), + (0xFBD3, 'M', u'ڭ'), + (0xFBD7, 'M', u'ۇ'), + (0xFBD9, 'M', u'ۆ'), + (0xFBDB, 'M', u'ۈ'), + (0xFBDD, 'M', u'ۇٴ'), + (0xFBDE, 'M', u'ۋ'), + (0xFBE0, 'M', u'ۅ'), + (0xFBE2, 'M', u'ۉ'), + (0xFBE4, 'M', u'ې'), + (0xFBE8, 'M', u'ى'), + (0xFBEA, 'M', u'ئا'), + (0xFBEC, 'M', u'ئە'), + (0xFBEE, 'M', u'ئو'), + (0xFBF0, 'M', u'ئۇ'), + (0xFBF2, 'M', u'ئۆ'), + (0xFBF4, 'M', u'ئۈ'), + ] + +def _seg_45(): + return [ + (0xFBF6, 'M', u'ئې'), + (0xFBF9, 'M', u'ئى'), + (0xFBFC, 'M', u'ی'), + (0xFC00, 'M', u'ئج'), + (0xFC01, 'M', u'ئح'), + (0xFC02, 'M', u'ئم'), + (0xFC03, 'M', u'ئى'), + (0xFC04, 'M', u'ئي'), + (0xFC05, 'M', u'بج'), + (0xFC06, 'M', u'بح'), + (0xFC07, 'M', u'بخ'), + (0xFC08, 'M', u'بم'), + (0xFC09, 'M', u'بى'), + (0xFC0A, 'M', u'بي'), + (0xFC0B, 'M', u'تج'), + (0xFC0C, 'M', u'تح'), + (0xFC0D, 'M', u'تخ'), + (0xFC0E, 'M', u'تم'), + (0xFC0F, 'M', u'تى'), + (0xFC10, 'M', u'تي'), + (0xFC11, 'M', u'ثج'), + (0xFC12, 'M', u'ثم'), + (0xFC13, 'M', u'ثى'), + (0xFC14, 'M', u'ثي'), + (0xFC15, 'M', u'جح'), + (0xFC16, 'M', u'جم'), + (0xFC17, 'M', u'حج'), + (0xFC18, 'M', u'حم'), + (0xFC19, 'M', u'خج'), + (0xFC1A, 'M', u'خح'), + (0xFC1B, 'M', u'خم'), + (0xFC1C, 'M', u'سج'), + (0xFC1D, 'M', u'سح'), + (0xFC1E, 'M', u'سخ'), + (0xFC1F, 'M', u'سم'), + (0xFC20, 'M', u'صح'), + (0xFC21, 'M', u'صم'), + (0xFC22, 'M', u'ضج'), + (0xFC23, 'M', u'ضح'), + (0xFC24, 'M', u'ضخ'), + (0xFC25, 'M', u'ضم'), + (0xFC26, 'M', u'طح'), + (0xFC27, 'M', u'طم'), + (0xFC28, 'M', u'ظم'), + (0xFC29, 'M', u'عج'), + (0xFC2A, 'M', u'عم'), + (0xFC2B, 'M', u'غج'), + (0xFC2C, 'M', u'غم'), + (0xFC2D, 'M', u'فج'), + (0xFC2E, 'M', u'فح'), + (0xFC2F, 'M', u'فخ'), + (0xFC30, 'M', u'فم'), + (0xFC31, 'M', u'فى'), + (0xFC32, 'M', u'في'), + (0xFC33, 'M', u'قح'), + (0xFC34, 'M', u'قم'), + (0xFC35, 'M', u'قى'), + (0xFC36, 'M', u'قي'), + (0xFC37, 'M', u'كا'), + (0xFC38, 'M', u'كج'), + (0xFC39, 'M', u'كح'), + (0xFC3A, 'M', u'كخ'), + (0xFC3B, 'M', u'كل'), + (0xFC3C, 'M', u'كم'), + (0xFC3D, 'M', u'كى'), + (0xFC3E, 'M', u'كي'), + (0xFC3F, 'M', u'لج'), + (0xFC40, 'M', u'لح'), + (0xFC41, 'M', u'لخ'), + (0xFC42, 'M', u'لم'), + (0xFC43, 'M', u'لى'), + (0xFC44, 'M', u'لي'), + (0xFC45, 'M', u'مج'), + (0xFC46, 'M', u'مح'), + (0xFC47, 'M', u'مخ'), + (0xFC48, 'M', u'مم'), + (0xFC49, 'M', u'مى'), + (0xFC4A, 'M', u'مي'), + (0xFC4B, 'M', u'نج'), + (0xFC4C, 'M', u'نح'), + (0xFC4D, 'M', u'نخ'), + (0xFC4E, 'M', u'نم'), + (0xFC4F, 'M', u'نى'), + (0xFC50, 'M', u'ني'), + (0xFC51, 'M', u'هج'), + (0xFC52, 'M', u'هم'), + (0xFC53, 'M', u'هى'), + (0xFC54, 'M', u'هي'), + (0xFC55, 'M', u'يج'), + (0xFC56, 'M', u'يح'), + (0xFC57, 'M', u'يخ'), + (0xFC58, 'M', u'يم'), + (0xFC59, 'M', u'يى'), + (0xFC5A, 'M', u'يي'), + (0xFC5B, 'M', u'ذٰ'), + (0xFC5C, 'M', u'رٰ'), + (0xFC5D, 'M', u'ىٰ'), + (0xFC5E, '3', u' ٌّ'), + (0xFC5F, '3', u' ٍّ'), + (0xFC60, '3', u' َّ'), + ] + +def _seg_46(): + return [ + (0xFC61, '3', u' ُّ'), + (0xFC62, '3', u' ِّ'), + (0xFC63, '3', u' ّٰ'), + (0xFC64, 'M', u'ئر'), + (0xFC65, 'M', u'ئز'), + (0xFC66, 'M', u'ئم'), + (0xFC67, 'M', u'ئن'), + (0xFC68, 'M', u'ئى'), + (0xFC69, 'M', u'ئي'), + (0xFC6A, 'M', u'بر'), + (0xFC6B, 'M', u'بز'), + (0xFC6C, 'M', u'بم'), + (0xFC6D, 'M', u'بن'), + (0xFC6E, 'M', u'بى'), + (0xFC6F, 'M', u'بي'), + (0xFC70, 'M', u'تر'), + (0xFC71, 'M', u'تز'), + (0xFC72, 'M', u'تم'), + (0xFC73, 'M', u'تن'), + (0xFC74, 'M', u'تى'), + (0xFC75, 'M', u'تي'), + (0xFC76, 'M', u'ثر'), + (0xFC77, 'M', u'ثز'), + (0xFC78, 'M', u'ثم'), + (0xFC79, 'M', u'ثن'), + (0xFC7A, 'M', u'ثى'), + (0xFC7B, 'M', u'ثي'), + (0xFC7C, 'M', u'فى'), + (0xFC7D, 'M', u'في'), + (0xFC7E, 'M', u'قى'), + (0xFC7F, 'M', u'قي'), + (0xFC80, 'M', u'كا'), + (0xFC81, 'M', u'كل'), + (0xFC82, 'M', u'كم'), + (0xFC83, 'M', u'كى'), + (0xFC84, 'M', u'كي'), + (0xFC85, 'M', u'لم'), + (0xFC86, 'M', u'لى'), + (0xFC87, 'M', u'لي'), + (0xFC88, 'M', u'ما'), + (0xFC89, 'M', u'مم'), + (0xFC8A, 'M', u'نر'), + (0xFC8B, 'M', u'نز'), + (0xFC8C, 'M', u'نم'), + (0xFC8D, 'M', u'نن'), + (0xFC8E, 'M', u'نى'), + (0xFC8F, 'M', u'ني'), + (0xFC90, 'M', u'ىٰ'), + (0xFC91, 'M', u'ير'), + (0xFC92, 'M', u'يز'), + (0xFC93, 'M', u'يم'), + (0xFC94, 'M', u'ين'), + (0xFC95, 'M', u'يى'), + (0xFC96, 'M', u'يي'), + (0xFC97, 'M', u'ئج'), + (0xFC98, 'M', u'ئح'), + (0xFC99, 'M', u'ئخ'), + (0xFC9A, 'M', u'ئم'), + (0xFC9B, 'M', u'ئه'), + (0xFC9C, 'M', u'بج'), + (0xFC9D, 'M', u'بح'), + (0xFC9E, 'M', u'بخ'), + (0xFC9F, 'M', u'بم'), + (0xFCA0, 'M', u'به'), + (0xFCA1, 'M', u'تج'), + (0xFCA2, 'M', u'تح'), + (0xFCA3, 'M', u'تخ'), + (0xFCA4, 'M', u'تم'), + (0xFCA5, 'M', u'ته'), + (0xFCA6, 'M', u'ثم'), + (0xFCA7, 'M', u'جح'), + (0xFCA8, 'M', u'جم'), + (0xFCA9, 'M', u'حج'), + (0xFCAA, 'M', u'حم'), + (0xFCAB, 'M', u'خج'), + (0xFCAC, 'M', u'خم'), + (0xFCAD, 'M', u'سج'), + (0xFCAE, 'M', u'سح'), + (0xFCAF, 'M', u'سخ'), + (0xFCB0, 'M', u'سم'), + (0xFCB1, 'M', u'صح'), + (0xFCB2, 'M', u'صخ'), + (0xFCB3, 'M', u'صم'), + (0xFCB4, 'M', u'ضج'), + (0xFCB5, 'M', u'ضح'), + (0xFCB6, 'M', u'ضخ'), + (0xFCB7, 'M', u'ضم'), + (0xFCB8, 'M', u'طح'), + (0xFCB9, 'M', u'ظم'), + (0xFCBA, 'M', u'عج'), + (0xFCBB, 'M', u'عم'), + (0xFCBC, 'M', u'غج'), + (0xFCBD, 'M', u'غم'), + (0xFCBE, 'M', u'فج'), + (0xFCBF, 'M', u'فح'), + (0xFCC0, 'M', u'فخ'), + (0xFCC1, 'M', u'فم'), + (0xFCC2, 'M', u'قح'), + (0xFCC3, 'M', u'قم'), + (0xFCC4, 'M', u'كج'), + ] + +def _seg_47(): + return [ + (0xFCC5, 'M', u'كح'), + (0xFCC6, 'M', u'كخ'), + (0xFCC7, 'M', u'كل'), + (0xFCC8, 'M', u'كم'), + (0xFCC9, 'M', u'لج'), + (0xFCCA, 'M', u'لح'), + (0xFCCB, 'M', u'لخ'), + (0xFCCC, 'M', u'لم'), + (0xFCCD, 'M', u'له'), + (0xFCCE, 'M', u'مج'), + (0xFCCF, 'M', u'مح'), + (0xFCD0, 'M', u'مخ'), + (0xFCD1, 'M', u'مم'), + (0xFCD2, 'M', u'نج'), + (0xFCD3, 'M', u'نح'), + (0xFCD4, 'M', u'نخ'), + (0xFCD5, 'M', u'نم'), + (0xFCD6, 'M', u'نه'), + (0xFCD7, 'M', u'هج'), + (0xFCD8, 'M', u'هم'), + (0xFCD9, 'M', u'هٰ'), + (0xFCDA, 'M', u'يج'), + (0xFCDB, 'M', u'يح'), + (0xFCDC, 'M', u'يخ'), + (0xFCDD, 'M', u'يم'), + (0xFCDE, 'M', u'يه'), + (0xFCDF, 'M', u'ئم'), + (0xFCE0, 'M', u'ئه'), + (0xFCE1, 'M', u'بم'), + (0xFCE2, 'M', u'به'), + (0xFCE3, 'M', u'تم'), + (0xFCE4, 'M', u'ته'), + (0xFCE5, 'M', u'ثم'), + (0xFCE6, 'M', u'ثه'), + (0xFCE7, 'M', u'سم'), + (0xFCE8, 'M', u'سه'), + (0xFCE9, 'M', u'شم'), + (0xFCEA, 'M', u'شه'), + (0xFCEB, 'M', u'كل'), + (0xFCEC, 'M', u'كم'), + (0xFCED, 'M', u'لم'), + (0xFCEE, 'M', u'نم'), + (0xFCEF, 'M', u'نه'), + (0xFCF0, 'M', u'يم'), + (0xFCF1, 'M', u'يه'), + (0xFCF2, 'M', u'ـَّ'), + (0xFCF3, 'M', u'ـُّ'), + (0xFCF4, 'M', u'ـِّ'), + (0xFCF5, 'M', u'طى'), + (0xFCF6, 'M', u'طي'), + (0xFCF7, 'M', u'عى'), + (0xFCF8, 'M', u'عي'), + (0xFCF9, 'M', u'غى'), + (0xFCFA, 'M', u'غي'), + (0xFCFB, 'M', u'سى'), + (0xFCFC, 'M', u'سي'), + (0xFCFD, 'M', u'شى'), + (0xFCFE, 'M', u'شي'), + (0xFCFF, 'M', u'حى'), + (0xFD00, 'M', u'حي'), + (0xFD01, 'M', u'جى'), + (0xFD02, 'M', u'جي'), + (0xFD03, 'M', u'خى'), + (0xFD04, 'M', u'خي'), + (0xFD05, 'M', u'صى'), + (0xFD06, 'M', u'صي'), + (0xFD07, 'M', u'ضى'), + (0xFD08, 'M', u'ضي'), + (0xFD09, 'M', u'شج'), + (0xFD0A, 'M', u'شح'), + (0xFD0B, 'M', u'شخ'), + (0xFD0C, 'M', u'شم'), + (0xFD0D, 'M', u'شر'), + (0xFD0E, 'M', u'سر'), + (0xFD0F, 'M', u'صر'), + (0xFD10, 'M', u'ضر'), + (0xFD11, 'M', u'طى'), + (0xFD12, 'M', u'طي'), + (0xFD13, 'M', u'عى'), + (0xFD14, 'M', u'عي'), + (0xFD15, 'M', u'غى'), + (0xFD16, 'M', u'غي'), + (0xFD17, 'M', u'سى'), + (0xFD18, 'M', u'سي'), + (0xFD19, 'M', u'شى'), + (0xFD1A, 'M', u'شي'), + (0xFD1B, 'M', u'حى'), + (0xFD1C, 'M', u'حي'), + (0xFD1D, 'M', u'جى'), + (0xFD1E, 'M', u'جي'), + (0xFD1F, 'M', u'خى'), + (0xFD20, 'M', u'خي'), + (0xFD21, 'M', u'صى'), + (0xFD22, 'M', u'صي'), + (0xFD23, 'M', u'ضى'), + (0xFD24, 'M', u'ضي'), + (0xFD25, 'M', u'شج'), + (0xFD26, 'M', u'شح'), + (0xFD27, 'M', u'شخ'), + (0xFD28, 'M', u'شم'), + ] + +def _seg_48(): + return [ + (0xFD29, 'M', u'شر'), + (0xFD2A, 'M', u'سر'), + (0xFD2B, 'M', u'صر'), + (0xFD2C, 'M', u'ضر'), + (0xFD2D, 'M', u'شج'), + (0xFD2E, 'M', u'شح'), + (0xFD2F, 'M', u'شخ'), + (0xFD30, 'M', u'شم'), + (0xFD31, 'M', u'سه'), + (0xFD32, 'M', u'شه'), + (0xFD33, 'M', u'طم'), + (0xFD34, 'M', u'سج'), + (0xFD35, 'M', u'سح'), + (0xFD36, 'M', u'سخ'), + (0xFD37, 'M', u'شج'), + (0xFD38, 'M', u'شح'), + (0xFD39, 'M', u'شخ'), + (0xFD3A, 'M', u'طم'), + (0xFD3B, 'M', u'ظم'), + (0xFD3C, 'M', u'اً'), + (0xFD3E, 'V'), + (0xFD40, 'X'), + (0xFD50, 'M', u'تجم'), + (0xFD51, 'M', u'تحج'), + (0xFD53, 'M', u'تحم'), + (0xFD54, 'M', u'تخم'), + (0xFD55, 'M', u'تمج'), + (0xFD56, 'M', u'تمح'), + (0xFD57, 'M', u'تمخ'), + (0xFD58, 'M', u'جمح'), + (0xFD5A, 'M', u'حمي'), + (0xFD5B, 'M', u'حمى'), + (0xFD5C, 'M', u'سحج'), + (0xFD5D, 'M', u'سجح'), + (0xFD5E, 'M', u'سجى'), + (0xFD5F, 'M', u'سمح'), + (0xFD61, 'M', u'سمج'), + (0xFD62, 'M', u'سمم'), + (0xFD64, 'M', u'صحح'), + (0xFD66, 'M', u'صمم'), + (0xFD67, 'M', u'شحم'), + (0xFD69, 'M', u'شجي'), + (0xFD6A, 'M', u'شمخ'), + (0xFD6C, 'M', u'شمم'), + (0xFD6E, 'M', u'ضحى'), + (0xFD6F, 'M', u'ضخم'), + (0xFD71, 'M', u'طمح'), + (0xFD73, 'M', u'طمم'), + (0xFD74, 'M', u'طمي'), + (0xFD75, 'M', u'عجم'), + (0xFD76, 'M', u'عمم'), + (0xFD78, 'M', u'عمى'), + (0xFD79, 'M', u'غمم'), + (0xFD7A, 'M', u'غمي'), + (0xFD7B, 'M', u'غمى'), + (0xFD7C, 'M', u'فخم'), + (0xFD7E, 'M', u'قمح'), + (0xFD7F, 'M', u'قمم'), + (0xFD80, 'M', u'لحم'), + (0xFD81, 'M', u'لحي'), + (0xFD82, 'M', u'لحى'), + (0xFD83, 'M', u'لجج'), + (0xFD85, 'M', u'لخم'), + (0xFD87, 'M', u'لمح'), + (0xFD89, 'M', u'محج'), + (0xFD8A, 'M', u'محم'), + (0xFD8B, 'M', u'محي'), + (0xFD8C, 'M', u'مجح'), + (0xFD8D, 'M', u'مجم'), + (0xFD8E, 'M', u'مخج'), + (0xFD8F, 'M', u'مخم'), + (0xFD90, 'X'), + (0xFD92, 'M', u'مجخ'), + (0xFD93, 'M', u'همج'), + (0xFD94, 'M', u'همم'), + (0xFD95, 'M', u'نحم'), + (0xFD96, 'M', u'نحى'), + (0xFD97, 'M', u'نجم'), + (0xFD99, 'M', u'نجى'), + (0xFD9A, 'M', u'نمي'), + (0xFD9B, 'M', u'نمى'), + (0xFD9C, 'M', u'يمم'), + (0xFD9E, 'M', u'بخي'), + (0xFD9F, 'M', u'تجي'), + (0xFDA0, 'M', u'تجى'), + (0xFDA1, 'M', u'تخي'), + (0xFDA2, 'M', u'تخى'), + (0xFDA3, 'M', u'تمي'), + (0xFDA4, 'M', u'تمى'), + (0xFDA5, 'M', u'جمي'), + (0xFDA6, 'M', u'جحى'), + (0xFDA7, 'M', u'جمى'), + (0xFDA8, 'M', u'سخى'), + (0xFDA9, 'M', u'صحي'), + (0xFDAA, 'M', u'شحي'), + (0xFDAB, 'M', u'ضحي'), + (0xFDAC, 'M', u'لجي'), + (0xFDAD, 'M', u'لمي'), + (0xFDAE, 'M', u'يحي'), + (0xFDAF, 'M', u'يجي'), + ] + +def _seg_49(): + return [ + (0xFDB0, 'M', u'يمي'), + (0xFDB1, 'M', u'ممي'), + (0xFDB2, 'M', u'قمي'), + (0xFDB3, 'M', u'نحي'), + (0xFDB4, 'M', u'قمح'), + (0xFDB5, 'M', u'لحم'), + (0xFDB6, 'M', u'عمي'), + (0xFDB7, 'M', u'كمي'), + (0xFDB8, 'M', u'نجح'), + (0xFDB9, 'M', u'مخي'), + (0xFDBA, 'M', u'لجم'), + (0xFDBB, 'M', u'كمم'), + (0xFDBC, 'M', u'لجم'), + (0xFDBD, 'M', u'نجح'), + (0xFDBE, 'M', u'جحي'), + (0xFDBF, 'M', u'حجي'), + (0xFDC0, 'M', u'مجي'), + (0xFDC1, 'M', u'فمي'), + (0xFDC2, 'M', u'بحي'), + (0xFDC3, 'M', u'كمم'), + (0xFDC4, 'M', u'عجم'), + (0xFDC5, 'M', u'صمم'), + (0xFDC6, 'M', u'سخي'), + (0xFDC7, 'M', u'نجي'), + (0xFDC8, 'X'), + (0xFDF0, 'M', u'صلے'), + (0xFDF1, 'M', u'قلے'), + (0xFDF2, 'M', u'الله'), + (0xFDF3, 'M', u'اكبر'), + (0xFDF4, 'M', u'محمد'), + (0xFDF5, 'M', u'صلعم'), + (0xFDF6, 'M', u'رسول'), + (0xFDF7, 'M', u'عليه'), + (0xFDF8, 'M', u'وسلم'), + (0xFDF9, 'M', u'صلى'), + (0xFDFA, '3', u'صلى الله عليه وسلم'), + (0xFDFB, '3', u'جل جلاله'), + (0xFDFC, 'M', u'ریال'), + (0xFDFD, 'V'), + (0xFDFE, 'X'), + (0xFE00, 'I'), + (0xFE10, '3', u','), + (0xFE11, 'M', u'、'), + (0xFE12, 'X'), + (0xFE13, '3', u':'), + (0xFE14, '3', u';'), + (0xFE15, '3', u'!'), + (0xFE16, '3', u'?'), + (0xFE17, 'M', u'〖'), + (0xFE18, 'M', u'〗'), + (0xFE19, 'X'), + (0xFE20, 'V'), + (0xFE30, 'X'), + (0xFE31, 'M', u'—'), + (0xFE32, 'M', u'–'), + (0xFE33, '3', u'_'), + (0xFE35, '3', u'('), + (0xFE36, '3', u')'), + (0xFE37, '3', u'{'), + (0xFE38, '3', u'}'), + (0xFE39, 'M', u'〔'), + (0xFE3A, 'M', u'〕'), + (0xFE3B, 'M', u'【'), + (0xFE3C, 'M', u'】'), + (0xFE3D, 'M', u'《'), + (0xFE3E, 'M', u'》'), + (0xFE3F, 'M', u'〈'), + (0xFE40, 'M', u'〉'), + (0xFE41, 'M', u'「'), + (0xFE42, 'M', u'」'), + (0xFE43, 'M', u'『'), + (0xFE44, 'M', u'』'), + (0xFE45, 'V'), + (0xFE47, '3', u'['), + (0xFE48, '3', u']'), + (0xFE49, '3', u' ̅'), + (0xFE4D, '3', u'_'), + (0xFE50, '3', u','), + (0xFE51, 'M', u'、'), + (0xFE52, 'X'), + (0xFE54, '3', u';'), + (0xFE55, '3', u':'), + (0xFE56, '3', u'?'), + (0xFE57, '3', u'!'), + (0xFE58, 'M', u'—'), + (0xFE59, '3', u'('), + (0xFE5A, '3', u')'), + (0xFE5B, '3', u'{'), + (0xFE5C, '3', u'}'), + (0xFE5D, 'M', u'〔'), + (0xFE5E, 'M', u'〕'), + (0xFE5F, '3', u'#'), + (0xFE60, '3', u'&'), + (0xFE61, '3', u'*'), + (0xFE62, '3', u'+'), + (0xFE63, 'M', u'-'), + (0xFE64, '3', u'<'), + (0xFE65, '3', u'>'), + (0xFE66, '3', u'='), + (0xFE67, 'X'), + ] + +def _seg_50(): + return [ + (0xFE68, '3', u'\\'), + (0xFE69, '3', u'$'), + (0xFE6A, '3', u'%'), + (0xFE6B, '3', u'@'), + (0xFE6C, 'X'), + (0xFE70, '3', u' ً'), + (0xFE71, 'M', u'ـً'), + (0xFE72, '3', u' ٌ'), + (0xFE73, 'V'), + (0xFE74, '3', u' ٍ'), + (0xFE75, 'X'), + (0xFE76, '3', u' َ'), + (0xFE77, 'M', u'ـَ'), + (0xFE78, '3', u' ُ'), + (0xFE79, 'M', u'ـُ'), + (0xFE7A, '3', u' ِ'), + (0xFE7B, 'M', u'ـِ'), + (0xFE7C, '3', u' ّ'), + (0xFE7D, 'M', u'ـّ'), + (0xFE7E, '3', u' ْ'), + (0xFE7F, 'M', u'ـْ'), + (0xFE80, 'M', u'ء'), + (0xFE81, 'M', u'آ'), + (0xFE83, 'M', u'أ'), + (0xFE85, 'M', u'ؤ'), + (0xFE87, 'M', u'إ'), + (0xFE89, 'M', u'ئ'), + (0xFE8D, 'M', u'ا'), + (0xFE8F, 'M', u'ب'), + (0xFE93, 'M', u'ة'), + (0xFE95, 'M', u'ت'), + (0xFE99, 'M', u'ث'), + (0xFE9D, 'M', u'ج'), + (0xFEA1, 'M', u'ح'), + (0xFEA5, 'M', u'خ'), + (0xFEA9, 'M', u'د'), + (0xFEAB, 'M', u'ذ'), + (0xFEAD, 'M', u'ر'), + (0xFEAF, 'M', u'ز'), + (0xFEB1, 'M', u'س'), + (0xFEB5, 'M', u'ش'), + (0xFEB9, 'M', u'ص'), + (0xFEBD, 'M', u'ض'), + (0xFEC1, 'M', u'ط'), + (0xFEC5, 'M', u'ظ'), + (0xFEC9, 'M', u'ع'), + (0xFECD, 'M', u'غ'), + (0xFED1, 'M', u'ف'), + (0xFED5, 'M', u'ق'), + (0xFED9, 'M', u'ك'), + (0xFEDD, 'M', u'ل'), + (0xFEE1, 'M', u'م'), + (0xFEE5, 'M', u'ن'), + (0xFEE9, 'M', u'ه'), + (0xFEED, 'M', u'و'), + (0xFEEF, 'M', u'ى'), + (0xFEF1, 'M', u'ي'), + (0xFEF5, 'M', u'لآ'), + (0xFEF7, 'M', u'لأ'), + (0xFEF9, 'M', u'لإ'), + (0xFEFB, 'M', u'لا'), + (0xFEFD, 'X'), + (0xFEFF, 'I'), + (0xFF00, 'X'), + (0xFF01, '3', u'!'), + (0xFF02, '3', u'"'), + (0xFF03, '3', u'#'), + (0xFF04, '3', u'$'), + (0xFF05, '3', u'%'), + (0xFF06, '3', u'&'), + (0xFF07, '3', u'\''), + (0xFF08, '3', u'('), + (0xFF09, '3', u')'), + (0xFF0A, '3', u'*'), + (0xFF0B, '3', u'+'), + (0xFF0C, '3', u','), + (0xFF0D, 'M', u'-'), + (0xFF0E, 'M', u'.'), + (0xFF0F, '3', u'/'), + (0xFF10, 'M', u'0'), + (0xFF11, 'M', u'1'), + (0xFF12, 'M', u'2'), + (0xFF13, 'M', u'3'), + (0xFF14, 'M', u'4'), + (0xFF15, 'M', u'5'), + (0xFF16, 'M', u'6'), + (0xFF17, 'M', u'7'), + (0xFF18, 'M', u'8'), + (0xFF19, 'M', u'9'), + (0xFF1A, '3', u':'), + (0xFF1B, '3', u';'), + (0xFF1C, '3', u'<'), + (0xFF1D, '3', u'='), + (0xFF1E, '3', u'>'), + (0xFF1F, '3', u'?'), + (0xFF20, '3', u'@'), + (0xFF21, 'M', u'a'), + (0xFF22, 'M', u'b'), + (0xFF23, 'M', u'c'), + (0xFF24, 'M', u'd'), + ] + +def _seg_51(): + return [ + (0xFF25, 'M', u'e'), + (0xFF26, 'M', u'f'), + (0xFF27, 'M', u'g'), + (0xFF28, 'M', u'h'), + (0xFF29, 'M', u'i'), + (0xFF2A, 'M', u'j'), + (0xFF2B, 'M', u'k'), + (0xFF2C, 'M', u'l'), + (0xFF2D, 'M', u'm'), + (0xFF2E, 'M', u'n'), + (0xFF2F, 'M', u'o'), + (0xFF30, 'M', u'p'), + (0xFF31, 'M', u'q'), + (0xFF32, 'M', u'r'), + (0xFF33, 'M', u's'), + (0xFF34, 'M', u't'), + (0xFF35, 'M', u'u'), + (0xFF36, 'M', u'v'), + (0xFF37, 'M', u'w'), + (0xFF38, 'M', u'x'), + (0xFF39, 'M', u'y'), + (0xFF3A, 'M', u'z'), + (0xFF3B, '3', u'['), + (0xFF3C, '3', u'\\'), + (0xFF3D, '3', u']'), + (0xFF3E, '3', u'^'), + (0xFF3F, '3', u'_'), + (0xFF40, '3', u'`'), + (0xFF41, 'M', u'a'), + (0xFF42, 'M', u'b'), + (0xFF43, 'M', u'c'), + (0xFF44, 'M', u'd'), + (0xFF45, 'M', u'e'), + (0xFF46, 'M', u'f'), + (0xFF47, 'M', u'g'), + (0xFF48, 'M', u'h'), + (0xFF49, 'M', u'i'), + (0xFF4A, 'M', u'j'), + (0xFF4B, 'M', u'k'), + (0xFF4C, 'M', u'l'), + (0xFF4D, 'M', u'm'), + (0xFF4E, 'M', u'n'), + (0xFF4F, 'M', u'o'), + (0xFF50, 'M', u'p'), + (0xFF51, 'M', u'q'), + (0xFF52, 'M', u'r'), + (0xFF53, 'M', u's'), + (0xFF54, 'M', u't'), + (0xFF55, 'M', u'u'), + (0xFF56, 'M', u'v'), + (0xFF57, 'M', u'w'), + (0xFF58, 'M', u'x'), + (0xFF59, 'M', u'y'), + (0xFF5A, 'M', u'z'), + (0xFF5B, '3', u'{'), + (0xFF5C, '3', u'|'), + (0xFF5D, '3', u'}'), + (0xFF5E, '3', u'~'), + (0xFF5F, 'M', u'⦅'), + (0xFF60, 'M', u'⦆'), + (0xFF61, 'M', u'.'), + (0xFF62, 'M', u'「'), + (0xFF63, 'M', u'」'), + (0xFF64, 'M', u'、'), + (0xFF65, 'M', u'・'), + (0xFF66, 'M', u'ヲ'), + (0xFF67, 'M', u'ァ'), + (0xFF68, 'M', u'ィ'), + (0xFF69, 'M', u'ゥ'), + (0xFF6A, 'M', u'ェ'), + (0xFF6B, 'M', u'ォ'), + (0xFF6C, 'M', u'ャ'), + (0xFF6D, 'M', u'ュ'), + (0xFF6E, 'M', u'ョ'), + (0xFF6F, 'M', u'ッ'), + (0xFF70, 'M', u'ー'), + (0xFF71, 'M', u'ア'), + (0xFF72, 'M', u'イ'), + (0xFF73, 'M', u'ウ'), + (0xFF74, 'M', u'エ'), + (0xFF75, 'M', u'オ'), + (0xFF76, 'M', u'カ'), + (0xFF77, 'M', u'キ'), + (0xFF78, 'M', u'ク'), + (0xFF79, 'M', u'ケ'), + (0xFF7A, 'M', u'コ'), + (0xFF7B, 'M', u'サ'), + (0xFF7C, 'M', u'シ'), + (0xFF7D, 'M', u'ス'), + (0xFF7E, 'M', u'セ'), + (0xFF7F, 'M', u'ソ'), + (0xFF80, 'M', u'タ'), + (0xFF81, 'M', u'チ'), + (0xFF82, 'M', u'ツ'), + (0xFF83, 'M', u'テ'), + (0xFF84, 'M', u'ト'), + (0xFF85, 'M', u'ナ'), + (0xFF86, 'M', u'ニ'), + (0xFF87, 'M', u'ヌ'), + (0xFF88, 'M', u'ネ'), + ] + +def _seg_52(): + return [ + (0xFF89, 'M', u'ノ'), + (0xFF8A, 'M', u'ハ'), + (0xFF8B, 'M', u'ヒ'), + (0xFF8C, 'M', u'フ'), + (0xFF8D, 'M', u'ヘ'), + (0xFF8E, 'M', u'ホ'), + (0xFF8F, 'M', u'マ'), + (0xFF90, 'M', u'ミ'), + (0xFF91, 'M', u'ム'), + (0xFF92, 'M', u'メ'), + (0xFF93, 'M', u'モ'), + (0xFF94, 'M', u'ヤ'), + (0xFF95, 'M', u'ユ'), + (0xFF96, 'M', u'ヨ'), + (0xFF97, 'M', u'ラ'), + (0xFF98, 'M', u'リ'), + (0xFF99, 'M', u'ル'), + (0xFF9A, 'M', u'レ'), + (0xFF9B, 'M', u'ロ'), + (0xFF9C, 'M', u'ワ'), + (0xFF9D, 'M', u'ン'), + (0xFF9E, 'M', u'゙'), + (0xFF9F, 'M', u'゚'), + (0xFFA0, 'X'), + (0xFFA1, 'M', u'ᄀ'), + (0xFFA2, 'M', u'ᄁ'), + (0xFFA3, 'M', u'ᆪ'), + (0xFFA4, 'M', u'ᄂ'), + (0xFFA5, 'M', u'ᆬ'), + (0xFFA6, 'M', u'ᆭ'), + (0xFFA7, 'M', u'ᄃ'), + (0xFFA8, 'M', u'ᄄ'), + (0xFFA9, 'M', u'ᄅ'), + (0xFFAA, 'M', u'ᆰ'), + (0xFFAB, 'M', u'ᆱ'), + (0xFFAC, 'M', u'ᆲ'), + (0xFFAD, 'M', u'ᆳ'), + (0xFFAE, 'M', u'ᆴ'), + (0xFFAF, 'M', u'ᆵ'), + (0xFFB0, 'M', u'ᄚ'), + (0xFFB1, 'M', u'ᄆ'), + (0xFFB2, 'M', u'ᄇ'), + (0xFFB3, 'M', u'ᄈ'), + (0xFFB4, 'M', u'ᄡ'), + (0xFFB5, 'M', u'ᄉ'), + (0xFFB6, 'M', u'ᄊ'), + (0xFFB7, 'M', u'ᄋ'), + (0xFFB8, 'M', u'ᄌ'), + (0xFFB9, 'M', u'ᄍ'), + (0xFFBA, 'M', u'ᄎ'), + (0xFFBB, 'M', u'ᄏ'), + (0xFFBC, 'M', u'ᄐ'), + (0xFFBD, 'M', u'ᄑ'), + (0xFFBE, 'M', u'ᄒ'), + (0xFFBF, 'X'), + (0xFFC2, 'M', u'ᅡ'), + (0xFFC3, 'M', u'ᅢ'), + (0xFFC4, 'M', u'ᅣ'), + (0xFFC5, 'M', u'ᅤ'), + (0xFFC6, 'M', u'ᅥ'), + (0xFFC7, 'M', u'ᅦ'), + (0xFFC8, 'X'), + (0xFFCA, 'M', u'ᅧ'), + (0xFFCB, 'M', u'ᅨ'), + (0xFFCC, 'M', u'ᅩ'), + (0xFFCD, 'M', u'ᅪ'), + (0xFFCE, 'M', u'ᅫ'), + (0xFFCF, 'M', u'ᅬ'), + (0xFFD0, 'X'), + (0xFFD2, 'M', u'ᅭ'), + (0xFFD3, 'M', u'ᅮ'), + (0xFFD4, 'M', u'ᅯ'), + (0xFFD5, 'M', u'ᅰ'), + (0xFFD6, 'M', u'ᅱ'), + (0xFFD7, 'M', u'ᅲ'), + (0xFFD8, 'X'), + (0xFFDA, 'M', u'ᅳ'), + (0xFFDB, 'M', u'ᅴ'), + (0xFFDC, 'M', u'ᅵ'), + (0xFFDD, 'X'), + (0xFFE0, 'M', u'¢'), + (0xFFE1, 'M', u'£'), + (0xFFE2, 'M', u'¬'), + (0xFFE3, '3', u' ̄'), + (0xFFE4, 'M', u'¦'), + (0xFFE5, 'M', u'¥'), + (0xFFE6, 'M', u'₩'), + (0xFFE7, 'X'), + (0xFFE8, 'M', u'│'), + (0xFFE9, 'M', u'←'), + (0xFFEA, 'M', u'↑'), + (0xFFEB, 'M', u'→'), + (0xFFEC, 'M', u'↓'), + (0xFFED, 'M', u'■'), + (0xFFEE, 'M', u'○'), + (0xFFEF, 'X'), + (0x10000, 'V'), + (0x1000C, 'X'), + (0x1000D, 'V'), + (0x10027, 'X'), + ] + +def _seg_53(): + return [ + (0x10028, 'V'), + (0x1003B, 'X'), + (0x1003C, 'V'), + (0x1003E, 'X'), + (0x1003F, 'V'), + (0x1004E, 'X'), + (0x10050, 'V'), + (0x1005E, 'X'), + (0x10080, 'V'), + (0x100FB, 'X'), + (0x10100, 'V'), + (0x10103, 'X'), + (0x10107, 'V'), + (0x10134, 'X'), + (0x10137, 'V'), + (0x1018F, 'X'), + (0x10190, 'V'), + (0x1019C, 'X'), + (0x101A0, 'V'), + (0x101A1, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x102E0, 'V'), + (0x102FC, 'X'), + (0x10300, 'V'), + (0x10324, 'X'), + (0x1032D, 'V'), + (0x1034B, 'X'), + (0x10350, 'V'), + (0x1037B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', u'𐐨'), + (0x10401, 'M', u'𐐩'), + (0x10402, 'M', u'𐐪'), + (0x10403, 'M', u'𐐫'), + (0x10404, 'M', u'𐐬'), + (0x10405, 'M', u'𐐭'), + (0x10406, 'M', u'𐐮'), + (0x10407, 'M', u'𐐯'), + (0x10408, 'M', u'𐐰'), + (0x10409, 'M', u'𐐱'), + (0x1040A, 'M', u'𐐲'), + (0x1040B, 'M', u'𐐳'), + (0x1040C, 'M', u'𐐴'), + (0x1040D, 'M', u'𐐵'), + (0x1040E, 'M', u'𐐶'), + (0x1040F, 'M', u'𐐷'), + (0x10410, 'M', u'𐐸'), + (0x10411, 'M', u'𐐹'), + (0x10412, 'M', u'𐐺'), + (0x10413, 'M', u'𐐻'), + (0x10414, 'M', u'𐐼'), + (0x10415, 'M', u'𐐽'), + (0x10416, 'M', u'𐐾'), + (0x10417, 'M', u'𐐿'), + (0x10418, 'M', u'𐑀'), + (0x10419, 'M', u'𐑁'), + (0x1041A, 'M', u'𐑂'), + (0x1041B, 'M', u'𐑃'), + (0x1041C, 'M', u'𐑄'), + (0x1041D, 'M', u'𐑅'), + (0x1041E, 'M', u'𐑆'), + (0x1041F, 'M', u'𐑇'), + (0x10420, 'M', u'𐑈'), + (0x10421, 'M', u'𐑉'), + (0x10422, 'M', u'𐑊'), + (0x10423, 'M', u'𐑋'), + (0x10424, 'M', u'𐑌'), + (0x10425, 'M', u'𐑍'), + (0x10426, 'M', u'𐑎'), + (0x10427, 'M', u'𐑏'), + (0x10428, 'V'), + (0x1049E, 'X'), + (0x104A0, 'V'), + (0x104AA, 'X'), + (0x104B0, 'M', u'𐓘'), + (0x104B1, 'M', u'𐓙'), + (0x104B2, 'M', u'𐓚'), + (0x104B3, 'M', u'𐓛'), + (0x104B4, 'M', u'𐓜'), + (0x104B5, 'M', u'𐓝'), + (0x104B6, 'M', u'𐓞'), + (0x104B7, 'M', u'𐓟'), + (0x104B8, 'M', u'𐓠'), + (0x104B9, 'M', u'𐓡'), + (0x104BA, 'M', u'𐓢'), + (0x104BB, 'M', u'𐓣'), + (0x104BC, 'M', u'𐓤'), + (0x104BD, 'M', u'𐓥'), + (0x104BE, 'M', u'𐓦'), + (0x104BF, 'M', u'𐓧'), + ] + +def _seg_54(): + return [ + (0x104C0, 'M', u'𐓨'), + (0x104C1, 'M', u'𐓩'), + (0x104C2, 'M', u'𐓪'), + (0x104C3, 'M', u'𐓫'), + (0x104C4, 'M', u'𐓬'), + (0x104C5, 'M', u'𐓭'), + (0x104C6, 'M', u'𐓮'), + (0x104C7, 'M', u'𐓯'), + (0x104C8, 'M', u'𐓰'), + (0x104C9, 'M', u'𐓱'), + (0x104CA, 'M', u'𐓲'), + (0x104CB, 'M', u'𐓳'), + (0x104CC, 'M', u'𐓴'), + (0x104CD, 'M', u'𐓵'), + (0x104CE, 'M', u'𐓶'), + (0x104CF, 'M', u'𐓷'), + (0x104D0, 'M', u'𐓸'), + (0x104D1, 'M', u'𐓹'), + (0x104D2, 'M', u'𐓺'), + (0x104D3, 'M', u'𐓻'), + (0x104D4, 'X'), + (0x104D8, 'V'), + (0x104FC, 'X'), + (0x10500, 'V'), + (0x10528, 'X'), + (0x10530, 'V'), + (0x10564, 'X'), + (0x1056F, 'V'), + (0x10570, 'X'), + (0x10600, 'V'), + (0x10737, 'X'), + (0x10740, 'V'), + (0x10756, 'X'), + (0x10760, 'V'), + (0x10768, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x1089F, 'X'), + (0x108A7, 'V'), + (0x108B0, 'X'), + (0x108E0, 'V'), + (0x108F3, 'X'), + (0x108F4, 'V'), + (0x108F6, 'X'), + (0x108FB, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BC, 'V'), + (0x109D0, 'X'), + (0x109D2, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A36, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A49, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10AA0, 'X'), + (0x10AC0, 'V'), + (0x10AE7, 'X'), + (0x10AEB, 'V'), + (0x10AF7, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B92, 'X'), + (0x10B99, 'V'), + (0x10B9D, 'X'), + (0x10BA9, 'V'), + (0x10BB0, 'X'), + (0x10C00, 'V'), + ] + +def _seg_55(): + return [ + (0x10C49, 'X'), + (0x10C80, 'M', u'𐳀'), + (0x10C81, 'M', u'𐳁'), + (0x10C82, 'M', u'𐳂'), + (0x10C83, 'M', u'𐳃'), + (0x10C84, 'M', u'𐳄'), + (0x10C85, 'M', u'𐳅'), + (0x10C86, 'M', u'𐳆'), + (0x10C87, 'M', u'𐳇'), + (0x10C88, 'M', u'𐳈'), + (0x10C89, 'M', u'𐳉'), + (0x10C8A, 'M', u'𐳊'), + (0x10C8B, 'M', u'𐳋'), + (0x10C8C, 'M', u'𐳌'), + (0x10C8D, 'M', u'𐳍'), + (0x10C8E, 'M', u'𐳎'), + (0x10C8F, 'M', u'𐳏'), + (0x10C90, 'M', u'𐳐'), + (0x10C91, 'M', u'𐳑'), + (0x10C92, 'M', u'𐳒'), + (0x10C93, 'M', u'𐳓'), + (0x10C94, 'M', u'𐳔'), + (0x10C95, 'M', u'𐳕'), + (0x10C96, 'M', u'𐳖'), + (0x10C97, 'M', u'𐳗'), + (0x10C98, 'M', u'𐳘'), + (0x10C99, 'M', u'𐳙'), + (0x10C9A, 'M', u'𐳚'), + (0x10C9B, 'M', u'𐳛'), + (0x10C9C, 'M', u'𐳜'), + (0x10C9D, 'M', u'𐳝'), + (0x10C9E, 'M', u'𐳞'), + (0x10C9F, 'M', u'𐳟'), + (0x10CA0, 'M', u'𐳠'), + (0x10CA1, 'M', u'𐳡'), + (0x10CA2, 'M', u'𐳢'), + (0x10CA3, 'M', u'𐳣'), + (0x10CA4, 'M', u'𐳤'), + (0x10CA5, 'M', u'𐳥'), + (0x10CA6, 'M', u'𐳦'), + (0x10CA7, 'M', u'𐳧'), + (0x10CA8, 'M', u'𐳨'), + (0x10CA9, 'M', u'𐳩'), + (0x10CAA, 'M', u'𐳪'), + (0x10CAB, 'M', u'𐳫'), + (0x10CAC, 'M', u'𐳬'), + (0x10CAD, 'M', u'𐳭'), + (0x10CAE, 'M', u'𐳮'), + (0x10CAF, 'M', u'𐳯'), + (0x10CB0, 'M', u'𐳰'), + (0x10CB1, 'M', u'𐳱'), + (0x10CB2, 'M', u'𐳲'), + (0x10CB3, 'X'), + (0x10CC0, 'V'), + (0x10CF3, 'X'), + (0x10CFA, 'V'), + (0x10D28, 'X'), + (0x10D30, 'V'), + (0x10D3A, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x10F00, 'V'), + (0x10F28, 'X'), + (0x10F30, 'V'), + (0x10F5A, 'X'), + (0x10FE0, 'V'), + (0x10FF7, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11070, 'X'), + (0x1107F, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + (0x110C2, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11147, 'X'), + (0x11150, 'V'), + (0x11177, 'X'), + (0x11180, 'V'), + (0x111CE, 'X'), + (0x111D0, 'V'), + (0x111E0, 'X'), + (0x111E1, 'V'), + (0x111F5, 'X'), + (0x11200, 'V'), + (0x11212, 'X'), + (0x11213, 'V'), + (0x1123F, 'X'), + (0x11280, 'V'), + (0x11287, 'X'), + (0x11288, 'V'), + (0x11289, 'X'), + (0x1128A, 'V'), + ] + +def _seg_56(): + return [ + (0x1128E, 'X'), + (0x1128F, 'V'), + (0x1129E, 'X'), + (0x1129F, 'V'), + (0x112AA, 'X'), + (0x112B0, 'V'), + (0x112EB, 'X'), + (0x112F0, 'V'), + (0x112FA, 'X'), + (0x11300, 'V'), + (0x11304, 'X'), + (0x11305, 'V'), + (0x1130D, 'X'), + (0x1130F, 'V'), + (0x11311, 'X'), + (0x11313, 'V'), + (0x11329, 'X'), + (0x1132A, 'V'), + (0x11331, 'X'), + (0x11332, 'V'), + (0x11334, 'X'), + (0x11335, 'V'), + (0x1133A, 'X'), + (0x1133B, 'V'), + (0x11345, 'X'), + (0x11347, 'V'), + (0x11349, 'X'), + (0x1134B, 'V'), + (0x1134E, 'X'), + (0x11350, 'V'), + (0x11351, 'X'), + (0x11357, 'V'), + (0x11358, 'X'), + (0x1135D, 'V'), + (0x11364, 'X'), + (0x11366, 'V'), + (0x1136D, 'X'), + (0x11370, 'V'), + (0x11375, 'X'), + (0x11400, 'V'), + (0x1145A, 'X'), + (0x1145B, 'V'), + (0x1145C, 'X'), + (0x1145D, 'V'), + (0x11460, 'X'), + (0x11480, 'V'), + (0x114C8, 'X'), + (0x114D0, 'V'), + (0x114DA, 'X'), + (0x11580, 'V'), + (0x115B6, 'X'), + (0x115B8, 'V'), + (0x115DE, 'X'), + (0x11600, 'V'), + (0x11645, 'X'), + (0x11650, 'V'), + (0x1165A, 'X'), + (0x11660, 'V'), + (0x1166D, 'X'), + (0x11680, 'V'), + (0x116B9, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x11700, 'V'), + (0x1171B, 'X'), + (0x1171D, 'V'), + (0x1172C, 'X'), + (0x11730, 'V'), + (0x11740, 'X'), + (0x11800, 'V'), + (0x1183C, 'X'), + (0x118A0, 'M', u'𑣀'), + (0x118A1, 'M', u'𑣁'), + (0x118A2, 'M', u'𑣂'), + (0x118A3, 'M', u'𑣃'), + (0x118A4, 'M', u'𑣄'), + (0x118A5, 'M', u'𑣅'), + (0x118A6, 'M', u'𑣆'), + (0x118A7, 'M', u'𑣇'), + (0x118A8, 'M', u'𑣈'), + (0x118A9, 'M', u'𑣉'), + (0x118AA, 'M', u'𑣊'), + (0x118AB, 'M', u'𑣋'), + (0x118AC, 'M', u'𑣌'), + (0x118AD, 'M', u'𑣍'), + (0x118AE, 'M', u'𑣎'), + (0x118AF, 'M', u'𑣏'), + (0x118B0, 'M', u'𑣐'), + (0x118B1, 'M', u'𑣑'), + (0x118B2, 'M', u'𑣒'), + (0x118B3, 'M', u'𑣓'), + (0x118B4, 'M', u'𑣔'), + (0x118B5, 'M', u'𑣕'), + (0x118B6, 'M', u'𑣖'), + (0x118B7, 'M', u'𑣗'), + (0x118B8, 'M', u'𑣘'), + (0x118B9, 'M', u'𑣙'), + (0x118BA, 'M', u'𑣚'), + (0x118BB, 'M', u'𑣛'), + (0x118BC, 'M', u'𑣜'), + ] + +def _seg_57(): + return [ + (0x118BD, 'M', u'𑣝'), + (0x118BE, 'M', u'𑣞'), + (0x118BF, 'M', u'𑣟'), + (0x118C0, 'V'), + (0x118F3, 'X'), + (0x118FF, 'V'), + (0x11900, 'X'), + (0x119A0, 'V'), + (0x119A8, 'X'), + (0x119AA, 'V'), + (0x119D8, 'X'), + (0x119DA, 'V'), + (0x119E5, 'X'), + (0x11A00, 'V'), + (0x11A48, 'X'), + (0x11A50, 'V'), + (0x11AA3, 'X'), + (0x11AC0, 'V'), + (0x11AF9, 'X'), + (0x11C00, 'V'), + (0x11C09, 'X'), + (0x11C0A, 'V'), + (0x11C37, 'X'), + (0x11C38, 'V'), + (0x11C46, 'X'), + (0x11C50, 'V'), + (0x11C6D, 'X'), + (0x11C70, 'V'), + (0x11C90, 'X'), + (0x11C92, 'V'), + (0x11CA8, 'X'), + (0x11CA9, 'V'), + (0x11CB7, 'X'), + (0x11D00, 'V'), + (0x11D07, 'X'), + (0x11D08, 'V'), + (0x11D0A, 'X'), + (0x11D0B, 'V'), + (0x11D37, 'X'), + (0x11D3A, 'V'), + (0x11D3B, 'X'), + (0x11D3C, 'V'), + (0x11D3E, 'X'), + (0x11D3F, 'V'), + (0x11D48, 'X'), + (0x11D50, 'V'), + (0x11D5A, 'X'), + (0x11D60, 'V'), + (0x11D66, 'X'), + (0x11D67, 'V'), + (0x11D69, 'X'), + (0x11D6A, 'V'), + (0x11D8F, 'X'), + (0x11D90, 'V'), + (0x11D92, 'X'), + (0x11D93, 'V'), + (0x11D99, 'X'), + (0x11DA0, 'V'), + (0x11DAA, 'X'), + (0x11EE0, 'V'), + (0x11EF9, 'X'), + (0x11FC0, 'V'), + (0x11FF2, 'X'), + (0x11FFF, 'V'), + (0x1239A, 'X'), + (0x12400, 'V'), + (0x1246F, 'X'), + (0x12470, 'V'), + (0x12475, 'X'), + (0x12480, 'V'), + (0x12544, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + (0x14400, 'V'), + (0x14647, 'X'), + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16A40, 'V'), + (0x16A5F, 'X'), + (0x16A60, 'V'), + (0x16A6A, 'X'), + (0x16A6E, 'V'), + (0x16A70, 'X'), + (0x16AD0, 'V'), + (0x16AEE, 'X'), + (0x16AF0, 'V'), + (0x16AF6, 'X'), + (0x16B00, 'V'), + (0x16B46, 'X'), + (0x16B50, 'V'), + (0x16B5A, 'X'), + (0x16B5B, 'V'), + (0x16B62, 'X'), + (0x16B63, 'V'), + (0x16B78, 'X'), + (0x16B7D, 'V'), + (0x16B90, 'X'), + (0x16E40, 'M', u'𖹠'), + (0x16E41, 'M', u'𖹡'), + (0x16E42, 'M', u'𖹢'), + ] + +def _seg_58(): + return [ + (0x16E43, 'M', u'𖹣'), + (0x16E44, 'M', u'𖹤'), + (0x16E45, 'M', u'𖹥'), + (0x16E46, 'M', u'𖹦'), + (0x16E47, 'M', u'𖹧'), + (0x16E48, 'M', u'𖹨'), + (0x16E49, 'M', u'𖹩'), + (0x16E4A, 'M', u'𖹪'), + (0x16E4B, 'M', u'𖹫'), + (0x16E4C, 'M', u'𖹬'), + (0x16E4D, 'M', u'𖹭'), + (0x16E4E, 'M', u'𖹮'), + (0x16E4F, 'M', u'𖹯'), + (0x16E50, 'M', u'𖹰'), + (0x16E51, 'M', u'𖹱'), + (0x16E52, 'M', u'𖹲'), + (0x16E53, 'M', u'𖹳'), + (0x16E54, 'M', u'𖹴'), + (0x16E55, 'M', u'𖹵'), + (0x16E56, 'M', u'𖹶'), + (0x16E57, 'M', u'𖹷'), + (0x16E58, 'M', u'𖹸'), + (0x16E59, 'M', u'𖹹'), + (0x16E5A, 'M', u'𖹺'), + (0x16E5B, 'M', u'𖹻'), + (0x16E5C, 'M', u'𖹼'), + (0x16E5D, 'M', u'𖹽'), + (0x16E5E, 'M', u'𖹾'), + (0x16E5F, 'M', u'𖹿'), + (0x16E60, 'V'), + (0x16E9B, 'X'), + (0x16F00, 'V'), + (0x16F4B, 'X'), + (0x16F4F, 'V'), + (0x16F88, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x16FE0, 'V'), + (0x16FE4, 'X'), + (0x17000, 'V'), + (0x187F8, 'X'), + (0x18800, 'V'), + (0x18AF3, 'X'), + (0x1B000, 'V'), + (0x1B11F, 'X'), + (0x1B150, 'V'), + (0x1B153, 'X'), + (0x1B164, 'V'), + (0x1B168, 'X'), + (0x1B170, 'V'), + (0x1B2FC, 'X'), + (0x1BC00, 'V'), + (0x1BC6B, 'X'), + (0x1BC70, 'V'), + (0x1BC7D, 'X'), + (0x1BC80, 'V'), + (0x1BC89, 'X'), + (0x1BC90, 'V'), + (0x1BC9A, 'X'), + (0x1BC9C, 'V'), + (0x1BCA0, 'I'), + (0x1BCA4, 'X'), + (0x1D000, 'V'), + (0x1D0F6, 'X'), + (0x1D100, 'V'), + (0x1D127, 'X'), + (0x1D129, 'V'), + (0x1D15E, 'M', u'𝅗𝅥'), + (0x1D15F, 'M', u'𝅘𝅥'), + (0x1D160, 'M', u'𝅘𝅥𝅮'), + (0x1D161, 'M', u'𝅘𝅥𝅯'), + (0x1D162, 'M', u'𝅘𝅥𝅰'), + (0x1D163, 'M', u'𝅘𝅥𝅱'), + (0x1D164, 'M', u'𝅘𝅥𝅲'), + (0x1D165, 'V'), + (0x1D173, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', u'𝆹𝅥'), + (0x1D1BC, 'M', u'𝆺𝅥'), + (0x1D1BD, 'M', u'𝆹𝅥𝅮'), + (0x1D1BE, 'M', u'𝆺𝅥𝅮'), + (0x1D1BF, 'M', u'𝆹𝅥𝅯'), + (0x1D1C0, 'M', u'𝆺𝅥𝅯'), + (0x1D1C1, 'V'), + (0x1D1E9, 'X'), + (0x1D200, 'V'), + (0x1D246, 'X'), + (0x1D2E0, 'V'), + (0x1D2F4, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D379, 'X'), + (0x1D400, 'M', u'a'), + (0x1D401, 'M', u'b'), + (0x1D402, 'M', u'c'), + (0x1D403, 'M', u'd'), + (0x1D404, 'M', u'e'), + (0x1D405, 'M', u'f'), + (0x1D406, 'M', u'g'), + ] + +def _seg_59(): + return [ + (0x1D407, 'M', u'h'), + (0x1D408, 'M', u'i'), + (0x1D409, 'M', u'j'), + (0x1D40A, 'M', u'k'), + (0x1D40B, 'M', u'l'), + (0x1D40C, 'M', u'm'), + (0x1D40D, 'M', u'n'), + (0x1D40E, 'M', u'o'), + (0x1D40F, 'M', u'p'), + (0x1D410, 'M', u'q'), + (0x1D411, 'M', u'r'), + (0x1D412, 'M', u's'), + (0x1D413, 'M', u't'), + (0x1D414, 'M', u'u'), + (0x1D415, 'M', u'v'), + (0x1D416, 'M', u'w'), + (0x1D417, 'M', u'x'), + (0x1D418, 'M', u'y'), + (0x1D419, 'M', u'z'), + (0x1D41A, 'M', u'a'), + (0x1D41B, 'M', u'b'), + (0x1D41C, 'M', u'c'), + (0x1D41D, 'M', u'd'), + (0x1D41E, 'M', u'e'), + (0x1D41F, 'M', u'f'), + (0x1D420, 'M', u'g'), + (0x1D421, 'M', u'h'), + (0x1D422, 'M', u'i'), + (0x1D423, 'M', u'j'), + (0x1D424, 'M', u'k'), + (0x1D425, 'M', u'l'), + (0x1D426, 'M', u'm'), + (0x1D427, 'M', u'n'), + (0x1D428, 'M', u'o'), + (0x1D429, 'M', u'p'), + (0x1D42A, 'M', u'q'), + (0x1D42B, 'M', u'r'), + (0x1D42C, 'M', u's'), + (0x1D42D, 'M', u't'), + (0x1D42E, 'M', u'u'), + (0x1D42F, 'M', u'v'), + (0x1D430, 'M', u'w'), + (0x1D431, 'M', u'x'), + (0x1D432, 'M', u'y'), + (0x1D433, 'M', u'z'), + (0x1D434, 'M', u'a'), + (0x1D435, 'M', u'b'), + (0x1D436, 'M', u'c'), + (0x1D437, 'M', u'd'), + (0x1D438, 'M', u'e'), + (0x1D439, 'M', u'f'), + (0x1D43A, 'M', u'g'), + (0x1D43B, 'M', u'h'), + (0x1D43C, 'M', u'i'), + (0x1D43D, 'M', u'j'), + (0x1D43E, 'M', u'k'), + (0x1D43F, 'M', u'l'), + (0x1D440, 'M', u'm'), + (0x1D441, 'M', u'n'), + (0x1D442, 'M', u'o'), + (0x1D443, 'M', u'p'), + (0x1D444, 'M', u'q'), + (0x1D445, 'M', u'r'), + (0x1D446, 'M', u's'), + (0x1D447, 'M', u't'), + (0x1D448, 'M', u'u'), + (0x1D449, 'M', u'v'), + (0x1D44A, 'M', u'w'), + (0x1D44B, 'M', u'x'), + (0x1D44C, 'M', u'y'), + (0x1D44D, 'M', u'z'), + (0x1D44E, 'M', u'a'), + (0x1D44F, 'M', u'b'), + (0x1D450, 'M', u'c'), + (0x1D451, 'M', u'd'), + (0x1D452, 'M', u'e'), + (0x1D453, 'M', u'f'), + (0x1D454, 'M', u'g'), + (0x1D455, 'X'), + (0x1D456, 'M', u'i'), + (0x1D457, 'M', u'j'), + (0x1D458, 'M', u'k'), + (0x1D459, 'M', u'l'), + (0x1D45A, 'M', u'm'), + (0x1D45B, 'M', u'n'), + (0x1D45C, 'M', u'o'), + (0x1D45D, 'M', u'p'), + (0x1D45E, 'M', u'q'), + (0x1D45F, 'M', u'r'), + (0x1D460, 'M', u's'), + (0x1D461, 'M', u't'), + (0x1D462, 'M', u'u'), + (0x1D463, 'M', u'v'), + (0x1D464, 'M', u'w'), + (0x1D465, 'M', u'x'), + (0x1D466, 'M', u'y'), + (0x1D467, 'M', u'z'), + (0x1D468, 'M', u'a'), + (0x1D469, 'M', u'b'), + (0x1D46A, 'M', u'c'), + ] + +def _seg_60(): + return [ + (0x1D46B, 'M', u'd'), + (0x1D46C, 'M', u'e'), + (0x1D46D, 'M', u'f'), + (0x1D46E, 'M', u'g'), + (0x1D46F, 'M', u'h'), + (0x1D470, 'M', u'i'), + (0x1D471, 'M', u'j'), + (0x1D472, 'M', u'k'), + (0x1D473, 'M', u'l'), + (0x1D474, 'M', u'm'), + (0x1D475, 'M', u'n'), + (0x1D476, 'M', u'o'), + (0x1D477, 'M', u'p'), + (0x1D478, 'M', u'q'), + (0x1D479, 'M', u'r'), + (0x1D47A, 'M', u's'), + (0x1D47B, 'M', u't'), + (0x1D47C, 'M', u'u'), + (0x1D47D, 'M', u'v'), + (0x1D47E, 'M', u'w'), + (0x1D47F, 'M', u'x'), + (0x1D480, 'M', u'y'), + (0x1D481, 'M', u'z'), + (0x1D482, 'M', u'a'), + (0x1D483, 'M', u'b'), + (0x1D484, 'M', u'c'), + (0x1D485, 'M', u'd'), + (0x1D486, 'M', u'e'), + (0x1D487, 'M', u'f'), + (0x1D488, 'M', u'g'), + (0x1D489, 'M', u'h'), + (0x1D48A, 'M', u'i'), + (0x1D48B, 'M', u'j'), + (0x1D48C, 'M', u'k'), + (0x1D48D, 'M', u'l'), + (0x1D48E, 'M', u'm'), + (0x1D48F, 'M', u'n'), + (0x1D490, 'M', u'o'), + (0x1D491, 'M', u'p'), + (0x1D492, 'M', u'q'), + (0x1D493, 'M', u'r'), + (0x1D494, 'M', u's'), + (0x1D495, 'M', u't'), + (0x1D496, 'M', u'u'), + (0x1D497, 'M', u'v'), + (0x1D498, 'M', u'w'), + (0x1D499, 'M', u'x'), + (0x1D49A, 'M', u'y'), + (0x1D49B, 'M', u'z'), + (0x1D49C, 'M', u'a'), + (0x1D49D, 'X'), + (0x1D49E, 'M', u'c'), + (0x1D49F, 'M', u'd'), + (0x1D4A0, 'X'), + (0x1D4A2, 'M', u'g'), + (0x1D4A3, 'X'), + (0x1D4A5, 'M', u'j'), + (0x1D4A6, 'M', u'k'), + (0x1D4A7, 'X'), + (0x1D4A9, 'M', u'n'), + (0x1D4AA, 'M', u'o'), + (0x1D4AB, 'M', u'p'), + (0x1D4AC, 'M', u'q'), + (0x1D4AD, 'X'), + (0x1D4AE, 'M', u's'), + (0x1D4AF, 'M', u't'), + (0x1D4B0, 'M', u'u'), + (0x1D4B1, 'M', u'v'), + (0x1D4B2, 'M', u'w'), + (0x1D4B3, 'M', u'x'), + (0x1D4B4, 'M', u'y'), + (0x1D4B5, 'M', u'z'), + (0x1D4B6, 'M', u'a'), + (0x1D4B7, 'M', u'b'), + (0x1D4B8, 'M', u'c'), + (0x1D4B9, 'M', u'd'), + (0x1D4BA, 'X'), + (0x1D4BB, 'M', u'f'), + (0x1D4BC, 'X'), + (0x1D4BD, 'M', u'h'), + (0x1D4BE, 'M', u'i'), + (0x1D4BF, 'M', u'j'), + (0x1D4C0, 'M', u'k'), + (0x1D4C1, 'M', u'l'), + (0x1D4C2, 'M', u'm'), + (0x1D4C3, 'M', u'n'), + (0x1D4C4, 'X'), + (0x1D4C5, 'M', u'p'), + (0x1D4C6, 'M', u'q'), + (0x1D4C7, 'M', u'r'), + (0x1D4C8, 'M', u's'), + (0x1D4C9, 'M', u't'), + (0x1D4CA, 'M', u'u'), + (0x1D4CB, 'M', u'v'), + (0x1D4CC, 'M', u'w'), + (0x1D4CD, 'M', u'x'), + (0x1D4CE, 'M', u'y'), + (0x1D4CF, 'M', u'z'), + (0x1D4D0, 'M', u'a'), + (0x1D4D1, 'M', u'b'), + ] + +def _seg_61(): + return [ + (0x1D4D2, 'M', u'c'), + (0x1D4D3, 'M', u'd'), + (0x1D4D4, 'M', u'e'), + (0x1D4D5, 'M', u'f'), + (0x1D4D6, 'M', u'g'), + (0x1D4D7, 'M', u'h'), + (0x1D4D8, 'M', u'i'), + (0x1D4D9, 'M', u'j'), + (0x1D4DA, 'M', u'k'), + (0x1D4DB, 'M', u'l'), + (0x1D4DC, 'M', u'm'), + (0x1D4DD, 'M', u'n'), + (0x1D4DE, 'M', u'o'), + (0x1D4DF, 'M', u'p'), + (0x1D4E0, 'M', u'q'), + (0x1D4E1, 'M', u'r'), + (0x1D4E2, 'M', u's'), + (0x1D4E3, 'M', u't'), + (0x1D4E4, 'M', u'u'), + (0x1D4E5, 'M', u'v'), + (0x1D4E6, 'M', u'w'), + (0x1D4E7, 'M', u'x'), + (0x1D4E8, 'M', u'y'), + (0x1D4E9, 'M', u'z'), + (0x1D4EA, 'M', u'a'), + (0x1D4EB, 'M', u'b'), + (0x1D4EC, 'M', u'c'), + (0x1D4ED, 'M', u'd'), + (0x1D4EE, 'M', u'e'), + (0x1D4EF, 'M', u'f'), + (0x1D4F0, 'M', u'g'), + (0x1D4F1, 'M', u'h'), + (0x1D4F2, 'M', u'i'), + (0x1D4F3, 'M', u'j'), + (0x1D4F4, 'M', u'k'), + (0x1D4F5, 'M', u'l'), + (0x1D4F6, 'M', u'm'), + (0x1D4F7, 'M', u'n'), + (0x1D4F8, 'M', u'o'), + (0x1D4F9, 'M', u'p'), + (0x1D4FA, 'M', u'q'), + (0x1D4FB, 'M', u'r'), + (0x1D4FC, 'M', u's'), + (0x1D4FD, 'M', u't'), + (0x1D4FE, 'M', u'u'), + (0x1D4FF, 'M', u'v'), + (0x1D500, 'M', u'w'), + (0x1D501, 'M', u'x'), + (0x1D502, 'M', u'y'), + (0x1D503, 'M', u'z'), + (0x1D504, 'M', u'a'), + (0x1D505, 'M', u'b'), + (0x1D506, 'X'), + (0x1D507, 'M', u'd'), + (0x1D508, 'M', u'e'), + (0x1D509, 'M', u'f'), + (0x1D50A, 'M', u'g'), + (0x1D50B, 'X'), + (0x1D50D, 'M', u'j'), + (0x1D50E, 'M', u'k'), + (0x1D50F, 'M', u'l'), + (0x1D510, 'M', u'm'), + (0x1D511, 'M', u'n'), + (0x1D512, 'M', u'o'), + (0x1D513, 'M', u'p'), + (0x1D514, 'M', u'q'), + (0x1D515, 'X'), + (0x1D516, 'M', u's'), + (0x1D517, 'M', u't'), + (0x1D518, 'M', u'u'), + (0x1D519, 'M', u'v'), + (0x1D51A, 'M', u'w'), + (0x1D51B, 'M', u'x'), + (0x1D51C, 'M', u'y'), + (0x1D51D, 'X'), + (0x1D51E, 'M', u'a'), + (0x1D51F, 'M', u'b'), + (0x1D520, 'M', u'c'), + (0x1D521, 'M', u'd'), + (0x1D522, 'M', u'e'), + (0x1D523, 'M', u'f'), + (0x1D524, 'M', u'g'), + (0x1D525, 'M', u'h'), + (0x1D526, 'M', u'i'), + (0x1D527, 'M', u'j'), + (0x1D528, 'M', u'k'), + (0x1D529, 'M', u'l'), + (0x1D52A, 'M', u'm'), + (0x1D52B, 'M', u'n'), + (0x1D52C, 'M', u'o'), + (0x1D52D, 'M', u'p'), + (0x1D52E, 'M', u'q'), + (0x1D52F, 'M', u'r'), + (0x1D530, 'M', u's'), + (0x1D531, 'M', u't'), + (0x1D532, 'M', u'u'), + (0x1D533, 'M', u'v'), + (0x1D534, 'M', u'w'), + (0x1D535, 'M', u'x'), + (0x1D536, 'M', u'y'), + ] + +def _seg_62(): + return [ + (0x1D537, 'M', u'z'), + (0x1D538, 'M', u'a'), + (0x1D539, 'M', u'b'), + (0x1D53A, 'X'), + (0x1D53B, 'M', u'd'), + (0x1D53C, 'M', u'e'), + (0x1D53D, 'M', u'f'), + (0x1D53E, 'M', u'g'), + (0x1D53F, 'X'), + (0x1D540, 'M', u'i'), + (0x1D541, 'M', u'j'), + (0x1D542, 'M', u'k'), + (0x1D543, 'M', u'l'), + (0x1D544, 'M', u'm'), + (0x1D545, 'X'), + (0x1D546, 'M', u'o'), + (0x1D547, 'X'), + (0x1D54A, 'M', u's'), + (0x1D54B, 'M', u't'), + (0x1D54C, 'M', u'u'), + (0x1D54D, 'M', u'v'), + (0x1D54E, 'M', u'w'), + (0x1D54F, 'M', u'x'), + (0x1D550, 'M', u'y'), + (0x1D551, 'X'), + (0x1D552, 'M', u'a'), + (0x1D553, 'M', u'b'), + (0x1D554, 'M', u'c'), + (0x1D555, 'M', u'd'), + (0x1D556, 'M', u'e'), + (0x1D557, 'M', u'f'), + (0x1D558, 'M', u'g'), + (0x1D559, 'M', u'h'), + (0x1D55A, 'M', u'i'), + (0x1D55B, 'M', u'j'), + (0x1D55C, 'M', u'k'), + (0x1D55D, 'M', u'l'), + (0x1D55E, 'M', u'm'), + (0x1D55F, 'M', u'n'), + (0x1D560, 'M', u'o'), + (0x1D561, 'M', u'p'), + (0x1D562, 'M', u'q'), + (0x1D563, 'M', u'r'), + (0x1D564, 'M', u's'), + (0x1D565, 'M', u't'), + (0x1D566, 'M', u'u'), + (0x1D567, 'M', u'v'), + (0x1D568, 'M', u'w'), + (0x1D569, 'M', u'x'), + (0x1D56A, 'M', u'y'), + (0x1D56B, 'M', u'z'), + (0x1D56C, 'M', u'a'), + (0x1D56D, 'M', u'b'), + (0x1D56E, 'M', u'c'), + (0x1D56F, 'M', u'd'), + (0x1D570, 'M', u'e'), + (0x1D571, 'M', u'f'), + (0x1D572, 'M', u'g'), + (0x1D573, 'M', u'h'), + (0x1D574, 'M', u'i'), + (0x1D575, 'M', u'j'), + (0x1D576, 'M', u'k'), + (0x1D577, 'M', u'l'), + (0x1D578, 'M', u'm'), + (0x1D579, 'M', u'n'), + (0x1D57A, 'M', u'o'), + (0x1D57B, 'M', u'p'), + (0x1D57C, 'M', u'q'), + (0x1D57D, 'M', u'r'), + (0x1D57E, 'M', u's'), + (0x1D57F, 'M', u't'), + (0x1D580, 'M', u'u'), + (0x1D581, 'M', u'v'), + (0x1D582, 'M', u'w'), + (0x1D583, 'M', u'x'), + (0x1D584, 'M', u'y'), + (0x1D585, 'M', u'z'), + (0x1D586, 'M', u'a'), + (0x1D587, 'M', u'b'), + (0x1D588, 'M', u'c'), + (0x1D589, 'M', u'd'), + (0x1D58A, 'M', u'e'), + (0x1D58B, 'M', u'f'), + (0x1D58C, 'M', u'g'), + (0x1D58D, 'M', u'h'), + (0x1D58E, 'M', u'i'), + (0x1D58F, 'M', u'j'), + (0x1D590, 'M', u'k'), + (0x1D591, 'M', u'l'), + (0x1D592, 'M', u'm'), + (0x1D593, 'M', u'n'), + (0x1D594, 'M', u'o'), + (0x1D595, 'M', u'p'), + (0x1D596, 'M', u'q'), + (0x1D597, 'M', u'r'), + (0x1D598, 'M', u's'), + (0x1D599, 'M', u't'), + (0x1D59A, 'M', u'u'), + (0x1D59B, 'M', u'v'), + (0x1D59C, 'M', u'w'), + ] + +def _seg_63(): + return [ + (0x1D59D, 'M', u'x'), + (0x1D59E, 'M', u'y'), + (0x1D59F, 'M', u'z'), + (0x1D5A0, 'M', u'a'), + (0x1D5A1, 'M', u'b'), + (0x1D5A2, 'M', u'c'), + (0x1D5A3, 'M', u'd'), + (0x1D5A4, 'M', u'e'), + (0x1D5A5, 'M', u'f'), + (0x1D5A6, 'M', u'g'), + (0x1D5A7, 'M', u'h'), + (0x1D5A8, 'M', u'i'), + (0x1D5A9, 'M', u'j'), + (0x1D5AA, 'M', u'k'), + (0x1D5AB, 'M', u'l'), + (0x1D5AC, 'M', u'm'), + (0x1D5AD, 'M', u'n'), + (0x1D5AE, 'M', u'o'), + (0x1D5AF, 'M', u'p'), + (0x1D5B0, 'M', u'q'), + (0x1D5B1, 'M', u'r'), + (0x1D5B2, 'M', u's'), + (0x1D5B3, 'M', u't'), + (0x1D5B4, 'M', u'u'), + (0x1D5B5, 'M', u'v'), + (0x1D5B6, 'M', u'w'), + (0x1D5B7, 'M', u'x'), + (0x1D5B8, 'M', u'y'), + (0x1D5B9, 'M', u'z'), + (0x1D5BA, 'M', u'a'), + (0x1D5BB, 'M', u'b'), + (0x1D5BC, 'M', u'c'), + (0x1D5BD, 'M', u'd'), + (0x1D5BE, 'M', u'e'), + (0x1D5BF, 'M', u'f'), + (0x1D5C0, 'M', u'g'), + (0x1D5C1, 'M', u'h'), + (0x1D5C2, 'M', u'i'), + (0x1D5C3, 'M', u'j'), + (0x1D5C4, 'M', u'k'), + (0x1D5C5, 'M', u'l'), + (0x1D5C6, 'M', u'm'), + (0x1D5C7, 'M', u'n'), + (0x1D5C8, 'M', u'o'), + (0x1D5C9, 'M', u'p'), + (0x1D5CA, 'M', u'q'), + (0x1D5CB, 'M', u'r'), + (0x1D5CC, 'M', u's'), + (0x1D5CD, 'M', u't'), + (0x1D5CE, 'M', u'u'), + (0x1D5CF, 'M', u'v'), + (0x1D5D0, 'M', u'w'), + (0x1D5D1, 'M', u'x'), + (0x1D5D2, 'M', u'y'), + (0x1D5D3, 'M', u'z'), + (0x1D5D4, 'M', u'a'), + (0x1D5D5, 'M', u'b'), + (0x1D5D6, 'M', u'c'), + (0x1D5D7, 'M', u'd'), + (0x1D5D8, 'M', u'e'), + (0x1D5D9, 'M', u'f'), + (0x1D5DA, 'M', u'g'), + (0x1D5DB, 'M', u'h'), + (0x1D5DC, 'M', u'i'), + (0x1D5DD, 'M', u'j'), + (0x1D5DE, 'M', u'k'), + (0x1D5DF, 'M', u'l'), + (0x1D5E0, 'M', u'm'), + (0x1D5E1, 'M', u'n'), + (0x1D5E2, 'M', u'o'), + (0x1D5E3, 'M', u'p'), + (0x1D5E4, 'M', u'q'), + (0x1D5E5, 'M', u'r'), + (0x1D5E6, 'M', u's'), + (0x1D5E7, 'M', u't'), + (0x1D5E8, 'M', u'u'), + (0x1D5E9, 'M', u'v'), + (0x1D5EA, 'M', u'w'), + (0x1D5EB, 'M', u'x'), + (0x1D5EC, 'M', u'y'), + (0x1D5ED, 'M', u'z'), + (0x1D5EE, 'M', u'a'), + (0x1D5EF, 'M', u'b'), + (0x1D5F0, 'M', u'c'), + (0x1D5F1, 'M', u'd'), + (0x1D5F2, 'M', u'e'), + (0x1D5F3, 'M', u'f'), + (0x1D5F4, 'M', u'g'), + (0x1D5F5, 'M', u'h'), + (0x1D5F6, 'M', u'i'), + (0x1D5F7, 'M', u'j'), + (0x1D5F8, 'M', u'k'), + (0x1D5F9, 'M', u'l'), + (0x1D5FA, 'M', u'm'), + (0x1D5FB, 'M', u'n'), + (0x1D5FC, 'M', u'o'), + (0x1D5FD, 'M', u'p'), + (0x1D5FE, 'M', u'q'), + (0x1D5FF, 'M', u'r'), + (0x1D600, 'M', u's'), + ] + +def _seg_64(): + return [ + (0x1D601, 'M', u't'), + (0x1D602, 'M', u'u'), + (0x1D603, 'M', u'v'), + (0x1D604, 'M', u'w'), + (0x1D605, 'M', u'x'), + (0x1D606, 'M', u'y'), + (0x1D607, 'M', u'z'), + (0x1D608, 'M', u'a'), + (0x1D609, 'M', u'b'), + (0x1D60A, 'M', u'c'), + (0x1D60B, 'M', u'd'), + (0x1D60C, 'M', u'e'), + (0x1D60D, 'M', u'f'), + (0x1D60E, 'M', u'g'), + (0x1D60F, 'M', u'h'), + (0x1D610, 'M', u'i'), + (0x1D611, 'M', u'j'), + (0x1D612, 'M', u'k'), + (0x1D613, 'M', u'l'), + (0x1D614, 'M', u'm'), + (0x1D615, 'M', u'n'), + (0x1D616, 'M', u'o'), + (0x1D617, 'M', u'p'), + (0x1D618, 'M', u'q'), + (0x1D619, 'M', u'r'), + (0x1D61A, 'M', u's'), + (0x1D61B, 'M', u't'), + (0x1D61C, 'M', u'u'), + (0x1D61D, 'M', u'v'), + (0x1D61E, 'M', u'w'), + (0x1D61F, 'M', u'x'), + (0x1D620, 'M', u'y'), + (0x1D621, 'M', u'z'), + (0x1D622, 'M', u'a'), + (0x1D623, 'M', u'b'), + (0x1D624, 'M', u'c'), + (0x1D625, 'M', u'd'), + (0x1D626, 'M', u'e'), + (0x1D627, 'M', u'f'), + (0x1D628, 'M', u'g'), + (0x1D629, 'M', u'h'), + (0x1D62A, 'M', u'i'), + (0x1D62B, 'M', u'j'), + (0x1D62C, 'M', u'k'), + (0x1D62D, 'M', u'l'), + (0x1D62E, 'M', u'm'), + (0x1D62F, 'M', u'n'), + (0x1D630, 'M', u'o'), + (0x1D631, 'M', u'p'), + (0x1D632, 'M', u'q'), + (0x1D633, 'M', u'r'), + (0x1D634, 'M', u's'), + (0x1D635, 'M', u't'), + (0x1D636, 'M', u'u'), + (0x1D637, 'M', u'v'), + (0x1D638, 'M', u'w'), + (0x1D639, 'M', u'x'), + (0x1D63A, 'M', u'y'), + (0x1D63B, 'M', u'z'), + (0x1D63C, 'M', u'a'), + (0x1D63D, 'M', u'b'), + (0x1D63E, 'M', u'c'), + (0x1D63F, 'M', u'd'), + (0x1D640, 'M', u'e'), + (0x1D641, 'M', u'f'), + (0x1D642, 'M', u'g'), + (0x1D643, 'M', u'h'), + (0x1D644, 'M', u'i'), + (0x1D645, 'M', u'j'), + (0x1D646, 'M', u'k'), + (0x1D647, 'M', u'l'), + (0x1D648, 'M', u'm'), + (0x1D649, 'M', u'n'), + (0x1D64A, 'M', u'o'), + (0x1D64B, 'M', u'p'), + (0x1D64C, 'M', u'q'), + (0x1D64D, 'M', u'r'), + (0x1D64E, 'M', u's'), + (0x1D64F, 'M', u't'), + (0x1D650, 'M', u'u'), + (0x1D651, 'M', u'v'), + (0x1D652, 'M', u'w'), + (0x1D653, 'M', u'x'), + (0x1D654, 'M', u'y'), + (0x1D655, 'M', u'z'), + (0x1D656, 'M', u'a'), + (0x1D657, 'M', u'b'), + (0x1D658, 'M', u'c'), + (0x1D659, 'M', u'd'), + (0x1D65A, 'M', u'e'), + (0x1D65B, 'M', u'f'), + (0x1D65C, 'M', u'g'), + (0x1D65D, 'M', u'h'), + (0x1D65E, 'M', u'i'), + (0x1D65F, 'M', u'j'), + (0x1D660, 'M', u'k'), + (0x1D661, 'M', u'l'), + (0x1D662, 'M', u'm'), + (0x1D663, 'M', u'n'), + (0x1D664, 'M', u'o'), + ] + +def _seg_65(): + return [ + (0x1D665, 'M', u'p'), + (0x1D666, 'M', u'q'), + (0x1D667, 'M', u'r'), + (0x1D668, 'M', u's'), + (0x1D669, 'M', u't'), + (0x1D66A, 'M', u'u'), + (0x1D66B, 'M', u'v'), + (0x1D66C, 'M', u'w'), + (0x1D66D, 'M', u'x'), + (0x1D66E, 'M', u'y'), + (0x1D66F, 'M', u'z'), + (0x1D670, 'M', u'a'), + (0x1D671, 'M', u'b'), + (0x1D672, 'M', u'c'), + (0x1D673, 'M', u'd'), + (0x1D674, 'M', u'e'), + (0x1D675, 'M', u'f'), + (0x1D676, 'M', u'g'), + (0x1D677, 'M', u'h'), + (0x1D678, 'M', u'i'), + (0x1D679, 'M', u'j'), + (0x1D67A, 'M', u'k'), + (0x1D67B, 'M', u'l'), + (0x1D67C, 'M', u'm'), + (0x1D67D, 'M', u'n'), + (0x1D67E, 'M', u'o'), + (0x1D67F, 'M', u'p'), + (0x1D680, 'M', u'q'), + (0x1D681, 'M', u'r'), + (0x1D682, 'M', u's'), + (0x1D683, 'M', u't'), + (0x1D684, 'M', u'u'), + (0x1D685, 'M', u'v'), + (0x1D686, 'M', u'w'), + (0x1D687, 'M', u'x'), + (0x1D688, 'M', u'y'), + (0x1D689, 'M', u'z'), + (0x1D68A, 'M', u'a'), + (0x1D68B, 'M', u'b'), + (0x1D68C, 'M', u'c'), + (0x1D68D, 'M', u'd'), + (0x1D68E, 'M', u'e'), + (0x1D68F, 'M', u'f'), + (0x1D690, 'M', u'g'), + (0x1D691, 'M', u'h'), + (0x1D692, 'M', u'i'), + (0x1D693, 'M', u'j'), + (0x1D694, 'M', u'k'), + (0x1D695, 'M', u'l'), + (0x1D696, 'M', u'm'), + (0x1D697, 'M', u'n'), + (0x1D698, 'M', u'o'), + (0x1D699, 'M', u'p'), + (0x1D69A, 'M', u'q'), + (0x1D69B, 'M', u'r'), + (0x1D69C, 'M', u's'), + (0x1D69D, 'M', u't'), + (0x1D69E, 'M', u'u'), + (0x1D69F, 'M', u'v'), + (0x1D6A0, 'M', u'w'), + (0x1D6A1, 'M', u'x'), + (0x1D6A2, 'M', u'y'), + (0x1D6A3, 'M', u'z'), + (0x1D6A4, 'M', u'ı'), + (0x1D6A5, 'M', u'ȷ'), + (0x1D6A6, 'X'), + (0x1D6A8, 'M', u'α'), + (0x1D6A9, 'M', u'β'), + (0x1D6AA, 'M', u'γ'), + (0x1D6AB, 'M', u'δ'), + (0x1D6AC, 'M', u'ε'), + (0x1D6AD, 'M', u'ζ'), + (0x1D6AE, 'M', u'η'), + (0x1D6AF, 'M', u'θ'), + (0x1D6B0, 'M', u'ι'), + (0x1D6B1, 'M', u'κ'), + (0x1D6B2, 'M', u'λ'), + (0x1D6B3, 'M', u'μ'), + (0x1D6B4, 'M', u'ν'), + (0x1D6B5, 'M', u'ξ'), + (0x1D6B6, 'M', u'ο'), + (0x1D6B7, 'M', u'π'), + (0x1D6B8, 'M', u'ρ'), + (0x1D6B9, 'M', u'θ'), + (0x1D6BA, 'M', u'σ'), + (0x1D6BB, 'M', u'τ'), + (0x1D6BC, 'M', u'υ'), + (0x1D6BD, 'M', u'φ'), + (0x1D6BE, 'M', u'χ'), + (0x1D6BF, 'M', u'ψ'), + (0x1D6C0, 'M', u'ω'), + (0x1D6C1, 'M', u'∇'), + (0x1D6C2, 'M', u'α'), + (0x1D6C3, 'M', u'β'), + (0x1D6C4, 'M', u'γ'), + (0x1D6C5, 'M', u'δ'), + (0x1D6C6, 'M', u'ε'), + (0x1D6C7, 'M', u'ζ'), + (0x1D6C8, 'M', u'η'), + (0x1D6C9, 'M', u'θ'), + ] + +def _seg_66(): + return [ + (0x1D6CA, 'M', u'ι'), + (0x1D6CB, 'M', u'κ'), + (0x1D6CC, 'M', u'λ'), + (0x1D6CD, 'M', u'μ'), + (0x1D6CE, 'M', u'ν'), + (0x1D6CF, 'M', u'ξ'), + (0x1D6D0, 'M', u'ο'), + (0x1D6D1, 'M', u'π'), + (0x1D6D2, 'M', u'ρ'), + (0x1D6D3, 'M', u'σ'), + (0x1D6D5, 'M', u'τ'), + (0x1D6D6, 'M', u'υ'), + (0x1D6D7, 'M', u'φ'), + (0x1D6D8, 'M', u'χ'), + (0x1D6D9, 'M', u'ψ'), + (0x1D6DA, 'M', u'ω'), + (0x1D6DB, 'M', u'∂'), + (0x1D6DC, 'M', u'ε'), + (0x1D6DD, 'M', u'θ'), + (0x1D6DE, 'M', u'κ'), + (0x1D6DF, 'M', u'φ'), + (0x1D6E0, 'M', u'ρ'), + (0x1D6E1, 'M', u'π'), + (0x1D6E2, 'M', u'α'), + (0x1D6E3, 'M', u'β'), + (0x1D6E4, 'M', u'γ'), + (0x1D6E5, 'M', u'δ'), + (0x1D6E6, 'M', u'ε'), + (0x1D6E7, 'M', u'ζ'), + (0x1D6E8, 'M', u'η'), + (0x1D6E9, 'M', u'θ'), + (0x1D6EA, 'M', u'ι'), + (0x1D6EB, 'M', u'κ'), + (0x1D6EC, 'M', u'λ'), + (0x1D6ED, 'M', u'μ'), + (0x1D6EE, 'M', u'ν'), + (0x1D6EF, 'M', u'ξ'), + (0x1D6F0, 'M', u'ο'), + (0x1D6F1, 'M', u'π'), + (0x1D6F2, 'M', u'ρ'), + (0x1D6F3, 'M', u'θ'), + (0x1D6F4, 'M', u'σ'), + (0x1D6F5, 'M', u'τ'), + (0x1D6F6, 'M', u'υ'), + (0x1D6F7, 'M', u'φ'), + (0x1D6F8, 'M', u'χ'), + (0x1D6F9, 'M', u'ψ'), + (0x1D6FA, 'M', u'ω'), + (0x1D6FB, 'M', u'∇'), + (0x1D6FC, 'M', u'α'), + (0x1D6FD, 'M', u'β'), + (0x1D6FE, 'M', u'γ'), + (0x1D6FF, 'M', u'δ'), + (0x1D700, 'M', u'ε'), + (0x1D701, 'M', u'ζ'), + (0x1D702, 'M', u'η'), + (0x1D703, 'M', u'θ'), + (0x1D704, 'M', u'ι'), + (0x1D705, 'M', u'κ'), + (0x1D706, 'M', u'λ'), + (0x1D707, 'M', u'μ'), + (0x1D708, 'M', u'ν'), + (0x1D709, 'M', u'ξ'), + (0x1D70A, 'M', u'ο'), + (0x1D70B, 'M', u'π'), + (0x1D70C, 'M', u'ρ'), + (0x1D70D, 'M', u'σ'), + (0x1D70F, 'M', u'τ'), + (0x1D710, 'M', u'υ'), + (0x1D711, 'M', u'φ'), + (0x1D712, 'M', u'χ'), + (0x1D713, 'M', u'ψ'), + (0x1D714, 'M', u'ω'), + (0x1D715, 'M', u'∂'), + (0x1D716, 'M', u'ε'), + (0x1D717, 'M', u'θ'), + (0x1D718, 'M', u'κ'), + (0x1D719, 'M', u'φ'), + (0x1D71A, 'M', u'ρ'), + (0x1D71B, 'M', u'π'), + (0x1D71C, 'M', u'α'), + (0x1D71D, 'M', u'β'), + (0x1D71E, 'M', u'γ'), + (0x1D71F, 'M', u'δ'), + (0x1D720, 'M', u'ε'), + (0x1D721, 'M', u'ζ'), + (0x1D722, 'M', u'η'), + (0x1D723, 'M', u'θ'), + (0x1D724, 'M', u'ι'), + (0x1D725, 'M', u'κ'), + (0x1D726, 'M', u'λ'), + (0x1D727, 'M', u'μ'), + (0x1D728, 'M', u'ν'), + (0x1D729, 'M', u'ξ'), + (0x1D72A, 'M', u'ο'), + (0x1D72B, 'M', u'π'), + (0x1D72C, 'M', u'ρ'), + (0x1D72D, 'M', u'θ'), + (0x1D72E, 'M', u'σ'), + (0x1D72F, 'M', u'τ'), + ] + +def _seg_67(): + return [ + (0x1D730, 'M', u'υ'), + (0x1D731, 'M', u'φ'), + (0x1D732, 'M', u'χ'), + (0x1D733, 'M', u'ψ'), + (0x1D734, 'M', u'ω'), + (0x1D735, 'M', u'∇'), + (0x1D736, 'M', u'α'), + (0x1D737, 'M', u'β'), + (0x1D738, 'M', u'γ'), + (0x1D739, 'M', u'δ'), + (0x1D73A, 'M', u'ε'), + (0x1D73B, 'M', u'ζ'), + (0x1D73C, 'M', u'η'), + (0x1D73D, 'M', u'θ'), + (0x1D73E, 'M', u'ι'), + (0x1D73F, 'M', u'κ'), + (0x1D740, 'M', u'λ'), + (0x1D741, 'M', u'μ'), + (0x1D742, 'M', u'ν'), + (0x1D743, 'M', u'ξ'), + (0x1D744, 'M', u'ο'), + (0x1D745, 'M', u'π'), + (0x1D746, 'M', u'ρ'), + (0x1D747, 'M', u'σ'), + (0x1D749, 'M', u'τ'), + (0x1D74A, 'M', u'υ'), + (0x1D74B, 'M', u'φ'), + (0x1D74C, 'M', u'χ'), + (0x1D74D, 'M', u'ψ'), + (0x1D74E, 'M', u'ω'), + (0x1D74F, 'M', u'∂'), + (0x1D750, 'M', u'ε'), + (0x1D751, 'M', u'θ'), + (0x1D752, 'M', u'κ'), + (0x1D753, 'M', u'φ'), + (0x1D754, 'M', u'ρ'), + (0x1D755, 'M', u'π'), + (0x1D756, 'M', u'α'), + (0x1D757, 'M', u'β'), + (0x1D758, 'M', u'γ'), + (0x1D759, 'M', u'δ'), + (0x1D75A, 'M', u'ε'), + (0x1D75B, 'M', u'ζ'), + (0x1D75C, 'M', u'η'), + (0x1D75D, 'M', u'θ'), + (0x1D75E, 'M', u'ι'), + (0x1D75F, 'M', u'κ'), + (0x1D760, 'M', u'λ'), + (0x1D761, 'M', u'μ'), + (0x1D762, 'M', u'ν'), + (0x1D763, 'M', u'ξ'), + (0x1D764, 'M', u'ο'), + (0x1D765, 'M', u'π'), + (0x1D766, 'M', u'ρ'), + (0x1D767, 'M', u'θ'), + (0x1D768, 'M', u'σ'), + (0x1D769, 'M', u'τ'), + (0x1D76A, 'M', u'υ'), + (0x1D76B, 'M', u'φ'), + (0x1D76C, 'M', u'χ'), + (0x1D76D, 'M', u'ψ'), + (0x1D76E, 'M', u'ω'), + (0x1D76F, 'M', u'∇'), + (0x1D770, 'M', u'α'), + (0x1D771, 'M', u'β'), + (0x1D772, 'M', u'γ'), + (0x1D773, 'M', u'δ'), + (0x1D774, 'M', u'ε'), + (0x1D775, 'M', u'ζ'), + (0x1D776, 'M', u'η'), + (0x1D777, 'M', u'θ'), + (0x1D778, 'M', u'ι'), + (0x1D779, 'M', u'κ'), + (0x1D77A, 'M', u'λ'), + (0x1D77B, 'M', u'μ'), + (0x1D77C, 'M', u'ν'), + (0x1D77D, 'M', u'ξ'), + (0x1D77E, 'M', u'ο'), + (0x1D77F, 'M', u'π'), + (0x1D780, 'M', u'ρ'), + (0x1D781, 'M', u'σ'), + (0x1D783, 'M', u'τ'), + (0x1D784, 'M', u'υ'), + (0x1D785, 'M', u'φ'), + (0x1D786, 'M', u'χ'), + (0x1D787, 'M', u'ψ'), + (0x1D788, 'M', u'ω'), + (0x1D789, 'M', u'∂'), + (0x1D78A, 'M', u'ε'), + (0x1D78B, 'M', u'θ'), + (0x1D78C, 'M', u'κ'), + (0x1D78D, 'M', u'φ'), + (0x1D78E, 'M', u'ρ'), + (0x1D78F, 'M', u'π'), + (0x1D790, 'M', u'α'), + (0x1D791, 'M', u'β'), + (0x1D792, 'M', u'γ'), + (0x1D793, 'M', u'δ'), + (0x1D794, 'M', u'ε'), + (0x1D795, 'M', u'ζ'), + ] + +def _seg_68(): + return [ + (0x1D796, 'M', u'η'), + (0x1D797, 'M', u'θ'), + (0x1D798, 'M', u'ι'), + (0x1D799, 'M', u'κ'), + (0x1D79A, 'M', u'λ'), + (0x1D79B, 'M', u'μ'), + (0x1D79C, 'M', u'ν'), + (0x1D79D, 'M', u'ξ'), + (0x1D79E, 'M', u'ο'), + (0x1D79F, 'M', u'π'), + (0x1D7A0, 'M', u'ρ'), + (0x1D7A1, 'M', u'θ'), + (0x1D7A2, 'M', u'σ'), + (0x1D7A3, 'M', u'τ'), + (0x1D7A4, 'M', u'υ'), + (0x1D7A5, 'M', u'φ'), + (0x1D7A6, 'M', u'χ'), + (0x1D7A7, 'M', u'ψ'), + (0x1D7A8, 'M', u'ω'), + (0x1D7A9, 'M', u'∇'), + (0x1D7AA, 'M', u'α'), + (0x1D7AB, 'M', u'β'), + (0x1D7AC, 'M', u'γ'), + (0x1D7AD, 'M', u'δ'), + (0x1D7AE, 'M', u'ε'), + (0x1D7AF, 'M', u'ζ'), + (0x1D7B0, 'M', u'η'), + (0x1D7B1, 'M', u'θ'), + (0x1D7B2, 'M', u'ι'), + (0x1D7B3, 'M', u'κ'), + (0x1D7B4, 'M', u'λ'), + (0x1D7B5, 'M', u'μ'), + (0x1D7B6, 'M', u'ν'), + (0x1D7B7, 'M', u'ξ'), + (0x1D7B8, 'M', u'ο'), + (0x1D7B9, 'M', u'π'), + (0x1D7BA, 'M', u'ρ'), + (0x1D7BB, 'M', u'σ'), + (0x1D7BD, 'M', u'τ'), + (0x1D7BE, 'M', u'υ'), + (0x1D7BF, 'M', u'φ'), + (0x1D7C0, 'M', u'χ'), + (0x1D7C1, 'M', u'ψ'), + (0x1D7C2, 'M', u'ω'), + (0x1D7C3, 'M', u'∂'), + (0x1D7C4, 'M', u'ε'), + (0x1D7C5, 'M', u'θ'), + (0x1D7C6, 'M', u'κ'), + (0x1D7C7, 'M', u'φ'), + (0x1D7C8, 'M', u'ρ'), + (0x1D7C9, 'M', u'π'), + (0x1D7CA, 'M', u'ϝ'), + (0x1D7CC, 'X'), + (0x1D7CE, 'M', u'0'), + (0x1D7CF, 'M', u'1'), + (0x1D7D0, 'M', u'2'), + (0x1D7D1, 'M', u'3'), + (0x1D7D2, 'M', u'4'), + (0x1D7D3, 'M', u'5'), + (0x1D7D4, 'M', u'6'), + (0x1D7D5, 'M', u'7'), + (0x1D7D6, 'M', u'8'), + (0x1D7D7, 'M', u'9'), + (0x1D7D8, 'M', u'0'), + (0x1D7D9, 'M', u'1'), + (0x1D7DA, 'M', u'2'), + (0x1D7DB, 'M', u'3'), + (0x1D7DC, 'M', u'4'), + (0x1D7DD, 'M', u'5'), + (0x1D7DE, 'M', u'6'), + (0x1D7DF, 'M', u'7'), + (0x1D7E0, 'M', u'8'), + (0x1D7E1, 'M', u'9'), + (0x1D7E2, 'M', u'0'), + (0x1D7E3, 'M', u'1'), + (0x1D7E4, 'M', u'2'), + (0x1D7E5, 'M', u'3'), + (0x1D7E6, 'M', u'4'), + (0x1D7E7, 'M', u'5'), + (0x1D7E8, 'M', u'6'), + (0x1D7E9, 'M', u'7'), + (0x1D7EA, 'M', u'8'), + (0x1D7EB, 'M', u'9'), + (0x1D7EC, 'M', u'0'), + (0x1D7ED, 'M', u'1'), + (0x1D7EE, 'M', u'2'), + (0x1D7EF, 'M', u'3'), + (0x1D7F0, 'M', u'4'), + (0x1D7F1, 'M', u'5'), + (0x1D7F2, 'M', u'6'), + (0x1D7F3, 'M', u'7'), + (0x1D7F4, 'M', u'8'), + (0x1D7F5, 'M', u'9'), + (0x1D7F6, 'M', u'0'), + (0x1D7F7, 'M', u'1'), + (0x1D7F8, 'M', u'2'), + (0x1D7F9, 'M', u'3'), + (0x1D7FA, 'M', u'4'), + (0x1D7FB, 'M', u'5'), + (0x1D7FC, 'M', u'6'), + ] + +def _seg_69(): + return [ + (0x1D7FD, 'M', u'7'), + (0x1D7FE, 'M', u'8'), + (0x1D7FF, 'M', u'9'), + (0x1D800, 'V'), + (0x1DA8C, 'X'), + (0x1DA9B, 'V'), + (0x1DAA0, 'X'), + (0x1DAA1, 'V'), + (0x1DAB0, 'X'), + (0x1E000, 'V'), + (0x1E007, 'X'), + (0x1E008, 'V'), + (0x1E019, 'X'), + (0x1E01B, 'V'), + (0x1E022, 'X'), + (0x1E023, 'V'), + (0x1E025, 'X'), + (0x1E026, 'V'), + (0x1E02B, 'X'), + (0x1E100, 'V'), + (0x1E12D, 'X'), + (0x1E130, 'V'), + (0x1E13E, 'X'), + (0x1E140, 'V'), + (0x1E14A, 'X'), + (0x1E14E, 'V'), + (0x1E150, 'X'), + (0x1E2C0, 'V'), + (0x1E2FA, 'X'), + (0x1E2FF, 'V'), + (0x1E300, 'X'), + (0x1E800, 'V'), + (0x1E8C5, 'X'), + (0x1E8C7, 'V'), + (0x1E8D7, 'X'), + (0x1E900, 'M', u'𞤢'), + (0x1E901, 'M', u'𞤣'), + (0x1E902, 'M', u'𞤤'), + (0x1E903, 'M', u'𞤥'), + (0x1E904, 'M', u'𞤦'), + (0x1E905, 'M', u'𞤧'), + (0x1E906, 'M', u'𞤨'), + (0x1E907, 'M', u'𞤩'), + (0x1E908, 'M', u'𞤪'), + (0x1E909, 'M', u'𞤫'), + (0x1E90A, 'M', u'𞤬'), + (0x1E90B, 'M', u'𞤭'), + (0x1E90C, 'M', u'𞤮'), + (0x1E90D, 'M', u'𞤯'), + (0x1E90E, 'M', u'𞤰'), + (0x1E90F, 'M', u'𞤱'), + (0x1E910, 'M', u'𞤲'), + (0x1E911, 'M', u'𞤳'), + (0x1E912, 'M', u'𞤴'), + (0x1E913, 'M', u'𞤵'), + (0x1E914, 'M', u'𞤶'), + (0x1E915, 'M', u'𞤷'), + (0x1E916, 'M', u'𞤸'), + (0x1E917, 'M', u'𞤹'), + (0x1E918, 'M', u'𞤺'), + (0x1E919, 'M', u'𞤻'), + (0x1E91A, 'M', u'𞤼'), + (0x1E91B, 'M', u'𞤽'), + (0x1E91C, 'M', u'𞤾'), + (0x1E91D, 'M', u'𞤿'), + (0x1E91E, 'M', u'𞥀'), + (0x1E91F, 'M', u'𞥁'), + (0x1E920, 'M', u'𞥂'), + (0x1E921, 'M', u'𞥃'), + (0x1E922, 'V'), + (0x1E94C, 'X'), + (0x1E950, 'V'), + (0x1E95A, 'X'), + (0x1E95E, 'V'), + (0x1E960, 'X'), + (0x1EC71, 'V'), + (0x1ECB5, 'X'), + (0x1ED01, 'V'), + (0x1ED3E, 'X'), + (0x1EE00, 'M', u'ا'), + (0x1EE01, 'M', u'ب'), + (0x1EE02, 'M', u'ج'), + (0x1EE03, 'M', u'د'), + (0x1EE04, 'X'), + (0x1EE05, 'M', u'و'), + (0x1EE06, 'M', u'ز'), + (0x1EE07, 'M', u'ح'), + (0x1EE08, 'M', u'ط'), + (0x1EE09, 'M', u'ي'), + (0x1EE0A, 'M', u'ك'), + (0x1EE0B, 'M', u'ل'), + (0x1EE0C, 'M', u'م'), + (0x1EE0D, 'M', u'ن'), + (0x1EE0E, 'M', u'س'), + (0x1EE0F, 'M', u'ع'), + (0x1EE10, 'M', u'ف'), + (0x1EE11, 'M', u'ص'), + (0x1EE12, 'M', u'ق'), + (0x1EE13, 'M', u'ر'), + (0x1EE14, 'M', u'ش'), + ] + +def _seg_70(): + return [ + (0x1EE15, 'M', u'ت'), + (0x1EE16, 'M', u'ث'), + (0x1EE17, 'M', u'خ'), + (0x1EE18, 'M', u'ذ'), + (0x1EE19, 'M', u'ض'), + (0x1EE1A, 'M', u'ظ'), + (0x1EE1B, 'M', u'غ'), + (0x1EE1C, 'M', u'ٮ'), + (0x1EE1D, 'M', u'ں'), + (0x1EE1E, 'M', u'ڡ'), + (0x1EE1F, 'M', u'ٯ'), + (0x1EE20, 'X'), + (0x1EE21, 'M', u'ب'), + (0x1EE22, 'M', u'ج'), + (0x1EE23, 'X'), + (0x1EE24, 'M', u'ه'), + (0x1EE25, 'X'), + (0x1EE27, 'M', u'ح'), + (0x1EE28, 'X'), + (0x1EE29, 'M', u'ي'), + (0x1EE2A, 'M', u'ك'), + (0x1EE2B, 'M', u'ل'), + (0x1EE2C, 'M', u'م'), + (0x1EE2D, 'M', u'ن'), + (0x1EE2E, 'M', u'س'), + (0x1EE2F, 'M', u'ع'), + (0x1EE30, 'M', u'ف'), + (0x1EE31, 'M', u'ص'), + (0x1EE32, 'M', u'ق'), + (0x1EE33, 'X'), + (0x1EE34, 'M', u'ش'), + (0x1EE35, 'M', u'ت'), + (0x1EE36, 'M', u'ث'), + (0x1EE37, 'M', u'خ'), + (0x1EE38, 'X'), + (0x1EE39, 'M', u'ض'), + (0x1EE3A, 'X'), + (0x1EE3B, 'M', u'غ'), + (0x1EE3C, 'X'), + (0x1EE42, 'M', u'ج'), + (0x1EE43, 'X'), + (0x1EE47, 'M', u'ح'), + (0x1EE48, 'X'), + (0x1EE49, 'M', u'ي'), + (0x1EE4A, 'X'), + (0x1EE4B, 'M', u'ل'), + (0x1EE4C, 'X'), + (0x1EE4D, 'M', u'ن'), + (0x1EE4E, 'M', u'س'), + (0x1EE4F, 'M', u'ع'), + (0x1EE50, 'X'), + (0x1EE51, 'M', u'ص'), + (0x1EE52, 'M', u'ق'), + (0x1EE53, 'X'), + (0x1EE54, 'M', u'ش'), + (0x1EE55, 'X'), + (0x1EE57, 'M', u'خ'), + (0x1EE58, 'X'), + (0x1EE59, 'M', u'ض'), + (0x1EE5A, 'X'), + (0x1EE5B, 'M', u'غ'), + (0x1EE5C, 'X'), + (0x1EE5D, 'M', u'ں'), + (0x1EE5E, 'X'), + (0x1EE5F, 'M', u'ٯ'), + (0x1EE60, 'X'), + (0x1EE61, 'M', u'ب'), + (0x1EE62, 'M', u'ج'), + (0x1EE63, 'X'), + (0x1EE64, 'M', u'ه'), + (0x1EE65, 'X'), + (0x1EE67, 'M', u'ح'), + (0x1EE68, 'M', u'ط'), + (0x1EE69, 'M', u'ي'), + (0x1EE6A, 'M', u'ك'), + (0x1EE6B, 'X'), + (0x1EE6C, 'M', u'م'), + (0x1EE6D, 'M', u'ن'), + (0x1EE6E, 'M', u'س'), + (0x1EE6F, 'M', u'ع'), + (0x1EE70, 'M', u'ف'), + (0x1EE71, 'M', u'ص'), + (0x1EE72, 'M', u'ق'), + (0x1EE73, 'X'), + (0x1EE74, 'M', u'ش'), + (0x1EE75, 'M', u'ت'), + (0x1EE76, 'M', u'ث'), + (0x1EE77, 'M', u'خ'), + (0x1EE78, 'X'), + (0x1EE79, 'M', u'ض'), + (0x1EE7A, 'M', u'ظ'), + (0x1EE7B, 'M', u'غ'), + (0x1EE7C, 'M', u'ٮ'), + (0x1EE7D, 'X'), + (0x1EE7E, 'M', u'ڡ'), + (0x1EE7F, 'X'), + (0x1EE80, 'M', u'ا'), + (0x1EE81, 'M', u'ب'), + (0x1EE82, 'M', u'ج'), + (0x1EE83, 'M', u'د'), + ] + +def _seg_71(): + return [ + (0x1EE84, 'M', u'ه'), + (0x1EE85, 'M', u'و'), + (0x1EE86, 'M', u'ز'), + (0x1EE87, 'M', u'ح'), + (0x1EE88, 'M', u'ط'), + (0x1EE89, 'M', u'ي'), + (0x1EE8A, 'X'), + (0x1EE8B, 'M', u'ل'), + (0x1EE8C, 'M', u'م'), + (0x1EE8D, 'M', u'ن'), + (0x1EE8E, 'M', u'س'), + (0x1EE8F, 'M', u'ع'), + (0x1EE90, 'M', u'ف'), + (0x1EE91, 'M', u'ص'), + (0x1EE92, 'M', u'ق'), + (0x1EE93, 'M', u'ر'), + (0x1EE94, 'M', u'ش'), + (0x1EE95, 'M', u'ت'), + (0x1EE96, 'M', u'ث'), + (0x1EE97, 'M', u'خ'), + (0x1EE98, 'M', u'ذ'), + (0x1EE99, 'M', u'ض'), + (0x1EE9A, 'M', u'ظ'), + (0x1EE9B, 'M', u'غ'), + (0x1EE9C, 'X'), + (0x1EEA1, 'M', u'ب'), + (0x1EEA2, 'M', u'ج'), + (0x1EEA3, 'M', u'د'), + (0x1EEA4, 'X'), + (0x1EEA5, 'M', u'و'), + (0x1EEA6, 'M', u'ز'), + (0x1EEA7, 'M', u'ح'), + (0x1EEA8, 'M', u'ط'), + (0x1EEA9, 'M', u'ي'), + (0x1EEAA, 'X'), + (0x1EEAB, 'M', u'ل'), + (0x1EEAC, 'M', u'م'), + (0x1EEAD, 'M', u'ن'), + (0x1EEAE, 'M', u'س'), + (0x1EEAF, 'M', u'ع'), + (0x1EEB0, 'M', u'ف'), + (0x1EEB1, 'M', u'ص'), + (0x1EEB2, 'M', u'ق'), + (0x1EEB3, 'M', u'ر'), + (0x1EEB4, 'M', u'ش'), + (0x1EEB5, 'M', u'ت'), + (0x1EEB6, 'M', u'ث'), + (0x1EEB7, 'M', u'خ'), + (0x1EEB8, 'M', u'ذ'), + (0x1EEB9, 'M', u'ض'), + (0x1EEBA, 'M', u'ظ'), + (0x1EEBB, 'M', u'غ'), + (0x1EEBC, 'X'), + (0x1EEF0, 'V'), + (0x1EEF2, 'X'), + (0x1F000, 'V'), + (0x1F02C, 'X'), + (0x1F030, 'V'), + (0x1F094, 'X'), + (0x1F0A0, 'V'), + (0x1F0AF, 'X'), + (0x1F0B1, 'V'), + (0x1F0C0, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0F6, 'X'), + (0x1F101, '3', u'0,'), + (0x1F102, '3', u'1,'), + (0x1F103, '3', u'2,'), + (0x1F104, '3', u'3,'), + (0x1F105, '3', u'4,'), + (0x1F106, '3', u'5,'), + (0x1F107, '3', u'6,'), + (0x1F108, '3', u'7,'), + (0x1F109, '3', u'8,'), + (0x1F10A, '3', u'9,'), + (0x1F10B, 'V'), + (0x1F10D, 'X'), + (0x1F110, '3', u'(a)'), + (0x1F111, '3', u'(b)'), + (0x1F112, '3', u'(c)'), + (0x1F113, '3', u'(d)'), + (0x1F114, '3', u'(e)'), + (0x1F115, '3', u'(f)'), + (0x1F116, '3', u'(g)'), + (0x1F117, '3', u'(h)'), + (0x1F118, '3', u'(i)'), + (0x1F119, '3', u'(j)'), + (0x1F11A, '3', u'(k)'), + (0x1F11B, '3', u'(l)'), + (0x1F11C, '3', u'(m)'), + (0x1F11D, '3', u'(n)'), + (0x1F11E, '3', u'(o)'), + (0x1F11F, '3', u'(p)'), + (0x1F120, '3', u'(q)'), + (0x1F121, '3', u'(r)'), + (0x1F122, '3', u'(s)'), + (0x1F123, '3', u'(t)'), + (0x1F124, '3', u'(u)'), + ] + +def _seg_72(): + return [ + (0x1F125, '3', u'(v)'), + (0x1F126, '3', u'(w)'), + (0x1F127, '3', u'(x)'), + (0x1F128, '3', u'(y)'), + (0x1F129, '3', u'(z)'), + (0x1F12A, 'M', u'〔s〕'), + (0x1F12B, 'M', u'c'), + (0x1F12C, 'M', u'r'), + (0x1F12D, 'M', u'cd'), + (0x1F12E, 'M', u'wz'), + (0x1F12F, 'V'), + (0x1F130, 'M', u'a'), + (0x1F131, 'M', u'b'), + (0x1F132, 'M', u'c'), + (0x1F133, 'M', u'd'), + (0x1F134, 'M', u'e'), + (0x1F135, 'M', u'f'), + (0x1F136, 'M', u'g'), + (0x1F137, 'M', u'h'), + (0x1F138, 'M', u'i'), + (0x1F139, 'M', u'j'), + (0x1F13A, 'M', u'k'), + (0x1F13B, 'M', u'l'), + (0x1F13C, 'M', u'm'), + (0x1F13D, 'M', u'n'), + (0x1F13E, 'M', u'o'), + (0x1F13F, 'M', u'p'), + (0x1F140, 'M', u'q'), + (0x1F141, 'M', u'r'), + (0x1F142, 'M', u's'), + (0x1F143, 'M', u't'), + (0x1F144, 'M', u'u'), + (0x1F145, 'M', u'v'), + (0x1F146, 'M', u'w'), + (0x1F147, 'M', u'x'), + (0x1F148, 'M', u'y'), + (0x1F149, 'M', u'z'), + (0x1F14A, 'M', u'hv'), + (0x1F14B, 'M', u'mv'), + (0x1F14C, 'M', u'sd'), + (0x1F14D, 'M', u'ss'), + (0x1F14E, 'M', u'ppv'), + (0x1F14F, 'M', u'wc'), + (0x1F150, 'V'), + (0x1F16A, 'M', u'mc'), + (0x1F16B, 'M', u'md'), + (0x1F16C, 'M', u'mr'), + (0x1F16D, 'X'), + (0x1F170, 'V'), + (0x1F190, 'M', u'dj'), + (0x1F191, 'V'), + (0x1F1AD, 'X'), + (0x1F1E6, 'V'), + (0x1F200, 'M', u'ほか'), + (0x1F201, 'M', u'ココ'), + (0x1F202, 'M', u'サ'), + (0x1F203, 'X'), + (0x1F210, 'M', u'手'), + (0x1F211, 'M', u'字'), + (0x1F212, 'M', u'双'), + (0x1F213, 'M', u'デ'), + (0x1F214, 'M', u'二'), + (0x1F215, 'M', u'多'), + (0x1F216, 'M', u'解'), + (0x1F217, 'M', u'天'), + (0x1F218, 'M', u'交'), + (0x1F219, 'M', u'映'), + (0x1F21A, 'M', u'無'), + (0x1F21B, 'M', u'料'), + (0x1F21C, 'M', u'前'), + (0x1F21D, 'M', u'後'), + (0x1F21E, 'M', u'再'), + (0x1F21F, 'M', u'新'), + (0x1F220, 'M', u'初'), + (0x1F221, 'M', u'終'), + (0x1F222, 'M', u'生'), + (0x1F223, 'M', u'販'), + (0x1F224, 'M', u'声'), + (0x1F225, 'M', u'吹'), + (0x1F226, 'M', u'演'), + (0x1F227, 'M', u'投'), + (0x1F228, 'M', u'捕'), + (0x1F229, 'M', u'一'), + (0x1F22A, 'M', u'三'), + (0x1F22B, 'M', u'遊'), + (0x1F22C, 'M', u'左'), + (0x1F22D, 'M', u'中'), + (0x1F22E, 'M', u'右'), + (0x1F22F, 'M', u'指'), + (0x1F230, 'M', u'走'), + (0x1F231, 'M', u'打'), + (0x1F232, 'M', u'禁'), + (0x1F233, 'M', u'空'), + (0x1F234, 'M', u'合'), + (0x1F235, 'M', u'満'), + (0x1F236, 'M', u'有'), + (0x1F237, 'M', u'月'), + (0x1F238, 'M', u'申'), + (0x1F239, 'M', u'割'), + (0x1F23A, 'M', u'営'), + ] + +def _seg_73(): + return [ + (0x1F23B, 'M', u'配'), + (0x1F23C, 'X'), + (0x1F240, 'M', u'〔本〕'), + (0x1F241, 'M', u'〔三〕'), + (0x1F242, 'M', u'〔二〕'), + (0x1F243, 'M', u'〔安〕'), + (0x1F244, 'M', u'〔点〕'), + (0x1F245, 'M', u'〔打〕'), + (0x1F246, 'M', u'〔盗〕'), + (0x1F247, 'M', u'〔勝〕'), + (0x1F248, 'M', u'〔敗〕'), + (0x1F249, 'X'), + (0x1F250, 'M', u'得'), + (0x1F251, 'M', u'可'), + (0x1F252, 'X'), + (0x1F260, 'V'), + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D6, 'X'), + (0x1F6E0, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6FB, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x1F780, 'V'), + (0x1F7D9, 'X'), + (0x1F7E0, 'V'), + (0x1F7EC, 'X'), + (0x1F800, 'V'), + (0x1F80C, 'X'), + (0x1F810, 'V'), + (0x1F848, 'X'), + (0x1F850, 'V'), + (0x1F85A, 'X'), + (0x1F860, 'V'), + (0x1F888, 'X'), + (0x1F890, 'V'), + (0x1F8AE, 'X'), + (0x1F900, 'V'), + (0x1F90C, 'X'), + (0x1F90D, 'V'), + (0x1F972, 'X'), + (0x1F973, 'V'), + (0x1F977, 'X'), + (0x1F97A, 'V'), + (0x1F9A3, 'X'), + (0x1F9A5, 'V'), + (0x1F9AB, 'X'), + (0x1F9AE, 'V'), + (0x1F9CB, 'X'), + (0x1F9CD, 'V'), + (0x1FA54, 'X'), + (0x1FA60, 'V'), + (0x1FA6E, 'X'), + (0x1FA70, 'V'), + (0x1FA74, 'X'), + (0x1FA78, 'V'), + (0x1FA7B, 'X'), + (0x1FA80, 'V'), + (0x1FA83, 'X'), + (0x1FA90, 'V'), + (0x1FA96, 'X'), + (0x20000, 'V'), + (0x2A6D7, 'X'), + (0x2A700, 'V'), + (0x2B735, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2B820, 'V'), + (0x2CEA2, 'X'), + (0x2CEB0, 'V'), + (0x2EBE1, 'X'), + (0x2F800, 'M', u'丽'), + (0x2F801, 'M', u'丸'), + (0x2F802, 'M', u'乁'), + (0x2F803, 'M', u'𠄢'), + (0x2F804, 'M', u'你'), + (0x2F805, 'M', u'侮'), + (0x2F806, 'M', u'侻'), + (0x2F807, 'M', u'倂'), + (0x2F808, 'M', u'偺'), + (0x2F809, 'M', u'備'), + (0x2F80A, 'M', u'僧'), + (0x2F80B, 'M', u'像'), + (0x2F80C, 'M', u'㒞'), + (0x2F80D, 'M', u'𠘺'), + (0x2F80E, 'M', u'免'), + (0x2F80F, 'M', u'兔'), + (0x2F810, 'M', u'兤'), + (0x2F811, 'M', u'具'), + (0x2F812, 'M', u'𠔜'), + (0x2F813, 'M', u'㒹'), + (0x2F814, 'M', u'內'), + (0x2F815, 'M', u'再'), + (0x2F816, 'M', u'𠕋'), + (0x2F817, 'M', u'冗'), + (0x2F818, 'M', u'冤'), + (0x2F819, 'M', u'仌'), + (0x2F81A, 'M', u'冬'), + ] + +def _seg_74(): + return [ + (0x2F81B, 'M', u'况'), + (0x2F81C, 'M', u'𩇟'), + (0x2F81D, 'M', u'凵'), + (0x2F81E, 'M', u'刃'), + (0x2F81F, 'M', u'㓟'), + (0x2F820, 'M', u'刻'), + (0x2F821, 'M', u'剆'), + (0x2F822, 'M', u'割'), + (0x2F823, 'M', u'剷'), + (0x2F824, 'M', u'㔕'), + (0x2F825, 'M', u'勇'), + (0x2F826, 'M', u'勉'), + (0x2F827, 'M', u'勤'), + (0x2F828, 'M', u'勺'), + (0x2F829, 'M', u'包'), + (0x2F82A, 'M', u'匆'), + (0x2F82B, 'M', u'北'), + (0x2F82C, 'M', u'卉'), + (0x2F82D, 'M', u'卑'), + (0x2F82E, 'M', u'博'), + (0x2F82F, 'M', u'即'), + (0x2F830, 'M', u'卽'), + (0x2F831, 'M', u'卿'), + (0x2F834, 'M', u'𠨬'), + (0x2F835, 'M', u'灰'), + (0x2F836, 'M', u'及'), + (0x2F837, 'M', u'叟'), + (0x2F838, 'M', u'𠭣'), + (0x2F839, 'M', u'叫'), + (0x2F83A, 'M', u'叱'), + (0x2F83B, 'M', u'吆'), + (0x2F83C, 'M', u'咞'), + (0x2F83D, 'M', u'吸'), + (0x2F83E, 'M', u'呈'), + (0x2F83F, 'M', u'周'), + (0x2F840, 'M', u'咢'), + (0x2F841, 'M', u'哶'), + (0x2F842, 'M', u'唐'), + (0x2F843, 'M', u'啓'), + (0x2F844, 'M', u'啣'), + (0x2F845, 'M', u'善'), + (0x2F847, 'M', u'喙'), + (0x2F848, 'M', u'喫'), + (0x2F849, 'M', u'喳'), + (0x2F84A, 'M', u'嗂'), + (0x2F84B, 'M', u'圖'), + (0x2F84C, 'M', u'嘆'), + (0x2F84D, 'M', u'圗'), + (0x2F84E, 'M', u'噑'), + (0x2F84F, 'M', u'噴'), + (0x2F850, 'M', u'切'), + (0x2F851, 'M', u'壮'), + (0x2F852, 'M', u'城'), + (0x2F853, 'M', u'埴'), + (0x2F854, 'M', u'堍'), + (0x2F855, 'M', u'型'), + (0x2F856, 'M', u'堲'), + (0x2F857, 'M', u'報'), + (0x2F858, 'M', u'墬'), + (0x2F859, 'M', u'𡓤'), + (0x2F85A, 'M', u'売'), + (0x2F85B, 'M', u'壷'), + (0x2F85C, 'M', u'夆'), + (0x2F85D, 'M', u'多'), + (0x2F85E, 'M', u'夢'), + (0x2F85F, 'M', u'奢'), + (0x2F860, 'M', u'𡚨'), + (0x2F861, 'M', u'𡛪'), + (0x2F862, 'M', u'姬'), + (0x2F863, 'M', u'娛'), + (0x2F864, 'M', u'娧'), + (0x2F865, 'M', u'姘'), + (0x2F866, 'M', u'婦'), + (0x2F867, 'M', u'㛮'), + (0x2F868, 'X'), + (0x2F869, 'M', u'嬈'), + (0x2F86A, 'M', u'嬾'), + (0x2F86C, 'M', u'𡧈'), + (0x2F86D, 'M', u'寃'), + (0x2F86E, 'M', u'寘'), + (0x2F86F, 'M', u'寧'), + (0x2F870, 'M', u'寳'), + (0x2F871, 'M', u'𡬘'), + (0x2F872, 'M', u'寿'), + (0x2F873, 'M', u'将'), + (0x2F874, 'X'), + (0x2F875, 'M', u'尢'), + (0x2F876, 'M', u'㞁'), + (0x2F877, 'M', u'屠'), + (0x2F878, 'M', u'屮'), + (0x2F879, 'M', u'峀'), + (0x2F87A, 'M', u'岍'), + (0x2F87B, 'M', u'𡷤'), + (0x2F87C, 'M', u'嵃'), + (0x2F87D, 'M', u'𡷦'), + (0x2F87E, 'M', u'嵮'), + (0x2F87F, 'M', u'嵫'), + (0x2F880, 'M', u'嵼'), + (0x2F881, 'M', u'巡'), + (0x2F882, 'M', u'巢'), + ] + +def _seg_75(): + return [ + (0x2F883, 'M', u'㠯'), + (0x2F884, 'M', u'巽'), + (0x2F885, 'M', u'帨'), + (0x2F886, 'M', u'帽'), + (0x2F887, 'M', u'幩'), + (0x2F888, 'M', u'㡢'), + (0x2F889, 'M', u'𢆃'), + (0x2F88A, 'M', u'㡼'), + (0x2F88B, 'M', u'庰'), + (0x2F88C, 'M', u'庳'), + (0x2F88D, 'M', u'庶'), + (0x2F88E, 'M', u'廊'), + (0x2F88F, 'M', u'𪎒'), + (0x2F890, 'M', u'廾'), + (0x2F891, 'M', u'𢌱'), + (0x2F893, 'M', u'舁'), + (0x2F894, 'M', u'弢'), + (0x2F896, 'M', u'㣇'), + (0x2F897, 'M', u'𣊸'), + (0x2F898, 'M', u'𦇚'), + (0x2F899, 'M', u'形'), + (0x2F89A, 'M', u'彫'), + (0x2F89B, 'M', u'㣣'), + (0x2F89C, 'M', u'徚'), + (0x2F89D, 'M', u'忍'), + (0x2F89E, 'M', u'志'), + (0x2F89F, 'M', u'忹'), + (0x2F8A0, 'M', u'悁'), + (0x2F8A1, 'M', u'㤺'), + (0x2F8A2, 'M', u'㤜'), + (0x2F8A3, 'M', u'悔'), + (0x2F8A4, 'M', u'𢛔'), + (0x2F8A5, 'M', u'惇'), + (0x2F8A6, 'M', u'慈'), + (0x2F8A7, 'M', u'慌'), + (0x2F8A8, 'M', u'慎'), + (0x2F8A9, 'M', u'慌'), + (0x2F8AA, 'M', u'慺'), + (0x2F8AB, 'M', u'憎'), + (0x2F8AC, 'M', u'憲'), + (0x2F8AD, 'M', u'憤'), + (0x2F8AE, 'M', u'憯'), + (0x2F8AF, 'M', u'懞'), + (0x2F8B0, 'M', u'懲'), + (0x2F8B1, 'M', u'懶'), + (0x2F8B2, 'M', u'成'), + (0x2F8B3, 'M', u'戛'), + (0x2F8B4, 'M', u'扝'), + (0x2F8B5, 'M', u'抱'), + (0x2F8B6, 'M', u'拔'), + (0x2F8B7, 'M', u'捐'), + (0x2F8B8, 'M', u'𢬌'), + (0x2F8B9, 'M', u'挽'), + (0x2F8BA, 'M', u'拼'), + (0x2F8BB, 'M', u'捨'), + (0x2F8BC, 'M', u'掃'), + (0x2F8BD, 'M', u'揤'), + (0x2F8BE, 'M', u'𢯱'), + (0x2F8BF, 'M', u'搢'), + (0x2F8C0, 'M', u'揅'), + (0x2F8C1, 'M', u'掩'), + (0x2F8C2, 'M', u'㨮'), + (0x2F8C3, 'M', u'摩'), + (0x2F8C4, 'M', u'摾'), + (0x2F8C5, 'M', u'撝'), + (0x2F8C6, 'M', u'摷'), + (0x2F8C7, 'M', u'㩬'), + (0x2F8C8, 'M', u'敏'), + (0x2F8C9, 'M', u'敬'), + (0x2F8CA, 'M', u'𣀊'), + (0x2F8CB, 'M', u'旣'), + (0x2F8CC, 'M', u'書'), + (0x2F8CD, 'M', u'晉'), + (0x2F8CE, 'M', u'㬙'), + (0x2F8CF, 'M', u'暑'), + (0x2F8D0, 'M', u'㬈'), + (0x2F8D1, 'M', u'㫤'), + (0x2F8D2, 'M', u'冒'), + (0x2F8D3, 'M', u'冕'), + (0x2F8D4, 'M', u'最'), + (0x2F8D5, 'M', u'暜'), + (0x2F8D6, 'M', u'肭'), + (0x2F8D7, 'M', u'䏙'), + (0x2F8D8, 'M', u'朗'), + (0x2F8D9, 'M', u'望'), + (0x2F8DA, 'M', u'朡'), + (0x2F8DB, 'M', u'杞'), + (0x2F8DC, 'M', u'杓'), + (0x2F8DD, 'M', u'𣏃'), + (0x2F8DE, 'M', u'㭉'), + (0x2F8DF, 'M', u'柺'), + (0x2F8E0, 'M', u'枅'), + (0x2F8E1, 'M', u'桒'), + (0x2F8E2, 'M', u'梅'), + (0x2F8E3, 'M', u'𣑭'), + (0x2F8E4, 'M', u'梎'), + (0x2F8E5, 'M', u'栟'), + (0x2F8E6, 'M', u'椔'), + (0x2F8E7, 'M', u'㮝'), + (0x2F8E8, 'M', u'楂'), + ] + +def _seg_76(): + return [ + (0x2F8E9, 'M', u'榣'), + (0x2F8EA, 'M', u'槪'), + (0x2F8EB, 'M', u'檨'), + (0x2F8EC, 'M', u'𣚣'), + (0x2F8ED, 'M', u'櫛'), + (0x2F8EE, 'M', u'㰘'), + (0x2F8EF, 'M', u'次'), + (0x2F8F0, 'M', u'𣢧'), + (0x2F8F1, 'M', u'歔'), + (0x2F8F2, 'M', u'㱎'), + (0x2F8F3, 'M', u'歲'), + (0x2F8F4, 'M', u'殟'), + (0x2F8F5, 'M', u'殺'), + (0x2F8F6, 'M', u'殻'), + (0x2F8F7, 'M', u'𣪍'), + (0x2F8F8, 'M', u'𡴋'), + (0x2F8F9, 'M', u'𣫺'), + (0x2F8FA, 'M', u'汎'), + (0x2F8FB, 'M', u'𣲼'), + (0x2F8FC, 'M', u'沿'), + (0x2F8FD, 'M', u'泍'), + (0x2F8FE, 'M', u'汧'), + (0x2F8FF, 'M', u'洖'), + (0x2F900, 'M', u'派'), + (0x2F901, 'M', u'海'), + (0x2F902, 'M', u'流'), + (0x2F903, 'M', u'浩'), + (0x2F904, 'M', u'浸'), + (0x2F905, 'M', u'涅'), + (0x2F906, 'M', u'𣴞'), + (0x2F907, 'M', u'洴'), + (0x2F908, 'M', u'港'), + (0x2F909, 'M', u'湮'), + (0x2F90A, 'M', u'㴳'), + (0x2F90B, 'M', u'滋'), + (0x2F90C, 'M', u'滇'), + (0x2F90D, 'M', u'𣻑'), + (0x2F90E, 'M', u'淹'), + (0x2F90F, 'M', u'潮'), + (0x2F910, 'M', u'𣽞'), + (0x2F911, 'M', u'𣾎'), + (0x2F912, 'M', u'濆'), + (0x2F913, 'M', u'瀹'), + (0x2F914, 'M', u'瀞'), + (0x2F915, 'M', u'瀛'), + (0x2F916, 'M', u'㶖'), + (0x2F917, 'M', u'灊'), + (0x2F918, 'M', u'災'), + (0x2F919, 'M', u'灷'), + (0x2F91A, 'M', u'炭'), + (0x2F91B, 'M', u'𠔥'), + (0x2F91C, 'M', u'煅'), + (0x2F91D, 'M', u'𤉣'), + (0x2F91E, 'M', u'熜'), + (0x2F91F, 'X'), + (0x2F920, 'M', u'爨'), + (0x2F921, 'M', u'爵'), + (0x2F922, 'M', u'牐'), + (0x2F923, 'M', u'𤘈'), + (0x2F924, 'M', u'犀'), + (0x2F925, 'M', u'犕'), + (0x2F926, 'M', u'𤜵'), + (0x2F927, 'M', u'𤠔'), + (0x2F928, 'M', u'獺'), + (0x2F929, 'M', u'王'), + (0x2F92A, 'M', u'㺬'), + (0x2F92B, 'M', u'玥'), + (0x2F92C, 'M', u'㺸'), + (0x2F92E, 'M', u'瑇'), + (0x2F92F, 'M', u'瑜'), + (0x2F930, 'M', u'瑱'), + (0x2F931, 'M', u'璅'), + (0x2F932, 'M', u'瓊'), + (0x2F933, 'M', u'㼛'), + (0x2F934, 'M', u'甤'), + (0x2F935, 'M', u'𤰶'), + (0x2F936, 'M', u'甾'), + (0x2F937, 'M', u'𤲒'), + (0x2F938, 'M', u'異'), + (0x2F939, 'M', u'𢆟'), + (0x2F93A, 'M', u'瘐'), + (0x2F93B, 'M', u'𤾡'), + (0x2F93C, 'M', u'𤾸'), + (0x2F93D, 'M', u'𥁄'), + (0x2F93E, 'M', u'㿼'), + (0x2F93F, 'M', u'䀈'), + (0x2F940, 'M', u'直'), + (0x2F941, 'M', u'𥃳'), + (0x2F942, 'M', u'𥃲'), + (0x2F943, 'M', u'𥄙'), + (0x2F944, 'M', u'𥄳'), + (0x2F945, 'M', u'眞'), + (0x2F946, 'M', u'真'), + (0x2F948, 'M', u'睊'), + (0x2F949, 'M', u'䀹'), + (0x2F94A, 'M', u'瞋'), + (0x2F94B, 'M', u'䁆'), + (0x2F94C, 'M', u'䂖'), + (0x2F94D, 'M', u'𥐝'), + (0x2F94E, 'M', u'硎'), + ] + +def _seg_77(): + return [ + (0x2F94F, 'M', u'碌'), + (0x2F950, 'M', u'磌'), + (0x2F951, 'M', u'䃣'), + (0x2F952, 'M', u'𥘦'), + (0x2F953, 'M', u'祖'), + (0x2F954, 'M', u'𥚚'), + (0x2F955, 'M', u'𥛅'), + (0x2F956, 'M', u'福'), + (0x2F957, 'M', u'秫'), + (0x2F958, 'M', u'䄯'), + (0x2F959, 'M', u'穀'), + (0x2F95A, 'M', u'穊'), + (0x2F95B, 'M', u'穏'), + (0x2F95C, 'M', u'𥥼'), + (0x2F95D, 'M', u'𥪧'), + (0x2F95F, 'X'), + (0x2F960, 'M', u'䈂'), + (0x2F961, 'M', u'𥮫'), + (0x2F962, 'M', u'篆'), + (0x2F963, 'M', u'築'), + (0x2F964, 'M', u'䈧'), + (0x2F965, 'M', u'𥲀'), + (0x2F966, 'M', u'糒'), + (0x2F967, 'M', u'䊠'), + (0x2F968, 'M', u'糨'), + (0x2F969, 'M', u'糣'), + (0x2F96A, 'M', u'紀'), + (0x2F96B, 'M', u'𥾆'), + (0x2F96C, 'M', u'絣'), + (0x2F96D, 'M', u'䌁'), + (0x2F96E, 'M', u'緇'), + (0x2F96F, 'M', u'縂'), + (0x2F970, 'M', u'繅'), + (0x2F971, 'M', u'䌴'), + (0x2F972, 'M', u'𦈨'), + (0x2F973, 'M', u'𦉇'), + (0x2F974, 'M', u'䍙'), + (0x2F975, 'M', u'𦋙'), + (0x2F976, 'M', u'罺'), + (0x2F977, 'M', u'𦌾'), + (0x2F978, 'M', u'羕'), + (0x2F979, 'M', u'翺'), + (0x2F97A, 'M', u'者'), + (0x2F97B, 'M', u'𦓚'), + (0x2F97C, 'M', u'𦔣'), + (0x2F97D, 'M', u'聠'), + (0x2F97E, 'M', u'𦖨'), + (0x2F97F, 'M', u'聰'), + (0x2F980, 'M', u'𣍟'), + (0x2F981, 'M', u'䏕'), + (0x2F982, 'M', u'育'), + (0x2F983, 'M', u'脃'), + (0x2F984, 'M', u'䐋'), + (0x2F985, 'M', u'脾'), + (0x2F986, 'M', u'媵'), + (0x2F987, 'M', u'𦞧'), + (0x2F988, 'M', u'𦞵'), + (0x2F989, 'M', u'𣎓'), + (0x2F98A, 'M', u'𣎜'), + (0x2F98B, 'M', u'舁'), + (0x2F98C, 'M', u'舄'), + (0x2F98D, 'M', u'辞'), + (0x2F98E, 'M', u'䑫'), + (0x2F98F, 'M', u'芑'), + (0x2F990, 'M', u'芋'), + (0x2F991, 'M', u'芝'), + (0x2F992, 'M', u'劳'), + (0x2F993, 'M', u'花'), + (0x2F994, 'M', u'芳'), + (0x2F995, 'M', u'芽'), + (0x2F996, 'M', u'苦'), + (0x2F997, 'M', u'𦬼'), + (0x2F998, 'M', u'若'), + (0x2F999, 'M', u'茝'), + (0x2F99A, 'M', u'荣'), + (0x2F99B, 'M', u'莭'), + (0x2F99C, 'M', u'茣'), + (0x2F99D, 'M', u'莽'), + (0x2F99E, 'M', u'菧'), + (0x2F99F, 'M', u'著'), + (0x2F9A0, 'M', u'荓'), + (0x2F9A1, 'M', u'菊'), + (0x2F9A2, 'M', u'菌'), + (0x2F9A3, 'M', u'菜'), + (0x2F9A4, 'M', u'𦰶'), + (0x2F9A5, 'M', u'𦵫'), + (0x2F9A6, 'M', u'𦳕'), + (0x2F9A7, 'M', u'䔫'), + (0x2F9A8, 'M', u'蓱'), + (0x2F9A9, 'M', u'蓳'), + (0x2F9AA, 'M', u'蔖'), + (0x2F9AB, 'M', u'𧏊'), + (0x2F9AC, 'M', u'蕤'), + (0x2F9AD, 'M', u'𦼬'), + (0x2F9AE, 'M', u'䕝'), + (0x2F9AF, 'M', u'䕡'), + (0x2F9B0, 'M', u'𦾱'), + (0x2F9B1, 'M', u'𧃒'), + (0x2F9B2, 'M', u'䕫'), + (0x2F9B3, 'M', u'虐'), + ] + +def _seg_78(): + return [ + (0x2F9B4, 'M', u'虜'), + (0x2F9B5, 'M', u'虧'), + (0x2F9B6, 'M', u'虩'), + (0x2F9B7, 'M', u'蚩'), + (0x2F9B8, 'M', u'蚈'), + (0x2F9B9, 'M', u'蜎'), + (0x2F9BA, 'M', u'蛢'), + (0x2F9BB, 'M', u'蝹'), + (0x2F9BC, 'M', u'蜨'), + (0x2F9BD, 'M', u'蝫'), + (0x2F9BE, 'M', u'螆'), + (0x2F9BF, 'X'), + (0x2F9C0, 'M', u'蟡'), + (0x2F9C1, 'M', u'蠁'), + (0x2F9C2, 'M', u'䗹'), + (0x2F9C3, 'M', u'衠'), + (0x2F9C4, 'M', u'衣'), + (0x2F9C5, 'M', u'𧙧'), + (0x2F9C6, 'M', u'裗'), + (0x2F9C7, 'M', u'裞'), + (0x2F9C8, 'M', u'䘵'), + (0x2F9C9, 'M', u'裺'), + (0x2F9CA, 'M', u'㒻'), + (0x2F9CB, 'M', u'𧢮'), + (0x2F9CC, 'M', u'𧥦'), + (0x2F9CD, 'M', u'䚾'), + (0x2F9CE, 'M', u'䛇'), + (0x2F9CF, 'M', u'誠'), + (0x2F9D0, 'M', u'諭'), + (0x2F9D1, 'M', u'變'), + (0x2F9D2, 'M', u'豕'), + (0x2F9D3, 'M', u'𧲨'), + (0x2F9D4, 'M', u'貫'), + (0x2F9D5, 'M', u'賁'), + (0x2F9D6, 'M', u'贛'), + (0x2F9D7, 'M', u'起'), + (0x2F9D8, 'M', u'𧼯'), + (0x2F9D9, 'M', u'𠠄'), + (0x2F9DA, 'M', u'跋'), + (0x2F9DB, 'M', u'趼'), + (0x2F9DC, 'M', u'跰'), + (0x2F9DD, 'M', u'𠣞'), + (0x2F9DE, 'M', u'軔'), + (0x2F9DF, 'M', u'輸'), + (0x2F9E0, 'M', u'𨗒'), + (0x2F9E1, 'M', u'𨗭'), + (0x2F9E2, 'M', u'邔'), + (0x2F9E3, 'M', u'郱'), + (0x2F9E4, 'M', u'鄑'), + (0x2F9E5, 'M', u'𨜮'), + (0x2F9E6, 'M', u'鄛'), + (0x2F9E7, 'M', u'鈸'), + (0x2F9E8, 'M', u'鋗'), + (0x2F9E9, 'M', u'鋘'), + (0x2F9EA, 'M', u'鉼'), + (0x2F9EB, 'M', u'鏹'), + (0x2F9EC, 'M', u'鐕'), + (0x2F9ED, 'M', u'𨯺'), + (0x2F9EE, 'M', u'開'), + (0x2F9EF, 'M', u'䦕'), + (0x2F9F0, 'M', u'閷'), + (0x2F9F1, 'M', u'𨵷'), + (0x2F9F2, 'M', u'䧦'), + (0x2F9F3, 'M', u'雃'), + (0x2F9F4, 'M', u'嶲'), + (0x2F9F5, 'M', u'霣'), + (0x2F9F6, 'M', u'𩅅'), + (0x2F9F7, 'M', u'𩈚'), + (0x2F9F8, 'M', u'䩮'), + (0x2F9F9, 'M', u'䩶'), + (0x2F9FA, 'M', u'韠'), + (0x2F9FB, 'M', u'𩐊'), + (0x2F9FC, 'M', u'䪲'), + (0x2F9FD, 'M', u'𩒖'), + (0x2F9FE, 'M', u'頋'), + (0x2FA00, 'M', u'頩'), + (0x2FA01, 'M', u'𩖶'), + (0x2FA02, 'M', u'飢'), + (0x2FA03, 'M', u'䬳'), + (0x2FA04, 'M', u'餩'), + (0x2FA05, 'M', u'馧'), + (0x2FA06, 'M', u'駂'), + (0x2FA07, 'M', u'駾'), + (0x2FA08, 'M', u'䯎'), + (0x2FA09, 'M', u'𩬰'), + (0x2FA0A, 'M', u'鬒'), + (0x2FA0B, 'M', u'鱀'), + (0x2FA0C, 'M', u'鳽'), + (0x2FA0D, 'M', u'䳎'), + (0x2FA0E, 'M', u'䳭'), + (0x2FA0F, 'M', u'鵧'), + (0x2FA10, 'M', u'𪃎'), + (0x2FA11, 'M', u'䳸'), + (0x2FA12, 'M', u'𪄅'), + (0x2FA13, 'M', u'𪈎'), + (0x2FA14, 'M', u'𪊑'), + (0x2FA15, 'M', u'麻'), + (0x2FA16, 'M', u'䵖'), + (0x2FA17, 'M', u'黹'), + (0x2FA18, 'M', u'黾'), + ] + +def _seg_79(): + return [ + (0x2FA19, 'M', u'鼅'), + (0x2FA1A, 'M', u'鼏'), + (0x2FA1B, 'M', u'鼖'), + (0x2FA1C, 'M', u'鼻'), + (0x2FA1D, 'M', u'𪘀'), + (0x2FA1E, 'X'), + (0xE0100, 'I'), + (0xE01F0, 'X'), + ] + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() + + _seg_78() + + _seg_79() +) diff --git a/main.py b/main.py index 30bc165..3b66ed7 100644 --- a/main.py +++ b/main.py @@ -7,6 +7,7 @@ import tkinter from tkinter import messagebox from tkinter import filedialog +import tkinter.font import tkinter.ttk import os import platform @@ -19,7 +20,12 @@ from subprocess import Popen import zipfile import distutils from distutils import dir_util +import webbrowser +import threading +from requests.exceptions import ConnectionError +import hashlib +pageNumber = 0 #Memory Pit Links - Points to GitHub repo dsiVersions = ["1.0 - 1.3 (USA, EUR, AUS, JPN)", "1.4 - 1.4.5 (USA, EUR, AUS, JPN)", "All versions (KOR, CHN)"] @@ -27,13 +33,20 @@ memoryPitLinks = ["https://github.com/YourKalamity/just-a-dsi-cfw-installer/raw/ #Downloader def downloadFile(link, destination): - r = requests.get(link, allow_redirects=True) - if link.find('/'): - fileName = link.rsplit('/', 1)[1] - downloadLocation = destination + fileName - open(downloadLocation, 'wb').write(r.content) - return downloadLocation + try: + r = requests.get(link, allow_redirects=True) + if link.find('/'): + fileName = link.rsplit('/', 1)[1] + downloadLocation = destination + fileName + open(downloadLocation, 'wb').write(r.content) + return downloadLocation + except ConnectionError: + print("File not available, skipping...") + return None +def hashcreator(filetobechecked): + string = hashlib.blake2b(open(filetobechecked,'rb').read()).hexdigest() + return string #Get link of latest Github Release def getLatestGitHub(usernamerepo, assetNumber): @@ -45,6 +58,7 @@ def getLatestGitHub(usernamerepo, assetNumber): def outputbox(message): outputBox.configure(state='normal') outputBox.insert('end', message) + outputBox.see(tkinter.END) outputBox.configure(state='disabled') #Check if directory exists and has write permissions @@ -52,7 +66,8 @@ def validateDirectory(directory): try: directory = str(directory) except TypeError: - outputbox("That's not a valid directory") + outputbox("That's not a valid directory \n") + outputbox("Press the Back button to change the folder\n") return False try: string = directory + "/test.file" @@ -61,12 +76,13 @@ def validateDirectory(directory): os.remove(string) except FileNotFoundError: outputbox("That's not a valid directory") - outputbox(" or you do not have the") + outputbox("or you do not have the") outputbox(" permission to write there") + outputbox("Press the Back button to change the folder\n") return False except PermissionError: - outputbox("You do not have write") - outputbox(" access to that folder") + outputbox("You do not have write access to that folder\n") + outputbox("Press the Back button to change the folder\n") return False else: return True @@ -129,20 +145,22 @@ def start(): _7za = _7z except WindowsError: print("7-Zip not found, please install it before using") - outputbox("7-Zip not found") + outputbox("7-Zip not found \n") + finalbackButton.configure(state='normal') return print("7-Zip found!") - + lineCounter = 0 #Variables - directory = SDentry.get() + directory = SDentry version = firmwareVersion.get() unlaunchNeeded = unlaunch.get() #Validate directory directoryValidated = validateDirectory(directory) if directoryValidated == False: + finalbackButton.configure(state='normal') return if dsiVersions.index(version) == 1: memoryPitDownload = memoryPitLinks[1] @@ -157,59 +175,75 @@ def start(): #Download Memory Pit memoryPitLocation = directory + "/private/ds/app/484E494A/" Path(memoryPitLocation).mkdir(parents=True, exist_ok=True) - downloadFile(memoryPitDownload, memoryPitLocation) - outputbox("Memory Pit Downloaded ") - print("Memory Pit Downloaded") + outputbox("Downloading Memory Pit\n") + downloadLocation = downloadFile(memoryPitDownload, memoryPitLocation) + if downloadLocation != None: + outputbox("Memory Pit Downloaded\n") + print("Memory Pit Downloaded") if downloadtwlmenu.get() == 1: #Download TWiLight Menu + outputbox("Downloading TWiLight Menu ++\n") TWLmenuLocation = downloadFile(getLatestGitHub('DS-Homebrew/TWiLightMenu', 0),cwdtemp) - outputbox("TWiLight Menu ++ Downloaded ") - print("TWiLight Menu ++ Downloaded") + if TWLmenuLocation != None: + outputbox("TWiLight Menu ++ Downloaded\n") + print("TWiLight Menu ++ Downloaded") - #Extract TWiLight Menu - proc = Popen([_7za,"x", "-aoa", TWLmenuLocation, '-o'+cwdtemp, 'DSi - CFW users/SDNAND root/', '_nds', 'DSi&3DS - SD card users', 'roms', 'BOOT.NDS']) - ret_val = proc.wait() + #Extract TWiLight Menu + proc = Popen([_7za,"x", "-aoa", TWLmenuLocation, '-o'+cwdtemp, 'DSi - CFW users/SDNAND root/', '_nds', 'DSi&3DS - SD card users', 'roms', 'BOOT.NDS']) + ret_val = proc.wait() - while True: - if ret_val == 0: - outputbox("TWiLight Menu ++ Extracted ") + while True: + if ret_val == 0: + outputbox("TWiLight Menu ++ Extracted\n") print("TWiLight Menu ++ Extracted to", cwdtemp) break + originalHash = hashcreator(cwdtemp + "DSi&3DS - SD card users/BOOT.NDS") - #Move TWiLight Menu - shutil.copy(cwdtemp + "DSi&3DS - SD card users/BOOT.NDS", directory) - distutils.dir_util.copy_tree(cwdtemp + "_nds/" , directory +"/_nds/") - distutils.dir_util.copy_tree(cwdtemp + "DSi - CFW users/SDNAND root/hiya", directory+"/hiya/") - distutils.dir_util.copy_tree(cwdtemp + "DSi - CFW users/SDNAND root/title", directory+"/title/") - shutil.copy(cwdtemp + "DSi&3DS - SD card users/_nds/nds-bootstrap-hb-nightly.nds", directory + "/_nds") - shutil.copy(cwdtemp + "DSi&3DS - SD card users/_nds/nds-bootstrap-hb-release.nds", directory + "/_nds") - Path(directory + "/roms/").mkdir(parents=True,exist_ok=True) - #Some Homebrew write to the _nds folder so it is better to clear it first - shutil.rmtree(cwdtemp +"_nds/") - Path(cwdtemp +"_nds/").mkdir(parents=True,exist_ok=True) - - print("TWiLight Menu ++ placed in", directory) - outputbox("TWiLight Menu ++ placed ") + #Move TWiLight Menu + shutil.copy(cwdtemp + "DSi&3DS - SD card users/BOOT.NDS", directory) + distutils.dir_util.copy_tree(cwdtemp + "_nds/" , directory +"/_nds/") + distutils.dir_util.copy_tree(cwdtemp + "DSi - CFW users/SDNAND root/hiya", directory+"/hiya/") + distutils.dir_util.copy_tree(cwdtemp + "DSi - CFW users/SDNAND root/title", directory+"/title/") + shutil.copy(cwdtemp + "DSi&3DS - SD card users/_nds/nds-bootstrap-hb-nightly.nds", directory + "/_nds") + shutil.copy(cwdtemp + "DSi&3DS - SD card users/_nds/nds-bootstrap-hb-release.nds", directory + "/_nds") + Path(directory + "/roms/").mkdir(parents=True,exist_ok=True) + #Some Homebrew write to the _nds folder so it is better to clear it first + shutil.rmtree(cwdtemp +"_nds/") + Path(cwdtemp +"_nds/").mkdir(parents=True,exist_ok=True) + comparedHash = hashcreator(directory+"/BOOT.NDS") + if originalHash == comparedHash: + print("TWiLight Menu ++ placed in", directory) + outputbox("TWiLight Menu ++ placed on SD \n") + #Download DeadSkullzJr's Cheat Database Path(directory + "/_nds/TWiLightMenu/extras/").mkdir(parents=True,exist_ok=True) - downloadFile('https://bitbucket.org/DeadSkullzJr/nds-cheat-databases/raw/933c375545d3ff90854d1e210dcf4b3b31d9d585/Cheats/usrcheat.dat', directory + "/_nds/TWiLightMenu/extras/") - print("DeadSkullzJr's Cheat Database downloaded") + outputbox("Downloading DeadSkullzJr's Cheat database\n") + downloadLocation = downloadFile('https://bitbucket.org/DeadSkullzJr/nds-cheat-databases/raw/933c375545d3ff90854d1e210dcf4b3b31d9d585/Cheats/usrcheat.dat', directory + "/_nds/TWiLightMenu/extras/") + if downloadLocation != None: + print("DeadSkullzJr's Cheat Database downloaded") + outputbox("DeadSkullzJr's Cheat Database downloaded\n") if downloaddumptool.get() == 1: #Download dumpTool - downloadFile(getLatestGitHub('zoogie/dumpTool', 0), directory) - print("dumpTool downloaded") - outputbox("dumpTool Downloaded ") + outputbox("Downloading dumpTool\n") + downloadLocation = downloadFile(getLatestGitHub('zoogie/dumpTool', 0), directory) + if downloadLocation != None: + print("dumpTool downloaded") + outputbox("dumpTool Downloaded\n") + lineCounter = lineCounter + 1 if unlaunchNeeded == 1 : #Download Unlaunch url = "https://problemkaputt.de/unlaunch.zip" + outputbox("Downloading Unlaunch\n") unlaunchLocation = downloadFile(url, cwdtemp) - print("Unlaunch Downloaded") - outputbox("Unlaunch Downloaded ") + if unlaunchLocation != None: + print("Unlaunch Downloaded") + outputbox("Unlaunch Downloaded\n") + lineCounter = lineCounter + 1 #Extract Unlaunch unzipper(unlaunchLocation,directory) @@ -220,176 +254,363 @@ def start(): roms = directory +"/roms/nds/" Path(roms).mkdir(parents=True,exist_ok=True) - outputbox("Downloading other homebrew ") + outputbox("Downloading other homebrew\n") + lineCounter = lineCounter + 1 print("Downloading other homebrew...") for count, item in enumerate(homebrewDB): if homebrewList[count].get() == 1: print("Downloading "+item["title"]) + outputbox("Downloading "+item["title"]+'\n') + lineCounter = lineCounter + 1 if item["github"] == "True": downloadlink = getLatestGitHub(item["repo"], int(item["asset"])) else: downloadlink = item["link"] if item["extension"] == "nds": downloadFile(downloadlink, roms) + outputbox("Downloaded "+item["title"]+'\n') elif item["extension"] == "zip": downloadLocation = downloadFile(downloadlink, cwdtemp) - if item["location"]["roms"] == "all": - unzipper(downloadLocation, roms) + if downloadLocation != None: + if item["location"]["roms"] == "all": + unzipper(downloadLocation, roms) + outputbox("Downloaded "+item["title"]+'\n') elif item["extension"] == "7z": downloadLocation = downloadFile(downloadlink, cwdtemp) - if item["location"]["roms"] == "all": - un7zipper(_7za, downloadLocation, roms) - else: - un7zipper(_7za, downloadLocation, cwdtemp) - if "root" in item["location"]: - Path(directory+(item["location"]["root"].split('/')).pop()).mkdir(parents=True,exist_ok=True) - shutil.copy(cwdtemp+item["location"]["root"],directory+((item["location"]["root"].split('/')).pop().pop(0))) - if "roms" in item["location"]: - shutil.copy(cwdtemp+item["location"]["roms"],roms) + if downloadLocation != None: + if item["location"]["roms"] == "all": + un7zipper(_7za, downloadLocation, roms) + outputbox("Downloaded "+item["title"]+'\n') + else: + un7zipper(_7za, downloadLocation, cwdtemp) + if "root" in item["location"]: + Path(directory+(item["location"]["root"].split('/')).pop()).mkdir(parents=True,exist_ok=True) + shutil.copy(cwdtemp+item["location"]["root"],directory+((item["location"]["root"].split('/')).pop().pop(0))) + if "roms" in item["location"]: + shutil.copy(cwdtemp+item["location"]["roms"],roms) + outputbox("Downloaded "+item["title"]+'\n') #Delete tmp folder shutil.rmtree(cwdtemp) - + + #Restore button access + finalnextButton.config(state="normal") + window.protocol("WM_DELETE_WINDOW",lambda:closeButtonPress(window)) + print("Done!") - outputbox("Done!") + outputbox("Done!\n") + outputbox("Press the Finish button to continue... \n") -def chooseDir(): - window.sourceFolder = filedialog.askdirectory(parent=window, initialdir= "/", title='Please select the directory of your SD card') +def chooseDir(source,SDentry): + source.sourceFolder = filedialog.askdirectory(parent=source, initialdir= "/", title='Please select the directory of your SD card') SDentry.delete(0, tkinter.END) - SDentry.insert(0, window.sourceFolder) + SDentry.insert(0, source.sourceFolder) -def okButtonPress(self): +def okButtonPress(self,source): self.destroy() - window.deiconify() + source.deiconify() -def extraHomebrew(): - homebrewWindow = tkinter.Toplevel(window) - window.withdraw() - homebrewWindowLabel = tkinter.Label(homebrewWindow, text="Homebrew List",font=("Verdana",12,"bold")) +def extraHomebrew(source): + homebrewWindow = tkinter.Toplevel(source) + homebrewWindow.config(bg="#f0f0f0") + source.withdraw() + homebrewWindowLabel = tkinter.Label(homebrewWindow, text="Homebrew List",font=("Segoe UI",12,"bold"),bg="#f0f0f0") homebrewWindowLabel.pack(anchor = "w") - homebrewWindowLabel2 = tkinter.Label(homebrewWindow, text="Select additional homebrew for download then press OK") + homebrewWindowLabel2 = tkinter.Label(homebrewWindow, text="Select additional homebrew for download then press OK", font=(bodyFont),bg="#f0f0f0") homebrewWindowLabel2.pack(anchor = "w") vscrollbar = tkinter.Scrollbar(homebrewWindow) canvas = tkinter.Canvas(homebrewWindow, yscrollcommand=vscrollbar.set) + canvas.config(bg="#f0f0f0") vscrollbar.config(command=canvas.yview) vscrollbar.pack(side=tkinter.RIGHT, fill=tkinter.Y) homebrewFrame = tkinter.Frame(canvas) + homebrewFrame.configure(bg="#f0f0f0") + homebrewWindow.title("Homebrew List") homebrewWindow.resizable(0,0) canvas.pack(side="left", fill="both", expand=True) canvas.create_window(0,0, window=homebrewFrame, anchor="n") for count, x in enumerate(homebrewDB): - l = tkinter.Checkbutton(homebrewFrame, text=x["title"] + " by " + x["author"], variable=homebrewList[count]) + l = tkinter.Checkbutton(homebrewFrame, text=x["title"] + " by " + x["author"],font=(bigListFont), variable=homebrewList[count],bg="#f0f0f0") + l.config(selectcolor="#F0F0F0") l.pack(anchor = "w") frame = tkinter.ttk.Frame(homebrewWindow, relief=tkinter.RAISED, borderwidth=1) frame.pack(fill=tkinter.BOTH, expand=True) - okButton = tkinter.Button(homebrewWindow, text = "OK", font=("Verdana",12,"bold"), command=lambda:okButtonPress(homebrewWindow)) + + okButton = tkinter.Button(homebrewWindow, text = "OK", font=(buttonFont), command=lambda:okButtonPress(homebrewWindow,source),bg="#f0f0f0") okButton.pack(side=tkinter.RIGHT, padx=5, pady=5) homebrewWindow.update() canvas.config(scrollregion=canvas.bbox("all")) - homebrewWindow.protocol("WM_DELETE_WINDOW",lambda:okButtonPress(homebrewWindow)) + homebrewWindow.protocol("WM_DELETE_WINDOW",lambda:okButtonPress(homebrewWindow,source)) + +def closeButtonPress(source): + source.destroy() + root.destroy() + +def nextWindow(windownumbertosummon): + globals()["summonWindow"+windownumbertosummon] + +def donothing(): + return + +def summonWindow0(): + window.title("Lazy DSi file Downloader") + window.resizable(0,0) + window.geometry("500x360") + window.option_add("*Background", backgroundColour) + window.configure(bg=backgroundColour) + topFrame = tkinter.Frame(window) + topFrame.pack(expand=True, fill=tkinter.BOTH,padx=5) + topFrame.option_add("*Background", backgroundColour) + bottomFrame = tkinter.Frame(window) + bottomFrame.pack(side=tkinter.BOTTOM, fill=tkinter.X,padx=5) + bottomFrame.option_add("*Background", backgroundColour) + first = tkinter.Label(topFrame, text="Welcome to the Lazy DSi File Downloader", font=(titleFont), fg=foregroundColour) + first.grid(column=0,row=0, sticky="w",padx=5) + + bulletpoints = [ + "This is an application made by Your Kalamity that downloads and place files for homebrew'ing your Nintendo DSi in the correct location. If you have already installed homebrew, this can also update the one you have.", + "This is to be used in conjunction with the Nintendo DSi Modding guide by NightScript and emiyl", + "Check it out here: https://dsi.cfw.guide/", + "By using this application, you do not need to follow any of the 'Preparing SD card' steps.", + "This application is to be given for free. If you have paid to receive this, contact the person that sold you this application; you have been scammed.", + "You may use any part of this application for your own purposes as long as credit is given.", + "Please proceed by hitting the 'Next' button" + ] + + for count, x in enumerate(bulletpoints): + bullet = tkinter.Label(topFrame, text=x, font=(paragraphFont),fg=foregroundColour,wraplength=450, justify="left") + bullet.grid(column=0,row=count+3, sticky="w", padx=5) + + discordButton = tkinter.Button(bottomFrame, text="DS⁽ⁱ⁾ Mode Hacking Discord server", fg=foregroundColour,bg=buttonColour, font=(buttonFont),command=lambda:webbrowser.open("https://discord.gg/yD3spjv",new=1)) + discordButton.pack(side=tkinter.LEFT, padx="5", pady="5") + nextButton = tkinter.Button(bottomFrame, text="Next",width="8", fg=foregroundColour,bg=nextButtonColour, font=(buttonFont),command=lambda:[topFrame.destroy(),bottomFrame.destroy(),summonWindow1()]) + nextButton.pack(side=tkinter.RIGHT, padx="5", pady="5") + + window.protocol("WM_DELETE_WINDOW",lambda:closeButtonPress(window)) + + +def summonWindow1(): + topFrame = tkinter.Frame(window) + topFrame.pack(expand=True, fill=tkinter.BOTH,padx=5) + topFrame.option_add("*Background", backgroundColour) + bottomFrame = tkinter.Frame(window) + bottomFrame.pack(side=tkinter.BOTTOM, fill=tkinter.X,padx=5) + bottomFrame.option_add("*Background", backgroundColour) + first = tkinter.Label(topFrame, text="Memory Pit", font=(titleFont), fg=foregroundColour) + first.grid(column=0,row=0, sticky="w",padx=5) + subtitle = tkinter.Label(topFrame, text='thank you, shutterbug2000!', font=(subtitleFont), fg=foregroundColour) + subtitle.grid(column=0,row=1, sticky="w",padx=5) + filler = tkinter.Label(topFrame, text=" ") + filler.grid(column=0,row=3) + downloadmemorypitCheck = tkinter.Checkbutton(topFrame, text = "Download Memory pit exploit?",font=(buttonFont),fg=foregroundColour, variable = downloadmemorypit) + downloadmemorypitCheck.grid(column=0,row=2, sticky="w") + firmwareLabel = tkinter.Label(topFrame, text = "Select your DSi firmware : ",fg=foregroundColour,font=(buttonFont)) + firmwareLabel.grid(column=0,row=4, sticky="w") + selector = tkinter.OptionMenu(topFrame, firmwareVersion, *dsiVersions) + selector.config(bg=buttonColour,fg=foregroundColour,font=(buttonFont)) + selector["menu"].config(bg=buttonColour,fg=foregroundColour,font=(buttonFont)) + selector.grid(column=0,row=5,sticky="w") + + backButton = tkinter.Button(bottomFrame,text="Back", font=(buttonFont),fg=foregroundColour,bg=backButtonColour,command=lambda: [topFrame.destroy(),bottomFrame.destroy(),summonWindow0()], width="8") + backButton.pack(side=tkinter.LEFT) + nextButton = tkinter.Button(bottomFrame, text="Next",width="8", fg=foregroundColour,bg=nextButtonColour, font=(buttonFont),command=lambda:[topFrame.destroy(),bottomFrame.destroy(),summonWindow2()]) + nextButton.pack(side=tkinter.RIGHT, padx="5", pady="5") + window.protocol("WM_DELETE_WINDOW",lambda:closeButtonPress(window)) - +def summonWindow2(): + + topFrame = tkinter.Frame(window) + topFrame.pack(expand=True, fill=tkinter.BOTH,padx=5) + topFrame.option_add("*Background", backgroundColour) + bottomFrame = tkinter.Frame(window) + bottomFrame.pack(side=tkinter.BOTTOM, fill=tkinter.X,padx=5) + bottomFrame.option_add("*Background", backgroundColour) + first = tkinter.Label(topFrame, text="Homebrew Section", font=(titleFont), fg=foregroundColour) + first.grid(column=0,row=0, sticky="w") + subtitle = tkinter.Label(topFrame, text='brewed at home', font=(subtitleFont), fg=foregroundColour) + subtitle.grid(column=0,row=1,sticky="w") + downloadtwlmenuCheck = tkinter.Checkbutton(topFrame, text = "Download or Update TWiLight menu?",fg=foregroundColour, variable = downloadtwlmenu,font=(buttonFont)) + downloadtwlmenuCheck.grid(column=0,row=2, sticky ="w") + downloaddumptoolCheck = tkinter.Checkbutton(topFrame, text ="Download dumpTool?", variable=downloaddumptool,fg=foregroundColour,font=(buttonFont)) + downloaddumptoolCheck.grid(column=0,row=3,sticky="w") + unlaunchCheck = tkinter.Checkbutton(topFrame, text = "Download Unlaunch?", variable =unlaunch, fg=foregroundColour,font=(buttonFont)) + unlaunchCheck.grid(column=0,row=4,sticky="w") + buttonExtraHomebrew = tkinter.Button(topFrame, text = "Additional homebrew...", command =lambda:[extraHomebrew(window)], fg=foregroundColour,font=(buttonFont),bg=buttonColour) + buttonExtraHomebrew.grid(column=0,row=5,sticky="w",pady=5) + backButton = tkinter.Button(bottomFrame,text="Back", font=(buttonFont),fg=foregroundColour,bg=backButtonColour,command=lambda: [topFrame.destroy(),bottomFrame.destroy(),summonWindow1()], width="8") + backButton.pack(side=tkinter.LEFT) + nextButton = tkinter.Button(bottomFrame, text="Next",width="8", fg=foregroundColour,bg=nextButtonColour, font=(buttonFont),command=lambda:[topFrame.destroy(),bottomFrame.destroy(),summonWindow3()]) + nextButton.pack(side=tkinter.RIGHT, padx="5", pady="5") + window.protocol("WM_DELETE_WINDOW",lambda:closeButtonPress(window)) + +def summonWindow3(): + topFrame = tkinter.Frame(window) + topFrame.pack(expand=True, fill=tkinter.BOTH,padx=5) + topFrame.option_add("*Background", backgroundColour) + bottomFrame = tkinter.Frame(window) + bottomFrame.pack(side=tkinter.BOTTOM, fill=tkinter.X,padx=5) + bottomFrame.option_add("*Background", backgroundColour) + first = tkinter.Label(topFrame, text="Select SD Card", font=(titleFont), fg=foregroundColour) + first.grid(column=0,row=0, sticky="w") + subtitle = tkinter.Label(topFrame, text='ready to download?', font=(subtitleFont), fg=foregroundColour) + subtitle.grid(column=0,row=1,sticky="w") + noticeLabel=tkinter.Label(topFrame,text="Plug in your SD card and choose the directory", fg=foregroundColour, font=(bodyFont)) + noticeLabel.grid(column=0,row=2,sticky="w") + SDentry = tkinter.Entry(topFrame, fg=foregroundColour,bg=buttonColour,font=(buttonFont),width=25) + SDentry.grid(column=0, row=3,sticky="w") + chooseDirButton = tkinter.Button(topFrame, text = "Click to select folder", command =lambda:chooseDir(topFrame,SDentry),fg=foregroundColour,bg=buttonColour,font=(buttonFont),width=25) + chooseDirButton.grid(column=0, row=4,sticky="w",pady=5) + backButton = tkinter.Button(bottomFrame,text="Back", font=(buttonFont),fg=foregroundColour,bg=backButtonColour,command=lambda: [topFrame.destroy(),bottomFrame.destroy(),summonWindow2()], width="8") + backButton.pack(side=tkinter.LEFT) + nextButton = tkinter.Button(bottomFrame, text="Start",width="8", fg=foregroundColour,bg=nextButtonColour, font=(buttonFont),command=lambda:[globalify(SDentry.get()),topFrame.destroy(),bottomFrame.destroy(),summonWindow4()]) + nextButton.pack(side=tkinter.RIGHT, padx="5", pady="5") + window.protocol("WM_DELETE_WINDOW",lambda:closeButtonPress(window)) + +def globalify(value): + global SDentry + SDentry = value + +def summonWindow4(): + startThread = threading.Thread(target=start, daemon=True) + topFrame = tkinter.Frame(window) + topFrame.pack(expand=True, fill=tkinter.BOTH,padx=5) + topFrame.option_add("*Background", backgroundColour) + bottomFrame = tkinter.Frame(window) + bottomFrame.pack(side=tkinter.BOTTOM, fill=tkinter.X,padx=5) + bottomFrame.option_add("*Background", backgroundColour) + first = tkinter.Label(topFrame, text="Download Screen", font=(titleFont), fg=foregroundColour) + first.grid(column=0,row=0, sticky="w") + subtitle = tkinter.Label(topFrame, text='please wait...', font=(subtitleFont), fg=foregroundColour) + subtitle.grid(column=0,row=1,sticky="w") + global outputBox + outputBox = tkinter.Text(topFrame,state='disabled', width = 60, height = 15, bg="black", fg="white") + outputBox.grid(column=0,row=2,sticky="w") + startThread.start() + global finalbackButton + finalbackButton = tkinter.Button(bottomFrame,state="disabled", text="Back", font=(buttonFont),fg=foregroundColour,bg=backButtonColour,command=lambda: [topFrame.destroy(),bottomFrame.destroy(),summonWindow3()], width="8") + finalbackButton.pack(side=tkinter.LEFT) + global finalnextButton + finalnextButton = tkinter.Button(bottomFrame, state="disabled", text="Finish",width="8", fg=foregroundColour,bg=nextButtonColour, font=(buttonFont),command=lambda:[topFrame.destroy(),bottomFrame.destroy(),summonWindow5()]) + finalnextButton.pack(side=tkinter.RIGHT, padx="5", pady="5") + window.protocol("WM_DELETE_WINDOW",lambda:donothing) + +def summonWindow5(): + + topFrame = tkinter.Frame(window) + topFrame.pack(expand=True, fill=tkinter.BOTH,padx=5) + topFrame.option_add("*Background", backgroundColour) + bottomFrame = tkinter.Frame(window) + bottomFrame.pack(side=tkinter.BOTTOM, fill=tkinter.X,padx=5) + bottomFrame.option_add("*Background", backgroundColour) + first = tkinter.Label(topFrame, text="Completed", font=(titleFont), fg=foregroundColour) + first.grid(column=0,row=0, sticky="w") + subtitle = tkinter.Label(topFrame, text='all done!', font=(subtitleFont), fg=foregroundColour) + subtitle.grid(column=0,row=1,sticky="w") + label= tkinter.Label(topFrame,text="Your SD card is now ready to run and use Homebrew on your Nintendo DSi.",font=(bodyFont),fg=foregroundColour,wraplength=450,justify="left") + label.grid(column=0,row=2,sticky="w") + labellink= tkinter.Label(topFrame,text="You can now eject your SD card and follow the steps of https://dsi.cfw.guide/",font=(bodyFont),fg=foregroundColour,wraplength=450,justify="left") + labellink.grid(column=0,row=3,sticky="w") + labellink.bind("", lambda e: webbrowser.open_new("https://dsi.cfw.guide/")) + label= tkinter.Label(topFrame,text="Credits to",font=(bodyFont),fg=foregroundColour) + label.grid(column=0,row=4,sticky="w") + bulletpoints = ["YourKalamity - Creator","NightScript - Idea & writer of dsi.cfw.guide","Emiyl - Writer of dsi.cfw.guide","SNBeast - Testing and pointing out errors","Everybody that helped create the homebrew downloaded by this app","Kaisaan - Yes"] + w = 5 + for x in bulletpoints: + label = tkinter.Label(topFrame,text=x,font=(bigListFont),fg=foregroundColour) + label.grid(column=0,row=w,sticky="w") + w = w + 1 + label= tkinter.Label(topFrame,text="Press the Close button to Exit",font=(bodyFont),fg=foregroundColour) + label.grid(column=0,row=w+1,sticky="w") + finish = tkinter.Button(bottomFrame, text="Close",width="8", fg=foregroundColour,bg=nextButtonColour, font=(buttonFont),command=lambda:[topFrame.destroy(),bottomFrame.destroy(),closeButtonPress(window)]) + finish.pack(side=tkinter.RIGHT, padx="5", pady="5") + window.protocol("WM_DELETE_WINDOW",lambda:closeButtonPress(window)) + if(sys.version_info.major < 3): print("This program will ONLY work on Python 3 and above") sys.exit() -#Create Window -window = tkinter.Tk() -window.sourceFolder = '' -window.sourceFile = '' +root = tkinter.Tk() +window = tkinter.Toplevel(root) +root.withdraw() - -#Homebrew Links #Homebrew Database homebrewDB = json.loads(requests.get('https://raw.githubusercontent.com/YourKalamity/just-a-dsi-DB/master/just-a-dsi-DB.json').content) homebrewList = [] for x in homebrewDB: homebrewList.append(tkinter.IntVar()) - homebrewList[0] = tkinter.IntVar(value=1) -# Title and Author -appTitle = tkinter.Label(text="Lazy DSi file downloader",font=('Verdana', 14), fg="white", bg="black") -appTitle.width = 100 -appAuthor = tkinter.Label(text="by YourKalamity",font=('Verdana', 10, 'italic'), anchor="w") -appAuthor.width = 100 - -#SD Directory entry -SDlabel = tkinter.Label(text = "Enter your SD card's directory") -SDlabel.width = 100 -SDentry = tkinter.Entry(width=30) -SDentry.width = 100 -#Button to select folder -b_chooseDir = tkinter.Button(window, text = "Click to select folder", width = 25, command = chooseDir) -b_chooseDir.width = 100 -b_chooseDir.height = 50 - -#Checkbox for Memory Pit +#TKinter Vars downloadmemorypit = tkinter.IntVar(value=1) -downloadmemorypitCheck = tkinter.Checkbutton(window, text = "Download Memory pit exploit?", variable = downloadmemorypit) - - -#DSi Firmware selector -firmwareLabel = tkinter.Label(text = "Select your DSi firmware : ") -firmwareLabel.width = 100 -firmwareVersion = tkinter.StringVar(window) +firmwareVersion = tkinter.StringVar() firmwareVersion.set(dsiVersions[0]) -selector = tkinter.OptionMenu(window, firmwareVersion, *dsiVersions) -selector.width = 100 - -#Checkbox for TWiLight Menu ++ downloadtwlmenu = tkinter.IntVar(value=1) -downloadtwlmenuCheck = tkinter.Checkbutton(window, text = "Download / Update TWiLight menu?", variable = downloadtwlmenu) - -#Checkbox for dumpTool downloaddumptool = tkinter.IntVar(value=1) -downloaddumptoolCheck = tkinter.Checkbutton(window, text ="Download dumpTool?", variable=downloaddumptool) +unlaunch = tkinter.IntVar(value=0) -#Checkbox for Unlaunch -unlaunch = tkinter.IntVar(value=1) -unlaunchCheck = tkinter.Checkbutton(window, text = "Download Unlaunch?", variable =unlaunch) -#Button to launch Additional Homebrew box -buttonExtraHomebrew = tkinter.Button(window, text = "Additional homebrew...", width = 25, command = extraHomebrew) -buttonExtraHomebrew.width = 100 -buttonExtraHomebrew.height = 50 +#Fonts +titleFont = tkinter.font.Font( + family= "Segoe UI", + size= 15, + weight= "bold" + ) +subtitleFont = tkinter.font.Font( + family= "Segoe UI", + size= 11, + slant= "italic" +) + +bodyFont = tkinter.font.Font( + family= "Segoe UI", + underline= False, + size = 11 + ) +buttonFont = tkinter.font.Font( + family="Segoe UI", + underline=False, + size = 11, + weight = "bold" +) -#Start button and Output box -startButton = tkinter.Button(window, text = "Start", font = ("TkDefaultFont",12,'bold'), width = 25, command = start) -outputLabel = tkinter.Label(text="Output") -outputLabel.width = 100 -outputBox = tkinter.Text(window,state='disabled', width = 30, height = 10) +bigListFont = tkinter.font.Font( + family="Segoe UI", + underline=False, + size=9 +) -#Pack everything in to window -window.title("Lazy DSi file downloader") -window.resizable(0, 0) -appTitle.pack() -appAuthor.pack() -SDlabel.pack() -SDentry.pack() -b_chooseDir.pack() -downloadmemorypitCheck.pack() -firmwareLabel.pack() -selector.pack() -downloadtwlmenuCheck.pack() -downloaddumptoolCheck.pack() -unlaunchCheck.pack() -buttonExtraHomebrew.pack() -startButton.pack() -outputLabel.pack() -outputBox.pack() -window.mainloop() +paragraphFont = tkinter.font.Font( + family="Segoe UI", + size=10 +) + +if platform.system() == "Darwin": #Why is macOS so difficult... + backgroundColour = "#f0f0f0" #How dull and boring + foregroundColour = "black" + buttonColour = "#f0f0f0" + backButtonColour = "#f0f0f0" + nextButtonColour = "#f0f0f0" +else: #Non Jeve Stobs worshippers + backgroundColour = "#252a34" + foregroundColour = "white" + buttonColour = "#7289DA" + backButtonColour = "#567487" + nextButtonColour = "#027b76" + + +summonWindow0() +root.mainloop() diff --git a/old version/2.0.0.py b/old version/2.0.0.py new file mode 100644 index 0000000..30bc165 --- /dev/null +++ b/old version/2.0.0.py @@ -0,0 +1,395 @@ + +# Created by YourKalamity +#https://github.com/YourKalamity/lazy-dsi-file-downloader + + +#Import libraries +import tkinter +from tkinter import messagebox +from tkinter import filedialog +import tkinter.ttk +import os +import platform +import sys +import requests +import json +from pathlib import Path +import shutil +from subprocess import Popen +import zipfile +import distutils +from distutils import dir_util + + +#Memory Pit Links - Points to GitHub repo +dsiVersions = ["1.0 - 1.3 (USA, EUR, AUS, JPN)", "1.4 - 1.4.5 (USA, EUR, AUS, JPN)", "All versions (KOR, CHN)"] +memoryPitLinks = ["https://github.com/YourKalamity/just-a-dsi-cfw-installer/raw/master/assets/files/memoryPit/256/pit.bin","https://github.com/YourKalamity/just-a-dsi-cfw-installer/raw/master/assets/files/memoryPit/768_1024/pit.bin"] + +#Downloader +def downloadFile(link, destination): + r = requests.get(link, allow_redirects=True) + if link.find('/'): + fileName = link.rsplit('/', 1)[1] + downloadLocation = destination + fileName + open(downloadLocation, 'wb').write(r.content) + return downloadLocation + + +#Get link of latest Github Release +def getLatestGitHub(usernamerepo, assetNumber): + release = json.loads(requests.get("https://api.github.com/repos/"+usernamerepo+"/releases/latest").content) + url = release["assets"][assetNumber]["browser_download_url"] + return url + +#Push text to output box +def outputbox(message): + outputBox.configure(state='normal') + outputBox.insert('end', message) + outputBox.configure(state='disabled') + +#Check if directory exists and has write permissions +def validateDirectory(directory): + try: + directory = str(directory) + except TypeError: + outputbox("That's not a valid directory") + return False + try: + string = directory + "/test.file" + with open(string, 'w') as file: + file.close() + os.remove(string) + except FileNotFoundError: + outputbox("That's not a valid directory") + outputbox(" or you do not have the") + outputbox(" permission to write there") + return False + except PermissionError: + outputbox("You do not have write") + outputbox(" access to that folder") + return False + else: + return True + +def unzipper(unzipped, destination): + with zipfile.ZipFile(unzipped, 'r') as zip_ref: + zip_ref.extractall(destination) + zip_ref.close() + +def un7zipper(_7za, zipfile, destination): + proc = Popen([_7za,"x", "-aoa", zipfile, '-o'+destination]) + + ret_val = proc.wait() + + while True: + if ret_val == 0: + break + + + +def start(): + + #Clear outputBox + outputBox.configure(state='normal') + outputBox.delete('1.0', tkinter.END) + outputBox.configure(state='disabled') + + sysname = platform.system() + #Locate 7z binary + _7za = os.path.join(sysname, '7za') + _7z = None + if sysname in ["Darwin", "Linux"]: + #Chmod 7z binary to avoid a permission error + import stat + os.chmod(_7za, stat.S_IRWXU) + if sysname == "Windows": + #Search for 7z in the 64-bit Windows Registry + from winreg import OpenKey, QueryValueEx, HKEY_LOCAL_MACHINE, KEY_READ, KEY_WOW64_64KEY + print('Searching for 7-Zip in the Windows registry...') + + try: + with OpenKey(HKEY_LOCAL_MACHINE, 'SOFTWARE\\7-Zip', 0, KEY_READ | KEY_WOW64_64KEY) as hkey: + _7z = os.path.join(QueryValueEx(hkey, 'Path')[0], '7z.exe') + + if not os.path.exists(_7z): + raise WindowsError + + _7za = _7z + except WindowsError: + #Search for 7z in the 32-bit Windows Registry + print('Searching for 7-Zip in the 32-bit Windows registry...') + + try: + with OpenKey(HKEY_LOCAL_MACHINE, 'SOFTWARE\\7-Zip') as hkey: + _7z = os.path.join(QueryValueEx(hkey, 'Path')[0], '7z.exe') + + if not os.path.exists(_7z): + raise WindowsError + + _7za = _7z + except WindowsError: + print("7-Zip not found, please install it before using") + outputbox("7-Zip not found") + return + print("7-Zip found!") + + + + #Variables + directory = SDentry.get() + version = firmwareVersion.get() + unlaunchNeeded = unlaunch.get() + + #Validate directory + directoryValidated = validateDirectory(directory) + if directoryValidated == False: + return + if dsiVersions.index(version) == 1: + memoryPitDownload = memoryPitLinks[1] + elif dsiVersions.index(version) in [0,2]: + memoryPitDownload = memoryPitLinks[0] + + #Creates a path called "/lazy-dsi-file-downloader-tmp/" if it does not exist + cwdtemp = os.getcwd() + "/lazy-dsi-file-downloader-tmp/" + Path(cwdtemp).mkdir(parents=True,exist_ok=True) + + if downloadmemorypit.get() == 1: + #Download Memory Pit + memoryPitLocation = directory + "/private/ds/app/484E494A/" + Path(memoryPitLocation).mkdir(parents=True, exist_ok=True) + downloadFile(memoryPitDownload, memoryPitLocation) + outputbox("Memory Pit Downloaded ") + print("Memory Pit Downloaded") + + if downloadtwlmenu.get() == 1: + #Download TWiLight Menu + TWLmenuLocation = downloadFile(getLatestGitHub('DS-Homebrew/TWiLightMenu', 0),cwdtemp) + outputbox("TWiLight Menu ++ Downloaded ") + print("TWiLight Menu ++ Downloaded") + + #Extract TWiLight Menu + proc = Popen([_7za,"x", "-aoa", TWLmenuLocation, '-o'+cwdtemp, 'DSi - CFW users/SDNAND root/', '_nds', 'DSi&3DS - SD card users', 'roms', 'BOOT.NDS']) + ret_val = proc.wait() + + while True: + if ret_val == 0: + outputbox("TWiLight Menu ++ Extracted ") + print("TWiLight Menu ++ Extracted to", cwdtemp) + break + + #Move TWiLight Menu + shutil.copy(cwdtemp + "DSi&3DS - SD card users/BOOT.NDS", directory) + distutils.dir_util.copy_tree(cwdtemp + "_nds/" , directory +"/_nds/") + distutils.dir_util.copy_tree(cwdtemp + "DSi - CFW users/SDNAND root/hiya", directory+"/hiya/") + distutils.dir_util.copy_tree(cwdtemp + "DSi - CFW users/SDNAND root/title", directory+"/title/") + shutil.copy(cwdtemp + "DSi&3DS - SD card users/_nds/nds-bootstrap-hb-nightly.nds", directory + "/_nds") + shutil.copy(cwdtemp + "DSi&3DS - SD card users/_nds/nds-bootstrap-hb-release.nds", directory + "/_nds") + Path(directory + "/roms/").mkdir(parents=True,exist_ok=True) + #Some Homebrew write to the _nds folder so it is better to clear it first + shutil.rmtree(cwdtemp +"_nds/") + Path(cwdtemp +"_nds/").mkdir(parents=True,exist_ok=True) + + print("TWiLight Menu ++ placed in", directory) + outputbox("TWiLight Menu ++ placed ") + + #Download DeadSkullzJr's Cheat Database + Path(directory + "/_nds/TWiLightMenu/extras/").mkdir(parents=True,exist_ok=True) + downloadFile('https://bitbucket.org/DeadSkullzJr/nds-cheat-databases/raw/933c375545d3ff90854d1e210dcf4b3b31d9d585/Cheats/usrcheat.dat', directory + "/_nds/TWiLightMenu/extras/") + print("DeadSkullzJr's Cheat Database downloaded") + + + if downloaddumptool.get() == 1: + #Download dumpTool + downloadFile(getLatestGitHub('zoogie/dumpTool', 0), directory) + print("dumpTool downloaded") + outputbox("dumpTool Downloaded ") + + if unlaunchNeeded == 1 : + #Download Unlaunch + url = "https://problemkaputt.de/unlaunch.zip" + unlaunchLocation = downloadFile(url, cwdtemp) + print("Unlaunch Downloaded") + outputbox("Unlaunch Downloaded ") + + #Extract Unlaunch + unzipper(unlaunchLocation,directory) + + + + #Creates roms/nds if it does not exist + roms = directory +"/roms/nds/" + Path(roms).mkdir(parents=True,exist_ok=True) + + outputbox("Downloading other homebrew ") + print("Downloading other homebrew...") + + + for count, item in enumerate(homebrewDB): + if homebrewList[count].get() == 1: + print("Downloading "+item["title"]) + if item["github"] == "True": + downloadlink = getLatestGitHub(item["repo"], int(item["asset"])) + else: + downloadlink = item["link"] + if item["extension"] == "nds": + downloadFile(downloadlink, roms) + elif item["extension"] == "zip": + downloadLocation = downloadFile(downloadlink, cwdtemp) + if item["location"]["roms"] == "all": + unzipper(downloadLocation, roms) + elif item["extension"] == "7z": + downloadLocation = downloadFile(downloadlink, cwdtemp) + if item["location"]["roms"] == "all": + un7zipper(_7za, downloadLocation, roms) + else: + un7zipper(_7za, downloadLocation, cwdtemp) + if "root" in item["location"]: + Path(directory+(item["location"]["root"].split('/')).pop()).mkdir(parents=True,exist_ok=True) + shutil.copy(cwdtemp+item["location"]["root"],directory+((item["location"]["root"].split('/')).pop().pop(0))) + if "roms" in item["location"]: + shutil.copy(cwdtemp+item["location"]["roms"],roms) + + + + #Delete tmp folder + shutil.rmtree(cwdtemp) + + print("Done!") + outputbox("Done!") + + +def chooseDir(): + window.sourceFolder = filedialog.askdirectory(parent=window, initialdir= "/", title='Please select the directory of your SD card') + SDentry.delete(0, tkinter.END) + SDentry.insert(0, window.sourceFolder) + + +def okButtonPress(self): + self.destroy() + window.deiconify() + +def extraHomebrew(): + homebrewWindow = tkinter.Toplevel(window) + window.withdraw() + homebrewWindowLabel = tkinter.Label(homebrewWindow, text="Homebrew List",font=("Verdana",12,"bold")) + homebrewWindowLabel.pack(anchor = "w") + homebrewWindowLabel2 = tkinter.Label(homebrewWindow, text="Select additional homebrew for download then press OK") + homebrewWindowLabel2.pack(anchor = "w") + + vscrollbar = tkinter.Scrollbar(homebrewWindow) + canvas = tkinter.Canvas(homebrewWindow, yscrollcommand=vscrollbar.set) + vscrollbar.config(command=canvas.yview) + vscrollbar.pack(side=tkinter.RIGHT, fill=tkinter.Y) + + homebrewFrame = tkinter.Frame(canvas) + homebrewWindow.title("Homebrew List") + homebrewWindow.resizable(0,0) + canvas.pack(side="left", fill="both", expand=True) + canvas.create_window(0,0, window=homebrewFrame, anchor="n") + for count, x in enumerate(homebrewDB): + l = tkinter.Checkbutton(homebrewFrame, text=x["title"] + " by " + x["author"], variable=homebrewList[count]) + l.pack(anchor = "w") + + frame = tkinter.ttk.Frame(homebrewWindow, relief=tkinter.RAISED, borderwidth=1) + frame.pack(fill=tkinter.BOTH, expand=True) + + okButton = tkinter.Button(homebrewWindow, text = "OK", font=("Verdana",12,"bold"), command=lambda:okButtonPress(homebrewWindow)) + okButton.pack(side=tkinter.RIGHT, padx=5, pady=5) + homebrewWindow.update() + canvas.config(scrollregion=canvas.bbox("all")) + + homebrewWindow.protocol("WM_DELETE_WINDOW",lambda:okButtonPress(homebrewWindow)) + + + + +if(sys.version_info.major < 3): + print("This program will ONLY work on Python 3 and above") + sys.exit() + +#Create Window +window = tkinter.Tk() +window.sourceFolder = '' +window.sourceFile = '' + + +#Homebrew Links +#Homebrew Database +homebrewDB = json.loads(requests.get('https://raw.githubusercontent.com/YourKalamity/just-a-dsi-DB/master/just-a-dsi-DB.json').content) +homebrewList = [] +for x in homebrewDB: + homebrewList.append(tkinter.IntVar()) + +homebrewList[0] = tkinter.IntVar(value=1) + +# Title and Author +appTitle = tkinter.Label(text="Lazy DSi file downloader",font=('Verdana', 14), fg="white", bg="black") +appTitle.width = 100 +appAuthor = tkinter.Label(text="by YourKalamity",font=('Verdana', 10, 'italic'), anchor="w") +appAuthor.width = 100 + +#SD Directory entry +SDlabel = tkinter.Label(text = "Enter your SD card's directory") +SDlabel.width = 100 +SDentry = tkinter.Entry(width=30) +SDentry.width = 100 +#Button to select folder +b_chooseDir = tkinter.Button(window, text = "Click to select folder", width = 25, command = chooseDir) +b_chooseDir.width = 100 +b_chooseDir.height = 50 + +#Checkbox for Memory Pit +downloadmemorypit = tkinter.IntVar(value=1) +downloadmemorypitCheck = tkinter.Checkbutton(window, text = "Download Memory pit exploit?", variable = downloadmemorypit) + + +#DSi Firmware selector +firmwareLabel = tkinter.Label(text = "Select your DSi firmware : ") +firmwareLabel.width = 100 +firmwareVersion = tkinter.StringVar(window) +firmwareVersion.set(dsiVersions[0]) +selector = tkinter.OptionMenu(window, firmwareVersion, *dsiVersions) +selector.width = 100 + +#Checkbox for TWiLight Menu ++ +downloadtwlmenu = tkinter.IntVar(value=1) +downloadtwlmenuCheck = tkinter.Checkbutton(window, text = "Download / Update TWiLight menu?", variable = downloadtwlmenu) + +#Checkbox for dumpTool +downloaddumptool = tkinter.IntVar(value=1) +downloaddumptoolCheck = tkinter.Checkbutton(window, text ="Download dumpTool?", variable=downloaddumptool) + +#Checkbox for Unlaunch +unlaunch = tkinter.IntVar(value=1) +unlaunchCheck = tkinter.Checkbutton(window, text = "Download Unlaunch?", variable =unlaunch) + +#Button to launch Additional Homebrew box +buttonExtraHomebrew = tkinter.Button(window, text = "Additional homebrew...", width = 25, command = extraHomebrew) +buttonExtraHomebrew.width = 100 +buttonExtraHomebrew.height = 50 + +#Start button and Output box +startButton = tkinter.Button(window, text = "Start", font = ("TkDefaultFont",12,'bold'), width = 25, command = start) +outputLabel = tkinter.Label(text="Output") +outputLabel.width = 100 +outputBox = tkinter.Text(window,state='disabled', width = 30, height = 10) + +#Pack everything in to window +window.title("Lazy DSi file downloader") +window.resizable(0, 0) +appTitle.pack() +appAuthor.pack() +SDlabel.pack() +SDentry.pack() +b_chooseDir.pack() +downloadmemorypitCheck.pack() +firmwareLabel.pack() +selector.pack() +downloadtwlmenuCheck.pack() +downloaddumptoolCheck.pack() +unlaunchCheck.pack() +buttonExtraHomebrew.pack() +startButton.pack() +outputLabel.pack() +outputBox.pack() +window.mainloop()