From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- indexing/xindex/lualatex/xindex-DIN2.lua | 103 + indexing/xindex/lualatex/xindex-HAdW-eKO.lua | 317 +++ indexing/xindex/lualatex/xindex-base.lua | 243 ++ indexing/xindex/lualatex/xindex-cfg-common.lua | 117 + indexing/xindex/lualatex/xindex-cfg.lua | 90 + indexing/xindex/lualatex/xindex-dtk.lua | 158 ++ indexing/xindex/lualatex/xindex-lapp.lua | 325 +++ indexing/xindex/lualatex/xindex-lib.lua | 980 ++++++++ indexing/xindex/lualatex/xindex-pretty.lua | 254 ++ indexing/xindex/lualatex/xindex-unicode.lua | 3118 ++++++++++++++++++++++++ 10 files changed, 5705 insertions(+) create mode 100644 indexing/xindex/lualatex/xindex-DIN2.lua create mode 100644 indexing/xindex/lualatex/xindex-HAdW-eKO.lua create mode 100644 indexing/xindex/lualatex/xindex-base.lua create mode 100644 indexing/xindex/lualatex/xindex-cfg-common.lua create mode 100644 indexing/xindex/lualatex/xindex-cfg.lua create mode 100644 indexing/xindex/lualatex/xindex-dtk.lua create mode 100644 indexing/xindex/lualatex/xindex-lapp.lua create mode 100644 indexing/xindex/lualatex/xindex-lib.lua create mode 100644 indexing/xindex/lualatex/xindex-pretty.lua create mode 100644 indexing/xindex/lualatex/xindex-unicode.lua (limited to 'indexing/xindex/lualatex') diff --git a/indexing/xindex/lualatex/xindex-DIN2.lua b/indexing/xindex/lualatex/xindex-DIN2.lua new file mode 100644 index 0000000000..601b977f8e --- /dev/null +++ b/indexing/xindex/lualatex/xindex-DIN2.lua @@ -0,0 +1,103 @@ +----------------------------------------------------------------------- +-- FILE: xindex-cfg.lua +-- DESCRIPTION: configuration file for xindex.lua +-- REQUIREMENTS: +-- AUTHOR: Herbert Voß +-- LICENSE: LPPL1.3 +----------------------------------------------------------------------- + +if not modules then modules = { } end modules ['xindex-cfg'] = { + version = 0.13, + comment = "configuration to xindex.lua", + author = "Herbert Voss", + copyright = "Herbert Voss", + license = "LPPL 1.3" +} + +escape_chars = { -- by default " is the escape char + {'""', "\\escapedquote", "\"{}" }, + {'"@', "\\escapedat", "@" }, + {'"|', "\\escapedvert", "|" }, + {'"!', "\\escapedexcl", "!" } +} + +itemPageDelimiter = "," -- Hello, 14 +compressPages = true -- something like 12--15, instaead of 12,13,14,15. the |( ... |) syntax is still valid +fCompress = true -- 3f -> page 3, 4 and 3ff -> page 3, 4, 5 +minCompress = 3 -- 14--17 or +numericPage = true -- for non numerical pagenumbers, like "VI-17" +sublabels = {"", "-\\,", "--\\,", "---\\,"} -- for the (sub(sub(sub-items first one is for item +pageNoPrefixDel = "" -- a delimiter for page numbers like "VI-17" +indexOpening = "" -- commands after \begin{theindex} +rangeSymbol = "--" + + +--[[ + Each character's position in this array-like table determines its 'priority'. + Several characters in the same slot have the same 'priority'. +]] +alphabet_lower = { -- for sorting + { ' ' }, -- only for internal tests + { 'a', 'á', 'à', 'å', 'æ', }, + { 'ae', 'ä'}, + { 'b' }, + { 'c', 'ç' }, + { 'd' }, + { 'e', 'é', 'è', 'ë' }, + { 'f' }, + { 'g' }, + { 'h' }, + { 'i', 'í', 'ì', 'ï' }, + { 'j' }, + { 'k' }, + { 'l' }, + { 'm' }, + { 'n', 'ñ' }, + { 'o', 'ó', 'ò', 'ø', 'œ'}, + { 'oe', 'ö' }, + { 'p' }, + { 'q' }, + { 'r' }, + { 's', 'š', 'ß' }, + { 't' }, + { 'u', 'ú', 'ù' }, + { 'ue', 'ü' }, + { 'v' }, + { 'w' }, + { 'x' }, + { 'y', 'ý', 'ÿ' }, + { 'z', 'ž' } +} +alphabet_upper = { -- for sorting + { ' ' }, + { 'A', 'Á', 'À', 'Å', 'Æ'}, + { 'AE', 'Ä'}, + { 'B' }, + { 'C', 'Ç' }, + { 'D' }, + { 'E', 'È', 'È', 'Ë' }, + { 'F' }, + { 'G' }, + { 'H' }, + { 'I', 'Í', 'Ì', 'Ï' }, + { 'J' }, + { 'K' }, + { 'L' }, + { 'M' }, + { 'N', 'Ñ' }, + { 'O', 'Ó', 'Ò', 'Ø','Œ' }, + { 'OE', 'Ö' }, + { 'P' }, + { 'Q' }, + { 'R' }, + { 'S', 'Š' }, + { 'T' }, + { 'U', 'Ú', 'Ù' }, + { 'UE', 'Ü' }, + { 'V' }, + { 'W' }, + { 'X' }, + { 'Y', 'Ý', 'Ÿ' }, + { 'Z', 'Ž' } +} + diff --git a/indexing/xindex/lualatex/xindex-HAdW-eKO.lua b/indexing/xindex/lualatex/xindex-HAdW-eKO.lua new file mode 100644 index 0000000000..4601cccef5 --- /dev/null +++ b/indexing/xindex/lualatex/xindex-HAdW-eKO.lua @@ -0,0 +1,317 @@ +----------------------------------------------------------------------- +-- FILE: xindex-HAdW-eKO.lua +-- DESCRIPTION: configuration file for xindex.lua +-- REQUIREMENTS: +-- AUTHOR: Herbert Voß +-- LICENSE: LPPL1.3 +----------------------------------------------------------------------- +-- +-- configuration for index files of the Heidelberger Akademie der Wissenschaften + +if not modules then modules = { } end modules ['xindex-HAdW-eKO'] = { + version = 0.13, + comment = "configuration to xindex.lua", + author = "Herbert Voss", + copyright = "Herbert Voss", + license = "LPPL 1.3" +} + +--local version = "0.01" + +itemPageDelimiter = " \\dotfill " -- Hello ..... 14 +compressPages = true -- something like 12--15, instaead of 12,13,14,15. the |( ... |) syntax is still valid +fCompress = true -- 3f -> page 3, 4 and 3ff -> page 3, 4, 5 +minCompress = 3 -- 14--17 or +numericPage = false -- for non numerical pagenumbers, like "VI-17" +sublabels = {"", "-\\,", "--\\,", "---\\,"} -- for the (sub(sub(sub-items first one is for item +pageNoPrefixDel = "" -- a delimiter for page numbers like "VI-17" +indexOpening = "" -- commands after \begin{theindex} +rangeSymbol = "--" + +case_sensitive = false -- speeds up running + +--[[ + Each character's position in this array-like table determines its 'priority'. + Several characters in the same slot have the same 'priority'. +]] +alphabet_lower = { -- for sorting + { ' ' }, -- only for internal tests + { 'a', 'á', 'à', 'ä'}, + { 'b' }, + { 'c' }, + { 'd' }, + { 'e', 'é', 'è', 'ë' }, + { 'f' }, + { 'g' }, + { 'h' }, + { 'i', 'í', 'ì', 'ï' }, + { 'j' }, + { 'k' }, + { 'l' }, + { 'm' }, + { 'n', 'ñ' }, + { 'o', 'ó', 'ò', 'ö' }, + { 'p' }, + { 'q' }, + { 'r' }, + { 's' }, + { 't' }, + { 'u', 'ú', 'ù', 'ü' }, + { 'v' }, + { 'w' }, + { 'x' }, + { 'y' }, + { 'z' } +} +alphabet_upper = { -- for sorting + { ' ' }, + { 'A', 'Á', 'À', 'Ä'}, + { 'B' }, + { 'C' }, + { 'D' }, + { 'E', 'È', 'È', 'ë' }, + { 'F' }, + { 'G' }, + { 'H' }, + { 'I', 'Í', 'Ì', 'ï' }, + { 'J' }, + { 'K' }, + { 'L' }, + { 'M' }, + { 'N', 'Ñ' }, + { 'O', 'Ó', 'Ò', 'Ö' }, + { 'P' }, + { 'Q' }, + { 'R' }, + { 'S' }, + { 'T' }, + { 'U', 'Ú', 'Ù', 'Ü' }, + { 'V' }, + { 'W' }, + { 'X' }, + { 'Y' }, + { 'Z' } +} + + +--\indexentry{Ackers, Carolus}{VII/1-715} +--\indexentry{Bremen!Adalbert I. von, Erzbischof}{VII/2/1-948} +--\indexentry{Bremen!Adalbert I. von, Erzbischof}{VII/1-50} + +function specialCompressPageList(pages) +-- print(#pages..".. number:|"..pages[1]["number"].."| Special:"..pages[1]["special"]) + if (pages[1]["number"] == "") then pages[1]["number"] = " " end + if (#pages <= 1) then + pages[1]["number"] = pages[1]["number"]:gsub('-',':~')-- replace "-" with ":~" + return pages + end -- only one pageno +--[[ +modify pagelist +sortPages = {{ origin = { number=VII/1-715, special="" }, + sort = 07/1-00715 }, + {...} + } +]] + local sortPages = {} + local roman + local volume + local page + local i +--print("----------------------------------------") + for i=1,#pages do + roman = string.gsub(pages[i]["number"],'%U*','') -- only uppercase to catch VII/1-123f and VII/3-123ff (folium pages) + if romanToNumber(roman) then + roman = string.format("%05d",tonumber(romanToNumber(roman))) -- only roman part VII + else + roman = "" + end + volume = string.gsub(pages[i]["number"],'%a*','') -- only the number /2 123 or /2-123 + if volume then volume = volume:gsub('-%d*','') end -- delete - char to get /2 + page = string.gsub(pages[i]["number"],'.*-','') + page = string.format("%5s",page) + sortPages[#sortPages+1] = { + origin = pages[i], + sort = roman..volume.." "..page } -- no minus between Roman/Volume and first page +--print(roman..volume.." "..page.." Special:"..pages[i]["special"]) + end +-- sort the page list + table.sort(sortPages, function(a,b) return a["sort"] < b["sort"] end ) + local Pages = {} +-- writeLog(1,print(getRawPagesP(sortPages)),2) + for i=1,#sortPages do -- use the sorted origin table + Pages[#Pages+1] = sortPages[i]["origin"] + end +-- writeLog(1,print(getRawPagesP(Pages)),2) +-- test if two or more pages in the list + if #Pages == 2 then -- only two pages + local page1 = string.gsub(Pages[1]["number"],'%A*','') -- get prefix1 + local page2 = string.gsub(Pages[2]["number"],'%A*','') -- get prefix2 + print(page1,Pages[1]["number"],page2,Pages[2]["number"]) + if (page1 == page2) then -- same prefix + page1 = string.gsub(Pages[1]["number"],'.*-','') -- get page1 + page2 = string.gsub(Pages[2]["number"],'.*-','') -- get page2 + if ((type(tonumber(page1)) ~= "number") or (type(tonumber(page2)) ~= "number")) then return Pages end -- one is not numeric + if (page2-page1) == 1 then -- pagediff = 1 + Pages[1]["number"] = Pages[1]["number"].."f" + Pages[2] = nil -- remove second page + return Pages + else -- page difference > 1 + Pages[1]["number"] = pages[1]["number"]:gsub('-',':~') + Pages[2]["number"] = string.gsub(Pages[2]["number"],'.*-','') -- use only number -> same prefix + return Pages -- Pages[1] is the same + end + else -- different prefixes + Pages[1]["number"] = Pages[1]["number"]:gsub('-',':~') + Pages[2]["number"] = Pages[2]["number"]:gsub('-',':~') + return Pages -- different prefix -> simple return of the two pages + end + else -- more than two pages + local prefixList = {} + local lastPrefix = "" + local currentPrefix + for i=1,#Pages do -- create the list of different prefixes, eg {VI, VI/2/1, VI/2/2} + currentPrefix, j = string.gsub(Pages[i]["number"],'-.*','') + if currentPrefix ~= lastPrefix then + prefixList[#prefixList+1] = currentPrefix + lastPrefix = currentPrefix + end + end + pages = {} + for j = 1,#prefixList do + lastPrefix = prefixList[j] + i = 1 + local subPageList = {} + while (i <= #Pages) do + currentPrefix, _ = string.gsub(Pages[i]["number"],'-.*','') + if (lastPrefix == currentPrefix) then + subPageList[#subPageList+1] = { number = string.gsub(Pages[i]["number"],'.*-',''), special = Pages[i]["special"] } + end + i = i +1 + end + sortPages = compressPageList(subPageList) + -- instead of minus between Roman/Volume and first page insert colon + if (stripLeadingSpaces(sortPages[1]["number"]) == "") then + colon = "" + sortPages[1]["number"] = "" + else + colon = ':~' + end + pages[#pages+1] = { number = lastPrefix..colon..sortPages[1]["number"], special = sortPages[1]["special"] } + for i=2,#sortPages do + pages[#pages+1] = sortPages[i] + end + end + return pages + end +end + +function replaceRoman(r) + local i = romanToNumber(r) + if i then return "//"..string.format("%05d",i).."//" + else return r + end +end +function replaceRomanB(r) + local i = romanToNumber(r) + if i then return "!//"..string.format("%05d",i).."//." + else return r + end +end + +function SORTprehook(data) -- replace roman with algebraic, eg Karl IX -> Karl // 9// +-- \indexentry{Karl!V., Kaiser}{VI/1-284} must also be catched +-- writeLog(1,require 'xindex-pretty'.dump(data),0) -- only for internal dump + local entry + local elements = {} + for i=1,#data do + entry = data[i]["Entry"] + elements = entry:split() + if (#elements > 1) then -- at least one space (two elements) + local number = romanToNumber(elements[#elements]) + if number then + local strNr = string.format("%03d",tostring(number)) + elements[#elements] = "//"..strNr.."//" + entry = "" + for j=1,#elements do entry=entry.." "..elements[j] end -- has leading space + else + entry = entry:gsub("!(.-)%.",replaceRomanB) -- {Karl!V., Kaiser}{VI/1-284} + end + data[i]["Entry"] = entry:gsub("^%s*(.-)%s*$", "%1") -- strip leading space + end + end + return data +end + +function SORTposthook(data) -- the other way round as prehook + local entry + local elements = {} + for i=1,#data do + entry = data[i]["Entry"] + if entry:find("//") then + data[i]["Entry"] = entry:gsub("//(.-)//",numberToRoman) + end + end + return data +end + +function colorBox(str) + return ("\\colorbox{black!15}{"..str.."}:~") +end + +-- Pages[1]["number"] = pages[1]["number"]:gsub('(.-):~',colorBox) +-- Pages[2]["number"] = pages[2]["number"]:gsub('(.-):~',colorBox) + + +function specialGetPageList(v,hyperpage) + local Pages = {} + if v["pages"] then + table.sort(v["pages"],pageCompare)-- nur nötig, da User manuell eine Zeile einfügen kann + if specialCompressPageList then + Pages = specialCompressPageList(v["pages"]) + else + Pages = compressPageList(v["pages"]) + end +-- require 'xindex-pretty'.dump(Pages) -- only for internal dump + local pageNo +--[[ +\indexentry{Auto|hyperindexformat{\textbf}}{1} +-> \item Auto, \hyperindexformat{\textbf}{1} + + add for example \hyperpage{5\nohyperpage{f}} , same for ff + + \item foo, \hyperpage{1\nohyperpage{f}}, + \hyperpage{4\nohyperpage{ff}}, \hyperpage{8} + +]] + if hyperpage then + if string.find(v["pages"][1]["special"],"hyperindexformat") then + pageNo = v["pages"][1]["special"].."{"..checkFF(Pages[1]["number"].."}") + else + pageNo = "\\hyperpage{"..checkFF(Pages[1]["number"]).."}" + end + for i=2,#Pages do + if string.find(v["pages"][i]["special"],"hyperindexformat") then + pageNo = pageNo..", "..v["pages"][i]["special"].."{"..checkFF(Pages[i]["number"].."}") + else + pageNo = pageNo..", \\hyperpage{"..checkFF(Pages[i]["number"]).."}" + end +-- Pages[i] = nil + end + else + writeLog(1,"getPageList: "..tostring(Pages[1]["special"]).."{"..tostring(Pages[1]["number"]).."}\n",2) + if (Pages[1]["special"] == nil) or (Pages[1]["number"] == nil) then return "" end + pageNo = Pages[1]["special"].."{"..Pages[1]["number"]:gsub('(.-):~',colorBox).."}" + for i=2,#Pages do + if Pages[i]["number"] then + pageNo = pageNo..", "..Pages[i]["special"].."{"..Pages[i]["number"]:gsub('(.-):~',colorBox).."}" + Pages[i] = {} + end + end + end + return pageNo + else + return "" + end +end + + diff --git a/indexing/xindex/lualatex/xindex-base.lua b/indexing/xindex/lualatex/xindex-base.lua new file mode 100644 index 0000000000..c2647f2df2 --- /dev/null +++ b/indexing/xindex/lualatex/xindex-base.lua @@ -0,0 +1,243 @@ +----------------------------------------------------------------------- +-- FILE: xindex-base.lua +-- DESCRIPTION: base file for xindex.lua +-- REQUIREMENTS: +-- AUTHOR: Herbert Voß +-- LICENSE: LPPL1.3 +----------------------------------------------------------------------- + +local info = { version = 0.13 } + +-- check config +if pageNoPrefixDel ~= "" then +-- numericPage = false + pageNoPrefixPattern = "^.*"..pageNoPrefixDel +end + +writeLog(2,"Read Data from file "..inFile.." ... \n",0) +local lines = read_lines_from(inFile) +writeLog(2,#lines.." lines of data read\n",0) + +if vlevel > 1 then + writeLog(1,"--------------- Input data -----------------\n",2) + for _,l in pairs(lines) do writeLog(1,l.."\n",2) end + writeLog(1,"--------------- end Input data -----------------\n",2) +end + +local Index = {} -- Entry = "Seitenzahl(en)" +local pages = {} +local noEntryfound +local noPagefound + +hyperpage, lines = checkHyperpage(lines) -- hyperref used? +if hyperpage then writeLog(1,"We have hyperpages ... \n",1) end + +--for _,l in pairs(lines) do print (l) end + +writeLog(1,"Change escape chars with macros ... \n",0) +for k,v in pairs(lines) do + if not commandEntry(v) then + for i, str0 in ipairs(escape_chars) do + v = v:gsub(str0[1],str0[2]) + end + if k < #lines then + if commandEntry(lines[k+1]) then -- is the next line not a \indexentry ? + Index = getEntryAndPage(v,lines[k+1],Index)-- read two lines + else + Index = getEntryAndPage(v,"",Index)-- current line + end + else + Index = getEntryAndPage(v,"",Index)-- current line + end + end +end + +writeLog(1,"... done\n",0) +writeLog(1,"------------------ Start list after getEntryAndPage() ------------------------\n,",2) +printList(Index,2) +writeLog(1,"\n------------------ end list after getEntryAndPage() ------------------------\n",2) +writeLog(2,"Sorting entries: for LARGE idx files it can take some minutes ... \n",0) + +if SORTprehook then Index = SORTprehook(Index) end +k = 0 +table.sort(Index,UTFCompare) +if SORTposthook then Index = SORTposthook(Index) end + +writeLog(1,"\n------------------ Start list after table.sort(Index,UTFCompare)------------\n",2) +printList(Index,2) +writeLog(1,require 'xindex-pretty'.dump(Index),3) -- only for internal dump +writeLog(1,"\n------------------ end list after table.sort(Index,UTFCompare)------------\n",2) + +writeLog(1,"\n",0) +writeLog(2,"\ncheck for |(...|) \n",0) +writeLog(1,"------------------ Start list before checkParenthesis(Index)------------\n",2) +writeLog(1,require 'xindex-pretty'.dump(Index),3) -- only for internal dump +--for i=1,#Index do print(Index[i]["Entry"],Index[i]["pages"][1]["number"],Index[i]["pages"][1]["special"]) end + +Index = checkParenthesis(Index) + +writeLog(1,"\n",0) + +--for i=1,#Index do print(Index[i]["Entry"],Index[i]["pages"][1]["number"],Index[i]["pages"][1]["special"]) end +writeLog(1,require 'xindex-pretty'.dump(Index),3) -- only for internal dump +printList(Index,2) +writeLog(1,"------------------ End list after checkParenthesis(Index) ------------\n",2) +writeLog(2,"done\n",0) + + + +writeLog(2,"Replace @-operator ...\n",0) +writeLog(1,"------------------ Start list before compressEntryList(Index)------------\n",1) +writeLog(1,require 'xindex-pretty'.dump(Index),3) -- only for internal dump + +local NewIndex = {} +NewIndex = compressEntryList(Index) -- replaces also foo@bar -> bar + +-- for i=1,#NewIndex do print(NewIndex[i]["Entry"],NewIndex[i]["pages"][1]["number"],NewIndex[i]["pages"][1]["special"]) end +writeLog(1,require 'xindex-pretty'.dump(NewIndex),3) -- only for internal dump +printList(NewIndex,2) +writeLog(1,"------------------ End list after compressEntryList(Index)------------\n",1) +writeLog(2,"done\n",0) + +-- output the .ind-list +--[[ +for i, str0 in ipairs(escape_chars) do + outFile:write("\\def"..str0[2].."{"..str0[3].."}\n") +end +]] -- no more needed, we redo the setting + +if SORTendhook then + NewIndex = SORTendhook(NewIndex) +end + +outFile:write("\n") +outFile:write("\\begin{theindex}\n") + +if indexOpening ~= "" then -- commands after \begin{theindex} + outFile:write(indexOpening) +end + +local entry +local firstCLine = true +local firstNLine = true +local firstSLine = true +local firstChar +local symbols = true +local numbers = false +local letters = false +local charType +local currentChar +local currentCharType = 0 -- assume Symbol; 1 number; 2 letter +local oldChar = "" +local excl = 0 -- number of ! symbols in one entry +local lastItems = {"","",""} + +writeLog(2,"Start writing .ind file ... \n",0) + +-- first the special cases for symbols and numbers: + +writeLog(1,"---------- Start list to write the ind file --------------\n",1) +writeLog(1,require 'xindex-pretty'.dump(NewIndex),3) -- only for internal dump + +for k=1,#NewIndex do +-- require 'xindex-pretty'.dump(NewIndex[k]) -- only for internal dump + if NewIndex[k]["Entry"] then + local v = NewIndex[k] + writeLog(1," NewIndex[k]: "..v["Entry"].."\n",2) + writeLog(1,require 'xindex-pretty'.dump(v),3) -- only for internal dump + entry = v["Entry"] + writeLog(1,"\nBase start: "..entry.."\n",2) +-- local c = utf.sub(v["sortChar"],1,1) +-- if utf8.codepoint(c) < 12288 then -- Japanese starts at hex 3000 +-- firstChar = v["sortChar"] +-- else + firstChar = utf.sub(v["sortChar"],1,1) -- catch a translatet Ö->OE +-- end + currentChar = firstChar + charType = getCharType(firstChar) + if charType == 0 then + numbers = false + symbols = true + letters = false + end + if charType == 1 then + numbers = true + symbols = false + letters = false + end + if charType > 1 then + numbers = false + symbols = false + letters = true + end + if symbols then + writeLog(1,"We have symbols to print ...\n",3) + if firstSLine then + firstSLine = false + if not no_headings then + outFile:write("\\par\\textbf{"..index_header[1].."}") + if (labelPrefix == "") then + outFile:write("\\label{xindex-"..index_header[1].."}\n\\nopagebreak[4]\n") + else + outFile:write("\\label{"..labelPrefix.."-xindex-"..index_header[1].."}\n\\nopagebreak[4]\n") + end + end + end + if specialItemOutput then + lastItems = specialItemOutput(lastItems, v, hyperpage) + else + lastItems = itemOutput(lastItems, v, hyperpage) + end + else + writeLog(1,"We have no symbols to print ...\n",3) + end + if numbers then + writeLog(1,"We have numbers to print ...\n",3) + if firstNLine then + firstNLine = false + outFile:write("\n\\indexspace\n") + if not no_headings then + outFile:write("\\textbf{"..index_header[2].."}") + if (labelPrefix == "") then + outFile:write("\\label{xindex-"..index_header[2].."}\n\\nopagebreak[4]\n") + else + outFile:write("\\label{"..labelPrefix.."-xindex-"..index_header[2].."}\n\\nopagebreak[4]\n") + end + end + end + if specialItemOutput then + lastItems = specialItemOutput(lastItems, v, hyperpage) + else + lastItems = itemOutput(lastItems, v, hyperpage) + end + else + writeLog(1,"We have no numbers to print ...\n",3) + end + if letters then + writeLog(1,"We have letters to print ...\n",3) + if (currentChar ~= oldChar) and (charType == 2) then + outFile:write("\n\\indexspace\n") + if not no_headings then + outFile:write("\\textbf{"..currentChar.."}") + if (labelPrefix == '""') then + outFile:write("\\label{xindex-"..currentChar.."}\n\\nopagebreak[4]\n") + else + outFile:write("\\label{"..labelPrefix.."-xindex-"..currentChar.."}\n\\nopagebreak[4]\n") + end + end + oldChar = currentChar + end + if specialItemOutput then + lastItems = specialItemOutput(lastItems, v, hyperpage) + else + lastItems = itemOutput(lastItems, v, hyperpage) + end + end + if v["Macro"] then outFile:write(v["Macro"].."\n") end + end +end +outFile:write("\\end{theindex}\n") +outFile:close() + +writeLog(2,"\ndone! closing program\n",0) + diff --git a/indexing/xindex/lualatex/xindex-cfg-common.lua b/indexing/xindex/lualatex/xindex-cfg-common.lua new file mode 100644 index 0000000000..d98adb6b92 --- /dev/null +++ b/indexing/xindex/lualatex/xindex-cfg-common.lua @@ -0,0 +1,117 @@ +----------------------------------------------------------------------- +-- FILE: xindex-cfg-common.lua +-- DESCRIPTION: configuration file for xindex.lua +-- REQUIREMENTS: +-- AUTHOR: Herbert Voß +-- LICENSE: LPPL1.3 +----------------------------------------------------------------------- + +if not modules then modules = { } end modules ['xindex-cfg-common'] = { + version = 0.13, + comment = "configuration to xindex.lua", + author = "Herbert Voss", + copyright = "Herbert Voss", + license = "LPPL 1.3" +} + +indexheader = { + de = {"Symbole", "Zahlen"}, + en = {"Symbols", "Numbers"}, + fr = {"Symboles","Chiffre"}, + jp = {"シンボル","番号"}, +} + +folium = { + de = {"f", "ff"}, + en = {"f", "ff"}, + fr = {"\\,sq","\\,sqq"}, +} + +alphabet_uppercase = { + { 'α', 'Α' }, + { 'β', 'Β' }, + { 'ϐ', 'ϐ' }, + { 'γ', 'Γ' }, + { 'δ', 'Δ' }, + { 'ε', 'Ε' }, + { 'ζ', 'Ζ' }, + { 'η', 'Η' }, + { 'θ', 'Θ' }, + { 'ι', 'Ι' }, + { 'κ', 'Κ' }, + { 'λ', 'Λ' }, + { 'μ', 'Μ' }, + { 'ν', 'Ν' }, + { 'ξ', 'Ξ' }, + { 'ο', 'Ο' }, + { 'π', 'Π' }, + { 'ρ', 'Ρ' }, + { 'σ', 'Σ' }, + { 'ς', 'ς' }, + { 'τ', 'Τ' }, + { 'υ', 'Υ' }, + { 'φ', 'Φ' }, + { 'χ', 'Χ' }, + { 'ψ', 'Ψ' }, + { 'ω', 'Ω' }, +-- + { 'a', 'A' }, + { 'b', 'B' }, + { 'c', 'C' }, + { 'd', 'D' }, + { 'e', 'E' }, + { 'f', 'F' }, + { 'g', 'G' }, + { 'h', 'H' }, + { 'i', 'I' }, + { 'j', 'J' }, + { 'k', 'K' }, + { 'l', 'L' }, + { 'm', 'M' }, + { 'n', 'N' }, + { 'o', 'O' }, + { 'p', 'P' }, + { 'q', 'Q' }, + { 'r', 'R' }, + { 's', 'S' }, + { 't', 'T' }, + { 'u', 'U' }, + { 'v', 'V' }, + { 'w', 'W' }, + { 'x', 'X' }, + { 'y', 'Y' }, + { 'z', 'Z' }, +-- + { 'а', 'А' }, + { 'б', 'Б' }, + { 'в', 'В' }, + { 'г', 'Г' }, + { 'д', 'Д' }, + { 'е', 'Е' }, + { 'ж', 'Ж' }, + { 'з', 'З' }, + { 'и', 'И' }, + { 'й', 'Й' }, + { 'к', 'К' }, + { 'л', 'Л' }, + { 'м', 'М' }, + { 'н', 'Н' }, + { 'о', 'О' }, + { 'п', 'П' }, + { 'р', 'Р' }, + { 'с', 'С' }, + { 'т', 'Т' }, + { 'у', 'У' }, + { 'ф', 'Ф' }, + { 'х', 'Х' }, + { 'ц', 'Ц' }, + { 'ч', 'Ч' }, + { 'ш', 'Ш' }, + { 'щ', 'Щ' }, + { 'ъ', 'Ъ' }, + { 'ы', 'Ы' }, + { 'ь', 'Ь' }, + { 'э', 'Э' }, + { 'ю', 'Ю' }, + { 'я', 'Я' } +} diff --git a/indexing/xindex/lualatex/xindex-cfg.lua b/indexing/xindex/lualatex/xindex-cfg.lua new file mode 100644 index 0000000000..a9e7213dda --- /dev/null +++ b/indexing/xindex/lualatex/xindex-cfg.lua @@ -0,0 +1,90 @@ +----------------------------------------------------------------------- +-- FILE: xindex-cfg.lua +-- DESCRIPTION: configuration file for xindex.lua +-- REQUIREMENTS: +-- AUTHOR: Herbert Voß +-- LICENSE: LPPL1.3 +----------------------------------------------------------------------- + +if not modules then modules = { } end modules ['xindex-cfg'] = { + version = 0.13, + comment = "main configuration to xindex.lua", + author = "Herbert Voss", + copyright = "Herbert Voss", + license = "LPPL 1.3" +} + +itemPageDelimiter = "," -- Hello, 14 +compressPages = true -- something like 12--15, instaead of 12,13,14,15. the |( ... |) syntax is still valid +fCompress = true -- 3f -> page 3, 4 and 3ff -> page 3, 4, 5 +minCompress = 3 -- 14--17 or +rangeSymbol = "--" +numericPage = true -- for non numerical pagenumbers, like "VI-17" +sublabels = {"", "-\\,", "--\\,", "---\\,"} -- for the (sub(sub(sub-items first one is for item +pageNoPrefixDel = "" -- a delimiter for page numbers like "VI-17" -- not used !!! +indexOpening = "" -- commands after \begin{theindex} + + +--[[ + Each character's position in this array-like table determines its 'priority'. + Several characters in the same slot have the same 'priority'. +]] +alphabet_lower = { -- for sorting + { ' ' }, -- only for internal tests + { 'a', 'á', 'à', 'ä', 'å', 'æ', }, + { 'b' }, + { 'c', 'ç' }, + { 'd' }, + { 'e', 'é', 'è', 'ë' }, + { 'f' }, + { 'g' }, + { 'h' }, + { 'i', 'í', 'ì', 'ï' }, + { 'j' }, + { 'k' }, + { 'l' }, + { 'm' }, + { 'n', 'ñ' }, + { 'o', 'ó', 'ò', 'ö', 'ø', 'œ'}, + { 'p' }, + { 'q' }, + { 'r' }, + { 's', 'š', 'ß' }, + { 't' }, + { 'u', 'ú', 'ù', 'ü' , 'û'}, + { 'v' }, + { 'w' }, + { 'x' }, + { 'y', 'ý', 'ÿ' }, + { 'z', 'ž' } +} +alphabet_upper = { -- for sorting + { ' ' }, + { 'A', 'Á', 'À', 'Ä', 'Å', 'Æ'}, + { 'B' }, + { 'C', 'Ç' }, + { 'D' }, + { 'E', 'È', 'È', 'Ë' }, + { 'F' }, + { 'G' }, + { 'H' }, + { 'I', 'Í', 'Ì', 'Ï' }, + { 'J' }, + { 'K' }, + { 'L' }, + { 'M' }, + { 'N', 'Ñ' }, + { 'O', 'Ó', 'Ò', 'Ö', 'Ø','Œ' }, + { 'P' }, + { 'Q' }, + { 'R' }, + { 'S', 'Š' }, + { 'T' }, + { 'U', 'Ú', 'Ù', 'Ü' }, + { 'V' }, + { 'W' }, + { 'X' }, + { 'Y', 'Ý', 'Ÿ' }, + { 'Z', 'Ž' } +} + diff --git a/indexing/xindex/lualatex/xindex-dtk.lua b/indexing/xindex/lualatex/xindex-dtk.lua new file mode 100644 index 0000000000..cb38541fa2 --- /dev/null +++ b/indexing/xindex/lualatex/xindex-dtk.lua @@ -0,0 +1,158 @@ +----------------------------------------------------------------------- +-- FILE: xindex-cfg.lua +-- DESCRIPTION: configuration file for xindex.lua +-- REQUIREMENTS: +-- AUTHOR: Herbert Voß +-- LICENSE: LPPL1.3 +----------------------------------------------------------------------- + +if not modules then modules = { } end modules ['xindex-cfg'] = { + version = 0.13, + comment = "DTK configuration to xindex.lua", + author = "Herbert Voss", + copyright = "Herbert Voss", + license = "LPPL 1.3" +} + +itemPageDelimiter = "" -- Hello, 14 +compressPages = true -- something like 12--15, instaead of 12,13,14,15. the |( ... |) syntax is still valid +fCompress = true -- 3f -> page 3, 4 and 3ff -> page 3, 4, 5 +minCompress = 3 -- 14--17 or +numericPage = true -- for non numerical pagenumbers, like "VI-17" +sublabels = {"","","",""} -- for the sub(sub(sub-items +pageNoPrefixDel = "" -- a delimiter for page numbers like "VI-17" -- not used !!! +rangeSymbol = "--" +indexOpening = "" --[[\providecommand*\lettergroupDefault[1]{} +\providecommand*\lettergroup[1]{% + \par\textbf{#1}\par + \nopagebreak + } +]] + + +--[[ + Each character's position in this array-like table determines its 'priority'. + Several characters in the same slot have the same 'priority'. +]] +alphabet_lower = { -- for sorting + { ' ' }, -- only for internal tests + { 'a', 'á', 'à', 'ä'}, + { 'b' }, + { 'c' }, + { 'd' }, + { 'e', 'é', 'è', 'ë' }, + { 'f' }, + { 'g' }, + { 'h' }, + { 'i', 'í', 'ì', 'ï' }, + { 'j' }, + { 'k' }, + { 'l' }, + { 'm' }, + { 'n', 'ñ' }, + { 'o', 'ó', 'ò', 'ö' }, + { 'p' }, + { 'q' }, + { 'r' }, + { 's' }, + { 't' }, + { 'u', 'ú', 'ù', 'ü' }, + { 'v' }, + { 'w' }, + { 'x' }, + { 'y' }, + { 'z' } +} +alphabet_upper = { -- for sorting + { ' ' }, + { 'A', 'Á', 'À', 'Ä'}, + { 'B' }, + { 'C' }, + { 'D' }, + { 'E', 'È', 'È', 'ë' }, + { 'F' }, + { 'G' }, + { 'H' }, + { 'I', 'Í', 'Ì', 'ï' }, + { 'J' }, + { 'K' }, + { 'L' }, + { 'M' }, + { 'N', 'Ñ' }, + { 'O', 'Ó', 'Ò', 'Ö' }, + { 'P' }, + { 'Q' }, + { 'R' }, + { 'S' }, + { 'T' }, + { 'U', 'Ú', 'Ù', 'Ü' }, + { 'V' }, + { 'W' }, + { 'X' }, + { 'Y' }, + { 'Z' } +} + + +function specialGetPageList(v,hyperpage) + local Pages = {} + if v["pages"] then + table.sort(v["pages"],pageCompare)-- nur nötig, da User manuell eine Zeile einfügen kann + if specialCompressPageList then + Pages = specialCompressPageList(v["pages"]) + else + Pages = compressPageList(v["pages"]) + end + local pageNo + if hyperpage then + if string.find(v["pages"][1]["special"],"hyperindexformat") then + pageNo = v["pages"][1]["special"].."{"..checkFF(Pages[1]["number"].."}") + else + pageNo = "\\hyperpage{"..checkFF(Pages[1]["number"]).."}" + end + for i=2,#Pages do + if string.find(v["pages"][i]["special"],"hyperindexformat") then + pageNo = pageNo..", "..v["pages"][i]["special"].."{"..checkFF(Pages[i]["number"].."}") + else + pageNo = pageNo..", \\hyperpage{"..checkFF(Pages[i]["number"]).."}" + end +-- Pages[i] = nil + end + else + if args_v then print("getPageList: "..tostring(Pages[1]["special"])..tostring(Pages[1]["number"])) end + if (Pages[1]["special"] == nil) or (Pages[1]["number"] == nil) then return "" end + if #Pages == 1 then + return "\\relax "..Pages[1]["number"].."\\@nil" + else + pageNo = "\\relax "..Pages[1]["number"] + for i=2,#Pages do + if Pages[i]["number"] then + pageNo = pageNo..", "..Pages[i]["number"] + Pages[i] = {} + end + end + pageNo = pageNo.."\\@nil" -- add \@nil + end + return pageNo + end + else + return "" + end +end + +function specialItemOutput(last, v, hyperpage) + local lastItems = last + local currentItems = {} + local Entry = v["Entry"] + local name = getItem(Entry,0) + local adress = getItem(Entry,1) + outFile:write(" \\item "..name..itemPageDelimiter.."\n") + str = " \\subitem "..itemPageDelimiter.." "..adress..getPageList(v,hyperpage).."\n" + for i, str0 in ipairs(escape_chars) do -- undo the escape char setting + str = str:gsub(str0[2],str0[3]) + end + outFile:write(str) + return last +end + + diff --git a/indexing/xindex/lualatex/xindex-lapp.lua b/indexing/xindex/lualatex/xindex-lapp.lua new file mode 100644 index 0000000000..3912740ef7 --- /dev/null +++ b/indexing/xindex/lualatex/xindex-lapp.lua @@ -0,0 +1,325 @@ +-- lapp.lua +-- Simple command-line parsing using human-readable specification +----------------------------- +--~ -- args.lua +--~ local args = require ('lapp') [[ +--~ Testing parameter handling +--~ -p Plain flag (defaults to false) +--~ -q,--quiet Plain flag with GNU-style optional long name +--~ -o (string) Required string option +--~ -n (number) Required number option +--~ -s (default 1.0) Option that takes a number, but will default +--~ (number) Required number argument +--~ (default stdin) A parameter which is an input file +--~ (default stdout) One that is an output file +--~ ]] +--~ for k,v in pairs(args) do +--~ print(k,v) +--~ end +------------------------------- +--~ > args -pq -o help -n 2 2.3 +--~ input file (781C1B78) +--~ p true +--~ s 1 +--~ output file (781C1B98) +--~ quiet true +--~ start 2.3 +--~ o help +--~ n 2 +-------------------------------- +if not modules then modules = { } end modules ['xindex-lapp'] = { + version = 0.13, + comment = "read parameter for xindex.lua", + author = "Steve Donovan", + copyright = "Steve Donovan", + license = "MIT" +} + + +lapp = {} + +local append = table.insert +local usage +local open_files = {} +local parms = {} +local aliases = {} +local parmlist = {} + +local filetypes = { + stdin = {io.stdin,'file-in'}, stdout = {io.stdout,'file-out'}, + stderr = {io.stderr,'file-out'} +} + +local function quit(msg,no_usage) + if msg then + io.stderr:write(msg..'\n\n') + end + if not no_usage then + io.stderr:write(usage) + end + os.exit(1); +end + +local function error(msg,no_usage) + quit(arg[0]:gsub('.+[\\/]','')..':'..msg,no_usage) +end + +local function ltrim(line) + return line:gsub('^%s*','') +end + +local function rtrim(line) + return line:gsub('%s*$','') +end + +local function trim(s) + return ltrim(rtrim(s)) +end + +local function open (file,opt) + local val,err = io.open(file,opt) + if not val then error(err,true) end + append(open_files,val) + return val +end + +local function xassert(condn,msg) + if not condn then + error(msg) + end +end + +local function range_check(x,min,max,parm) + xassert(min <= x and max >= x,parm..' out of range') +end + +local function xtonumber(s) + local val = tonumber(s) + if not val then error("unable to convert to number: "..s) end + return val +end + +local function is_filetype(type) + return type == 'file-in' or type == 'file-out' +end + +local types = {} + +local function convert_parameter(ps,val) + if ps.converter then + val = ps.converter(val) + end + if ps.type == 'number' then + val = xtonumber(val) + elseif is_filetype(ps.type) then + val = open(val,(ps.type == 'file-in' and 'r') or 'w' ) + elseif ps.type == 'boolean' then + val = true + end + if ps.constraint then + ps.constraint(val) + end + return val +end + +function lapp.add_type (name,converter,constraint) + types[name] = {converter=converter,constraint=constraint} +end + +local function force_short(short) + xassert(#short==1,short..": short parameters should be one character") +end + +function process_options_string(str) + local res = {} + local varargs + + local function check_varargs(s) + local res,cnt = s:gsub('%.%.%.$','') + varargs = cnt > 0 + return res + end + + local function set_result(ps,parm,val) + if not ps.varargs then + res[parm] = val + else + if not res[parm] then + res[parm] = { val } + else + append(res[parm],val) + end + end + end + + usage = str + + for line in str:gmatch('([^\n]*)\n') do + local optspec,optparm,i1,i2,defval,vtype,constraint + line = ltrim(line) + -- flags: either - or -, + i1,i2,optspec = line:find('^%-(%S+)') + if i1 then + optspec = check_varargs(optspec) + local short,long = optspec:match('([^,]+),(.+)') + if short then + optparm = long:sub(3) + aliases[short] = optparm + force_short(short) + else + optparm = optspec + force_short(optparm) + end + else -- is it ? + i1,i2,optparm = line:find('(%b<>)') + if i1 then + -- so becomes input_file ... + optparm = check_varargs(optparm:sub(2,-2)):gsub('%A','_') + append(parmlist,optparm) + end + end + if i1 then -- this is not a pure doc line + local last_i2 = i2 + local sval + line = ltrim(line:sub(i2+1)) + -- do we have (default ) or ()? + i1,i2,typespec = line:find('^%s*(%b())') + if i1 then + typespec = trim(typespec:sub(2,-2)) -- trim the parens and any space + sval = typespec:match('default%s+(.+)') + if sval then + local val = tonumber(sval) + if val then -- we have a number! + defval = val + vtype = 'number' + elseif filetypes[sval] then + local ft = filetypes[sval] + defval = ft[1] + vtype = ft[2] + else + defval = sval + vtype = 'string' + end + else + local min,max = typespec:match '([^%.]+)%.%.(.+)' + if min then -- it's (min..max) + vtype = 'number' + min = xtonumber(min) + max = xtonumber(max) + constraint = function(x) + range_check(x,min,max,optparm) + end + else -- () just contains type of required parameter + vtype = typespec + end + end + else -- must be a plain flag, no extra parameter required + defval = false + vtype = 'boolean' + end + local ps = { + type = vtype, + defval = defval, + required = defval == nil, + comment = line:sub((i2 or last_i2)+1) or optparm, + constraint = constraint, + varargs = varargs + } + if types[vtype] then + local converter = types[vtype].converter + if type(converter) == 'string' then + ps.type = converter + else + ps.converter = converter + end + ps.constraint = types[vtype].constraint + end + parms[optparm] = ps + end + end + -- cool, we have our parms, let's parse the command line args + local iparm = 1 + local iextra = 1 + local i = 1 + local parm,ps,val + while i <= #arg do + -- look for a flag, - or -- + local i1,i2,dash,parmstr = arg[i]:find('^(%-+)(%a.*)') + if i1 then -- we have a flag + if #dash == 2 then -- long option + parm = parmstr + else -- short option + if #parmstr == 1 then + parm = parmstr + else -- multiple flags after a '-',? + parm = parmstr:sub(1,1) + if parmstr:find('^%a%d+') then + -- a short option followed by a digit? (exception for AW ;)) + -- push ahead into the arg array + table.insert(arg,i+1,parmstr:sub(2)) + else + -- push multiple flags into the arg array! + for k = 2,#parmstr do + table.insert(arg,i+k-1,'-'..parmstr:sub(k,k)) + end + end + end + end + if parm == 'h' or parm == 'help' then + quit() + end + if aliases[parm] then parm = aliases[parm] end + ps = parms[parm] + if not ps then error("unrecognized parameter: "..parm) end + if ps.type ~= 'boolean' then -- we need a value! This should follow + val = arg[i+1] + i = i + 1 + xassert(val,parm.." was expecting a value") + end + else -- a parameter + parm = parmlist[iparm] + if not parm then + -- extra unnamed parameters are indexed starting at 1 + parm = iextra + iextra = iextra + 1 + ps = { type = 'string' } + else + ps = parms[parm] + end + if not ps.varargs then + iparm = iparm + 1 + end + val = arg[i] + end + ps.used = true + val = convert_parameter(ps,val) + set_result(ps,parm,val) + if is_filetype(ps.type) then + set_result(ps,parm..'_name',arg[i]) + end + if lapp.callback then + lapp.callback(parm,arg[i],res) + end + i = i + 1 + end + -- check unused parms, set defaults and check if any required parameters were missed + for parm,ps in pairs(parms) do + if not ps.used then + if ps.required then error("missing required parameter: "..parm) end + set_result(ps,parm,ps.defval) + end + end + return res +end + +setmetatable(lapp, { + __call = function(tbl,str) return process_options_string(str) end, + __index = { + open = open, + quit = quit, + error = error, + assert = xassert, + } +}) + +return lapp diff --git a/indexing/xindex/lualatex/xindex-lib.lua b/indexing/xindex/lualatex/xindex-lib.lua new file mode 100644 index 0000000000..b1cfaabcb5 --- /dev/null +++ b/indexing/xindex/lualatex/xindex-lib.lua @@ -0,0 +1,980 @@ +----------------------------------------------------------------------- +-- FILE: xindex-lib.lua +-- DESCRIPTION: library for xindex.lua +-- REQUIREMENTS: +-- AUTHOR: Herbert Voß +-- LICENSE: LPPL1.3 +----------------------------------------------------------------------- + +if not modules then modules = { } end modules ['xindex-lib'] = { + version = 0.13, + comment = "main library to xindex.lua", + author = "Herbert Voss", + copyright = "Herbert Voss", + license = "LPPL 1.3" +} + +local escapechar1 = "\"" +local escapechar2 = "\"\"" +local Letters = "ÄÖÜäöüabcdefghijklmnopqrstuvwxyzßABCDEFGHIJKLMNOPQRSTUVWXYZ" +local Digits = "0123456789" + +-- Looks up the character `character´ in the alphabet and returns its 'normalization' for sorting +local function get_normalized_char( CharList, character ) + for i, alphabet_entry in ipairs(CharList) do + for _, alphabet_char in ipairs(alphabet_entry) do + if character == alphabet_char then + return alphabet_entry[1] + end + end + end + return character +end + +function Lower(strOrig) -- return UTF string.lower + local str = "" + for i=1, utf.len(strOrig) do + local c = utf.sub(strOrig,i,i) + if c == "Ä" then str = str.."ä" + elseif c == "Ö" then str = str.."ö" + elseif c == "Ü" then str = str.."ü" + else str = str..utf.lower(c) + end + end + return str +end + +function NormalizedLower(strOrig) -- return normalized UTF string.lower (ä -> a) + local str = "" + for i=1, utf.len(strOrig) do + local c = get_normalized_char(alphabet_lower,utf.sub(strOrig,i,i)) + str = str..string.lower(c) + end + return str +end + +function NormalizedUpper(strOrig) -- return normalized UTF string.upper (ä -> A) + local str = "" + local c + for i=1, utf.len(strOrig) do + c = get_normalized_char(alphabet_lower,utf.sub(strOrig,i,i)) +-- str = str..string.upper(c) + str = str..c + end + strOrig = str + str="" + for i=1, utf.len(strOrig) do + c = get_normalized_char(alphabet_upper,utf.sub(strOrig,i,i)) + c = NormalizedUppercase(c) + str = str..c + end + return str +end + +function NormalizedUppercase(chr) -- return normalized UTF uppercase letter + for i, alphabet_entry in ipairs(alphabet_uppercase) do + if chr == alphabet_entry[1] then + return alphabet_entry[2] + end + end + return chr +end + +function NormalizedChars(strOrig) -- return normalized UTF string (ä -> a) with first as upper case + local c = string.upper(get_normalized_char(alphabet_lower,utf.sub(strOrig,1,1))) + local str = c + for i=2, utf.len(strOrig) do + c = get_normalized_char(alphabet_lower,utf.sub(strOrig,i,i)) + str = str..c + end + local strOrigTrue = strOrig + strOrig = str + c = string.upper(get_normalized_char(alphabet_upper,utf.sub(strOrig,1,1))) + str = c + for i=2, utf.len(strOrig) do + c = get_normalized_char(alphabet_upper,utf.sub(strOrig,i,i)) + str = str..c + end +-- print(strOrigTrue.." -> "..str) + return str +end + +function checkVert(str) -- get the | part + local vert = string.find(str,"|",1,true) + if (vert) then + vertStr = string.sub(str,vert+1) + str = string.sub(str,1,vert-1) + return (vertStr) + else + return ("") + end +end + +function checkEntry(str) -- get the index entry name + local at=string.find(str,"@") + local excl=string.find(str,"!") + if (excl and at) then + if (at < excl) then + return string.sub(str,1,at-1) + else + return string.sub(str,1,excl-1) + end + elseif (excl) then + return string.sub(str,1,excl-1) + elseif (at) then + return string.sub(str,1,at-1) + else + return (str) + end +end + +function replaceAt(str) -- return "bar" from "foo@bar" +-- return str:gsub('[^!|@%s]+@', '') + return str:gsub('[^!|@]+@', '') +end + +function dofile(filename) + local file = kpse.find_file(filename) + local f = assert(loadfile(file)) + return f() +end + +-- see if the file exists +function file_exists(file) +local f = io.open(file, "rb") +if f then f:close() end +return f ~= nil +end + +-- get all lines from a file, returns an empty +-- list/table if the file does not exist +function read_lines_from(infile) + if not file_exists(infile) then return {} end + local lines = {} + local str + local c + for line in io.lines(infile) do + if line ~= "" then + if string.find(line,'\\indexentry',1,true) then + str = line:gsub('^\\%a+%s*{','{') -- remove "\\indexentry " + writeLog(1,"read_lines: str="..str.." ("..utf.sub(str,2,2)..")\n",2) + if getCharType(utf.sub(str,2,2)) == 0 then -- we have a symbol + lines[#lines + 1] = str:gsub('^{*','{ ') -- add a space before the symbol + else + lines[#lines + 1] = str + end + else + lines[#lines + 1] = "\\MACRO<<< "..line -- allow macros between entries + end + end + end + return lines +end + +function array_concat(...) + local t = {} + for n = 1,select("#",...) do + local arg = select(n,...) + if type(arg)=="table" then + for _,v in ipairs(arg) do + t[#t+1] = v + end + else + t[#t+1] = arg + end + end + return t +end + +function findSequences(a) -- look for 1,2,3,4, ... + local b = {} + local firstPage = a[1] -- first page in the sequence + for i=2,#a do -- next page until end of page list + if a[i]-a[i-1] > 1 then -- not next page + lastPage = a[i-1] -- new start for a sequence search + if lastPage - firstPage >= minCompress then -- sequence found + b[#b+1]= tostring(firstPage)..rangeSymbol..tostring(lastPage) + else + b[#b+1]= firstPage + if (firstPage ~= lastPage) then b[#b+1]= lastPage end + end + firstPage=a[i] + end + end + if a[#a] - firstPage > 2 then -- test file end + b[#b+1]= tostring(firstPage)..rangeSymbol..tostring(a[#a]) + else + b[#b+1]= firstPage + if (firstPage ~= a[#a]) then b[#b+1]= a[#a] end + end + return (b) +end + + +function deleteOpenClose(v) -- remove |( and/or |) + res, _ = string.gsub(v:gsub('\\[()]%s*$', ''), '\\[()]%s*', ' \\') + return res +end + +-- "\) " -> "" +-- "\)foo" -> \foo + +function checkParenthesis(Entries) -- search for |( ... |) entries + local paraOpen + local paraClose + local firstPage = 0 + local lastPage + local newEntries = {} + for k,v in pairs(Entries) do + if (k % 50) == 0 then writeLog(1,".",1) end + if v["Entry"] then + v["Entry"] = replaceAt(v["Entry"]) -- foo@bar!baz@foobar -> bar!foobar + CurrentEntry = v["Entry"] + paraOpen = v["pages"][1]["special"]:find("\\(",1,true) + paraClose = v["pages"][1]["special"]:find("\\)",1,true) + if paraOpen then + firstPage = v["pages"][1]["number"] + elseif paraClose then + lastPage = v["pages"][1]["number"] + newEntries[#newEntries+1] = { Entry = v["Entry"], + pages = {{ number = firstPage..rangeSymbol..lastPage, + special = deleteOpenClose(v["pages"][1]["special"])}}, + sortChar= v["sortChar"], + Macro = v["Macro"] + } + firstPage = 0 + elseif ((firstPage == 0) and not paraClose) then + newEntries[#newEntries+1] = v -- same Entry with greater page or new entry + end + end + end + return newEntries +end + +function replaceVerticalChar(v) +-- res, _ = string.gsub(v:gsub('|[()]$', ''), '|[()]?', ' \\') +-- return res + if not v:match('|') then + return v,"" + else + return v:gsub('|.*',''), v:match('|.*'):gsub('|','\\'):gsub("%s+", "") -- part before, part after | without spaces + end +end + +function getEntryAndPage(w, nextW, EntryList) +-- \indexentry{Aachen, Johann von}{VII/1-215} +-- \indexentry {Document@\idxtextClasses !IEEEtran@{\sfffffamily IEEEtran}}{185} +-- if indexEntry(w) then + local macro = nil + if string.find(nextW,"\\MACRO<<< ") then + macro = string.gsub(nextW,'\\MACRO<<<','') + end + local entry, pageNo = w:match('{(.*)}%s*{(.*)}') +-- if numericPage then +-- if tonumber(pageNo) then -- check for roman numbering +-- pageNo = tonumber(pageNo) +-- end +-- end + local IndexString, Special = replaceVerticalChar(entry) + EntryList[#EntryList+1] = { + Entry = IndexString, -- the index item foo@bar + pages = {{ + number = pageNo, + special = Special }}, -- the page number(s) and the part after | + sortChar= NormalizedUpper(utf.sub(IndexString,1,1)), -- :byte(), -- Initial for later output + Macro = macro + } + if args_v then + if Special == "" then Special = "-" end + writeLog(1,"getEntryAndPage: "..tostring(IndexString,pageNo,Special,utf.sub(IndexString,1,1),macro).."\n",2) + end + return EntryList +end + +function compressEntryList(EntryList) +-- require 'xindex-pretty'.dump(EntryList) -- only for internal dump + local newList = {} + newList[1] = EntryList[1] -- at least one entry + local nPages = 1 + for k=2,#EntryList do + if EntryList[k] then -- exists? + local vEntry = EntryList[k]["Entry"] + local last = EntryList[k-1] -- complete data + if (getSortString(last["Entry"]) == getSortString(vEntry)) then -- Entry exists -> add page +-- require 'xindex-pretty'.dump(EntryList) -- only for internal dump +-- require 'xindex-pretty'.dump(newList) -- only for internal dump + if (newList[#newList]["pages"][nPages]["number"] ~= EntryList[k]["pages"][1]["number"]) -- different pages or special? + or (newList[#newList]["pages"][nPages]["special"] ~= EntryList[k]["pages"][1]["special"]) then + newList[#newList]["pages"][nPages+1] = EntryList[k]["pages"][1] + nPages = nPages + 1 +-- require 'xindex-pretty'.dump(newList) -- only for internal dump + else + -- gleiche Entries, gleiche Seiten, gleiche specials -> nichts tun + end + else -- not the same entry +-- require 'xindex-pretty'.dump(newList) -- only for internal dump + newList[#newList]["pages"] = deletePageDups(newList[#newList]["pages"]) + newList[#newList+1] = EntryList[k] + nPages = 1 + end + end + end + -- last data line + newList[#newList]["pages"] = deletePageDups(newList[#newList]["pages"]) +-- require 'xindex-pretty'.dump(newList) -- only for internal dump + return newList +end + +--[[ example entry +EntryList[2] = { + Entry = "Johann", -- the index item foo@bar + pages = { -- the page number(s) and the part after | + { number = 111, + special = '\\emph' }, + { number = 11, + special = "\\textit"} + }, + sortChar= "", -- Initial for later output + Macro = "" +} +]] + + +function deletePageDups(pages) + if #pages == 1 then return pages end + local newPages = {pages[1]} + local notfound + for i=2,#pages do + notfound = true + for j=1,#newPages do + if (pages[i]["number"] == newPages[j]["number"]) and (pages[i]["special"] == newPages[j]["special"]) then + notfound = false + break + end + end + if notfound then + newPages[#newPages+1] = pages[i] + end + end + return newPages +end + + +function compressPageList(pages) -- called with (v["pages"]) + writeLog(1,"compressPageList: we have "..#pages.." pages for this entry\n",2) +-- require 'xindex-pretty'.dump(pages) -- only for internal dump + pages = deletePageDups(pages) -- delete duplicate page numners with same special + local str + if #pages == 1 then -- only one pageno + return pages + end -- only one pageno + if #pages == 2 then -- only two pages + if tonumber(pages[1]["number"]) and tonumber(pages[2]["number"]) then + if ((tonumber(pages[2]["number"]) - tonumber(pages[1]["number"])) == 1) and (pages[1]["special"] == pages[2]["special"]) then + if fCompress then + pages[1]["number"] = pages[1]["number"]..page_folium[1] + pages[2] = nil + elseif minCompress == 1 then + pages[1]["number"] = pages[1]["number"]..rangeSymbol..pages[2]["number"] + pages[2] = nil + end +-- elseif (pages[1]["number"] == pages[2]["number"]) and +-- (pages[1]["special"] == pages[2]["special"]) then +-- pages[2] = nil + end + end + return pages + end + -- we have at least three pages + pages[#pages+1] = {number = 9999999, special = ""} -- dummy to sort the last real page number correct + local startIndex + local newPages = {} -- { pages[1], pages[2], ... } + local series = {} -- { pages[1], pages[2], ... } + if tonumber(pages[1]["number"]) then -- if a number we start with second page + newPages = {} + series = {pages[1]} + startIndex = 2 + else -- if not a number we start with third page + newPages = {pages[1]} + series = {pages[2]} + startIndex = 3 + end +if args_v then print ("compressPageList: more than two pages for the entry\n") end + for i=startIndex,#pages do + if tonumber(pages[i-1]["number"]) and tonumber(pages[i]["number"]) then -- de we have something like 17--31 in the current list + if ((tonumber(pages[i]["number"])-tonumber(pages[i-1]["number"])) == 1) and + (pages[i]["special"] == pages[i-1]["special"]) then -- something like 12, 13 with identical |\special + series[#series+1] = pages[i]-- page difference is 1, add page to series + elseif (#series == 1) then -- no -f page -> only one page -> output + newPages[#newPages+1] = series[1] + series = {pages[i]} + elseif (#series > minCompress) then -- we found series or f pages like 11, 12, 13, 14 + -- the sequenz gets the special from the first page + newPages[#newPages+1] = { number = series[1]["number"]..rangeSymbol..series[#series]["number"], special = series[1]["special"]} -- first..last + series = {pages[i]} + else -- series < minCompress + if fCompress then + if #series == 2 then -- two pages -> 3f + writeLog(1,"compressPageList: Two consecutive pages for this entry\n",2) + if series[1]["special"] == series[2]["special"] then + newPages[#newPages+1] = { number = series[1]["number"]..page_folium[1], special = series[1]["special"] } + else + newPages[#newPages+1] = series[1] -- different |\special -> no compress to -f + newPages[#newPages+1] = series[2] + end + else -- must be #series=3 + if (series[1]["special"] == series[2]["special"]) and (series[2]["special"] == series[3]["special"]) then + newPages[#newPages+1] = { number = series[1]["number"]..page_folium[2], special = series[1]["special"] } -- three pages + elseif (series[1]["special"] == series[2]["special"]) then + newPages[#newPages+1] = { number = series[1]["number"]..page_folium[1], special = series[1]["special"] } -- three pages + newPages[#newPages+1] = series[3] + elseif (series[2]["special"] == series[3]["special"]) then + newPages[#newPages+1] = series[1] + newPages[#newPages+1] = { number = series[2]["number"]..page_folium[1], special = series[2]["special"] } -- three pages + else -- all different specials + newPages[#newPages+1] = series[1] + newPages[#newPages+1] = series[2] + newPages[#newPages+1] = series[3] + end + end + else + for i=1,#series do + newPages[#newPages+1] = series[i] + end + end + series = {pages[i]} + end + else -- current or forgoing page is not a number, we simply add it + if tonumber(pages[i]["number"]) then -- p[i-1] is non numeric p[i] is ok and not last no + series = {pages[i]} + else -- current page is non numeric + if (#series > minCompress) then -- we found a page series + newPages[#newPages+1] = { number = series[1]["number"]..rangeSymbol..series[#series]["number"], -- first..last + special =series[1]["special"] } + series = {pages[i]} + else -- series < minCompress + for i=1,#series do + newPages[#newPages+1] = series[i] + end + series = {pages[i]} + end + end + end + end +-- require 'xindex-pretty'.dump(newPages) + return newPages +end + + +-- 2 letter +-- 1 digit +-- 0 symbol + +UTFdatafile = kpse.find_file("xindex-unicode.lua") +local category_data = dofile(UTFdatafile) +local floor = math.floor + +local function binary_range_search(code_point, ranges) + local low, mid, high + low, high = 1, #ranges + while low <= high do + mid = floor((low + high) / 2) + local range = ranges[mid] + if code_point < range[1] then + high = mid - 1 + elseif code_point <= range[2] then + return range, mid + else + low = mid + 1 + end + end + return nil, mid +end + +function get_category(code_point) + if category_data.singles[code_point] then + return category_data.singles[code_point] + else + local range = binary_range_search(code_point, category_data.ranges) + return range and range[3] or "Cn" + end +end + +function getCharType(c) +-- print ("getCharType c="..c..": codepoint="..utf8.codepoint(c)) + local category = get_category(utf8.codepoint(c)) +-- print ("getCharType: "..category) + if category == "Nd" then return 1 + elseif category:sub(1, 1) == "L" then return 2 + else return 0 + end +end + +--print(get_category(utf8.codepoint('ö'))) +--print(category_to_number(get_category(utf8.codepoint('ö')))) + +function getCharTypeOld(c) -- in case of Lua < 5.3 (has no utf support) + if utf.find(Letters,c,1,true) then return 2 + elseif utf.find(Digits,c,1,true) then return 1 + else return 0 + end +end + +-- string.gsub('{Entry}{page}', '{[^{}]*}$', '') -> {Entry} +-- str = "\indexentry {foo}{bar}" +-- first, second = str:match('{([^}]*)}%s*{([^}]*)}') -> foo, bar + +function UTFCompare(a,b) +-- a, b are something like \indexentry{foo}{bar} +-- writeLog(1,"UTFCompare: "..a["Entry"]..", "..a["pages"][1]["number"].." - "..b["Entry"]..", "..b["pages"][1]["number"].."\n",2) +-- k = k + 1 +-- if (k % 50) == 0 then writeLog(1,".",1) end + local A,B,Apage,Bpage + if numericPage then + if tonumber(a["pages"][1]["number"]) then + Apage = string.format("%09d",a["pages"][1]["number"]) + else + Apage = string.format("%09d",romanToNumber(a["pages"][1]["number"])) + end + if tonumber(b["pages"][1]["number"]) then + Bpage = string.format("%09d",b["pages"][1]["number"]) + else + Bpage = string.format("%09d",romanToNumber(b["pages"][1]["number"])) + end + else + Apage = string.format("%09s",a["pages"][1]["number"]) + Bpage = string.format("%09s",b["pages"][1]["number"]) + end + if no_caseSensitive then + A = NormalizedUpper(getSortString(a["Entry"].." "..Apage..a["pages"][1]["special"]):gsub('!','')) -- replace! by empty + B = NormalizedUpper(getSortString(b["Entry"].." "..Bpage..b["pages"][1]["special"]):gsub('!','')) + else + A = NormalizedChars(getSortString(a["Entry"].." "..Apage..a["pages"][1]["special"]):gsub('!','')) -- replace! by empty + B = NormalizedChars(getSortString(b["Entry"].." "..Bpage..b["pages"][1]["special"]):gsub('!','')) + end + writeLog(1,"UTFCompare: A--B "..A.."--"..B.."\n",2) +-- print(A,B) +--[[ + if A == B then -- same entry, use also page number + Apage = string.format("%09s",a["pages"][1]["number"]) + Bpage = string.format("%09s",b["pages"][1]["number"]) + A = string.format("%-90s",A)..Apage + B = string.format("%-90s",B)..Bpage + end + if numericPage then + if tonumber(a["pages"][1]["number"]) then + Apage = string.format("%09d",a["pages"][1]["number"]) + else + Apage = string.format("%09d",romanToNumber(a["pages"][1]["number"])) + end + if tonumber(b["pages"][1]["number"]) then + Bpage = string.format("%09d",b["pages"][1]["number"]) + else + Bpage = string.format("%09d",romanToNumber(b["pages"][1]["number"])) + end + else + Apage = string.format("%09s",a["pages"][1]["number"]) + Bpage = string.format("%09s",b["pages"][1]["number"]) + end + A = string.format("%-90s",A)..Apage + B = string.format("%-90s",B)..Bpage +]] + return A < B +end + +function pageCompare(a,b) -- a = {{number=...,special=..},{...,...}} +-- a["number"], b["number"] are something like "3" or "VI-17" or "9--31" + writeLog(1,"pageCompare: "..a["number"].." "..b["number"].."\n",2) + if (a["number"] == nil) or (b["number"] == nil) then return true end -- should be no nil here + local a0 = a["number"] -- can be numeric or alphanumeric + local b0 = b["number"] +-- if pageNoPrefixDel ~= "" then ---- not active +-- A = (a0:gsub(pageNoPrefixPattern,'')) +-- B = (b0:gsub(pageNoPrefixPattern,'')) +-- a0 = tonumber(A) or romanToNumber(A) +-- b0 = tonumber(B) or romanToNumber(B) +-- else + if numericPage then + if (type(a0) == "number") and (type(b0) == "number") then return a0 < b0 end + if romanToNumber(a0) and (type(b0) == "number") then return true end -- ii < 2 + if (type(a0) == "number") and romanToNumber(b0) then return false end -- ii > 2 + if romanToNumber(a0) and romanToNumber(b0) then return a0 < b0 end -- ii < iii + -- now we have some special page numbers + A = tostring(a0) + B = tostring(b0) + A1 = A:find(rangeSymbol,1,true) or A:find("f",1,true) -- sequence or folio pages + B1 = B:find(rangeSymbol,1,true) or B:find("f",1,true) + if A1 then a0 = tonumber(A:sub(1,A1-1)) end + if B1 then b0 = tonumber(B:sub(1,B1-1)) end + return tonumber(a0) < tonumber(b0) -- numeric + else + return a0 < b0 -- alphanumeric (strings) + end +end + +function charCompare(a,b) -- compare only first char + local A,B + A = string.upper(utf.sub(a["sortChar"],1,1)) + B = string.upper(utf.sub(b["sortChar"],1,1)) + return A < B +end + +function checkFF(p) + if not p then return p end + local P = tostring(p) + if P:find("ff") then + return P:gsub('%a+','').."\\nohyperpage{"..page_folium[2].."}" + elseif P:find("f") then + return P:gsub('%a+','').."\\nohyperpage{"..page_folium[1].."}" + else + return P + end +end + +function getRawPages(v) + writeLog(1,"getRawPages, Entry: "..v["Entry"]..", page: "..tostring(v["pages"][1]["number"]),2) + if v then + local str = tostring(v["pages"][1]["number"]).."("..tostring(v["pages"][1]["special"])..")" + for i=2,#v["pages"] do + if v["pages"] then + str = str..", "..tostring(v["pages"][i]["number"]).."("..tostring(v["pages"][i]["special"])..")" + end + end + return str + else + return "v->nil" + end +end + +function getRawPagesP(p) -- does the same but uses table pages + if p then + local str = tostring(p[1]["number"]).."("..tostring(p[1]["special"])..")" + for i=2,#p do + if p then + str = str..", "..tostring(p[i]["number"]).."("..tostring(p[i]["special"])..")" + end + end + return str + else + return "pages->nil" + end +end + + +function getPageList(v,hyperpage) + if specialGetPageList then + local pageNo = specialGetPageList(v,hyperpage) + return pageNo + end + local Pages = {} + if v["pages"] then + table.sort(v["pages"],pageCompare)-- nur nötig, da User manuell eine Zeile einfügen kann + if specialCompressPageList then + Pages = specialCompressPageList(v["pages"]) + else + Pages = compressPageList(v["pages"]) + end +-- require 'xindex-pretty'.dump(Pages) -- only for internal dump + local pageNo +--[[ +\indexentry{Auto|hyperindexformat{\textbf}}{1} +-> \item Auto, \hyperindexformat{\textbf}{1} + + add for example \hyperpage{5\nohyperpage{f}} , same for ff + + \item foo, \hyperpage{1\nohyperpage{f}}, + \hyperpage{4\nohyperpage{ff}}, \hyperpage{8} + +]] + if hyperpage then + if string.find(v["pages"][1]["special"],"hyperindexformat") then + pageNo = v["pages"][1]["special"].."{"..checkFF(Pages[1]["number"].."}") + else + pageNo = "\\hyperpage{"..checkFF(Pages[1]["number"]).."}" + end + for i=2,#Pages do + if string.find(v["pages"][i]["special"],"hyperindexformat") then + pageNo = pageNo..", "..v["pages"][i]["special"].."{"..checkFF(Pages[i]["number"].."}") + else + pageNo = pageNo..", \\hyperpage{"..checkFF(Pages[i]["number"]).."}" + end +-- Pages[i] = nil + end + else + writeLog(1,"getPageList: "..tostring(Pages[1]["special"]).."{"..tostring(Pages[1]["number"]).."}\n",2) + if (Pages[1]["special"] == nil) or (Pages[1]["number"] == nil) then return "" end + pageNo = Pages[1]["special"].."{"..Pages[1]["number"].."}" + for i=2,#Pages do + if Pages[i]["number"] then + pageNo = pageNo..", "..Pages[i]["special"].."{"..Pages[i]["number"].."}" + Pages[i] = {} + end + end + end + return pageNo + else + return "" + end +end + + +function getPathFileExt(str) + local filepath = str:match("(.*[/\\])") + local filename = str:match("^.+/(.+)$") + local fileext = str:match("^.+(%..+)$") + return filepath,filename,fileext +end + +function printList(Index,level) + for k,v in pairs(Index) do + if v["Entry"] then + local sortChar = v["sortChar"] + if v["Entry"] and v["Macro"] then + writeLog(1,"Entry: "..v["Entry"].."; Pages: "..getRawPages(v).."Special: "..v["pages"][1]["special"].."; Type: "..sortChar.."; Macro: "..v["Macro"].."\n",level) + else + writeLog(1,"Entry: "..v["Entry"].."; Pages: "..getRawPages(v).."Special: "..v["pages"][1]["special"].."; Type: "..sortChar.."; Macro: nil".."\n",level) + end + end + end +end + +function getItem(str,n) + if n >= 0 then + local item = (str:gsub("!.*", "%0!") + :gsub("[^!]*!", "", n) + :match("^([^!]*)!") ) + writeLog(1,"getItem ("..str..", "..n..") = "..item.."\n",2) + return item + end +end + +local romanMap = { + I = 1, + V = 5, + X = 10, + L = 50, + C = 100, + D = 500, + M = 1000, +} + +local numbers = { 1, 5, 10, 50, 100, 500, 1000 } +local romanchars = { "I", "V", "X", "L", "C", "D", "M" } +local RomanNumerals = { } + +function numberToRoman(s) + --s = tostring(s) + s = tonumber(s) + if not s or s ~= s then error"Unable to convert to number" end + if s == math.huge then error"Unable to convert infinity" end + s = math.floor(s) + if s <= 0 then return s end + local ret = "" + for i = #numbers, 1, -1 do + local num = numbers[i] + while s - num >= 0 and s > 0 do + ret = ret .. romanchars[i] + s = s - num + end + for j = 1, i - 1 do + local n2 = numbers[j] + if s - (num - n2) >= 0 and s < num and s > 0 and num - n2 ~= n2 then + ret = ret .. romanchars[j] .. romanchars[i] + s = s - (num - n2) + break + end + end + end + return ret +end + +function romanToNumber(s) +-- if args_v then print("romanToNumber: "..tostring(s)) end +-- if not s then return end + s = s:upper() + local ret = 0 + local i = 1 + while i <= s:len() do + local c = s:sub(i, i) + if c ~= " " then -- allow spaces + local m = romanMap[c] + if not m then return nil end --error("Unknown Roman Numeral '" .. c .. "'") + local next = s:sub(i + 1, i + 1) + local nextm = romanMap[next] + if next and nextm then + if nextm > m then + ret = ret + (nextm - m) + i = i + 1 + else + ret = ret + m + end + else + ret = ret + m + end + end + i = i + 1 + end + return ret +end + +function commandEntry(line) + return string.find(line,"\\MACRO<<<",1,true) +end + +function checkHyperpage(lines) + local hyperpage = false + for i=1,#lines do + if string.find(lines[i],'hyperpage}') then + hyperpage = true + break + end + end + if hyperpage then + for i=1,#lines do + lines[i] = string.gsub(lines[i],'|?hyperpage}{','}{') + end + return true, lines + else + return false, lines + end + return +end + +function itemOutput(last, v, hyperpage) + local lastItems = last + local currentItems = {} + local Entry = v["Entry"] +-- require 'xindex-pretty'.dump(v) -- only for internal dump + local str + local excl = select(2,string.gsub(Entry,"!","!")) -- Number of ! + writeLog(1,"itemOutput(): We have entry "..Entry.."\n",2) + writeLog(1,"itemOutput(): The entry has "..excl.." Exclamation characters\n",2) + if excl == 0 then + str = " \\item "..Entry..itemPageDelimiter.." "..getPageList(v,hyperpage).."\n" + for i, str0 in ipairs(escape_chars) do -- undo the escape char setting + str = str:gsub(str0[2],str0[3]) + end + outFile:write(str) + lastItems = {} + lastItems[1] = Entry + else + for i = 1,excl+1 do + currentItems[i] = getItem(Entry,i-1) -- 0 ! 1 ! 2 ! ... + local item = "item" + if (currentItems[i] ~= lastItems[i]) then + writeLog(1,"itemOutput: currentItems[i]: "..tostring(currentItems[i]).."~= lastItems[i]: "..tostring(lastItems[i]).."\n",2) + local space = " " + for j = 2,i do + item = "sub"..item -- get the sub...subitem + space = space.." " + end + if not sublabels[i] then sublabels[i] = "---" end -- only three levels are predefined + writeLog(1,"itemOutput: currentItems[i]: "..currentItems[i].."; item: "..item.."\n",2) + if (i == 1) and (item == "item") then + str = space.."\\"..item.." "..sublabels[i]..currentItems[i].."\n" + else + str = space.."\\"..item.." "..sublabels[i]..currentItems[i]..itemPageDelimiter.." "..getPageList(v,hyperpage).."\n" + end + for i, str0 in ipairs(escape_chars) do -- undo the escape char setting + str = string.gsub(str,str0[2],str0[3]) + end + outFile:write(str) + lastItems[i] = currentItems[i] + else + writeLog(1,"itemOutput: currentItems[i]: "..currentItems[i].."= lastItems[i]: "..lastItems[i].."\n",2) + end + end + end + return lastItems +end + +-- \item Bugenhagen, {VII/1-16}, {166}, {17}, {215}, {222f}, {226}, {237f}, {248}, {258f}, {263}, {269}, {316f}, {321}, {361}, {365f}, {368}, {385}, {431}, {57}, {65}, {68}, {71}, {714}, {728}, {73f}, {748}, {75}, {79}, {81}, {85}, {90f}, {VII/2/1-1013}, {1015}, {1049}, {1085}, {1088}, {1097--1100}, {1110}, {1114}, {1120}, {1126}, {1148}, {1175}, {1234}, {1236ff}, {761}, {782}, {785}, {799}, {803--811}, {813f}, {818}, {822f}, {829}, {832--835}, {839f}, {848f}, {851}, {857--862}, {864f}, {867--871}, {873}, {875}, {877}, {880}, {882}, {884}, {961}, {973}, {IX-277} +-- \subitem -\,Johannes, {VII/1-16}, {166}, {17}, {215}, {222f}, {226}, {237f}, {248}, {258f}, {263}, {269}, {316f}, {321}, {361}, {365f}, {368}, {385}, {431}, {57}, {65}, {68}, {71}, {714}, {728}, {73f}, {748}, {75}, {79}, {81}, {85}, {90f}, {VII/2/1-1013}, {1015}, {1049}, {1085}, {1088}, {1097--1100}, {1110}, {1114}, {1120}, {1126}, {1148}, {1175}, {1234}, {1236ff}, {761}, {782}, {785}, {799}, {803--811}, {813f}, {818}, {822f}, {829}, {832--835}, {839f}, {848f}, {851}, {857--862}, {864f}, {867--871}, {873}, {875}, {877}, {880}, {882}, {884}, {961}, {973}, {IX-277} + +local match = function(expr) + local C, Ct, S = lpeg.C, lpeg.Ct, lpeg.S + local sep = S("@!|") + local str = C((1 - sep)^0) + local prefix = function(prefix) + return function(match) + return prefix .. match + end + end + local idx = str * ( "@" * str / prefix("@") + + "!" * str / prefix("!") + + "|" * str / prefix("|"))^0 + return Ct(idx):match(expr) +end + +function getSortString(Entry) + local t = match(Entry) +-- require 'xindex-pretty'.dump(t) -- only for internal dump + local data = t[1] + local c = utf.sub(data,1,1) + if getCharType(c) == 0 then + data = " "..data + end + for i = 2,#t do + if not (t[i]:sub(1,1) == "@") then -- and not (t[i]:sub(1,1) == "|") then + data = data..t[i] + end + end + return data +end + +function writeLog(i, str, level) -- mode i 0->console; 1->logfile: 2->both + if not_quiet then + if level <= vlevel then + if (i ~= 1) or (i < 0) then io.write(tostring(str)) end + if i > 0 then logFile:write(tostring(str)) end + end + else + if level < 0 then + io.write(tostring(str)) + elseif level == 0 then + logFile:write(tostring(str)) + end + end +end + +function string:split() + local sep, fields = " ", {} + local pattern = string.format("([^%s]+)", sep) + self:gsub(pattern, function(c) fields[#fields+1] = c end) + return fields +end + + + +--\indexentry{hello@foo!world@foo!bar|bar}{60} + + +--[[ +\indexentry {Schrift!Höhe}{64} +\indexentry {Schrift!Breite}{64} +\indexentry {Schrift!Tiefe}{64} + +]] + +function shellsort(a) + local inc = math.ceil( #a / 2 ) + while inc > 0 do + for i = inc, #a do + local tmp = a[i] + local j = i + while j > inc and not UTFCompare(a[j-inc],tmp) do + a[j] = a[j-inc] + j = j - inc + end + a[j] = tmp + end + inc = math.floor( 0.5 + inc / 2.2 ) + end + return a +end + +function stripLeadingSpaces(str) + return str:gsub("^%s*(.-)%s*$", "%1") +end + + diff --git a/indexing/xindex/lualatex/xindex-pretty.lua b/indexing/xindex/lualatex/xindex-pretty.lua new file mode 100644 index 0000000000..569974ecfa --- /dev/null +++ b/indexing/xindex/lualatex/xindex-pretty.lua @@ -0,0 +1,254 @@ +--- Pretty-printing Lua tables. +-- based on Steve Donovans Penlight package +-- Also provides a sandboxed Lua table reader and +-- a function to present large numbers in human-friendly format. +-- + +if not modules then modules = { } end modules ['xindex-pretty'] = { + version = 0.13, + comment = "dump a Lua table for debugging", + author = "Steve Donovan", + copyright = "Steve Donovan", + license = "MIT" +} + +local append = table.insert +local concat = table.concat +local mfloor, mhuge = math.floor, math.huge +local mtype = math.type + +local original_tostring = tostring + +--- Utility function that finds any patterns that match a long string's an open or close. +-- Note that having this function use the least number of equal signs that is possible is a harder algorithm to come up with. +-- Right now, it simply returns the greatest number of them found. +-- @param s The string +-- @return 'nil' if not found. If found, the maximum number of equal signs found within all matches. +local function has_lquote(s) + local lstring_pat = '([%[%]])(=*)%1' + local equals, new_equals, _ + local finish = 1 + repeat + _, finish, _, new_equals = s:find(lstring_pat, finish) + if new_equals then + equals = max(equals or 0, #new_equals) + end + until not new_equals + + return equals +end + +--- Quote the given string and preserve any control or escape characters, such that reloading the string in Lua returns the same result. +-- @param s The string to be quoted. +-- @return The quoted string. + +function quote_string(s) +-- assert_string(1,s) + -- Find out if there are any embedded long-quote sequences that may cause issues. + -- This is important when strings are embedded within strings, like when serializing. + -- Append a closing bracket to catch unfinished long-quote sequences at the end of the string. + local equal_signs = has_lquote(s .. "]") + + -- Note that strings containing "\r" can't be quoted using long brackets + -- as Lua lexer converts all newlines to "\n" within long strings. + if (s:find("\n") or equal_signs) and not s:find("\r") then + -- If there is an embedded sequence that matches a long quote, then + -- find the one with the maximum number of = signs and add one to that number. + equal_signs = ("="):rep((equal_signs or -1) + 1) + -- Long strings strip out leading newline. We want to retain that, when quoting. + if s:find("^\n") then s = "\n" .. s end + local lbracket, rbracket = + "[" .. equal_signs .. "[", + "]" .. equal_signs .. "]" + s = lbracket .. s .. rbracket + else + -- Escape funny stuff. Lua 5.1 does not handle "\r" correctly. + s = ("%q"):format(s):gsub("\r", "\\r") + end + return s +end + +-- Patch tostring to format numbers with better precision +-- and to produce cross-platform results for +-- infinite values and NaN. +local function tostring(value) + if type(value) ~= "number" then + return original_tostring(value) + elseif value ~= value then + return "NaN" + elseif value == mhuge then + return "Inf" + elseif value == -mhuge then + return "-Inf" + elseif (_VERSION ~= "Lua 5.3" or mtype(value) == "integer") and mfloor(value) == value then + return ("%d"):format(value) + else + local res = ("%.14g"):format(value) + if _VERSION == "Lua 5.3" and mtype(value) == "float" and not res:find("%.") then + -- Number is internally a float but looks like an integer. + -- Insert ".0" after first run of digits. + res = res:gsub("%d+", "%0.0", 1) + end + return res + end +end + +local pretty = {} + +local function quote_if_necessary (v) + if not v then return '' + else + --AAS + if v:find ' ' then v = quote_string(v) end + end + return v +end + +local keywords + +local function is_identifier (s) + return type(s) == 'string' and s:find('^[%a_][%w_]*$') and not keywords[s] +end + +local function quote (s) + if type(s) == 'table' then + return pretty.write(s,'') + else + --AAS + return quote_string(s)-- ('%q'):format(tostring(s)) + end +end + +local function index (numkey,key) + --AAS + if not numkey then + key = quote(key) + key = key:find("^%[") and (" " .. key .. " ") or key + end + return '['..key..']' +end + +--- Create a string representation of a Lua table. +-- This function never fails, but may complain by returning an +-- extra value. Normally puts out one item per line, using +-- the provided indent; set the second parameter to an empty string +-- if you want output on one line. +-- @tab tbl Table to serialize to a string. +-- @string[opt] space The indent to use. +-- Defaults to two spaces; pass an empty string for no indentation. +-- @bool[opt] not_clever Pass `true` for plain output, e.g `{['key']=1}`. +-- Defaults to `false`. +-- @return a string +-- @return an optional error message + +function pretty.dump (tbl,space,not_clever) + if type(tbl) ~= 'table' then + local res = tostring(tbl) + if type(tbl) == 'string' then return quote(tbl) end + return res, 'not a table' + end + if not keywords then + keywords = { + ["and"] = true, ["break"] = true, ["do"] = true, + ["else"] = true, ["elseif"] = true, ["end"] = true, + ["false"] = true, ["for"] = true, ["function"] = true, + ["if"] = true, ["in"] = true, ["local"] = true, ["nil"] = true, + ["not"] = true, ["or"] = true, ["repeat"] = true, + ["return"] = true, ["then"] = true, ["true"] = true, + ["until"] = true, ["while"] = true + } + end + local set = ' = ' + if space == '' then set = '=' end + space = space or ' ' + local lines = {} + local line = '' + local tables = {} + + + local function put(s) + if #s > 0 then + line = line..s + end + end + + local function putln (s) + if #line > 0 then + line = line..s + append(lines,line) + line = '' + else + append(lines,s) + end + end + + local function eat_last_comma () + local n = #lines + local lastch = lines[n]:sub(-1,-1) + if lastch == ',' then + lines[n] = lines[n]:sub(1,-2) + end + end + + local writeit + writeit = function (t,oldindent,indent) + local tp = type(t) + if tp ~= 'string' and tp ~= 'table' then + putln(quote_if_necessary(tostring(t))..',') + elseif tp == 'string' then + -- if t:find('\n') then + -- putln('[[\n'..t..']],') + -- else + -- putln(quote(t)..',') + -- end + --AAS + putln(quote_string(t) ..",") + elseif tp == 'table' then + if tables[t] then + putln(',') + return + end + tables[t] = true + local newindent = indent..space + putln('{') + local used = {} + if not not_clever then + for i,val in ipairs(t) do + put(indent) + writeit(val,indent,newindent) + used[i] = true + end + end + for key,val in pairs(t) do + local tkey = type(key) + local numkey = tkey == 'number' + if not_clever then + key = tostring(key) + put(indent..index(numkey,key)..set) + writeit(val,indent,newindent) + else + if not numkey or not used[key] then -- non-array indices + if tkey ~= 'string' then + key = tostring(key) + end + if numkey or not is_identifier(key) then + key = index(numkey,key) + end + put(indent..key..set) + writeit(val,indent,newindent) + end + end + end + tables[t] = nil + eat_last_comma() + putln(oldindent..'},') + else + putln(tostring(t)..',') + end + end + writeit(tbl,'',space) + eat_last_comma() + return concat(lines,#space > 0 and '\n' or '') +end + +return pretty diff --git a/indexing/xindex/lualatex/xindex-unicode.lua b/indexing/xindex/lualatex/xindex-unicode.lua new file mode 100644 index 0000000000..d3f6c5b84a --- /dev/null +++ b/indexing/xindex/lualatex/xindex-unicode.lua @@ -0,0 +1,3118 @@ +return { + singles = { + [0x00020] = "Zs", + [0x00024] = "Sc", + [0x00028] = "Ps", + [0x00029] = "Pe", + [0x0002A] = "Po", + [0x0002B] = "Sm", + [0x0002C] = "Po", + [0x0002D] = "Pd", + [0x0005B] = "Ps", + [0x0005C] = "Po", + [0x0005D] = "Pe", + [0x0005E] = "Sk", + [0x0005F] = "Pc", + [0x00060] = "Sk", + [0x0007B] = "Ps", + [0x0007C] = "Sm", + [0x0007D] = "Pe", + [0x0007E] = "Sm", + [0x000A0] = "Zs", + [0x000A1] = "Po", + [0x000A6] = "So", + [0x000A7] = "Po", + [0x000A8] = "Sk", + [0x000A9] = "So", + [0x000AA] = "Lo", + [0x000AB] = "Pi", + [0x000AC] = "Sm", + [0x000AD] = "Cf", + [0x000AE] = "So", + [0x000AF] = "Sk", + [0x000B0] = "So", + [0x000B1] = "Sm", + [0x000B4] = "Sk", + [0x000B5] = "Ll", + [0x000B8] = "Sk", + [0x000B9] = "No", + [0x000BA] = "Lo", + [0x000BB] = "Pf", + [0x000BF] = "Po", + [0x000D7] = "Sm", + [0x000F7] = "Sm", + [0x00100] = "Lu", + [0x00101] = "Ll", + [0x00102] = "Lu", + [0x00103] = "Ll", + [0x00104] = "Lu", + [0x00105] = "Ll", + [0x00106] = "Lu", + [0x00107] = "Ll", + [0x00108] = "Lu", + [0x00109] = "Ll", + [0x0010A] = "Lu", + [0x0010B] = "Ll", + [0x0010C] = "Lu", + [0x0010D] = "Ll", + [0x0010E] = "Lu", + [0x0010F] = "Ll", + [0x00110] = "Lu", + [0x00111] = "Ll", + [0x00112] = "Lu", + [0x00113] = "Ll", + [0x00114] = "Lu", + [0x00115] = "Ll", + [0x00116] = "Lu", + [0x00117] = "Ll", + [0x00118] = "Lu", + [0x00119] = "Ll", + [0x0011A] = "Lu", + [0x0011B] = "Ll", + [0x0011C] = "Lu", + [0x0011D] = "Ll", + [0x0011E] = "Lu", + [0x0011F] = "Ll", + [0x00120] = "Lu", + [0x00121] = "Ll", + [0x00122] = "Lu", + [0x00123] = "Ll", + [0x00124] = "Lu", + [0x00125] = "Ll", + [0x00126] = "Lu", + [0x00127] = "Ll", + [0x00128] = "Lu", + [0x00129] = "Ll", + [0x0012A] = "Lu", + [0x0012B] = "Ll", + [0x0012C] = "Lu", + [0x0012D] = "Ll", + [0x0012E] = "Lu", + [0x0012F] = "Ll", + [0x00130] = "Lu", + [0x00131] = "Ll", + [0x00132] = "Lu", + [0x00133] = "Ll", + [0x00134] = "Lu", + [0x00135] = "Ll", + [0x00136] = "Lu", + [0x00139] = "Lu", + [0x0013A] = "Ll", + [0x0013B] = "Lu", + [0x0013C] = "Ll", + [0x0013D] = "Lu", + [0x0013E] = "Ll", + [0x0013F] = "Lu", + [0x00140] = "Ll", + [0x00141] = "Lu", + [0x00142] = "Ll", + [0x00143] = "Lu", + [0x00144] = "Ll", + [0x00145] = "Lu", + [0x00146] = "Ll", + [0x00147] = "Lu", + [0x0014A] = "Lu", + [0x0014B] = "Ll", + [0x0014C] = "Lu", + [0x0014D] = "Ll", + [0x0014E] = "Lu", + [0x0014F] = "Ll", + [0x00150] = "Lu", + [0x00151] = "Ll", + [0x00152] = "Lu", + [0x00153] = "Ll", + [0x00154] = "Lu", + [0x00155] = "Ll", + [0x00156] = "Lu", + [0x00157] = "Ll", + [0x00158] = "Lu", + [0x00159] = "Ll", + [0x0015A] = "Lu", + [0x0015B] = "Ll", + [0x0015C] = "Lu", + [0x0015D] = "Ll", + [0x0015E] = "Lu", + [0x0015F] = "Ll", + [0x00160] = "Lu", + [0x00161] = "Ll", + [0x00162] = "Lu", + [0x00163] = "Ll", + [0x00164] = "Lu", + [0x00165] = "Ll", + [0x00166] = "Lu", + [0x00167] = "Ll", + [0x00168] = "Lu", + [0x00169] = "Ll", + [0x0016A] = "Lu", + [0x0016B] = "Ll", + [0x0016C] = "Lu", + [0x0016D] = "Ll", + [0x0016E] = "Lu", + [0x0016F] = "Ll", + [0x00170] = "Lu", + [0x00171] = "Ll", + [0x00172] = "Lu", + [0x00173] = "Ll", + [0x00174] = "Lu", + [0x00175] = "Ll", + [0x00176] = "Lu", + [0x00177] = "Ll", + [0x0017A] = "Ll", + [0x0017B] = "Lu", + [0x0017C] = "Ll", + [0x0017D] = "Lu", + [0x00183] = "Ll", + [0x00184] = "Lu", + [0x00185] = "Ll", + [0x00188] = "Ll", + [0x00192] = "Ll", + [0x00195] = "Ll", + [0x0019E] = "Ll", + [0x001A1] = "Ll", + [0x001A2] = "Lu", + [0x001A3] = "Ll", + [0x001A4] = "Lu", + [0x001A5] = "Ll", + [0x001A8] = "Ll", + [0x001A9] = "Lu", + [0x001AC] = "Lu", + [0x001AD] = "Ll", + [0x001B0] = "Ll", + [0x001B4] = "Ll", + [0x001B5] = "Lu", + [0x001B6] = "Ll", + [0x001BB] = "Lo", + [0x001BC] = "Lu", + [0x001C4] = "Lu", + [0x001C5] = "Lt", + [0x001C6] = "Ll", + [0x001C7] = "Lu", + [0x001C8] = "Lt", + [0x001C9] = "Ll", + [0x001CA] = "Lu", + [0x001CB] = "Lt", + [0x001CC] = "Ll", + [0x001CD] = "Lu", + [0x001CE] = "Ll", + [0x001CF] = "Lu", + [0x001D0] = "Ll", + [0x001D1] = "Lu", + [0x001D2] = "Ll", + [0x001D3] = "Lu", + [0x001D4] = "Ll", + [0x001D5] = "Lu", + [0x001D6] = "Ll", + [0x001D7] = "Lu", + [0x001D8] = "Ll", + [0x001D9] = "Lu", + [0x001DA] = "Ll", + [0x001DB] = "Lu", + [0x001DE] = "Lu", + [0x001DF] = "Ll", + [0x001E0] = "Lu", + [0x001E1] = "Ll", + [0x001E2] = "Lu", + [0x001E3] = "Ll", + [0x001E4] = "Lu", + [0x001E5] = "Ll", + [0x001E6] = "Lu", + [0x001E7] = "Ll", + [0x001E8] = "Lu", + [0x001E9] = "Ll", + [0x001EA] = "Lu", + [0x001EB] = "Ll", + [0x001EC] = "Lu", + [0x001ED] = "Ll", + [0x001EE] = "Lu", + [0x001F1] = "Lu", + [0x001F2] = "Lt", + [0x001F3] = "Ll", + [0x001F4] = "Lu", + [0x001F5] = "Ll", + [0x001F9] = "Ll", + [0x001FA] = "Lu", + [0x001FB] = "Ll", + [0x001FC] = "Lu", + [0x001FD] = "Ll", + [0x001FE] = "Lu", + [0x001FF] = "Ll", + [0x00200] = "Lu", + [0x00201] = "Ll", + [0x00202] = "Lu", + [0x00203] = "Ll", + [0x00204] = "Lu", + [0x00205] = "Ll", + [0x00206] = "Lu", + [0x00207] = "Ll", + [0x00208] = "Lu", + [0x00209] = "Ll", + [0x0020A] = "Lu", + [0x0020B] = "Ll", + [0x0020C] = "Lu", + [0x0020D] = "Ll", + [0x0020E] = "Lu", + [0x0020F] = "Ll", + [0x00210] = "Lu", + [0x00211] = "Ll", + [0x00212] = "Lu", + [0x00213] = "Ll", + [0x00214] = "Lu", + [0x00215] = "Ll", + [0x00216] = "Lu", + [0x00217] = "Ll", + [0x00218] = "Lu", + [0x00219] = "Ll", + [0x0021A] = "Lu", + [0x0021B] = "Ll", + [0x0021C] = "Lu", + [0x0021D] = "Ll", + [0x0021E] = "Lu", + [0x0021F] = "Ll", + [0x00220] = "Lu", + [0x00221] = "Ll", + [0x00222] = "Lu", + [0x00223] = "Ll", + [0x00224] = "Lu", + [0x00225] = "Ll", + [0x00226] = "Lu", + [0x00227] = "Ll", + [0x00228] = "Lu", + [0x00229] = "Ll", + [0x0022A] = "Lu", + [0x0022B] = "Ll", + [0x0022C] = "Lu", + [0x0022D] = "Ll", + [0x0022E] = "Lu", + [0x0022F] = "Ll", + [0x00230] = "Lu", + [0x00231] = "Ll", + [0x00232] = "Lu", + [0x0023C] = "Ll", + [0x00241] = "Lu", + [0x00242] = "Ll", + [0x00247] = "Ll", + [0x00248] = "Lu", + [0x00249] = "Ll", + [0x0024A] = "Lu", + [0x0024B] = "Ll", + [0x0024C] = "Lu", + [0x0024D] = "Ll", + [0x0024E] = "Lu", + [0x00294] = "Lo", + [0x002EC] = "Lm", + [0x002ED] = "Sk", + [0x002EE] = "Lm", + [0x00370] = "Lu", + [0x00371] = "Ll", + [0x00372] = "Lu", + [0x00373] = "Ll", + [0x00374] = "Lm", + [0x00375] = "Sk", + [0x00376] = "Lu", + [0x00377] = "Ll", + [0x0037A] = "Lm", + [0x0037E] = "Po", + [0x0037F] = "Lu", + [0x00386] = "Lu", + [0x00387] = "Po", + [0x0038C] = "Lu", + [0x00390] = "Ll", + [0x003CF] = "Lu", + [0x003D8] = "Lu", + [0x003D9] = "Ll", + [0x003DA] = "Lu", + [0x003DB] = "Ll", + [0x003DC] = "Lu", + [0x003DD] = "Ll", + [0x003DE] = "Lu", + [0x003DF] = "Ll", + [0x003E0] = "Lu", + [0x003E1] = "Ll", + [0x003E2] = "Lu", + [0x003E3] = "Ll", + [0x003E4] = "Lu", + [0x003E5] = "Ll", + [0x003E6] = "Lu", + [0x003E7] = "Ll", + [0x003E8] = "Lu", + [0x003E9] = "Ll", + [0x003EA] = "Lu", + [0x003EB] = "Ll", + [0x003EC] = "Lu", + [0x003ED] = "Ll", + [0x003EE] = "Lu", + [0x003F4] = "Lu", + [0x003F5] = "Ll", + [0x003F6] = "Sm", + [0x003F7] = "Lu", + [0x003F8] = "Ll", + [0x00460] = "Lu", + [0x00461] = "Ll", + [0x00462] = "Lu", + [0x00463] = "Ll", + [0x00464] = "Lu", + [0x00465] = "Ll", + [0x00466] = "Lu", + [0x00467] = "Ll", + [0x00468] = "Lu", + [0x00469] = "Ll", + [0x0046A] = "Lu", + [0x0046B] = "Ll", + [0x0046C] = "Lu", + [0x0046D] = "Ll", + [0x0046E] = "Lu", + [0x0046F] = "Ll", + [0x00470] = "Lu", + [0x00471] = "Ll", + [0x00472] = "Lu", + [0x00473] = "Ll", + [0x00474] = "Lu", + [0x00475] = "Ll", + [0x00476] = "Lu", + [0x00477] = "Ll", + [0x00478] = "Lu", + [0x00479] = "Ll", + [0x0047A] = "Lu", + [0x0047B] = "Ll", + [0x0047C] = "Lu", + [0x0047D] = "Ll", + [0x0047E] = "Lu", + [0x0047F] = "Ll", + [0x00480] = "Lu", + [0x00481] = "Ll", + [0x00482] = "So", + [0x0048A] = "Lu", + [0x0048B] = "Ll", + [0x0048C] = "Lu", + [0x0048D] = "Ll", + [0x0048E] = "Lu", + [0x0048F] = "Ll", + [0x00490] = "Lu", + [0x00491] = "Ll", + [0x00492] = "Lu", + [0x00493] = "Ll", + [0x00494] = "Lu", + [0x00495] = "Ll", + [0x00496] = "Lu", + [0x00497] = "Ll", + [0x00498] = "Lu", + [0x00499] = "Ll", + [0x0049A] = "Lu", + [0x0049B] = "Ll", + [0x0049C] = "Lu", + [0x0049D] = "Ll", + [0x0049E] = "Lu", + [0x0049F] = "Ll", + [0x004A0] = "Lu", + [0x004A1] = "Ll", + [0x004A2] = "Lu", + [0x004A3] = "Ll", + [0x004A4] = "Lu", + [0x004A5] = "Ll", + [0x004A6] = "Lu", + [0x004A7] = "Ll", + [0x004A8] = "Lu", + [0x004A9] = "Ll", + [0x004AA] = "Lu", + [0x004AB] = "Ll", + [0x004AC] = "Lu", + [0x004AD] = "Ll", + [0x004AE] = "Lu", + [0x004AF] = "Ll", + [0x004B0] = "Lu", + [0x004B1] = "Ll", + [0x004B2] = "Lu", + [0x004B3] = "Ll", + [0x004B4] = "Lu", + [0x004B5] = "Ll", + [0x004B6] = "Lu", + [0x004B7] = "Ll", + [0x004B8] = "Lu", + [0x004B9] = "Ll", + [0x004BA] = "Lu", + [0x004BB] = "Ll", + [0x004BC] = "Lu", + [0x004BD] = "Ll", + [0x004BE] = "Lu", + [0x004BF] = "Ll", + [0x004C2] = "Ll", + [0x004C3] = "Lu", + [0x004C4] = "Ll", + [0x004C5] = "Lu", + [0x004C6] = "Ll", + [0x004C7] = "Lu", + [0x004C8] = "Ll", + [0x004C9] = "Lu", + [0x004CA] = "Ll", + [0x004CB] = "Lu", + [0x004CC] = "Ll", + [0x004CD] = "Lu", + [0x004D0] = "Lu", + [0x004D1] = "Ll", + [0x004D2] = "Lu", + [0x004D3] = "Ll", + [0x004D4] = "Lu", + [0x004D5] = "Ll", + [0x004D6] = "Lu", + [0x004D7] = "Ll", + [0x004D8] = "Lu", + [0x004D9] = "Ll", + [0x004DA] = "Lu", + [0x004DB] = "Ll", + [0x004DC] = "Lu", + [0x004DD] = "Ll", + [0x004DE] = "Lu", + [0x004DF] = "Ll", + [0x004E0] = "Lu", + [0x004E1] = "Ll", + [0x004E2] = "Lu", + [0x004E3] = "Ll", + [0x004E4] = "Lu", + [0x004E5] = "Ll", + [0x004E6] = "Lu", + [0x004E7] = "Ll", + [0x004E8] = "Lu", + [0x004E9] = "Ll", + [0x004EA] = "Lu", + [0x004EB] = "Ll", + [0x004EC] = "Lu", + [0x004ED] = "Ll", + [0x004EE] = "Lu", + [0x004EF] = "Ll", + [0x004F0] = "Lu", + [0x004F1] = "Ll", + [0x004F2] = "Lu", + [0x004F3] = "Ll", + [0x004F4] = "Lu", + [0x004F5] = "Ll", + [0x004F6] = "Lu", + [0x004F7] = "Ll", + [0x004F8] = "Lu", + [0x004F9] = "Ll", + [0x004FA] = "Lu", + [0x004FB] = "Ll", + [0x004FC] = "Lu", + [0x004FD] = "Ll", + [0x004FE] = "Lu", + [0x004FF] = "Ll", + [0x00500] = "Lu", + [0x00501] = "Ll", + [0x00502] = "Lu", + [0x00503] = "Ll", + [0x00504] = "Lu", + [0x00505] = "Ll", + [0x00506] = "Lu", + [0x00507] = "Ll", + [0x00508] = "Lu", + [0x00509] = "Ll", + [0x0050A] = "Lu", + [0x0050B] = "Ll", + [0x0050C] = "Lu", + [0x0050D] = "Ll", + [0x0050E] = "Lu", + [0x0050F] = "Ll", + [0x00510] = "Lu", + [0x00511] = "Ll", + [0x00512] = "Lu", + [0x00513] = "Ll", + [0x00514] = "Lu", + [0x00515] = "Ll", + [0x00516] = "Lu", + [0x00517] = "Ll", + [0x00518] = "Lu", + [0x00519] = "Ll", + [0x0051A] = "Lu", + [0x0051B] = "Ll", + [0x0051C] = "Lu", + [0x0051D] = "Ll", + [0x0051E] = "Lu", + [0x0051F] = "Ll", + [0x00520] = "Lu", + [0x00521] = "Ll", + [0x00522] = "Lu", + [0x00523] = "Ll", + [0x00524] = "Lu", + [0x00525] = "Ll", + [0x00526] = "Lu", + [0x00527] = "Ll", + [0x00528] = "Lu", + [0x00529] = "Ll", + [0x0052A] = "Lu", + [0x0052B] = "Ll", + [0x0052C] = "Lu", + [0x0052D] = "Ll", + [0x0052E] = "Lu", + [0x0052F] = "Ll", + [0x00559] = "Lm", + [0x00589] = "Po", + [0x0058A] = "Pd", + [0x0058F] = "Sc", + [0x005BE] = "Pd", + [0x005BF] = "Mn", + [0x005C0] = "Po", + [0x005C3] = "Po", + [0x005C6] = "Po", + [0x005C7] = "Mn", + [0x0060B] = "Sc", + [0x0061B] = "Po", + [0x0061C] = "Cf", + [0x00640] = "Lm", + [0x00670] = "Mn", + [0x006D4] = "Po", + [0x006D5] = "Lo", + [0x006DD] = "Cf", + [0x006DE] = "So", + [0x006E9] = "So", + [0x006FF] = "Lo", + [0x0070F] = "Cf", + [0x00710] = "Lo", + [0x00711] = "Mn", + [0x007B1] = "Lo", + [0x007F6] = "So", + [0x007FA] = "Lm", + [0x007FD] = "Mn", + [0x0081A] = "Lm", + [0x00824] = "Lm", + [0x00828] = "Lm", + [0x0085E] = "Po", + [0x008E2] = "Cf", + [0x00903] = "Mc", + [0x0093A] = "Mn", + [0x0093B] = "Mc", + [0x0093C] = "Mn", + [0x0093D] = "Lo", + [0x0094D] = "Mn", + [0x00950] = "Lo", + [0x00970] = "Po", + [0x00971] = "Lm", + [0x00981] = "Mn", + [0x009B2] = "Lo", + [0x009BC] = "Mn", + [0x009BD] = "Lo", + [0x009CD] = "Mn", + [0x009CE] = "Lo", + [0x009D7] = "Mc", + [0x009FA] = "So", + [0x009FB] = "Sc", + [0x009FC] = "Lo", + [0x009FD] = "Po", + [0x009FE] = "Mn", + [0x00A03] = "Mc", + [0x00A3C] = "Mn", + [0x00A51] = "Mn", + [0x00A5E] = "Lo", + [0x00A75] = "Mn", + [0x00A76] = "Po", + [0x00A83] = "Mc", + [0x00ABC] = "Mn", + [0x00ABD] = "Lo", + [0x00AC9] = "Mc", + [0x00ACD] = "Mn", + [0x00AD0] = "Lo", + [0x00AF0] = "Po", + [0x00AF1] = "Sc", + [0x00AF9] = "Lo", + [0x00B01] = "Mn", + [0x00B3C] = "Mn", + [0x00B3D] = "Lo", + [0x00B3E] = "Mc", + [0x00B3F] = "Mn", + [0x00B40] = "Mc", + [0x00B4D] = "Mn", + [0x00B56] = "Mn", + [0x00B57] = "Mc", + [0x00B70] = "So", + [0x00B71] = "Lo", + [0x00B82] = "Mn", + [0x00B83] = "Lo", + [0x00B9C] = "Lo", + [0x00BC0] = "Mn", + [0x00BCD] = "Mn", + [0x00BD0] = "Lo", + [0x00BD7] = "Mc", + [0x00BF9] = "Sc", + [0x00BFA] = "So", + [0x00C00] = "Mn", + [0x00C04] = "Mn", + [0x00C3D] = "Lo", + [0x00C7F] = "So", + [0x00C80] = "Lo", + [0x00C81] = "Mn", + [0x00C84] = "Po", + [0x00CBC] = "Mn", + [0x00CBD] = "Lo", + [0x00CBE] = "Mc", + [0x00CBF] = "Mn", + [0x00CC6] = "Mn", + [0x00CDE] = "Lo", + [0x00D3D] = "Lo", + [0x00D4D] = "Mn", + [0x00D4E] = "Lo", + [0x00D4F] = "So", + [0x00D57] = "Mc", + [0x00D79] = "So", + [0x00DBD] = "Lo", + [0x00DCA] = "Mn", + [0x00DD6] = "Mn", + [0x00DF4] = "Po", + [0x00E31] = "Mn", + [0x00E3F] = "Sc", + [0x00E46] = "Lm", + [0x00E4F] = "Po", + [0x00E84] = "Lo", + [0x00E8A] = "Lo", + [0x00E8D] = "Lo", + [0x00EA5] = "Lo", + [0x00EA7] = "Lo", + [0x00EB1] = "Mn", + [0x00EBD] = "Lo", + [0x00EC6] = "Lm", + [0x00F00] = "Lo", + [0x00F13] = "So", + [0x00F14] = "Po", + [0x00F34] = "So", + [0x00F35] = "Mn", + [0x00F36] = "So", + [0x00F37] = "Mn", + [0x00F38] = "So", + [0x00F39] = "Mn", + [0x00F3A] = "Ps", + [0x00F3B] = "Pe", + [0x00F3C] = "Ps", + [0x00F3D] = "Pe", + [0x00F7F] = "Mc", + [0x00F85] = "Po", + [0x00FC6] = "Mn", + [0x01031] = "Mc", + [0x01038] = "Mc", + [0x0103F] = "Lo", + [0x01061] = "Lo", + [0x01082] = "Mn", + [0x0108D] = "Mn", + [0x0108E] = "Lo", + [0x0108F] = "Mc", + [0x0109D] = "Mn", + [0x010C7] = "Lu", + [0x010CD] = "Lu", + [0x010FB] = "Po", + [0x010FC] = "Lm", + [0x01258] = "Lo", + [0x012C0] = "Lo", + [0x01400] = "Pd", + [0x01680] = "Zs", + [0x0169B] = "Ps", + [0x0169C] = "Pe", + [0x017B6] = "Mc", + [0x017C6] = "Mn", + [0x017D7] = "Lm", + [0x017DB] = "Sc", + [0x017DC] = "Lo", + [0x017DD] = "Mn", + [0x01806] = "Pd", + [0x0180E] = "Cf", + [0x01843] = "Lm", + [0x018A9] = "Mn", + [0x018AA] = "Lo", + [0x01932] = "Mn", + [0x01940] = "So", + [0x019DA] = "No", + [0x01A1B] = "Mn", + [0x01A55] = "Mc", + [0x01A56] = "Mn", + [0x01A57] = "Mc", + [0x01A60] = "Mn", + [0x01A61] = "Mc", + [0x01A62] = "Mn", + [0x01A7F] = "Mn", + [0x01AA7] = "Lm", + [0x01ABE] = "Me", + [0x01B04] = "Mc", + [0x01B34] = "Mn", + [0x01B35] = "Mc", + [0x01B3B] = "Mc", + [0x01B3C] = "Mn", + [0x01B42] = "Mn", + [0x01B82] = "Mc", + [0x01BA1] = "Mc", + [0x01BAA] = "Mc", + [0x01BE6] = "Mn", + [0x01BE7] = "Mc", + [0x01BED] = "Mn", + [0x01BEE] = "Mc", + [0x01CD3] = "Po", + [0x01CE1] = "Mc", + [0x01CED] = "Mn", + [0x01CF4] = "Mn", + [0x01CF7] = "Mc", + [0x01D78] = "Lm", + [0x01E00] = "Lu", + [0x01E01] = "Ll", + [0x01E02] = "Lu", + [0x01E03] = "Ll", + [0x01E04] = "Lu", + [0x01E05] = "Ll", + [0x01E06] = "Lu", + [0x01E07] = "Ll", + [0x01E08] = "Lu", + [0x01E09] = "Ll", + [0x01E0A] = "Lu", + [0x01E0B] = "Ll", + [0x01E0C] = "Lu", + [0x01E0D] = "Ll", + [0x01E0E] = "Lu", + [0x01E0F] = "Ll", + [0x01E10] = "Lu", + [0x01E11] = "Ll", + [0x01E12] = "Lu", + [0x01E13] = "Ll", + [0x01E14] = "Lu", + [0x01E15] = "Ll", + [0x01E16] = "Lu", + [0x01E17] = "Ll", + [0x01E18] = "Lu", + [0x01E19] = "Ll", + [0x01E1A] = "Lu", + [0x01E1B] = "Ll", + [0x01E1C] = "Lu", + [0x01E1D] = "Ll", + [0x01E1E] = "Lu", + [0x01E1F] = "Ll", + [0x01E20] = "Lu", + [0x01E21] = "Ll", + [0x01E22] = "Lu", + [0x01E23] = "Ll", + [0x01E24] = "Lu", + [0x01E25] = "Ll", + [0x01E26] = "Lu", + [0x01E27] = "Ll", + [0x01E28] = "Lu", + [0x01E29] = "Ll", + [0x01E2A] = "Lu", + [0x01E2B] = "Ll", + [0x01E2C] = "Lu", + [0x01E2D] = "Ll", + [0x01E2E] = "Lu", + [0x01E2F] = "Ll", + [0x01E30] = "Lu", + [0x01E31] = "Ll", + [0x01E32] = "Lu", + [0x01E33] = "Ll", + [0x01E34] = "Lu", + [0x01E35] = "Ll", + [0x01E36] = "Lu", + [0x01E37] = "Ll", + [0x01E38] = "Lu", + [0x01E39] = "Ll", + [0x01E3A] = "Lu", + [0x01E3B] = "Ll", + [0x01E3C] = "Lu", + [0x01E3D] = "Ll", + [0x01E3E] = "Lu", + [0x01E3F] = "Ll", + [0x01E40] = "Lu", + [0x01E41] = "Ll", + [0x01E42] = "Lu", + [0x01E43] = "Ll", + [0x01E44] = "Lu", + [0x01E45] = "Ll", + [0x01E46] = "Lu", + [0x01E47] = "Ll", + [0x01E48] = "Lu", + [0x01E49] = "Ll", + [0x01E4A] = "Lu", + [0x01E4B] = "Ll", + [0x01E4C] = "Lu", + [0x01E4D] = "Ll", + [0x01E4E] = "Lu", + [0x01E4F] = "Ll", + [0x01E50] = "Lu", + [0x01E51] = "Ll", + [0x01E52] = "Lu", + [0x01E53] = "Ll", + [0x01E54] = "Lu", + [0x01E55] = "Ll", + [0x01E56] = "Lu", + [0x01E57] = "Ll", + [0x01E58] = "Lu", + [0x01E59] = "Ll", + [0x01E5A] = "Lu", + [0x01E5B] = "Ll", + [0x01E5C] = "Lu", + [0x01E5D] = "Ll", + [0x01E5E] = "Lu", + [0x01E5F] = "Ll", + [0x01E60] = "Lu", + [0x01E61] = "Ll", + [0x01E62] = "Lu", + [0x01E63] = "Ll", + [0x01E64] = "Lu", + [0x01E65] = "Ll", + [0x01E66] = "Lu", + [0x01E67] = "Ll", + [0x01E68] = "Lu", + [0x01E69] = "Ll", + [0x01E6A] = "Lu", + [0x01E6B] = "Ll", + [0x01E6C] = "Lu", + [0x01E6D] = "Ll", + [0x01E6E] = "Lu", + [0x01E6F] = "Ll", + [0x01E70] = "Lu", + [0x01E71] = "Ll", + [0x01E72] = "Lu", + [0x01E73] = "Ll", + [0x01E74] = "Lu", + [0x01E75] = "Ll", + [0x01E76] = "Lu", + [0x01E77] = "Ll", + [0x01E78] = "Lu", + [0x01E79] = "Ll", + [0x01E7A] = "Lu", + [0x01E7B] = "Ll", + [0x01E7C] = "Lu", + [0x01E7D] = "Ll", + [0x01E7E] = "Lu", + [0x01E7F] = "Ll", + [0x01E80] = "Lu", + [0x01E81] = "Ll", + [0x01E82] = "Lu", + [0x01E83] = "Ll", + [0x01E84] = "Lu", + [0x01E85] = "Ll", + [0x01E86] = "Lu", + [0x01E87] = "Ll", + [0x01E88] = "Lu", + [0x01E89] = "Ll", + [0x01E8A] = "Lu", + [0x01E8B] = "Ll", + [0x01E8C] = "Lu", + [0x01E8D] = "Ll", + [0x01E8E] = "Lu", + [0x01E8F] = "Ll", + [0x01E90] = "Lu", + [0x01E91] = "Ll", + [0x01E92] = "Lu", + [0x01E93] = "Ll", + [0x01E94] = "Lu", + [0x01E9E] = "Lu", + [0x01E9F] = "Ll", + [0x01EA0] = "Lu", + [0x01EA1] = "Ll", + [0x01EA2] = "Lu", + [0x01EA3] = "Ll", + [0x01EA4] = "Lu", + [0x01EA5] = "Ll", + [0x01EA6] = "Lu", + [0x01EA7] = "Ll", + [0x01EA8] = "Lu", + [0x01EA9] = "Ll", + [0x01EAA] = "Lu", + [0x01EAB] = "Ll", + [0x01EAC] = "Lu", + [0x01EAD] = "Ll", + [0x01EAE] = "Lu", + [0x01EAF] = "Ll", + [0x01EB0] = "Lu", + [0x01EB1] = "Ll", + [0x01EB2] = "Lu", + [0x01EB3] = "Ll", + [0x01EB4] = "Lu", + [0x01EB5] = "Ll", + [0x01EB6] = "Lu", + [0x01EB7] = "Ll", + [0x01EB8] = "Lu", + [0x01EB9] = "Ll", + [0x01EBA] = "Lu", + [0x01EBB] = "Ll", + [0x01EBC] = "Lu", + [0x01EBD] = "Ll", + [0x01EBE] = "Lu", + [0x01EBF] = "Ll", + [0x01EC0] = "Lu", + [0x01EC1] = "Ll", + [0x01EC2] = "Lu", + [0x01EC3] = "Ll", + [0x01EC4] = "Lu", + [0x01EC5] = "Ll", + [0x01EC6] = "Lu", + [0x01EC7] = "Ll", + [0x01EC8] = "Lu", + [0x01EC9] = "Ll", + [0x01ECA] = "Lu", + [0x01ECB] = "Ll", + [0x01ECC] = "Lu", + [0x01ECD] = "Ll", + [0x01ECE] = "Lu", + [0x01ECF] = "Ll", + [0x01ED0] = "Lu", + [0x01ED1] = "Ll", + [0x01ED2] = "Lu", + [0x01ED3] = "Ll", + [0x01ED4] = "Lu", + [0x01ED5] = "Ll", + [0x01ED6] = "Lu", + [0x01ED7] = "Ll", + [0x01ED8] = "Lu", + [0x01ED9] = "Ll", + [0x01EDA] = "Lu", + [0x01EDB] = "Ll", + [0x01EDC] = "Lu", + [0x01EDD] = "Ll", + [0x01EDE] = "Lu", + [0x01EDF] = "Ll", + [0x01EE0] = "Lu", + [0x01EE1] = "Ll", + [0x01EE2] = "Lu", + [0x01EE3] = "Ll", + [0x01EE4] = "Lu", + [0x01EE5] = "Ll", + [0x01EE6] = "Lu", + [0x01EE7] = "Ll", + [0x01EE8] = "Lu", + [0x01EE9] = "Ll", + [0x01EEA] = "Lu", + [0x01EEB] = "Ll", + [0x01EEC] = "Lu", + [0x01EED] = "Ll", + [0x01EEE] = "Lu", + [0x01EEF] = "Ll", + [0x01EF0] = "Lu", + [0x01EF1] = "Ll", + [0x01EF2] = "Lu", + [0x01EF3] = "Ll", + [0x01EF4] = "Lu", + [0x01EF5] = "Ll", + [0x01EF6] = "Lu", + [0x01EF7] = "Ll", + [0x01EF8] = "Lu", + [0x01EF9] = "Ll", + [0x01EFA] = "Lu", + [0x01EFB] = "Ll", + [0x01EFC] = "Lu", + [0x01EFD] = "Ll", + [0x01EFE] = "Lu", + [0x01F59] = "Lu", + [0x01F5B] = "Lu", + [0x01F5D] = "Lu", + [0x01F5F] = "Lu", + [0x01FBC] = "Lt", + [0x01FBD] = "Sk", + [0x01FBE] = "Ll", + [0x01FCC] = "Lt", + [0x01FFC] = "Lt", + [0x02018] = "Pi", + [0x02019] = "Pf", + [0x0201A] = "Ps", + [0x0201D] = "Pf", + [0x0201E] = "Ps", + [0x0201F] = "Pi", + [0x02028] = "Zl", + [0x02029] = "Zp", + [0x0202F] = "Zs", + [0x02039] = "Pi", + [0x0203A] = "Pf", + [0x02044] = "Sm", + [0x02045] = "Ps", + [0x02046] = "Pe", + [0x02052] = "Sm", + [0x02053] = "Po", + [0x02054] = "Pc", + [0x0205F] = "Zs", + [0x02070] = "No", + [0x02071] = "Lm", + [0x0207D] = "Ps", + [0x0207E] = "Pe", + [0x0207F] = "Lm", + [0x0208D] = "Ps", + [0x0208E] = "Pe", + [0x020E1] = "Mn", + [0x02102] = "Lu", + [0x02107] = "Lu", + [0x0210A] = "Ll", + [0x02113] = "Ll", + [0x02114] = "So", + [0x02115] = "Lu", + [0x02118] = "Sm", + [0x02124] = "Lu", + [0x02125] = "So", + [0x02126] = "Lu", + [0x02127] = "So", + [0x02128] = "Lu", + [0x02129] = "So", + [0x0212E] = "So", + [0x0212F] = "Ll", + [0x02134] = "Ll", + [0x02139] = "Ll", + [0x02145] = "Lu", + [0x0214A] = "So", + [0x0214B] = "Sm", + [0x0214E] = "Ll", + [0x0214F] = "So", + [0x02183] = "Lu", + [0x02184] = "Ll", + [0x02189] = "No", + [0x021A0] = "Sm", + [0x021A3] = "Sm", + [0x021A6] = "Sm", + [0x021AE] = "Sm", + [0x021D2] = "Sm", + [0x021D3] = "So", + [0x021D4] = "Sm", + [0x02308] = "Ps", + [0x02309] = "Pe", + [0x0230A] = "Ps", + [0x0230B] = "Pe", + [0x02329] = "Ps", + [0x0232A] = "Pe", + [0x0237C] = "Sm", + [0x025B7] = "Sm", + [0x025C1] = "Sm", + [0x0266F] = "Sm", + [0x02768] = "Ps", + [0x02769] = "Pe", + [0x0276A] = "Ps", + [0x0276B] = "Pe", + [0x0276C] = "Ps", + [0x0276D] = "Pe", + [0x0276E] = "Ps", + [0x0276F] = "Pe", + [0x02770] = "Ps", + [0x02771] = "Pe", + [0x02772] = "Ps", + [0x02773] = "Pe", + [0x02774] = "Ps", + [0x02775] = "Pe", + [0x027C5] = "Ps", + [0x027C6] = "Pe", + [0x027E6] = "Ps", + [0x027E7] = "Pe", + [0x027E8] = "Ps", + [0x027E9] = "Pe", + [0x027EA] = "Ps", + [0x027EB] = "Pe", + [0x027EC] = "Ps", + [0x027ED] = "Pe", + [0x027EE] = "Ps", + [0x027EF] = "Pe", + [0x02983] = "Ps", + [0x02984] = "Pe", + [0x02985] = "Ps", + [0x02986] = "Pe", + [0x02987] = "Ps", + [0x02988] = "Pe", + [0x02989] = "Ps", + [0x0298A] = "Pe", + [0x0298B] = "Ps", + [0x0298C] = "Pe", + [0x0298D] = "Ps", + [0x0298E] = "Pe", + [0x0298F] = "Ps", + [0x02990] = "Pe", + [0x02991] = "Ps", + [0x02992] = "Pe", + [0x02993] = "Ps", + [0x02994] = "Pe", + [0x02995] = "Ps", + [0x02996] = "Pe", + [0x02997] = "Ps", + [0x02998] = "Pe", + [0x029D8] = "Ps", + [0x029D9] = "Pe", + [0x029DA] = "Ps", + [0x029DB] = "Pe", + [0x029FC] = "Ps", + [0x029FD] = "Pe", + [0x02C60] = "Lu", + [0x02C61] = "Ll", + [0x02C67] = "Lu", + [0x02C68] = "Ll", + [0x02C69] = "Lu", + [0x02C6A] = "Ll", + [0x02C6B] = "Lu", + [0x02C6C] = "Ll", + [0x02C71] = "Ll", + [0x02C72] = "Lu", + [0x02C75] = "Lu", + [0x02C81] = "Ll", + [0x02C82] = "Lu", + [0x02C83] = "Ll", + [0x02C84] = "Lu", + [0x02C85] = "Ll", + [0x02C86] = "Lu", + [0x02C87] = "Ll", + [0x02C88] = "Lu", + [0x02C89] = "Ll", + [0x02C8A] = "Lu", + [0x02C8B] = "Ll", + [0x02C8C] = "Lu", + [0x02C8D] = "Ll", + [0x02C8E] = "Lu", + [0x02C8F] = "Ll", + [0x02C90] = "Lu", + [0x02C91] = "Ll", + [0x02C92] = "Lu", + [0x02C93] = "Ll", + [0x02C94] = "Lu", + [0x02C95] = "Ll", + [0x02C96] = "Lu", + [0x02C97] = "Ll", + [0x02C98] = "Lu", + [0x02C99] = "Ll", + [0x02C9A] = "Lu", + [0x02C9B] = "Ll", + [0x02C9C] = "Lu", + [0x02C9D] = "Ll", + [0x02C9E] = "Lu", + [0x02C9F] = "Ll", + [0x02CA0] = "Lu", + [0x02CA1] = "Ll", + [0x02CA2] = "Lu", + [0x02CA3] = "Ll", + [0x02CA4] = "Lu", + [0x02CA5] = "Ll", + [0x02CA6] = "Lu", + [0x02CA7] = "Ll", + [0x02CA8] = "Lu", + [0x02CA9] = "Ll", + [0x02CAA] = "Lu", + [0x02CAB] = "Ll", + [0x02CAC] = "Lu", + [0x02CAD] = "Ll", + [0x02CAE] = "Lu", + [0x02CAF] = "Ll", + [0x02CB0] = "Lu", + [0x02CB1] = "Ll", + [0x02CB2] = "Lu", + [0x02CB3] = "Ll", + [0x02CB4] = "Lu", + [0x02CB5] = "Ll", + [0x02CB6] = "Lu", + [0x02CB7] = "Ll", + [0x02CB8] = "Lu", + [0x02CB9] = "Ll", + [0x02CBA] = "Lu", + [0x02CBB] = "Ll", + [0x02CBC] = "Lu", + [0x02CBD] = "Ll", + [0x02CBE] = "Lu", + [0x02CBF] = "Ll", + [0x02CC0] = "Lu", + [0x02CC1] = "Ll", + [0x02CC2] = "Lu", + [0x02CC3] = "Ll", + [0x02CC4] = "Lu", + [0x02CC5] = "Ll", + [0x02CC6] = "Lu", + [0x02CC7] = "Ll", + [0x02CC8] = "Lu", + [0x02CC9] = "Ll", + [0x02CCA] = "Lu", + [0x02CCB] = "Ll", + [0x02CCC] = "Lu", + [0x02CCD] = "Ll", + [0x02CCE] = "Lu", + [0x02CCF] = "Ll", + [0x02CD0] = "Lu", + [0x02CD1] = "Ll", + [0x02CD2] = "Lu", + [0x02CD3] = "Ll", + [0x02CD4] = "Lu", + [0x02CD5] = "Ll", + [0x02CD6] = "Lu", + [0x02CD7] = "Ll", + [0x02CD8] = "Lu", + [0x02CD9] = "Ll", + [0x02CDA] = "Lu", + [0x02CDB] = "Ll", + [0x02CDC] = "Lu", + [0x02CDD] = "Ll", + [0x02CDE] = "Lu", + [0x02CDF] = "Ll", + [0x02CE0] = "Lu", + [0x02CE1] = "Ll", + [0x02CE2] = "Lu", + [0x02CEB] = "Lu", + [0x02CEC] = "Ll", + [0x02CED] = "Lu", + [0x02CEE] = "Ll", + [0x02CF2] = "Lu", + [0x02CF3] = "Ll", + [0x02CFD] = "No", + [0x02D27] = "Ll", + [0x02D2D] = "Ll", + [0x02D6F] = "Lm", + [0x02D70] = "Po", + [0x02D7F] = "Mn", + [0x02E02] = "Pi", + [0x02E03] = "Pf", + [0x02E04] = "Pi", + [0x02E05] = "Pf", + [0x02E09] = "Pi", + [0x02E0A] = "Pf", + [0x02E0B] = "Po", + [0x02E0C] = "Pi", + [0x02E0D] = "Pf", + [0x02E17] = "Pd", + [0x02E1A] = "Pd", + [0x02E1B] = "Po", + [0x02E1C] = "Pi", + [0x02E1D] = "Pf", + [0x02E20] = "Pi", + [0x02E21] = "Pf", + [0x02E22] = "Ps", + [0x02E23] = "Pe", + [0x02E24] = "Ps", + [0x02E25] = "Pe", + [0x02E26] = "Ps", + [0x02E27] = "Pe", + [0x02E28] = "Ps", + [0x02E29] = "Pe", + [0x02E2F] = "Lm", + [0x02E40] = "Pd", + [0x02E41] = "Po", + [0x02E42] = "Ps", + [0x03000] = "Zs", + [0x03004] = "So", + [0x03005] = "Lm", + [0x03006] = "Lo", + [0x03007] = "Nl", + [0x03008] = "Ps", + [0x03009] = "Pe", + [0x0300A] = "Ps", + [0x0300B] = "Pe", + [0x0300C] = "Ps", + [0x0300D] = "Pe", + [0x0300E] = "Ps", + [0x0300F] = "Pe", + [0x03010] = "Ps", + [0x03011] = "Pe", + [0x03014] = "Ps", + [0x03015] = "Pe", + [0x03016] = "Ps", + [0x03017] = "Pe", + [0x03018] = "Ps", + [0x03019] = "Pe", + [0x0301A] = "Ps", + [0x0301B] = "Pe", + [0x0301C] = "Pd", + [0x0301D] = "Ps", + [0x03020] = "So", + [0x03030] = "Pd", + [0x0303B] = "Lm", + [0x0303C] = "Lo", + [0x0303D] = "Po", + [0x0309F] = "Lo", + [0x030A0] = "Pd", + [0x030FB] = "Po", + [0x030FF] = "Lo", + [0x03250] = "So", + [0x0A015] = "Lm", + [0x0A60C] = "Lm", + [0x0A640] = "Lu", + [0x0A641] = "Ll", + [0x0A642] = "Lu", + [0x0A643] = "Ll", + [0x0A644] = "Lu", + [0x0A645] = "Ll", + [0x0A646] = "Lu", + [0x0A647] = "Ll", + [0x0A648] = "Lu", + [0x0A649] = "Ll", + [0x0A64A] = "Lu", + [0x0A64B] = "Ll", + [0x0A64C] = "Lu", + [0x0A64D] = "Ll", + [0x0A64E] = "Lu", + [0x0A64F] = "Ll", + [0x0A650] = "Lu", + [0x0A651] = "Ll", + [0x0A652] = "Lu", + [0x0A653] = "Ll", + [0x0A654] = "Lu", + [0x0A655] = "Ll", + [0x0A656] = "Lu", + [0x0A657] = "Ll", + [0x0A658] = "Lu", + [0x0A659] = "Ll", + [0x0A65A] = "Lu", + [0x0A65B] = "Ll", + [0x0A65C] = "Lu", + [0x0A65D] = "Ll", + [0x0A65E] = "Lu", + [0x0A65F] = "Ll", + [0x0A660] = "Lu", + [0x0A661] = "Ll", + [0x0A662] = "Lu", + [0x0A663] = "Ll", + [0x0A664] = "Lu", + [0x0A665] = "Ll", + [0x0A666] = "Lu", + [0x0A667] = "Ll", + [0x0A668] = "Lu", + [0x0A669] = "Ll", + [0x0A66A] = "Lu", + [0x0A66B] = "Ll", + [0x0A66C] = "Lu", + [0x0A66D] = "Ll", + [0x0A66E] = "Lo", + [0x0A66F] = "Mn", + [0x0A673] = "Po", + [0x0A67E] = "Po", + [0x0A67F] = "Lm", + [0x0A680] = "Lu", + [0x0A681] = "Ll", + [0x0A682] = "Lu", + [0x0A683] = "Ll", + [0x0A684] = "Lu", + [0x0A685] = "Ll", + [0x0A686] = "Lu", + [0x0A687] = "Ll", + [0x0A688] = "Lu", + [0x0A689] = "Ll", + [0x0A68A] = "Lu", + [0x0A68B] = "Ll", + [0x0A68C] = "Lu", + [0x0A68D] = "Ll", + [0x0A68E] = "Lu", + [0x0A68F] = "Ll", + [0x0A690] = "Lu", + [0x0A691] = "Ll", + [0x0A692] = "Lu", + [0x0A693] = "Ll", + [0x0A694] = "Lu", + [0x0A695] = "Ll", + [0x0A696] = "Lu", + [0x0A697] = "Ll", + [0x0A698] = "Lu", + [0x0A699] = "Ll", + [0x0A69A] = "Lu", + [0x0A69B] = "Ll", + [0x0A722] = "Lu", + [0x0A723] = "Ll", + [0x0A724] = "Lu", + [0x0A725] = "Ll", + [0x0A726] = "Lu", + [0x0A727] = "Ll", + [0x0A728] = "Lu", + [0x0A729] = "Ll", + [0x0A72A] = "Lu", + [0x0A72B] = "Ll", + [0x0A72C] = "Lu", + [0x0A72D] = "Ll", + [0x0A72E] = "Lu", + [0x0A732] = "Lu", + [0x0A733] = "Ll", + [0x0A734] = "Lu", + [0x0A735] = "Ll", + [0x0A736] = "Lu", + [0x0A737] = "Ll", + [0x0A738] = "Lu", + [0x0A739] = "Ll", + [0x0A73A] = "Lu", + [0x0A73B] = "Ll", + [0x0A73C] = "Lu", + [0x0A73D] = "Ll", + [0x0A73E] = "Lu", + [0x0A73F] = "Ll", + [0x0A740] = "Lu", + [0x0A741] = "Ll", + [0x0A742] = "Lu", + [0x0A743] = "Ll", + [0x0A744] = "Lu", + [0x0A745] = "Ll", + [0x0A746] = "Lu", + [0x0A747] = "Ll", + [0x0A748] = "Lu", + [0x0A749] = "Ll", + [0x0A74A] = "Lu", + [0x0A74B] = "Ll", + [0x0A74C] = "Lu", + [0x0A74D] = "Ll", + [0x0A74E] = "Lu", + [0x0A74F] = "Ll", + [0x0A750] = "Lu", + [0x0A751] = "Ll", + [0x0A752] = "Lu", + [0x0A753] = "Ll", + [0x0A754] = "Lu", + [0x0A755] = "Ll", + [0x0A756] = "Lu", + [0x0A757] = "Ll", + [0x0A758] = "Lu", + [0x0A759] = "Ll", + [0x0A75A] = "Lu", + [0x0A75B] = "Ll", + [0x0A75C] = "Lu", + [0x0A75D] = "Ll", + [0x0A75E] = "Lu", + [0x0A75F] = "Ll", + [0x0A760] = "Lu", + [0x0A761] = "Ll", + [0x0A762] = "Lu", + [0x0A763] = "Ll", + [0x0A764] = "Lu", + [0x0A765] = "Ll", + [0x0A766] = "Lu", + [0x0A767] = "Ll", + [0x0A768] = "Lu", + [0x0A769] = "Ll", + [0x0A76A] = "Lu", + [0x0A76B] = "Ll", + [0x0A76C] = "Lu", + [0x0A76D] = "Ll", + [0x0A76E] = "Lu", + [0x0A76F] = "Ll", + [0x0A770] = "Lm", + [0x0A779] = "Lu", + [0x0A77A] = "Ll", + [0x0A77B] = "Lu", + [0x0A77C] = "Ll", + [0x0A77F] = "Ll", + [0x0A780] = "Lu", + [0x0A781] = "Ll", + [0x0A782] = "Lu", + [0x0A783] = "Ll", + [0x0A784] = "Lu", + [0x0A785] = "Ll", + [0x0A786] = "Lu", + [0x0A787] = "Ll", + [0x0A788] = "Lm", + [0x0A78B] = "Lu", + [0x0A78C] = "Ll", + [0x0A78D] = "Lu", + [0x0A78E] = "Ll", + [0x0A78F] = "Lo", + [0x0A790] = "Lu", + [0x0A791] = "Ll", + [0x0A792] = "Lu", + [0x0A796] = "Lu", + [0x0A797] = "Ll", + [0x0A798] = "Lu", + [0x0A799] = "Ll", + [0x0A79A] = "Lu", + [0x0A79B] = "Ll", + [0x0A79C] = "Lu", + [0x0A79D] = "Ll", + [0x0A79E] = "Lu", + [0x0A79F] = "Ll", + [0x0A7A0] = "Lu", + [0x0A7A1] = "Ll", + [0x0A7A2] = "Lu", + [0x0A7A3] = "Ll", + [0x0A7A4] = "Lu", + [0x0A7A5] = "Ll", + [0x0A7A6] = "Lu", + [0x0A7A7] = "Ll", + [0x0A7A8] = "Lu", + [0x0A7A9] = "Ll", + [0x0A7AF] = "Ll", + [0x0A7B5] = "Ll", + [0x0A7B6] = "Lu", + [0x0A7B7] = "Ll", + [0x0A7B8] = "Lu", + [0x0A7B9] = "Ll", + [0x0A7F7] = "Lo", + [0x0A7FA] = "Ll", + [0x0A802] = "Mn", + [0x0A806] = "Mn", + [0x0A80B] = "Mn", + [0x0A827] = "Mc", + [0x0A838] = "Sc", + [0x0A839] = "So", + [0x0A8FB] = "Lo", + [0x0A8FC] = "Po", + [0x0A8FF] = "Mn", + [0x0A95F] = "Po", + [0x0A983] = "Mc", + [0x0A9B3] = "Mn", + [0x0A9BC] = "Mn", + [0x0A9CF] = "Lm", + [0x0A9E5] = "Mn", + [0x0A9E6] = "Lm", + [0x0AA43] = "Mn", + [0x0AA4C] = "Mn", + [0x0AA4D] = "Mc", + [0x0AA70] = "Lm", + [0x0AA7A] = "Lo", + [0x0AA7B] = "Mc", + [0x0AA7C] = "Mn", + [0x0AA7D] = "Mc", + [0x0AAB0] = "Mn", + [0x0AAB1] = "Lo", + [0x0AAC0] = "Lo", + [0x0AAC1] = "Mn", + [0x0AAC2] = "Lo", + [0x0AADD] = "Lm", + [0x0AAEB] = "Mc", + [0x0AAF2] = "Lo", + [0x0AAF5] = "Mc", + [0x0AAF6] = "Mn", + [0x0AB5B] = "Sk", + [0x0ABE5] = "Mn", + [0x0ABE8] = "Mn", + [0x0ABEB] = "Po", + [0x0ABEC] = "Mc", + [0x0ABED] = "Mn", + [0x0FB1D] = "Lo", + [0x0FB1E] = "Mn", + [0x0FB29] = "Sm", + [0x0FB3E] = "Lo", + [0x0FD3E] = "Pe", + [0x0FD3F] = "Ps", + [0x0FDFC] = "Sc", + [0x0FDFD] = "So", + [0x0FE17] = "Ps", + [0x0FE18] = "Pe", + [0x0FE19] = "Po", + [0x0FE30] = "Po", + [0x0FE35] = "Ps", + [0x0FE36] = "Pe", + [0x0FE37] = "Ps", + [0x0FE38] = "Pe", + [0x0FE39] = "Ps", + [0x0FE3A] = "Pe", + [0x0FE3B] = "Ps", + [0x0FE3C] = "Pe", + [0x0FE3D] = "Ps", + [0x0FE3E] = "Pe", + [0x0FE3F] = "Ps", + [0x0FE40] = "Pe", + [0x0FE41] = "Ps", + [0x0FE42] = "Pe", + [0x0FE43] = "Ps", + [0x0FE44] = "Pe", + [0x0FE47] = "Ps", + [0x0FE48] = "Pe", + [0x0FE58] = "Pd", + [0x0FE59] = "Ps", + [0x0FE5A] = "Pe", + [0x0FE5B] = "Ps", + [0x0FE5C] = "Pe", + [0x0FE5D] = "Ps", + [0x0FE5E] = "Pe", + [0x0FE62] = "Sm", + [0x0FE63] = "Pd", + [0x0FE68] = "Po", + [0x0FE69] = "Sc", + [0x0FEFF] = "Cf", + [0x0FF04] = "Sc", + [0x0FF08] = "Ps", + [0x0FF09] = "Pe", + [0x0FF0A] = "Po", + [0x0FF0B] = "Sm", + [0x0FF0C] = "Po", + [0x0FF0D] = "Pd", + [0x0FF3B] = "Ps", + [0x0FF3C] = "Po", + [0x0FF3D] = "Pe", + [0x0FF3E] = "Sk", + [0x0FF3F] = "Pc", + [0x0FF40] = "Sk", + [0x0FF5B] = "Ps", + [0x0FF5C] = "Sm", + [0x0FF5D] = "Pe", + [0x0FF5E] = "Sm", + [0x0FF5F] = "Ps", + [0x0FF60] = "Pe", + [0x0FF61] = "Po", + [0x0FF62] = "Ps", + [0x0FF63] = "Pe", + [0x0FF70] = "Lm", + [0x0FFE2] = "Sm", + [0x0FFE3] = "Sk", + [0x0FFE4] = "So", + [0x0FFE8] = "So", + [0x101A0] = "So", + [0x101FD] = "Mn", + [0x102E0] = "Mn", + [0x10341] = "Nl", + [0x1034A] = "Nl", + [0x1039F] = "Po", + [0x103D0] = "Po", + [0x1056F] = "Po", + [0x10808] = "Lo", + [0x1083C] = "Lo", + [0x10857] = "Po", + [0x1091F] = "Po", + [0x1093F] = "Po", + [0x10A00] = "Lo", + [0x10A3F] = "Mn", + [0x10A7F] = "Po", + [0x10AC8] = "So", + [0x10F27] = "Lo", + [0x11000] = "Mc", + [0x11001] = "Mn", + [0x11002] = "Mc", + [0x11082] = "Mc", + [0x110BD] = "Cf", + [0x110CD] = "Cf", + [0x1112C] = "Mc", + [0x11144] = "Lo", + [0x11173] = "Mn", + [0x11176] = "Lo", + [0x11182] = "Mc", + [0x111CD] = "Po", + [0x111DA] = "Lo", + [0x111DB] = "Po", + [0x111DC] = "Lo", + [0x11234] = "Mn", + [0x11235] = "Mc", + [0x1123E] = "Mn", + [0x11288] = "Lo", + [0x112A9] = "Po", + [0x112DF] = "Mn", + [0x1133D] = "Lo", + [0x11340] = "Mn", + [0x11350] = "Lo", + [0x11357] = "Mc", + [0x11445] = "Mc", + [0x11446] = "Mn", + [0x1145B] = "Po", + [0x1145D] = "Po", + [0x1145E] = "Mn", + [0x114B9] = "Mc", + [0x114BA] = "Mn", + [0x114C1] = "Mc", + [0x114C6] = "Po", + [0x114C7] = "Lo", + [0x115BE] = "Mc", + [0x1163D] = "Mn", + [0x1163E] = "Mc", + [0x11644] = "Lo", + [0x116AB] = "Mn", + [0x116AC] = "Mc", + [0x116AD] = "Mn", + [0x116B6] = "Mc", + [0x116B7] = "Mn", + [0x11726] = "Mc", + [0x1173F] = "So", + [0x11838] = "Mc", + [0x1183B] = "Po", + [0x118FF] = "Lo", + [0x11A00] = "Lo", + [0x11A39] = "Mc", + [0x11A3A] = "Lo", + [0x11A47] = "Mn", + [0x11A50] = "Lo", + [0x11A97] = "Mc", + [0x11A9D] = "Lo", + [0x11C2F] = "Mc", + [0x11C3E] = "Mc", + [0x11C3F] = "Mn", + [0x11C40] = "Lo", + [0x11CA9] = "Mc", + [0x11CB1] = "Mc", + [0x11CB4] = "Mc", + [0x11D3A] = "Mn", + [0x11D46] = "Lo", + [0x11D47] = "Mn", + [0x11D95] = "Mn", + [0x11D96] = "Mc", + [0x11D97] = "Mn", + [0x11D98] = "Lo", + [0x16AF5] = "Po", + [0x16B44] = "Po", + [0x16B45] = "So", + [0x16F50] = "Lo", + [0x1BC9C] = "So", + [0x1BC9F] = "Po", + [0x1D245] = "So", + [0x1D49C] = "Lu", + [0x1D4A2] = "Lu", + [0x1D4BB] = "Ll", + [0x1D546] = "Lu", + [0x1D6C1] = "Sm", + [0x1D6DB] = "Sm", + [0x1D6FB] = "Sm", + [0x1D715] = "Sm", + [0x1D735] = "Sm", + [0x1D74F] = "Sm", + [0x1D76F] = "Sm", + [0x1D789] = "Sm", + [0x1D7A9] = "Sm", + [0x1D7C3] = "Sm", + [0x1D7CA] = "Lu", + [0x1D7CB] = "Ll", + [0x1DA75] = "Mn", + [0x1DA84] = "Mn", + [0x1ECAC] = "So", + [0x1ECB0] = "Sc", + [0x1EE24] = "Lo", + [0x1EE27] = "Lo", + [0x1EE39] = "Lo", + [0x1EE3B] = "Lo", + [0x1EE42] = "Lo", + [0x1EE47] = "Lo", + [0x1EE49] = "Lo", + [0x1EE4B] = "Lo", + [0x1EE54] = "Lo", + [0x1EE57] = "Lo", + [0x1EE59] = "Lo", + [0x1EE5B] = "Lo", + [0x1EE5D] = "Lo", + [0x1EE5F] = "Lo", + [0x1EE64] = "Lo", + [0x1EE7E] = "Lo", + [0x1F97A] = "So", + [0xE0001] = "Cf", + }, + ranges = { + { 0x000000, 0x00001F, "Cc" }, + { 0x000021, 0x000023, "Po" }, + { 0x000025, 0x000027, "Po" }, + { 0x00002E, 0x00002F, "Po" }, + { 0x000030, 0x000039, "Nd" }, + { 0x00003A, 0x00003B, "Po" }, + { 0x00003C, 0x00003E, "Sm" }, + { 0x00003F, 0x000040, "Po" }, + { 0x000041, 0x00005A, "Lu" }, + { 0x000061, 0x00007A, "Ll" }, + { 0x00007F, 0x00009F, "Cc" }, + { 0x0000A2, 0x0000A5, "Sc" }, + { 0x0000B2, 0x0000B3, "No" }, + { 0x0000B6, 0x0000B7, "Po" }, + { 0x0000BC, 0x0000BE, "No" }, + { 0x0000C0, 0x0000D6, "Lu" }, + { 0x0000D8, 0x0000DE, "Lu" }, + { 0x0000DF, 0x0000F6, "Ll" }, + { 0x0000F8, 0x0000FF, "Ll" }, + { 0x000137, 0x000138, "Ll" }, + { 0x000148, 0x000149, "Ll" }, + { 0x000178, 0x000179, "Lu" }, + { 0x00017E, 0x000180, "Ll" }, + { 0x000181, 0x000182, "Lu" }, + { 0x000186, 0x000187, "Lu" }, + { 0x000189, 0x00018B, "Lu" }, + { 0x00018C, 0x00018D, "Ll" }, + { 0x00018E, 0x000191, "Lu" }, + { 0x000193, 0x000194, "Lu" }, + { 0x000196, 0x000198, "Lu" }, + { 0x000199, 0x00019B, "Ll" }, + { 0x00019C, 0x00019D, "Lu" }, + { 0x00019F, 0x0001A0, "Lu" }, + { 0x0001A6, 0x0001A7, "Lu" }, + { 0x0001AA, 0x0001AB, "Ll" }, + { 0x0001AE, 0x0001AF, "Lu" }, + { 0x0001B1, 0x0001B3, "Lu" }, + { 0x0001B7, 0x0001B8, "Lu" }, + { 0x0001B9, 0x0001BA, "Ll" }, + { 0x0001BD, 0x0001BF, "Ll" }, + { 0x0001C0, 0x0001C3, "Lo" }, + { 0x0001DC, 0x0001DD, "Ll" }, + { 0x0001EF, 0x0001F0, "Ll" }, + { 0x0001F6, 0x0001F8, "Lu" }, + { 0x000233, 0x000239, "Ll" }, + { 0x00023A, 0x00023B, "Lu" }, + { 0x00023D, 0x00023E, "Lu" }, + { 0x00023F, 0x000240, "Ll" }, + { 0x000243, 0x000246, "Lu" }, + { 0x00024F, 0x000293, "Ll" }, + { 0x000295, 0x0002AF, "Ll" }, + { 0x0002B0, 0x0002C1, "Lm" }, + { 0x0002C2, 0x0002C5, "Sk" }, + { 0x0002C6, 0x0002D1, "Lm" }, + { 0x0002D2, 0x0002DF, "Sk" }, + { 0x0002E0, 0x0002E4, "Lm" }, + { 0x0002E5, 0x0002EB, "Sk" }, + { 0x0002EF, 0x0002FF, "Sk" }, + { 0x000300, 0x00036F, "Mn" }, + { 0x00037B, 0x00037D, "Ll" }, + { 0x000384, 0x000385, "Sk" }, + { 0x000388, 0x00038A, "Lu" }, + { 0x00038E, 0x00038F, "Lu" }, + { 0x000391, 0x0003A1, "Lu" }, + { 0x0003A3, 0x0003AB, "Lu" }, + { 0x0003AC, 0x0003CE, "Ll" }, + { 0x0003D0, 0x0003D1, "Ll" }, + { 0x0003D2, 0x0003D4, "Lu" }, + { 0x0003D5, 0x0003D7, "Ll" }, + { 0x0003EF, 0x0003F3, "Ll" }, + { 0x0003F9, 0x0003FA, "Lu" }, + { 0x0003FB, 0x0003FC, "Ll" }, + { 0x0003FD, 0x00042F, "Lu" }, + { 0x000430, 0x00045F, "Ll" }, + { 0x000483, 0x000487, "Mn" }, + { 0x000488, 0x000489, "Me" }, + { 0x0004C0, 0x0004C1, "Lu" }, + { 0x0004CE, 0x0004CF, "Ll" }, + { 0x000531, 0x000556, "Lu" }, + { 0x00055A, 0x00055F, "Po" }, + { 0x000560, 0x000588, "Ll" }, + { 0x00058D, 0x00058E, "So" }, + { 0x000591, 0x0005BD, "Mn" }, + { 0x0005C1, 0x0005C2, "Mn" }, + { 0x0005C4, 0x0005C5, "Mn" }, + { 0x0005D0, 0x0005EA, "Lo" }, + { 0x0005EF, 0x0005F2, "Lo" }, + { 0x0005F3, 0x0005F4, "Po" }, + { 0x000600, 0x000605, "Cf" }, + { 0x000606, 0x000608, "Sm" }, + { 0x000609, 0x00060A, "Po" }, + { 0x00060C, 0x00060D, "Po" }, + { 0x00060E, 0x00060F, "So" }, + { 0x000610, 0x00061A, "Mn" }, + { 0x00061E, 0x00061F, "Po" }, + { 0x000620, 0x00063F, "Lo" }, + { 0x000641, 0x00064A, "Lo" }, + { 0x00064B, 0x00065F, "Mn" }, + { 0x000660, 0x000669, "Nd" }, + { 0x00066A, 0x00066D, "Po" }, + { 0x00066E, 0x00066F, "Lo" }, + { 0x000671, 0x0006D3, "Lo" }, + { 0x0006D6, 0x0006DC, "Mn" }, + { 0x0006DF, 0x0006E4, "Mn" }, + { 0x0006E5, 0x0006E6, "Lm" }, + { 0x0006E7, 0x0006E8, "Mn" }, + { 0x0006EA, 0x0006ED, "Mn" }, + { 0x0006EE, 0x0006EF, "Lo" }, + { 0x0006F0, 0x0006F9, "Nd" }, + { 0x0006FA, 0x0006FC, "Lo" }, + { 0x0006FD, 0x0006FE, "So" }, + { 0x000700, 0x00070D, "Po" }, + { 0x000712, 0x00072F, "Lo" }, + { 0x000730, 0x00074A, "Mn" }, + { 0x00074D, 0x0007A5, "Lo" }, + { 0x0007A6, 0x0007B0, "Mn" }, + { 0x0007C0, 0x0007C9, "Nd" }, + { 0x0007CA, 0x0007EA, "Lo" }, + { 0x0007EB, 0x0007F3, "Mn" }, + { 0x0007F4, 0x0007F5, "Lm" }, + { 0x0007F7, 0x0007F9, "Po" }, + { 0x0007FE, 0x0007FF, "Sc" }, + { 0x000800, 0x000815, "Lo" }, + { 0x000816, 0x000819, "Mn" }, + { 0x00081B, 0x000823, "Mn" }, + { 0x000825, 0x000827, "Mn" }, + { 0x000829, 0x00082D, "Mn" }, + { 0x000830, 0x00083E, "Po" }, + { 0x000840, 0x000858, "Lo" }, + { 0x000859, 0x00085B, "Mn" }, + { 0x000860, 0x00086A, "Lo" }, + { 0x0008A0, 0x0008B4, "Lo" }, + { 0x0008B6, 0x0008BD, "Lo" }, + { 0x0008D3, 0x0008E1, "Mn" }, + { 0x0008E3, 0x000902, "Mn" }, + { 0x000904, 0x000939, "Lo" }, + { 0x00093E, 0x000940, "Mc" }, + { 0x000941, 0x000948, "Mn" }, + { 0x000949, 0x00094C, "Mc" }, + { 0x00094E, 0x00094F, "Mc" }, + { 0x000951, 0x000957, "Mn" }, + { 0x000958, 0x000961, "Lo" }, + { 0x000962, 0x000963, "Mn" }, + { 0x000964, 0x000965, "Po" }, + { 0x000966, 0x00096F, "Nd" }, + { 0x000972, 0x000980, "Lo" }, + { 0x000982, 0x000983, "Mc" }, + { 0x000985, 0x00098C, "Lo" }, + { 0x00098F, 0x000990, "Lo" }, + { 0x000993, 0x0009A8, "Lo" }, + { 0x0009AA, 0x0009B0, "Lo" }, + { 0x0009B6, 0x0009B9, "Lo" }, + { 0x0009BE, 0x0009C0, "Mc" }, + { 0x0009C1, 0x0009C4, "Mn" }, + { 0x0009C7, 0x0009C8, "Mc" }, + { 0x0009CB, 0x0009CC, "Mc" }, + { 0x0009DC, 0x0009DD, "Lo" }, + { 0x0009DF, 0x0009E1, "Lo" }, + { 0x0009E2, 0x0009E3, "Mn" }, + { 0x0009E6, 0x0009EF, "Nd" }, + { 0x0009F0, 0x0009F1, "Lo" }, + { 0x0009F2, 0x0009F3, "Sc" }, + { 0x0009F4, 0x0009F9, "No" }, + { 0x000A01, 0x000A02, "Mn" }, + { 0x000A05, 0x000A0A, "Lo" }, + { 0x000A0F, 0x000A10, "Lo" }, + { 0x000A13, 0x000A28, "Lo" }, + { 0x000A2A, 0x000A30, "Lo" }, + { 0x000A32, 0x000A33, "Lo" }, + { 0x000A35, 0x000A36, "Lo" }, + { 0x000A38, 0x000A39, "Lo" }, + { 0x000A3E, 0x000A40, "Mc" }, + { 0x000A41, 0x000A42, "Mn" }, + { 0x000A47, 0x000A48, "Mn" }, + { 0x000A4B, 0x000A4D, "Mn" }, + { 0x000A59, 0x000A5C, "Lo" }, + { 0x000A66, 0x000A6F, "Nd" }, + { 0x000A70, 0x000A71, "Mn" }, + { 0x000A72, 0x000A74, "Lo" }, + { 0x000A81, 0x000A82, "Mn" }, + { 0x000A85, 0x000A8D, "Lo" }, + { 0x000A8F, 0x000A91, "Lo" }, + { 0x000A93, 0x000AA8, "Lo" }, + { 0x000AAA, 0x000AB0, "Lo" }, + { 0x000AB2, 0x000AB3, "Lo" }, + { 0x000AB5, 0x000AB9, "Lo" }, + { 0x000ABE, 0x000AC0, "Mc" }, + { 0x000AC1, 0x000AC5, "Mn" }, + { 0x000AC7, 0x000AC8, "Mn" }, + { 0x000ACB, 0x000ACC, "Mc" }, + { 0x000AE0, 0x000AE1, "Lo" }, + { 0x000AE2, 0x000AE3, "Mn" }, + { 0x000AE6, 0x000AEF, "Nd" }, + { 0x000AFA, 0x000AFF, "Mn" }, + { 0x000B02, 0x000B03, "Mc" }, + { 0x000B05, 0x000B0C, "Lo" }, + { 0x000B0F, 0x000B10, "Lo" }, + { 0x000B13, 0x000B28, "Lo" }, + { 0x000B2A, 0x000B30, "Lo" }, + { 0x000B32, 0x000B33, "Lo" }, + { 0x000B35, 0x000B39, "Lo" }, + { 0x000B41, 0x000B44, "Mn" }, + { 0x000B47, 0x000B48, "Mc" }, + { 0x000B4B, 0x000B4C, "Mc" }, + { 0x000B5C, 0x000B5D, "Lo" }, + { 0x000B5F, 0x000B61, "Lo" }, + { 0x000B62, 0x000B63, "Mn" }, + { 0x000B66, 0x000B6F, "Nd" }, + { 0x000B72, 0x000B77, "No" }, + { 0x000B85, 0x000B8A, "Lo" }, + { 0x000B8E, 0x000B90, "Lo" }, + { 0x000B92, 0x000B95, "Lo" }, + { 0x000B99, 0x000B9A, "Lo" }, + { 0x000B9E, 0x000B9F, "Lo" }, + { 0x000BA3, 0x000BA4, "Lo" }, + { 0x000BA8, 0x000BAA, "Lo" }, + { 0x000BAE, 0x000BB9, "Lo" }, + { 0x000BBE, 0x000BBF, "Mc" }, + { 0x000BC1, 0x000BC2, "Mc" }, + { 0x000BC6, 0x000BC8, "Mc" }, + { 0x000BCA, 0x000BCC, "Mc" }, + { 0x000BE6, 0x000BEF, "Nd" }, + { 0x000BF0, 0x000BF2, "No" }, + { 0x000BF3, 0x000BF8, "So" }, + { 0x000C01, 0x000C03, "Mc" }, + { 0x000C05, 0x000C0C, "Lo" }, + { 0x000C0E, 0x000C10, "Lo" }, + { 0x000C12, 0x000C28, "Lo" }, + { 0x000C2A, 0x000C39, "Lo" }, + { 0x000C3E, 0x000C40, "Mn" }, + { 0x000C41, 0x000C44, "Mc" }, + { 0x000C46, 0x000C48, "Mn" }, + { 0x000C4A, 0x000C4D, "Mn" }, + { 0x000C55, 0x000C56, "Mn" }, + { 0x000C58, 0x000C5A, "Lo" }, + { 0x000C60, 0x000C61, "Lo" }, + { 0x000C62, 0x000C63, "Mn" }, + { 0x000C66, 0x000C6F, "Nd" }, + { 0x000C78, 0x000C7E, "No" }, + { 0x000C82, 0x000C83, "Mc" }, + { 0x000C85, 0x000C8C, "Lo" }, + { 0x000C8E, 0x000C90, "Lo" }, + { 0x000C92, 0x000CA8, "Lo" }, + { 0x000CAA, 0x000CB3, "Lo" }, + { 0x000CB5, 0x000CB9, "Lo" }, + { 0x000CC0, 0x000CC4, "Mc" }, + { 0x000CC7, 0x000CC8, "Mc" }, + { 0x000CCA, 0x000CCB, "Mc" }, + { 0x000CCC, 0x000CCD, "Mn" }, + { 0x000CD5, 0x000CD6, "Mc" }, + { 0x000CE0, 0x000CE1, "Lo" }, + { 0x000CE2, 0x000CE3, "Mn" }, + { 0x000CE6, 0x000CEF, "Nd" }, + { 0x000CF1, 0x000CF2, "Lo" }, + { 0x000D00, 0x000D01, "Mn" }, + { 0x000D02, 0x000D03, "Mc" }, + { 0x000D05, 0x000D0C, "Lo" }, + { 0x000D0E, 0x000D10, "Lo" }, + { 0x000D12, 0x000D3A, "Lo" }, + { 0x000D3B, 0x000D3C, "Mn" }, + { 0x000D3E, 0x000D40, "Mc" }, + { 0x000D41, 0x000D44, "Mn" }, + { 0x000D46, 0x000D48, "Mc" }, + { 0x000D4A, 0x000D4C, "Mc" }, + { 0x000D54, 0x000D56, "Lo" }, + { 0x000D58, 0x000D5E, "No" }, + { 0x000D5F, 0x000D61, "Lo" }, + { 0x000D62, 0x000D63, "Mn" }, + { 0x000D66, 0x000D6F, "Nd" }, + { 0x000D70, 0x000D78, "No" }, + { 0x000D7A, 0x000D7F, "Lo" }, + { 0x000D82, 0x000D83, "Mc" }, + { 0x000D85, 0x000D96, "Lo" }, + { 0x000D9A, 0x000DB1, "Lo" }, + { 0x000DB3, 0x000DBB, "Lo" }, + { 0x000DC0, 0x000DC6, "Lo" }, + { 0x000DCF, 0x000DD1, "Mc" }, + { 0x000DD2, 0x000DD4, "Mn" }, + { 0x000DD8, 0x000DDF, "Mc" }, + { 0x000DE6, 0x000DEF, "Nd" }, + { 0x000DF2, 0x000DF3, "Mc" }, + { 0x000E01, 0x000E30, "Lo" }, + { 0x000E32, 0x000E33, "Lo" }, + { 0x000E34, 0x000E3A, "Mn" }, + { 0x000E40, 0x000E45, "Lo" }, + { 0x000E47, 0x000E4E, "Mn" }, + { 0x000E50, 0x000E59, "Nd" }, + { 0x000E5A, 0x000E5B, "Po" }, + { 0x000E81, 0x000E82, "Lo" }, + { 0x000E87, 0x000E88, "Lo" }, + { 0x000E94, 0x000E97, "Lo" }, + { 0x000E99, 0x000E9F, "Lo" }, + { 0x000EA1, 0x000EA3, "Lo" }, + { 0x000EAA, 0x000EAB, "Lo" }, + { 0x000EAD, 0x000EB0, "Lo" }, + { 0x000EB2, 0x000EB3, "Lo" }, + { 0x000EB4, 0x000EB9, "Mn" }, + { 0x000EBB, 0x000EBC, "Mn" }, + { 0x000EC0, 0x000EC4, "Lo" }, + { 0x000EC8, 0x000ECD, "Mn" }, + { 0x000ED0, 0x000ED9, "Nd" }, + { 0x000EDC, 0x000EDF, "Lo" }, + { 0x000F01, 0x000F03, "So" }, + { 0x000F04, 0x000F12, "Po" }, + { 0x000F15, 0x000F17, "So" }, + { 0x000F18, 0x000F19, "Mn" }, + { 0x000F1A, 0x000F1F, "So" }, + { 0x000F20, 0x000F29, "Nd" }, + { 0x000F2A, 0x000F33, "No" }, + { 0x000F3E, 0x000F3F, "Mc" }, + { 0x000F40, 0x000F47, "Lo" }, + { 0x000F49, 0x000F6C, "Lo" }, + { 0x000F71, 0x000F7E, "Mn" }, + { 0x000F80, 0x000F84, "Mn" }, + { 0x000F86, 0x000F87, "Mn" }, + { 0x000F88, 0x000F8C, "Lo" }, + { 0x000F8D, 0x000F97, "Mn" }, + { 0x000F99, 0x000FBC, "Mn" }, + { 0x000FBE, 0x000FC5, "So" }, + { 0x000FC7, 0x000FCC, "So" }, + { 0x000FCE, 0x000FCF, "So" }, + { 0x000FD0, 0x000FD4, "Po" }, + { 0x000FD5, 0x000FD8, "So" }, + { 0x000FD9, 0x000FDA, "Po" }, + { 0x001000, 0x00102A, "Lo" }, + { 0x00102B, 0x00102C, "Mc" }, + { 0x00102D, 0x001030, "Mn" }, + { 0x001032, 0x001037, "Mn" }, + { 0x001039, 0x00103A, "Mn" }, + { 0x00103B, 0x00103C, "Mc" }, + { 0x00103D, 0x00103E, "Mn" }, + { 0x001040, 0x001049, "Nd" }, + { 0x00104A, 0x00104F, "Po" }, + { 0x001050, 0x001055, "Lo" }, + { 0x001056, 0x001057, "Mc" }, + { 0x001058, 0x001059, "Mn" }, + { 0x00105A, 0x00105D, "Lo" }, + { 0x00105E, 0x001060, "Mn" }, + { 0x001062, 0x001064, "Mc" }, + { 0x001065, 0x001066, "Lo" }, + { 0x001067, 0x00106D, "Mc" }, + { 0x00106E, 0x001070, "Lo" }, + { 0x001071, 0x001074, "Mn" }, + { 0x001075, 0x001081, "Lo" }, + { 0x001083, 0x001084, "Mc" }, + { 0x001085, 0x001086, "Mn" }, + { 0x001087, 0x00108C, "Mc" }, + { 0x001090, 0x001099, "Nd" }, + { 0x00109A, 0x00109C, "Mc" }, + { 0x00109E, 0x00109F, "So" }, + { 0x0010A0, 0x0010C5, "Lu" }, + { 0x0010D0, 0x0010FA, "Ll" }, + { 0x0010FD, 0x0010FF, "Ll" }, + { 0x001100, 0x001248, "Lo" }, + { 0x00124A, 0x00124D, "Lo" }, + { 0x001250, 0x001256, "Lo" }, + { 0x00125A, 0x00125D, "Lo" }, + { 0x001260, 0x001288, "Lo" }, + { 0x00128A, 0x00128D, "Lo" }, + { 0x001290, 0x0012B0, "Lo" }, + { 0x0012B2, 0x0012B5, "Lo" }, + { 0x0012B8, 0x0012BE, "Lo" }, + { 0x0012C2, 0x0012C5, "Lo" }, + { 0x0012C8, 0x0012D6, "Lo" }, + { 0x0012D8, 0x001310, "Lo" }, + { 0x001312, 0x001315, "Lo" }, + { 0x001318, 0x00135A, "Lo" }, + { 0x00135D, 0x00135F, "Mn" }, + { 0x001360, 0x001368, "Po" }, + { 0x001369, 0x00137C, "No" }, + { 0x001380, 0x00138F, "Lo" }, + { 0x001390, 0x001399, "So" }, + { 0x0013A0, 0x0013F5, "Lu" }, + { 0x0013F8, 0x0013FD, "Ll" }, + { 0x001401, 0x00166C, "Lo" }, + { 0x00166D, 0x00166E, "Po" }, + { 0x00166F, 0x00167F, "Lo" }, + { 0x001681, 0x00169A, "Lo" }, + { 0x0016A0, 0x0016EA, "Lo" }, + { 0x0016EB, 0x0016ED, "Po" }, + { 0x0016EE, 0x0016F0, "Nl" }, + { 0x0016F1, 0x0016F8, "Lo" }, + { 0x001700, 0x00170C, "Lo" }, + { 0x00170E, 0x001711, "Lo" }, + { 0x001712, 0x001714, "Mn" }, + { 0x001720, 0x001731, "Lo" }, + { 0x001732, 0x001734, "Mn" }, + { 0x001735, 0x001736, "Po" }, + { 0x001740, 0x001751, "Lo" }, + { 0x001752, 0x001753, "Mn" }, + { 0x001760, 0x00176C, "Lo" }, + { 0x00176E, 0x001770, "Lo" }, + { 0x001772, 0x001773, "Mn" }, + { 0x001780, 0x0017B3, "Lo" }, + { 0x0017B4, 0x0017B5, "Mn" }, + { 0x0017B7, 0x0017BD, "Mn" }, + { 0x0017BE, 0x0017C5, "Mc" }, + { 0x0017C7, 0x0017C8, "Mc" }, + { 0x0017C9, 0x0017D3, "Mn" }, + { 0x0017D4, 0x0017D6, "Po" }, + { 0x0017D8, 0x0017DA, "Po" }, + { 0x0017E0, 0x0017E9, "Nd" }, + { 0x0017F0, 0x0017F9, "No" }, + { 0x001800, 0x001805, "Po" }, + { 0x001807, 0x00180A, "Po" }, + { 0x00180B, 0x00180D, "Mn" }, + { 0x001810, 0x001819, "Nd" }, + { 0x001820, 0x001842, "Lo" }, + { 0x001844, 0x001878, "Lo" }, + { 0x001880, 0x001884, "Lo" }, + { 0x001885, 0x001886, "Mn" }, + { 0x001887, 0x0018A8, "Lo" }, + { 0x0018B0, 0x0018F5, "Lo" }, + { 0x001900, 0x00191E, "Lo" }, + { 0x001920, 0x001922, "Mn" }, + { 0x001923, 0x001926, "Mc" }, + { 0x001927, 0x001928, "Mn" }, + { 0x001929, 0x00192B, "Mc" }, + { 0x001930, 0x001931, "Mc" }, + { 0x001933, 0x001938, "Mc" }, + { 0x001939, 0x00193B, "Mn" }, + { 0x001944, 0x001945, "Po" }, + { 0x001946, 0x00194F, "Nd" }, + { 0x001950, 0x00196D, "Lo" }, + { 0x001970, 0x001974, "Lo" }, + { 0x001980, 0x0019AB, "Lo" }, + { 0x0019B0, 0x0019C9, "Lo" }, + { 0x0019D0, 0x0019D9, "Nd" }, + { 0x0019DE, 0x0019FF, "So" }, + { 0x001A00, 0x001A16, "Lo" }, + { 0x001A17, 0x001A18, "Mn" }, + { 0x001A19, 0x001A1A, "Mc" }, + { 0x001A1E, 0x001A1F, "Po" }, + { 0x001A20, 0x001A54, "Lo" }, + { 0x001A58, 0x001A5E, "Mn" }, + { 0x001A63, 0x001A64, "Mc" }, + { 0x001A65, 0x001A6C, "Mn" }, + { 0x001A6D, 0x001A72, "Mc" }, + { 0x001A73, 0x001A7C, "Mn" }, + { 0x001A80, 0x001A89, "Nd" }, + { 0x001A90, 0x001A99, "Nd" }, + { 0x001AA0, 0x001AA6, "Po" }, + { 0x001AA8, 0x001AAD, "Po" }, + { 0x001AB0, 0x001ABD, "Mn" }, + { 0x001B00, 0x001B03, "Mn" }, + { 0x001B05, 0x001B33, "Lo" }, + { 0x001B36, 0x001B3A, "Mn" }, + { 0x001B3D, 0x001B41, "Mc" }, + { 0x001B43, 0x001B44, "Mc" }, + { 0x001B45, 0x001B4B, "Lo" }, + { 0x001B50, 0x001B59, "Nd" }, + { 0x001B5A, 0x001B60, "Po" }, + { 0x001B61, 0x001B6A, "So" }, + { 0x001B6B, 0x001B73, "Mn" }, + { 0x001B74, 0x001B7C, "So" }, + { 0x001B80, 0x001B81, "Mn" }, + { 0x001B83, 0x001BA0, "Lo" }, + { 0x001BA2, 0x001BA5, "Mn" }, + { 0x001BA6, 0x001BA7, "Mc" }, + { 0x001BA8, 0x001BA9, "Mn" }, + { 0x001BAB, 0x001BAD, "Mn" }, + { 0x001BAE, 0x001BAF, "Lo" }, + { 0x001BB0, 0x001BB9, "Nd" }, + { 0x001BBA, 0x001BE5, "Lo" }, + { 0x001BE8, 0x001BE9, "Mn" }, + { 0x001BEA, 0x001BEC, "Mc" }, + { 0x001BEF, 0x001BF1, "Mn" }, + { 0x001BF2, 0x001BF3, "Mc" }, + { 0x001BFC, 0x001BFF, "Po" }, + { 0x001C00, 0x001C23, "Lo" }, + { 0x001C24, 0x001C2B, "Mc" }, + { 0x001C2C, 0x001C33, "Mn" }, + { 0x001C34, 0x001C35, "Mc" }, + { 0x001C36, 0x001C37, "Mn" }, + { 0x001C3B, 0x001C3F, "Po" }, + { 0x001C40, 0x001C49, "Nd" }, + { 0x001C4D, 0x001C4F, "Lo" }, + { 0x001C50, 0x001C59, "Nd" }, + { 0x001C5A, 0x001C77, "Lo" }, + { 0x001C78, 0x001C7D, "Lm" }, + { 0x001C7E, 0x001C7F, "Po" }, + { 0x001C80, 0x001C88, "Ll" }, + { 0x001C90, 0x001CBA, "Lu" }, + { 0x001CBD, 0x001CBF, "Lu" }, + { 0x001CC0, 0x001CC7, "Po" }, + { 0x001CD0, 0x001CD2, "Mn" }, + { 0x001CD4, 0x001CE0, "Mn" }, + { 0x001CE2, 0x001CE8, "Mn" }, + { 0x001CE9, 0x001CEC, "Lo" }, + { 0x001CEE, 0x001CF1, "Lo" }, + { 0x001CF2, 0x001CF3, "Mc" }, + { 0x001CF5, 0x001CF6, "Lo" }, + { 0x001CF8, 0x001CF9, "Mn" }, + { 0x001D00, 0x001D2B, "Ll" }, + { 0x001D2C, 0x001D6A, "Lm" }, + { 0x001D6B, 0x001D77, "Ll" }, + { 0x001D79, 0x001D9A, "Ll" }, + { 0x001D9B, 0x001DBF, "Lm" }, + { 0x001DC0, 0x001DF9, "Mn" }, + { 0x001DFB, 0x001DFF, "Mn" }, + { 0x001E95, 0x001E9D, "Ll" }, + { 0x001EFF, 0x001F07, "Ll" }, + { 0x001F08, 0x001F0F, "Lu" }, + { 0x001F10, 0x001F15, "Ll" }, + { 0x001F18, 0x001F1D, "Lu" }, + { 0x001F20, 0x001F27, "Ll" }, + { 0x001F28, 0x001F2F, "Lu" }, + { 0x001F30, 0x001F37, "Ll" }, + { 0x001F38, 0x001F3F, "Lu" }, + { 0x001F40, 0x001F45, "Ll" }, + { 0x001F48, 0x001F4D, "Lu" }, + { 0x001F50, 0x001F57, "Ll" }, + { 0x001F60, 0x001F67, "Ll" }, + { 0x001F68, 0x001F6F, "Lu" }, + { 0x001F70, 0x001F7D, "Ll" }, + { 0x001F80, 0x001F87, "Ll" }, + { 0x001F88, 0x001F8F, "Lt" }, + { 0x001F90, 0x001F97, "Ll" }, + { 0x001F98, 0x001F9F, "Lt" }, + { 0x001FA0, 0x001FA7, "Ll" }, + { 0x001FA8, 0x001FAF, "Lt" }, + { 0x001FB0, 0x001FB4, "Ll" }, + { 0x001FB6, 0x001FB7, "Ll" }, + { 0x001FB8, 0x001FBB, "Lu" }, + { 0x001FBF, 0x001FC1, "Sk" }, + { 0x001FC2, 0x001FC4, "Ll" }, + { 0x001FC6, 0x001FC7, "Ll" }, + { 0x001FC8, 0x001FCB, "Lu" }, + { 0x001FCD, 0x001FCF, "Sk" }, + { 0x001FD0, 0x001FD3, "Ll" }, + { 0x001FD6, 0x001FD7, "Ll" }, + { 0x001FD8, 0x001FDB, "Lu" }, + { 0x001FDD, 0x001FDF, "Sk" }, + { 0x001FE0, 0x001FE7, "Ll" }, + { 0x001FE8, 0x001FEC, "Lu" }, + { 0x001FED, 0x001FEF, "Sk" }, + { 0x001FF2, 0x001FF4, "Ll" }, + { 0x001FF6, 0x001FF7, "Ll" }, + { 0x001FF8, 0x001FFB, "Lu" }, + { 0x001FFD, 0x001FFE, "Sk" }, + { 0x002000, 0x00200A, "Zs" }, + { 0x00200B, 0x00200F, "Cf" }, + { 0x002010, 0x002015, "Pd" }, + { 0x002016, 0x002017, "Po" }, + { 0x00201B, 0x00201C, "Pi" }, + { 0x002020, 0x002027, "Po" }, + { 0x00202A, 0x00202E, "Cf" }, + { 0x002030, 0x002038, "Po" }, + { 0x00203B, 0x00203E, "Po" }, + { 0x00203F, 0x002040, "Pc" }, + { 0x002041, 0x002043, "Po" }, + { 0x002047, 0x002051, "Po" }, + { 0x002055, 0x00205E, "Po" }, + { 0x002060, 0x002064, "Cf" }, + { 0x002066, 0x00206F, "Cf" }, + { 0x002074, 0x002079, "No" }, + { 0x00207A, 0x00207C, "Sm" }, + { 0x002080, 0x002089, "No" }, + { 0x00208A, 0x00208C, "Sm" }, + { 0x002090, 0x00209C, "Lm" }, + { 0x0020A0, 0x0020BF, "Sc" }, + { 0x0020D0, 0x0020DC, "Mn" }, + { 0x0020DD, 0x0020E0, "Me" }, + { 0x0020E2, 0x0020E4, "Me" }, + { 0x0020E5, 0x0020F0, "Mn" }, + { 0x002100, 0x002101, "So" }, + { 0x002103, 0x002106, "So" }, + { 0x002108, 0x002109, "So" }, + { 0x00210B, 0x00210D, "Lu" }, + { 0x00210E, 0x00210F, "Ll" }, + { 0x002110, 0x002112, "Lu" }, + { 0x002116, 0x002117, "So" }, + { 0x002119, 0x00211D, "Lu" }, + { 0x00211E, 0x002123, "So" }, + { 0x00212A, 0x00212D, "Lu" }, + { 0x002130, 0x002133, "Lu" }, + { 0x002135, 0x002138, "Lo" }, + { 0x00213A, 0x00213B, "So" }, + { 0x00213C, 0x00213D, "Ll" }, + { 0x00213E, 0x00213F, "Lu" }, + { 0x002140, 0x002144, "Sm" }, + { 0x002146, 0x002149, "Ll" }, + { 0x00214C, 0x00214D, "So" }, + { 0x002150, 0x00215F, "No" }, + { 0x002160, 0x002182, "Nl" }, + { 0x002185, 0x002188, "Nl" }, + { 0x00218A, 0x00218B, "So" }, + { 0x002190, 0x002194, "Sm" }, + { 0x002195, 0x002199, "So" }, + { 0x00219A, 0x00219B, "Sm" }, + { 0x00219C, 0x00219F, "So" }, + { 0x0021A1, 0x0021A2, "So" }, + { 0x0021A4, 0x0021A5, "So" }, + { 0x0021A7, 0x0021AD, "So" }, + { 0x0021AF, 0x0021CD, "So" }, + { 0x0021CE, 0x0021CF, "Sm" }, + { 0x0021D0, 0x0021D1, "So" }, + { 0x0021D5, 0x0021F3, "So" }, + { 0x0021F4, 0x0022FF, "Sm" }, + { 0x002300, 0x002307, "So" }, + { 0x00230C, 0x00231F, "So" }, + { 0x002320, 0x002321, "Sm" }, + { 0x002322, 0x002328, "So" }, + { 0x00232B, 0x00237B, "So" }, + { 0x00237D, 0x00239A, "So" }, + { 0x00239B, 0x0023B3, "Sm" }, + { 0x0023B4, 0x0023DB, "So" }, + { 0x0023DC, 0x0023E1, "Sm" }, + { 0x0023E2, 0x002426, "So" }, + { 0x002440, 0x00244A, "So" }, + { 0x002460, 0x00249B, "No" }, + { 0x00249C, 0x0024E9, "So" }, + { 0x0024EA, 0x0024FF, "No" }, + { 0x002500, 0x0025B6, "So" }, + { 0x0025B8, 0x0025C0, "So" }, + { 0x0025C2, 0x0025F7, "So" }, + { 0x0025F8, 0x0025FF, "Sm" }, + { 0x002600, 0x00266E, "So" }, + { 0x002670, 0x002767, "So" }, + { 0x002776, 0x002793, "No" }, + { 0x002794, 0x0027BF, "So" }, + { 0x0027C0, 0x0027C4, "Sm" }, + { 0x0027C7, 0x0027E5, "Sm" }, + { 0x0027F0, 0x0027FF, "Sm" }, + { 0x002800, 0x0028FF, "So" }, + { 0x002900, 0x002982, "Sm" }, + { 0x002999, 0x0029D7, "Sm" }, + { 0x0029DC, 0x0029FB, "Sm" }, + { 0x0029FE, 0x002AFF, "Sm" }, + { 0x002B00, 0x002B2F, "So" }, + { 0x002B30, 0x002B44, "Sm" }, + { 0x002B45, 0x002B46, "So" }, + { 0x002B47, 0x002B4C, "Sm" }, + { 0x002B4D, 0x002B73, "So" }, + { 0x002B76, 0x002B95, "So" }, + { 0x002B98, 0x002BC8, "So" }, + { 0x002BCA, 0x002BFE, "So" }, + { 0x002C00, 0x002C2E, "Lu" }, + { 0x002C30, 0x002C5E, "Ll" }, + { 0x002C62, 0x002C64, "Lu" }, + { 0x002C65, 0x002C66, "Ll" }, + { 0x002C6D, 0x002C70, "Lu" }, + { 0x002C73, 0x002C74, "Ll" }, + { 0x002C76, 0x002C7B, "Ll" }, + { 0x002C7C, 0x002C7D, "Lm" }, + { 0x002C7E, 0x002C80, "Lu" }, + { 0x002CE3, 0x002CE4, "Ll" }, + { 0x002CE5, 0x002CEA, "So" }, + { 0x002CEF, 0x002CF1, "Mn" }, + { 0x002CF9, 0x002CFC, "Po" }, + { 0x002CFE, 0x002CFF, "Po" }, + { 0x002D00, 0x002D25, "Ll" }, + { 0x002D30, 0x002D67, "Lo" }, + { 0x002D80, 0x002D96, "Lo" }, + { 0x002DA0, 0x002DA6, "Lo" }, + { 0x002DA8, 0x002DAE, "Lo" }, + { 0x002DB0, 0x002DB6, "Lo" }, + { 0x002DB8, 0x002DBE, "Lo" }, + { 0x002DC0, 0x002DC6, "Lo" }, + { 0x002DC8, 0x002DCE, "Lo" }, + { 0x002DD0, 0x002DD6, "Lo" }, + { 0x002DD8, 0x002DDE, "Lo" }, + { 0x002DE0, 0x002DFF, "Mn" }, + { 0x002E00, 0x002E01, "Po" }, + { 0x002E06, 0x002E08, "Po" }, + { 0x002E0E, 0x002E16, "Po" }, + { 0x002E18, 0x002E19, "Po" }, + { 0x002E1E, 0x002E1F, "Po" }, + { 0x002E2A, 0x002E2E, "Po" }, + { 0x002E30, 0x002E39, "Po" }, + { 0x002E3A, 0x002E3B, "Pd" }, + { 0x002E3C, 0x002E3F, "Po" }, + { 0x002E43, 0x002E4E, "Po" }, + { 0x002E80, 0x002E99, "So" }, + { 0x002E9B, 0x002EF3, "So" }, + { 0x002F00, 0x002FD5, "So" }, + { 0x002FF0, 0x002FFB, "So" }, + { 0x003001, 0x003003, "Po" }, + { 0x003012, 0x003013, "So" }, + { 0x00301E, 0x00301F, "Pe" }, + { 0x003021, 0x003029, "Nl" }, + { 0x00302A, 0x00302D, "Mn" }, + { 0x00302E, 0x00302F, "Mc" }, + { 0x003031, 0x003035, "Lm" }, + { 0x003036, 0x003037, "So" }, + { 0x003038, 0x00303A, "Nl" }, + { 0x00303E, 0x00303F, "So" }, + { 0x003041, 0x003096, "Lo" }, + { 0x003099, 0x00309A, "Mn" }, + { 0x00309B, 0x00309C, "Sk" }, + { 0x00309D, 0x00309E, "Lm" }, + { 0x0030A1, 0x0030FA, "Lo" }, + { 0x0030FC, 0x0030FE, "Lm" }, + { 0x003105, 0x00312F, "Lo" }, + { 0x003131, 0x00318E, "Lo" }, + { 0x003190, 0x003191, "So" }, + { 0x003192, 0x003195, "No" }, + { 0x003196, 0x00319F, "So" }, + { 0x0031A0, 0x0031BA, "Lo" }, + { 0x0031C0, 0x0031E3, "So" }, + { 0x0031F0, 0x0031FF, "Lo" }, + { 0x003200, 0x00321E, "So" }, + { 0x003220, 0x003229, "No" }, + { 0x00322A, 0x003247, "So" }, + { 0x003248, 0x00324F, "No" }, + { 0x003251, 0x00325F, "No" }, + { 0x003260, 0x00327F, "So" }, + { 0x003280, 0x003289, "No" }, + { 0x00328A, 0x0032B0, "So" }, + { 0x0032B1, 0x0032BF, "No" }, + { 0x0032C0, 0x0032FE, "So" }, + { 0x003300, 0x0033FF, "So" }, + { 0x003400, 0x004DB5, "Lo" }, + { 0x004DC0, 0x004DFF, "So" }, + { 0x004E00, 0x009FEF, "Lo" }, + { 0x00A000, 0x00A014, "Lo" }, + { 0x00A016, 0x00A48C, "Lo" }, + { 0x00A490, 0x00A4C6, "So" }, + { 0x00A4D0, 0x00A4F7, "Lo" }, + { 0x00A4F8, 0x00A4FD, "Lm" }, + { 0x00A4FE, 0x00A4FF, "Po" }, + { 0x00A500, 0x00A60B, "Lo" }, + { 0x00A60D, 0x00A60F, "Po" }, + { 0x00A610, 0x00A61F, "Lo" }, + { 0x00A620, 0x00A629, "Nd" }, + { 0x00A62A, 0x00A62B, "Lo" }, + { 0x00A670, 0x00A672, "Me" }, + { 0x00A674, 0x00A67D, "Mn" }, + { 0x00A69C, 0x00A69D, "Lm" }, + { 0x00A69E, 0x00A69F, "Mn" }, + { 0x00A6A0, 0x00A6E5, "Lo" }, + { 0x00A6E6, 0x00A6EF, "Nl" }, + { 0x00A6F0, 0x00A6F1, "Mn" }, + { 0x00A6F2, 0x00A6F7, "Po" }, + { 0x00A700, 0x00A716, "Sk" }, + { 0x00A717, 0x00A71F, "Lm" }, + { 0x00A720, 0x00A721, "Sk" }, + { 0x00A72F, 0x00A731, "Ll" }, + { 0x00A771, 0x00A778, "Ll" }, + { 0x00A77D, 0x00A77E, "Lu" }, + { 0x00A789, 0x00A78A, "Sk" }, + { 0x00A793, 0x00A795, "Ll" }, + { 0x00A7AA, 0x00A7AE, "Lu" }, + { 0x00A7B0, 0x00A7B4, "Lu" }, + { 0x00A7F8, 0x00A7F9, "Lm" }, + { 0x00A7FB, 0x00A801, "Lo" }, + { 0x00A803, 0x00A805, "Lo" }, + { 0x00A807, 0x00A80A, "Lo" }, + { 0x00A80C, 0x00A822, "Lo" }, + { 0x00A823, 0x00A824, "Mc" }, + { 0x00A825, 0x00A826, "Mn" }, + { 0x00A828, 0x00A82B, "So" }, + { 0x00A830, 0x00A835, "No" }, + { 0x00A836, 0x00A837, "So" }, + { 0x00A840, 0x00A873, "Lo" }, + { 0x00A874, 0x00A877, "Po" }, + { 0x00A880, 0x00A881, "Mc" }, + { 0x00A882, 0x00A8B3, "Lo" }, + { 0x00A8B4, 0x00A8C3, "Mc" }, + { 0x00A8C4, 0x00A8C5, "Mn" }, + { 0x00A8CE, 0x00A8CF, "Po" }, + { 0x00A8D0, 0x00A8D9, "Nd" }, + { 0x00A8E0, 0x00A8F1, "Mn" }, + { 0x00A8F2, 0x00A8F7, "Lo" }, + { 0x00A8F8, 0x00A8FA, "Po" }, + { 0x00A8FD, 0x00A8FE, "Lo" }, + { 0x00A900, 0x00A909, "Nd" }, + { 0x00A90A, 0x00A925, "Lo" }, + { 0x00A926, 0x00A92D, "Mn" }, + { 0x00A92E, 0x00A92F, "Po" }, + { 0x00A930, 0x00A946, "Lo" }, + { 0x00A947, 0x00A951, "Mn" }, + { 0x00A952, 0x00A953, "Mc" }, + { 0x00A960, 0x00A97C, "Lo" }, + { 0x00A980, 0x00A982, "Mn" }, + { 0x00A984, 0x00A9B2, "Lo" }, + { 0x00A9B4, 0x00A9B5, "Mc" }, + { 0x00A9B6, 0x00A9B9, "Mn" }, + { 0x00A9BA, 0x00A9BB, "Mc" }, + { 0x00A9BD, 0x00A9C0, "Mc" }, + { 0x00A9C1, 0x00A9CD, "Po" }, + { 0x00A9D0, 0x00A9D9, "Nd" }, + { 0x00A9DE, 0x00A9DF, "Po" }, + { 0x00A9E0, 0x00A9E4, "Lo" }, + { 0x00A9E7, 0x00A9EF, "Lo" }, + { 0x00A9F0, 0x00A9F9, "Nd" }, + { 0x00A9FA, 0x00A9FE, "Lo" }, + { 0x00AA00, 0x00AA28, "Lo" }, + { 0x00AA29, 0x00AA2E, "Mn" }, + { 0x00AA2F, 0x00AA30, "Mc" }, + { 0x00AA31, 0x00AA32, "Mn" }, + { 0x00AA33, 0x00AA34, "Mc" }, + { 0x00AA35, 0x00AA36, "Mn" }, + { 0x00AA40, 0x00AA42, "Lo" }, + { 0x00AA44, 0x00AA4B, "Lo" }, + { 0x00AA50, 0x00AA59, "Nd" }, + { 0x00AA5C, 0x00AA5F, "Po" }, + { 0x00AA60, 0x00AA6F, "Lo" }, + { 0x00AA71, 0x00AA76, "Lo" }, + { 0x00AA77, 0x00AA79, "So" }, + { 0x00AA7E, 0x00AAAF, "Lo" }, + { 0x00AAB2, 0x00AAB4, "Mn" }, + { 0x00AAB5, 0x00AAB6, "Lo" }, + { 0x00AAB7, 0x00AAB8, "Mn" }, + { 0x00AAB9, 0x00AABD, "Lo" }, + { 0x00AABE, 0x00AABF, "Mn" }, + { 0x00AADB, 0x00AADC, "Lo" }, + { 0x00AADE, 0x00AADF, "Po" }, + { 0x00AAE0, 0x00AAEA, "Lo" }, + { 0x00AAEC, 0x00AAED, "Mn" }, + { 0x00AAEE, 0x00AAEF, "Mc" }, + { 0x00AAF0, 0x00AAF1, "Po" }, + { 0x00AAF3, 0x00AAF4, "Lm" }, + { 0x00AB01, 0x00AB06, "Lo" }, + { 0x00AB09, 0x00AB0E, "Lo" }, + { 0x00AB11, 0x00AB16, "Lo" }, + { 0x00AB20, 0x00AB26, "Lo" }, + { 0x00AB28, 0x00AB2E, "Lo" }, + { 0x00AB30, 0x00AB5A, "Ll" }, + { 0x00AB5C, 0x00AB5F, "Lm" }, + { 0x00AB60, 0x00AB65, "Ll" }, + { 0x00AB70, 0x00ABBF, "Ll" }, + { 0x00ABC0, 0x00ABE2, "Lo" }, + { 0x00ABE3, 0x00ABE4, "Mc" }, + { 0x00ABE6, 0x00ABE7, "Mc" }, + { 0x00ABE9, 0x00ABEA, "Mc" }, + { 0x00ABF0, 0x00ABF9, "Nd" }, + { 0x00AC00, 0x00D7A3, "Lo" }, + { 0x00D7B0, 0x00D7C6, "Lo" }, + { 0x00D7CB, 0x00D7FB, "Lo" }, + { 0x00D800, 0x00DFFF, "Cs" }, + { 0x00E000, 0x00F8FF, "Co" }, + { 0x00F900, 0x00FA6D, "Lo" }, + { 0x00FA70, 0x00FAD9, "Lo" }, + { 0x00FB00, 0x00FB06, "Ll" }, + { 0x00FB13, 0x00FB17, "Ll" }, + { 0x00FB1F, 0x00FB28, "Lo" }, + { 0x00FB2A, 0x00FB36, "Lo" }, + { 0x00FB38, 0x00FB3C, "Lo" }, + { 0x00FB40, 0x00FB41, "Lo" }, + { 0x00FB43, 0x00FB44, "Lo" }, + { 0x00FB46, 0x00FBB1, "Lo" }, + { 0x00FBB2, 0x00FBC1, "Sk" }, + { 0x00FBD3, 0x00FD3D, "Lo" }, + { 0x00FD50, 0x00FD8F, "Lo" }, + { 0x00FD92, 0x00FDC7, "Lo" }, + { 0x00FDF0, 0x00FDFB, "Lo" }, + { 0x00FE00, 0x00FE0F, "Mn" }, + { 0x00FE10, 0x00FE16, "Po" }, + { 0x00FE20, 0x00FE2F, "Mn" }, + { 0x00FE31, 0x00FE32, "Pd" }, + { 0x00FE33, 0x00FE34, "Pc" }, + { 0x00FE45, 0x00FE46, "Po" }, + { 0x00FE49, 0x00FE4C, "Po" }, + { 0x00FE4D, 0x00FE4F, "Pc" }, + { 0x00FE50, 0x00FE52, "Po" }, + { 0x00FE54, 0x00FE57, "Po" }, + { 0x00FE5F, 0x00FE61, "Po" }, + { 0x00FE64, 0x00FE66, "Sm" }, + { 0x00FE6A, 0x00FE6B, "Po" }, + { 0x00FE70, 0x00FE74, "Lo" }, + { 0x00FE76, 0x00FEFC, "Lo" }, + { 0x00FF01, 0x00FF03, "Po" }, + { 0x00FF05, 0x00FF07, "Po" }, + { 0x00FF0E, 0x00FF0F, "Po" }, + { 0x00FF10, 0x00FF19, "Nd" }, + { 0x00FF1A, 0x00FF1B, "Po" }, + { 0x00FF1C, 0x00FF1E, "Sm" }, + { 0x00FF1F, 0x00FF20, "Po" }, + { 0x00FF21, 0x00FF3A, "Lu" }, + { 0x00FF41, 0x00FF5A, "Ll" }, + { 0x00FF64, 0x00FF65, "Po" }, + { 0x00FF66, 0x00FF6F, "Lo" }, + { 0x00FF71, 0x00FF9D, "Lo" }, + { 0x00FF9E, 0x00FF9F, "Lm" }, + { 0x00FFA0, 0x00FFBE, "Lo" }, + { 0x00FFC2, 0x00FFC7, "Lo" }, + { 0x00FFCA, 0x00FFCF, "Lo" }, + { 0x00FFD2, 0x00FFD7, "Lo" }, + { 0x00FFDA, 0x00FFDC, "Lo" }, + { 0x00FFE0, 0x00FFE1, "Sc" }, + { 0x00FFE5, 0x00FFE6, "Sc" }, + { 0x00FFE9, 0x00FFEC, "Sm" }, + { 0x00FFED, 0x00FFEE, "So" }, + { 0x00FFF9, 0x00FFFB, "Cf" }, + { 0x00FFFC, 0x00FFFD, "So" }, + { 0x010000, 0x01000B, "Lo" }, + { 0x01000D, 0x010026, "Lo" }, + { 0x010028, 0x01003A, "Lo" }, + { 0x01003C, 0x01003D, "Lo" }, + { 0x01003F, 0x01004D, "Lo" }, + { 0x010050, 0x01005D, "Lo" }, + { 0x010080, 0x0100FA, "Lo" }, + { 0x010100, 0x010102, "Po" }, + { 0x010107, 0x010133, "No" }, + { 0x010137, 0x01013F, "So" }, + { 0x010140, 0x010174, "Nl" }, + { 0x010175, 0x010178, "No" }, + { 0x010179, 0x010189, "So" }, + { 0x01018A, 0x01018B, "No" }, + { 0x01018C, 0x01018E, "So" }, + { 0x010190, 0x01019B, "So" }, + { 0x0101D0, 0x0101FC, "So" }, + { 0x010280, 0x01029C, "Lo" }, + { 0x0102A0, 0x0102D0, "Lo" }, + { 0x0102E1, 0x0102FB, "No" }, + { 0x010300, 0x01031F, "Lo" }, + { 0x010320, 0x010323, "No" }, + { 0x01032D, 0x010340, "Lo" }, + { 0x010342, 0x010349, "Lo" }, + { 0x010350, 0x010375, "Lo" }, + { 0x010376, 0x01037A, "Mn" }, + { 0x010380, 0x01039D, "Lo" }, + { 0x0103A0, 0x0103C3, "Lo" }, + { 0x0103C8, 0x0103CF, "Lo" }, + { 0x0103D1, 0x0103D5, "Nl" }, + { 0x010400, 0x010427, "Lu" }, + { 0x010428, 0x01044F, "Ll" }, + { 0x010450, 0x01049D, "Lo" }, + { 0x0104A0, 0x0104A9, "Nd" }, + { 0x0104B0, 0x0104D3, "Lu" }, + { 0x0104D8, 0x0104FB, "Ll" }, + { 0x010500, 0x010527, "Lo" }, + { 0x010530, 0x010563, "Lo" }, + { 0x010600, 0x010736, "Lo" }, + { 0x010740, 0x010755, "Lo" }, + { 0x010760, 0x010767, "Lo" }, + { 0x010800, 0x010805, "Lo" }, + { 0x01080A, 0x010835, "Lo" }, + { 0x010837, 0x010838, "Lo" }, + { 0x01083F, 0x010855, "Lo" }, + { 0x010858, 0x01085F, "No" }, + { 0x010860, 0x010876, "Lo" }, + { 0x010877, 0x010878, "So" }, + { 0x010879, 0x01087F, "No" }, + { 0x010880, 0x01089E, "Lo" }, + { 0x0108A7, 0x0108AF, "No" }, + { 0x0108E0, 0x0108F2, "Lo" }, + { 0x0108F4, 0x0108F5, "Lo" }, + { 0x0108FB, 0x0108FF, "No" }, + { 0x010900, 0x010915, "Lo" }, + { 0x010916, 0x01091B, "No" }, + { 0x010920, 0x010939, "Lo" }, + { 0x010980, 0x0109B7, "Lo" }, + { 0x0109BC, 0x0109BD, "No" }, + { 0x0109BE, 0x0109BF, "Lo" }, + { 0x0109C0, 0x0109CF, "No" }, + { 0x0109D2, 0x0109FF, "No" }, + { 0x010A01, 0x010A03, "Mn" }, + { 0x010A05, 0x010A06, "Mn" }, + { 0x010A0C, 0x010A0F, "Mn" }, + { 0x010A10, 0x010A13, "Lo" }, + { 0x010A15, 0x010A17, "Lo" }, + { 0x010A19, 0x010A35, "Lo" }, + { 0x010A38, 0x010A3A, "Mn" }, + { 0x010A40, 0x010A48, "No" }, + { 0x010A50, 0x010A58, "Po" }, + { 0x010A60, 0x010A7C, "Lo" }, + { 0x010A7D, 0x010A7E, "No" }, + { 0x010A80, 0x010A9C, "Lo" }, + { 0x010A9D, 0x010A9F, "No" }, + { 0x010AC0, 0x010AC7, "Lo" }, + { 0x010AC9, 0x010AE4, "Lo" }, + { 0x010AE5, 0x010AE6, "Mn" }, + { 0x010AEB, 0x010AEF, "No" }, + { 0x010AF0, 0x010AF6, "Po" }, + { 0x010B00, 0x010B35, "Lo" }, + { 0x010B39, 0x010B3F, "Po" }, + { 0x010B40, 0x010B55, "Lo" }, + { 0x010B58, 0x010B5F, "No" }, + { 0x010B60, 0x010B72, "Lo" }, + { 0x010B78, 0x010B7F, "No" }, + { 0x010B80, 0x010B91, "Lo" }, + { 0x010B99, 0x010B9C, "Po" }, + { 0x010BA9, 0x010BAF, "No" }, + { 0x010C00, 0x010C48, "Lo" }, + { 0x010C80, 0x010CB2, "Lu" }, + { 0x010CC0, 0x010CF2, "Ll" }, + { 0x010CFA, 0x010CFF, "No" }, + { 0x010D00, 0x010D23, "Lo" }, + { 0x010D24, 0x010D27, "Mn" }, + { 0x010D30, 0x010D39, "Nd" }, + { 0x010E60, 0x010E7E, "No" }, + { 0x010F00, 0x010F1C, "Lo" }, + { 0x010F1D, 0x010F26, "No" }, + { 0x010F30, 0x010F45, "Lo" }, + { 0x010F46, 0x010F50, "Mn" }, + { 0x010F51, 0x010F54, "No" }, + { 0x010F55, 0x010F59, "Po" }, + { 0x011003, 0x011037, "Lo" }, + { 0x011038, 0x011046, "Mn" }, + { 0x011047, 0x01104D, "Po" }, + { 0x011052, 0x011065, "No" }, + { 0x011066, 0x01106F, "Nd" }, + { 0x01107F, 0x011081, "Mn" }, + { 0x011083, 0x0110AF, "Lo" }, + { 0x0110B0, 0x0110B2, "Mc" }, + { 0x0110B3, 0x0110B6, "Mn" }, + { 0x0110B7, 0x0110B8, "Mc" }, + { 0x0110B9, 0x0110BA, "Mn" }, + { 0x0110BB, 0x0110BC, "Po" }, + { 0x0110BE, 0x0110C1, "Po" }, + { 0x0110D0, 0x0110E8, "Lo" }, + { 0x0110F0, 0x0110F9, "Nd" }, + { 0x011100, 0x011102, "Mn" }, + { 0x011103, 0x011126, "Lo" }, + { 0x011127, 0x01112B, "Mn" }, + { 0x01112D, 0x011134, "Mn" }, + { 0x011136, 0x01113F, "Nd" }, + { 0x011140, 0x011143, "Po" }, + { 0x011145, 0x011146, "Mc" }, + { 0x011150, 0x011172, "Lo" }, + { 0x011174, 0x011175, "Po" }, + { 0x011180, 0x011181, "Mn" }, + { 0x011183, 0x0111B2, "Lo" }, + { 0x0111B3, 0x0111B5, "Mc" }, + { 0x0111B6, 0x0111BE, "Mn" }, + { 0x0111BF, 0x0111C0, "Mc" }, + { 0x0111C1, 0x0111C4, "Lo" }, + { 0x0111C5, 0x0111C8, "Po" }, + { 0x0111C9, 0x0111CC, "Mn" }, + { 0x0111D0, 0x0111D9, "Nd" }, + { 0x0111DD, 0x0111DF, "Po" }, + { 0x0111E1, 0x0111F4, "No" }, + { 0x011200, 0x011211, "Lo" }, + { 0x011213, 0x01122B, "Lo" }, + { 0x01122C, 0x01122E, "Mc" }, + { 0x01122F, 0x011231, "Mn" }, + { 0x011232, 0x011233, "Mc" }, + { 0x011236, 0x011237, "Mn" }, + { 0x011238, 0x01123D, "Po" }, + { 0x011280, 0x011286, "Lo" }, + { 0x01128A, 0x01128D, "Lo" }, + { 0x01128F, 0x01129D, "Lo" }, + { 0x01129F, 0x0112A8, "Lo" }, + { 0x0112B0, 0x0112DE, "Lo" }, + { 0x0112E0, 0x0112E2, "Mc" }, + { 0x0112E3, 0x0112EA, "Mn" }, + { 0x0112F0, 0x0112F9, "Nd" }, + { 0x011300, 0x011301, "Mn" }, + { 0x011302, 0x011303, "Mc" }, + { 0x011305, 0x01130C, "Lo" }, + { 0x01130F, 0x011310, "Lo" }, + { 0x011313, 0x011328, "Lo" }, + { 0x01132A, 0x011330, "Lo" }, + { 0x011332, 0x011333, "Lo" }, + { 0x011335, 0x011339, "Lo" }, + { 0x01133B, 0x01133C, "Mn" }, + { 0x01133E, 0x01133F, "Mc" }, + { 0x011341, 0x011344, "Mc" }, + { 0x011347, 0x011348, "Mc" }, + { 0x01134B, 0x01134D, "Mc" }, + { 0x01135D, 0x011361, "Lo" }, + { 0x011362, 0x011363, "Mc" }, + { 0x011366, 0x01136C, "Mn" }, + { 0x011370, 0x011374, "Mn" }, + { 0x011400, 0x011434, "Lo" }, + { 0x011435, 0x011437, "Mc" }, + { 0x011438, 0x01143F, "Mn" }, + { 0x011440, 0x011441, "Mc" }, + { 0x011442, 0x011444, "Mn" }, + { 0x011447, 0x01144A, "Lo" }, + { 0x01144B, 0x01144F, "Po" }, + { 0x011450, 0x011459, "Nd" }, + { 0x011480, 0x0114AF, "Lo" }, + { 0x0114B0, 0x0114B2, "Mc" }, + { 0x0114B3, 0x0114B8, "Mn" }, + { 0x0114BB, 0x0114BE, "Mc" }, + { 0x0114BF, 0x0114C0, "Mn" }, + { 0x0114C2, 0x0114C3, "Mn" }, + { 0x0114C4, 0x0114C5, "Lo" }, + { 0x0114D0, 0x0114D9, "Nd" }, + { 0x011580, 0x0115AE, "Lo" }, + { 0x0115AF, 0x0115B1, "Mc" }, + { 0x0115B2, 0x0115B5, "Mn" }, + { 0x0115B8, 0x0115BB, "Mc" }, + { 0x0115BC, 0x0115BD, "Mn" }, + { 0x0115BF, 0x0115C0, "Mn" }, + { 0x0115C1, 0x0115D7, "Po" }, + { 0x0115D8, 0x0115DB, "Lo" }, + { 0x0115DC, 0x0115DD, "Mn" }, + { 0x011600, 0x01162F, "Lo" }, + { 0x011630, 0x011632, "Mc" }, + { 0x011633, 0x01163A, "Mn" }, + { 0x01163B, 0x01163C, "Mc" }, + { 0x01163F, 0x011640, "Mn" }, + { 0x011641, 0x011643, "Po" }, + { 0x011650, 0x011659, "Nd" }, + { 0x011660, 0x01166C, "Po" }, + { 0x011680, 0x0116AA, "Lo" }, + { 0x0116AE, 0x0116AF, "Mc" }, + { 0x0116B0, 0x0116B5, "Mn" }, + { 0x0116C0, 0x0116C9, "Nd" }, + { 0x011700, 0x01171A, "Lo" }, + { 0x01171D, 0x01171F, "Mn" }, + { 0x011720, 0x011721, "Mc" }, + { 0x011722, 0x011725, "Mn" }, + { 0x011727, 0x01172B, "Mn" }, + { 0x011730, 0x011739, "Nd" }, + { 0x01173A, 0x01173B, "No" }, + { 0x01173C, 0x01173E, "Po" }, + { 0x011800, 0x01182B, "Lo" }, + { 0x01182C, 0x01182E, "Mc" }, + { 0x01182F, 0x011837, "Mn" }, + { 0x011839, 0x01183A, "Mn" }, + { 0x0118A0, 0x0118BF, "Lu" }, + { 0x0118C0, 0x0118DF, "Ll" }, + { 0x0118E0, 0x0118E9, "Nd" }, + { 0x0118EA, 0x0118F2, "No" }, + { 0x011A01, 0x011A0A, "Mn" }, + { 0x011A0B, 0x011A32, "Lo" }, + { 0x011A33, 0x011A38, "Mn" }, + { 0x011A3B, 0x011A3E, "Mn" }, + { 0x011A3F, 0x011A46, "Po" }, + { 0x011A51, 0x011A56, "Mn" }, + { 0x011A57, 0x011A58, "Mc" }, + { 0x011A59, 0x011A5B, "Mn" }, + { 0x011A5C, 0x011A83, "Lo" }, + { 0x011A86, 0x011A89, "Lo" }, + { 0x011A8A, 0x011A96, "Mn" }, + { 0x011A98, 0x011A99, "Mn" }, + { 0x011A9A, 0x011A9C, "Po" }, + { 0x011A9E, 0x011AA2, "Po" }, + { 0x011AC0, 0x011AF8, "Lo" }, + { 0x011C00, 0x011C08, "Lo" }, + { 0x011C0A, 0x011C2E, "Lo" }, + { 0x011C30, 0x011C36, "Mn" }, + { 0x011C38, 0x011C3D, "Mn" }, + { 0x011C41, 0x011C45, "Po" }, + { 0x011C50, 0x011C59, "Nd" }, + { 0x011C5A, 0x011C6C, "No" }, + { 0x011C70, 0x011C71, "Po" }, + { 0x011C72, 0x011C8F, "Lo" }, + { 0x011C92, 0x011CA7, "Mn" }, + { 0x011CAA, 0x011CB0, "Mn" }, + { 0x011CB2, 0x011CB3, "Mn" }, + { 0x011CB5, 0x011CB6, "Mn" }, + { 0x011D00, 0x011D06, "Lo" }, + { 0x011D08, 0x011D09, "Lo" }, + { 0x011D0B, 0x011D30, "Lo" }, + { 0x011D31, 0x011D36, "Mn" }, + { 0x011D3C, 0x011D3D, "Mn" }, + { 0x011D3F, 0x011D45, "Mn" }, + { 0x011D50, 0x011D59, "Nd" }, + { 0x011D60, 0x011D65, "Lo" }, + { 0x011D67, 0x011D68, "Lo" }, + { 0x011D6A, 0x011D89, "Lo" }, + { 0x011D8A, 0x011D8E, "Mc" }, + { 0x011D90, 0x011D91, "Mn" }, + { 0x011D93, 0x011D94, "Mc" }, + { 0x011DA0, 0x011DA9, "Nd" }, + { 0x011EE0, 0x011EF2, "Lo" }, + { 0x011EF3, 0x011EF4, "Mn" }, + { 0x011EF5, 0x011EF6, "Mc" }, + { 0x011EF7, 0x011EF8, "Po" }, + { 0x012000, 0x012399, "Lo" }, + { 0x012400, 0x01246E, "Nl" }, + { 0x012470, 0x012474, "Po" }, + { 0x012480, 0x012543, "Lo" }, + { 0x013000, 0x01342E, "Lo" }, + { 0x014400, 0x014646, "Lo" }, + { 0x016800, 0x016A38, "Lo" }, + { 0x016A40, 0x016A5E, "Lo" }, + { 0x016A60, 0x016A69, "Nd" }, + { 0x016A6E, 0x016A6F, "Po" }, + { 0x016AD0, 0x016AED, "Lo" }, + { 0x016AF0, 0x016AF4, "Mn" }, + { 0x016B00, 0x016B2F, "Lo" }, + { 0x016B30, 0x016B36, "Mn" }, + { 0x016B37, 0x016B3B, "Po" }, + { 0x016B3C, 0x016B3F, "So" }, + { 0x016B40, 0x016B43, "Lm" }, + { 0x016B50, 0x016B59, "Nd" }, + { 0x016B5B, 0x016B61, "No" }, + { 0x016B63, 0x016B77, "Lo" }, + { 0x016B7D, 0x016B8F, "Lo" }, + { 0x016E40, 0x016E5F, "Lu" }, + { 0x016E60, 0x016E7F, "Ll" }, + { 0x016E80, 0x016E96, "No" }, + { 0x016E97, 0x016E9A, "Po" }, + { 0x016F00, 0x016F44, "Lo" }, + { 0x016F51, 0x016F7E, "Mc" }, + { 0x016F8F, 0x016F92, "Mn" }, + { 0x016F93, 0x016F9F, "Lm" }, + { 0x016FE0, 0x016FE1, "Lm" }, + { 0x017000, 0x0187F1, "Lo" }, + { 0x018800, 0x018AF2, "Lo" }, + { 0x01B000, 0x01B11E, "Lo" }, + { 0x01B170, 0x01B2FB, "Lo" }, + { 0x01BC00, 0x01BC6A, "Lo" }, + { 0x01BC70, 0x01BC7C, "Lo" }, + { 0x01BC80, 0x01BC88, "Lo" }, + { 0x01BC90, 0x01BC99, "Lo" }, + { 0x01BC9D, 0x01BC9E, "Mn" }, + { 0x01BCA0, 0x01BCA3, "Cf" }, + { 0x01D000, 0x01D0F5, "So" }, + { 0x01D100, 0x01D126, "So" }, + { 0x01D129, 0x01D164, "So" }, + { 0x01D165, 0x01D166, "Mc" }, + { 0x01D167, 0x01D169, "Mn" }, + { 0x01D16A, 0x01D16C, "So" }, + { 0x01D16D, 0x01D172, "Mc" }, + { 0x01D173, 0x01D17A, "Cf" }, + { 0x01D17B, 0x01D182, "Mn" }, + { 0x01D183, 0x01D184, "So" }, + { 0x01D185, 0x01D18B, "Mn" }, + { 0x01D18C, 0x01D1A9, "So" }, + { 0x01D1AA, 0x01D1AD, "Mn" }, + { 0x01D1AE, 0x01D1E8, "So" }, + { 0x01D200, 0x01D241, "So" }, + { 0x01D242, 0x01D244, "Mn" }, + { 0x01D2E0, 0x01D2F3, "No" }, + { 0x01D300, 0x01D356, "So" }, + { 0x01D360, 0x01D378, "No" }, + { 0x01D400, 0x01D419, "Lu" }, + { 0x01D41A, 0x01D433, "Ll" }, + { 0x01D434, 0x01D44D, "Lu" }, + { 0x01D44E, 0x01D454, "Ll" }, + { 0x01D456, 0x01D467, "Ll" }, + { 0x01D468, 0x01D481, "Lu" }, + { 0x01D482, 0x01D49B, "Ll" }, + { 0x01D49E, 0x01D49F, "Lu" }, + { 0x01D4A5, 0x01D4A6, "Lu" }, + { 0x01D4A9, 0x01D4AC, "Lu" }, + { 0x01D4AE, 0x01D4B5, "Lu" }, + { 0x01D4B6, 0x01D4B9, "Ll" }, + { 0x01D4BD, 0x01D4C3, "Ll" }, + { 0x01D4C5, 0x01D4CF, "Ll" }, + { 0x01D4D0, 0x01D4E9, "Lu" }, + { 0x01D4EA, 0x01D503, "Ll" }, + { 0x01D504, 0x01D505, "Lu" }, + { 0x01D507, 0x01D50A, "Lu" }, + { 0x01D50D, 0x01D514, "Lu" }, + { 0x01D516, 0x01D51C, "Lu" }, + { 0x01D51E, 0x01D537, "Ll" }, + { 0x01D538, 0x01D539, "Lu" }, + { 0x01D53B, 0x01D53E, "Lu" }, + { 0x01D540, 0x01D544, "Lu" }, + { 0x01D54A, 0x01D550, "Lu" }, + { 0x01D552, 0x01D56B, "Ll" }, + { 0x01D56C, 0x01D585, "Lu" }, + { 0x01D586, 0x01D59F, "Ll" }, + { 0x01D5A0, 0x01D5B9, "Lu" }, + { 0x01D5BA, 0x01D5D3, "Ll" }, + { 0x01D5D4, 0x01D5ED, "Lu" }, + { 0x01D5EE, 0x01D607, "Ll" }, + { 0x01D608, 0x01D621, "Lu" }, + { 0x01D622, 0x01D63B, "Ll" }, + { 0x01D63C, 0x01D655, "Lu" }, + { 0x01D656, 0x01D66F, "Ll" }, + { 0x01D670, 0x01D689, "Lu" }, + { 0x01D68A, 0x01D6A5, "Ll" }, + { 0x01D6A8, 0x01D6C0, "Lu" }, + { 0x01D6C2, 0x01D6DA, "Ll" }, + { 0x01D6DC, 0x01D6E1, "Ll" }, + { 0x01D6E2, 0x01D6FA, "Lu" }, + { 0x01D6FC, 0x01D714, "Ll" }, + { 0x01D716, 0x01D71B, "Ll" }, + { 0x01D71C, 0x01D734, "Lu" }, + { 0x01D736, 0x01D74E, "Ll" }, + { 0x01D750, 0x01D755, "Ll" }, + { 0x01D756, 0x01D76E, "Lu" }, + { 0x01D770, 0x01D788, "Ll" }, + { 0x01D78A, 0x01D78F, "Ll" }, + { 0x01D790, 0x01D7A8, "Lu" }, + { 0x01D7AA, 0x01D7C2, "Ll" }, + { 0x01D7C4, 0x01D7C9, "Ll" }, + { 0x01D7CE, 0x01D7FF, "Nd" }, + { 0x01D800, 0x01D9FF, "So" }, + { 0x01DA00, 0x01DA36, "Mn" }, + { 0x01DA37, 0x01DA3A, "So" }, + { 0x01DA3B, 0x01DA6C, "Mn" }, + { 0x01DA6D, 0x01DA74, "So" }, + { 0x01DA76, 0x01DA83, "So" }, + { 0x01DA85, 0x01DA86, "So" }, + { 0x01DA87, 0x01DA8B, "Po" }, + { 0x01DA9B, 0x01DA9F, "Mn" }, + { 0x01DAA1, 0x01DAAF, "Mn" }, + { 0x01E000, 0x01E006, "Mn" }, + { 0x01E008, 0x01E018, "Mn" }, + { 0x01E01B, 0x01E021, "Mn" }, + { 0x01E023, 0x01E024, "Mn" }, + { 0x01E026, 0x01E02A, "Mn" }, + { 0x01E800, 0x01E8C4, "Lo" }, + { 0x01E8C7, 0x01E8CF, "No" }, + { 0x01E8D0, 0x01E8D6, "Mn" }, + { 0x01E900, 0x01E921, "Lu" }, + { 0x01E922, 0x01E943, "Ll" }, + { 0x01E944, 0x01E94A, "Mn" }, + { 0x01E950, 0x01E959, "Nd" }, + { 0x01E95E, 0x01E95F, "Po" }, + { 0x01EC71, 0x01ECAB, "No" }, + { 0x01ECAD, 0x01ECAF, "No" }, + { 0x01ECB1, 0x01ECB4, "No" }, + { 0x01EE00, 0x01EE03, "Lo" }, + { 0x01EE05, 0x01EE1F, "Lo" }, + { 0x01EE21, 0x01EE22, "Lo" }, + { 0x01EE29, 0x01EE32, "Lo" }, + { 0x01EE34, 0x01EE37, "Lo" }, + { 0x01EE4D, 0x01EE4F, "Lo" }, + { 0x01EE51, 0x01EE52, "Lo" }, + { 0x01EE61, 0x01EE62, "Lo" }, + { 0x01EE67, 0x01EE6A, "Lo" }, + { 0x01EE6C, 0x01EE72, "Lo" }, + { 0x01EE74, 0x01EE77, "Lo" }, + { 0x01EE79, 0x01EE7C, "Lo" }, + { 0x01EE80, 0x01EE89, "Lo" }, + { 0x01EE8B, 0x01EE9B, "Lo" }, + { 0x01EEA1, 0x01EEA3, "Lo" }, + { 0x01EEA5, 0x01EEA9, "Lo" }, + { 0x01EEAB, 0x01EEBB, "Lo" }, + { 0x01EEF0, 0x01EEF1, "Sm" }, + { 0x01F000, 0x01F02B, "So" }, + { 0x01F030, 0x01F093, "So" }, + { 0x01F0A0, 0x01F0AE, "So" }, + { 0x01F0B1, 0x01F0BF, "So" }, + { 0x01F0C1, 0x01F0CF, "So" }, + { 0x01F0D1, 0x01F0F5, "So" }, + { 0x01F100, 0x01F10C, "No" }, + { 0x01F110, 0x01F16B, "So" }, + { 0x01F170, 0x01F1AC, "So" }, + { 0x01F1E6, 0x01F202, "So" }, + { 0x01F210, 0x01F23B, "So" }, + { 0x01F240, 0x01F248, "So" }, + { 0x01F250, 0x01F251, "So" }, + { 0x01F260, 0x01F265, "So" }, + { 0x01F300, 0x01F3FA, "So" }, + { 0x01F3FB, 0x01F3FF, "Sk" }, + { 0x01F400, 0x01F6D4, "So" }, + { 0x01F6E0, 0x01F6EC, "So" }, + { 0x01F6F0, 0x01F6F9, "So" }, + { 0x01F700, 0x01F773, "So" }, + { 0x01F780, 0x01F7D8, "So" }, + { 0x01F800, 0x01F80B, "So" }, + { 0x01F810, 0x01F847, "So" }, + { 0x01F850, 0x01F859, "So" }, + { 0x01F860, 0x01F887, "So" }, + { 0x01F890, 0x01F8AD, "So" }, + { 0x01F900, 0x01F90B, "So" }, + { 0x01F910, 0x01F93E, "So" }, + { 0x01F940, 0x01F970, "So" }, + { 0x01F973, 0x01F976, "So" }, + { 0x01F97C, 0x01F9A2, "So" }, + { 0x01F9B0, 0x01F9B9, "So" }, + { 0x01F9C0, 0x01F9C2, "So" }, + { 0x01F9D0, 0x01F9FF, "So" }, + { 0x01FA60, 0x01FA6D, "So" }, + { 0x020000, 0x02A6D6, "Lo" }, + { 0x02A700, 0x02B734, "Lo" }, + { 0x02B740, 0x02B81D, "Lo" }, + { 0x02B820, 0x02CEA1, "Lo" }, + { 0x02CEB0, 0x02EBE0, "Lo" }, + { 0x02F800, 0x02FA1D, "Lo" }, + { 0x0E0020, 0x0E007F, "Cf" }, + { 0x0E0100, 0x0E01EF, "Mn" }, + { 0x0F0000, 0x0FFFFD, "Co" }, + { 0x100000, 0x10FFFD, "Co" }, + }, +} -- cgit v1.2.3