{"version":3,"file":"jsmigemo.min.cjs","names":[],"sources":["../src/BitList.ts","../src/utils.ts","../src/BitVector.ts","../src/CharacterConverter.ts","../src/LOUDSTrie.ts","../src/CompactHiraganaString.ts","../src/CompactDictionary.ts","../src/LOUDSTrieBuilder.ts","../src/CompactDictionaryBuilder.ts","../src/DoubleArray.ts","../src/TernaryRegexGenerator.ts","../src/RomajiProcessor.ts","../src/RomajiProcessor2.ts","../src/Migemo.ts","../src/RomajiProcessor1.ts"],"sourcesContent":["export class BitList {\r\n    words: Uint32Array;\r\n    size: number;\r\n    constructor(size?: number) {\r\n        if (size == undefined) {\r\n            this.words = new Uint32Array(8);\r\n            this.size = 0;\r\n        } else {\r\n            this.words = new Uint32Array((size + 31) >> 5);\r\n            this.size = size;\r\n        }\r\n    }\r\n    add(value: boolean) {\r\n        const pos = this.size;\r\n        if (this.words.length < (pos + 1 + 31) >> 5) {\r\n            const newWords = new Uint32Array(this.words.length * 2);\r\n            newWords.set(this.words, 0);\r\n            this.words = newWords;\r\n        }\r\n        this.size = pos + 1;\r\n        this.set(pos, value);\r\n    }\r\n\r\n    set(pos: number, value: boolean) {\r\n        if (0 > pos || pos >= this.size) {\r\n            throw new RangeError();\r\n        }\r\n        if (value) {\r\n            this.words[pos >> 5] |= 1 << (pos & 31);\r\n        } else {\r\n            this.words[pos >> 5] &= ~(1 << (pos & 31));\r\n        }\r\n    }\r\n\r\n    get(pos: number): boolean {\r\n        if (0 > pos || pos >= this.size) {\r\n            throw new RangeError();\r\n        }\r\n        return ((this.words[pos >> 5] >> (pos & 31)) & 1) == 1;\r\n    }\r\n}\r\n","/**\r\n * 配列ライクな構造に対して二分探索を実行します。\r\n * @param a 検索対象の配列ライクな構造\r\n * @param fromIndex 開始インデックス（含む）\r\n * @param toIndex 終了インデックス（含まない）\r\n * @param key 検索する値\r\n * @returns キーが見つかった場合はそのインデックス、見つからなかった場合は-(挿入位置 + 1)\r\n */\r\nexport function binarySearch<T>(a: ArrayLike<T>, fromIndex: number, toIndex: number, key: T): number {\r\n    let low = fromIndex;\r\n    let high = toIndex - 1;\r\n    while (low <= high) {\r\n        const mid = (low + high) >>> 1;\r\n        const midVal = a[mid];\r\n        if (midVal < key)\r\n            low = mid + 1;\r\n        else if (midVal > key)\r\n            high = mid - 1;\r\n        else\r\n            return mid;\r\n    }\r\n    return -(low + 1);\r\n}\r\n\r\n/**\r\n * 32ビット整数内のセットされたビット数を数えます。\r\n * 効率的なカウントのためにビット操作技術を使用します。\r\n * @param i ビットを数える対象の整数\r\n * @returns セットされたビット数（0-32）\r\n */\r\nexport function bitCount(i: number): number {\r\n    i = i - ((i >>> 1) & 0x55555555);\r\n    i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);\r\n    i = (i + (i >>> 4)) & 0x0f0f0f0f;\r\n    i = i + (i >>> 8);\r\n    i = i + (i >>> 16);\r\n    return i & 0x3f;\r\n}\r\n\r\n/**\r\n * 32ビット整数内の末尾の0ビット数を返します。\r\n * 入力が0の場合は64を返します。\r\n * @param i 分析する整数\r\n * @returns 末尾の0の数\r\n */\r\nexport function numberOfTrailingZeros(i: number): number {\r\n    let x, y: number;\r\n    if (i == 0) return 64;\r\n    let n = 63;\r\n    y = i; if (y != 0) { n = n -32; x = y; } else x = (i>>>32);\r\n    y = x <<16; if (y != 0) { n = n -16; x = y; }\r\n    y = x << 8; if (y != 0) { n = n - 8; x = y; }\r\n    y = x << 4; if (y != 0) { n = n - 4; x = y; }\r\n    y = x << 2; if (y != 0) { n = n - 2; x = y; }\r\n    return n - ((x << 1) >>> 31);\r\n}","import { bitCount, numberOfTrailingZeros } from \"./utils\";\r\nexport class BitVector {\r\n    words: Uint32Array;\r\n    sizeInBits: number;\r\n    lb: Uint32Array;\r\n    sb: Uint16Array;\r\n    constructor(words: Uint32Array, sizeInBits: number) {\r\n        const expectedWordsLength = ((sizeInBits + 63) >> 6) * 2;\r\n        if (expectedWordsLength != words.length) {\r\n            throw new Error(`expected: ${expectedWordsLength} actual: ${words.length}`);\r\n        }\r\n        this.words = words;\r\n        this.sizeInBits = sizeInBits;\r\n        this.lb = new Uint32Array((sizeInBits + 511) >>> 9);\r\n        this.sb = new Uint16Array(this.lb.length * 8);\r\n        let sum = 0;\r\n        let sumInLb = 0;\r\n        for (let i = 0; i < this.sb.length; i++) {\r\n            const bc = i < (this.words.length >>> 1) ? bitCount(this.words[i * 2]) + bitCount(this.words[i * 2 + 1]) : 0;\r\n            this.sb[i] = sumInLb;\r\n            sumInLb += bc;\r\n            if ((i & 7) == 7) {\r\n                this.lb[i >>> 3] = sum;\r\n                sum += sumInLb;\r\n                sumInLb = 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    rank(pos: number, b: boolean): number {\r\n        if (pos < 0 || this.sizeInBits + 1 < pos) {\r\n            throw new RangeError();\r\n        }\r\n        let count1 = this.sb[pos >>> 6] + this.lb[pos >>> 9];\r\n        const posInDWord = pos & 63;\r\n        if (posInDWord >= 32) {\r\n            count1 += bitCount(this.words[(pos >>> 5) & 0xFFFFFFFE]);\r\n        }\r\n        const posInWord = pos & 31;\r\n        const mask = 0x7FFFFFFF >>> (31 - posInWord);\r\n        count1 += bitCount(this.words[pos >>> 5] & mask);\r\n        return b ? count1 : (pos - count1);\r\n    }\r\n\r\n    select(count: number, b: boolean): number {\r\n        const lbIndex = this.lowerBoundBinarySearchLB(count, b) - 1;\r\n        if (lbIndex == -1) {\r\n            return 0\r\n        }\r\n        const countInLb = count - (b ? this.lb[lbIndex] : (512 * lbIndex - this.lb[lbIndex]));\r\n        const sbIndex = this.lowerBoundBinarySearchSB(countInLb, lbIndex * 8, lbIndex * 8 + 8, b) - 1;\r\n        let countInSb = countInLb - (b ? this.sb[sbIndex] : (64 * (sbIndex % 8) - this.sb[sbIndex]));\r\n        let wordL = this.words[sbIndex * 2];\r\n        let wordU = this.words[sbIndex * 2 + 1];\r\n        if (!b) {\r\n            wordL = ~wordL;\r\n            wordU = ~wordU;\r\n        }\r\n        const lowerBitCount = bitCount(wordL);\r\n        let i = 0;\r\n        if (countInSb > lowerBitCount) {\r\n            wordL = wordU;\r\n            countInSb -= lowerBitCount;\r\n            i = 32;\r\n        }\r\n        while (countInSb > 0) {\r\n            countInSb -= wordL & 1;\r\n            wordL >>>= 1;\r\n            i++;\r\n        }\r\n        return sbIndex * 64 + (i - 1);\r\n    }\r\n\r\n    private lowerBoundBinarySearchLB(key: number, b: boolean): number {\r\n        let high = this.lb.length;\r\n        let low = -1;\r\n        if (b) {\r\n            while (high - low > 1) {\r\n                let mid = (high + low) >>> 1;\r\n                if (this.lb[mid] < key) {\r\n                    low = mid;\r\n                } else {\r\n                    high = mid;\r\n                }\r\n            }\r\n        } else {\r\n            while (high - low > 1) {\r\n                let mid = (high + low) >>> 1;\r\n                if (512 * mid - this.lb[mid] < key) {\r\n                    low = mid;\r\n                } else {\r\n                    high = mid;\r\n                }\r\n            }\r\n        }\r\n        return high;\r\n    }\r\n\r\n    private lowerBoundBinarySearchSB(key: number, fromIndex: number, toIndex: number, b: boolean): number {\r\n        let high = toIndex;\r\n        let low = fromIndex - 1;\r\n        if (b) {\r\n            while (high - low > 1) {\r\n                const mid = (high + low) >>> 1;\r\n                if (this.sb[mid] < key) {\r\n                    low = mid;\r\n                } else {\r\n                    high = mid;\r\n                }\r\n            }\r\n        } else {\r\n            while (high - low > 1) {\r\n                const mid = (high + low) >>> 1;\r\n                if (64 * (mid & 7) - this.sb[mid] < key) {\r\n                    low = mid;\r\n                } else {\r\n                    high = mid;\r\n                }\r\n            }\r\n        }\r\n        return high;\r\n    }\r\n\r\n    nextClearBit(fromIndex: number): number {\r\n        let u = fromIndex >> 5;\r\n        let word = ~this.words[u] & (0xffffffff << fromIndex);\r\n        while (true) {\r\n            if (word != 0)\r\n                return (u * 32) + numberOfTrailingZeros(word);\r\n            if (++u == this.words.length)\r\n                return -1;\r\n            word = ~this.words[u];\r\n        }\r\n    }\r\n\r\n    size(): number {\r\n        return this.sizeInBits;\r\n    }\r\n\r\n    get(pos: number): boolean {\r\n        if (pos < 0 || this.sizeInBits < pos) {\r\n            throw new RangeError();\r\n        }\r\n        return ((this.words[pos >>> 5] >>> (pos & 31)) & 1) == 1;\r\n    }\r\n\r\n    public toString() {\r\n        let s = \"\";\r\n        for (let i = 0; i < this.sizeInBits; i++) {\r\n            const bit = ((this.words[i >>> 5] >>> (i & 31)) & 1) == 1;\r\n            s += bit ? '1' : '0';\r\n            if ((i & 63) == 63) {\r\n                s += ' ';\r\n            }\r\n        }\r\n        return s;\r\n    }\r\n}\r\n","const han2zenEntries: [string, string][] = [\r\n    ['!', '！'],\r\n    ['\"', '”'],\r\n    ['#', '＃'],\r\n    ['$', '＄'],\r\n    ['%', '％'],\r\n    ['&', '＆'],\r\n    ['\\'', '’'],\r\n    ['(', '（'],\r\n    [')', '）'],\r\n    ['*', '＊'],\r\n    ['+', '＋'],\r\n    [',', '，'],\r\n    ['-', '－'],\r\n    ['.', '．'],\r\n    ['/', '／'],\r\n    ['0', '０'],\r\n    ['1', '１'],\r\n    ['2', '２'],\r\n    ['3', '３'],\r\n    ['4', '４'],\r\n    ['5', '５'],\r\n    ['6', '６'],\r\n    ['7', '７'],\r\n    ['8', '８'],\r\n    ['9', '９'],\r\n    [':', '：'],\r\n    [';', '；'],\r\n    ['<', '＜'],\r\n    ['=', '＝'],\r\n    ['>', '＞'],\r\n    ['?', '？'],\r\n    ['@', '＠'],\r\n    ['A', 'Ａ'],\r\n    ['B', 'Ｂ'],\r\n    ['C', 'Ｃ'],\r\n    ['D', 'Ｄ'],\r\n    ['E', 'Ｅ'],\r\n    ['F', 'Ｆ'],\r\n    ['G', 'Ｇ'],\r\n    ['H', 'Ｈ'],\r\n    ['I', 'Ｉ'],\r\n    ['J', 'Ｊ'],\r\n    ['K', 'Ｋ'],\r\n    ['L', 'Ｌ'],\r\n    ['M', 'Ｍ'],\r\n    ['N', 'Ｎ'],\r\n    ['O', 'Ｏ'],\r\n    ['P', 'Ｐ'],\r\n    ['Q', 'Ｑ'],\r\n    ['R', 'Ｒ'],\r\n    ['S', 'Ｓ'],\r\n    ['T', 'Ｔ'],\r\n    ['U', 'Ｕ'],\r\n    ['V', 'Ｖ'],\r\n    ['W', 'Ｗ'],\r\n    ['X', 'Ｘ'],\r\n    ['Y', 'Ｙ'],\r\n    ['Z', 'Ｚ'],\r\n    ['[', '［'],\r\n    ['\\\\', '￥'],\r\n    [']', '］'],\r\n    ['^', '＾'],\r\n    ['_', '＿'],\r\n    ['`', '‘'],\r\n    ['a', 'ａ'],\r\n    ['b', 'ｂ'],\r\n    ['c', 'ｃ'],\r\n    ['d', 'ｄ'],\r\n    ['e', 'ｅ'],\r\n    ['f', 'ｆ'],\r\n    ['g', 'ｇ'],\r\n    ['h', 'ｈ'],\r\n    ['i', 'ｉ'],\r\n    ['j', 'ｊ'],\r\n    ['k', 'ｋ'],\r\n    ['l', 'ｌ'],\r\n    ['m', 'ｍ'],\r\n    ['n', 'ｎ'],\r\n    ['o', 'ｏ'],\r\n    ['p', 'ｐ'],\r\n    ['q', 'ｑ'],\r\n    ['r', 'ｒ'],\r\n    ['s', 'ｓ'],\r\n    ['t', 'ｔ'],\r\n    ['u', 'ｕ'],\r\n    ['v', 'ｖ'],\r\n    ['w', 'ｗ'],\r\n    ['x', 'ｘ'],\r\n    ['y', 'ｙ'],\r\n    ['z', 'ｚ'],\r\n    ['{', '｛'],\r\n    ['|', '｜'],\r\n    ['}', '｝'],\r\n    ['~', '～'],\r\n    ['｡', '。'],\r\n    ['｢', '「'],\r\n    ['｣', '」'],\r\n    ['､', '、'],\r\n    ['･', '・'],\r\n    ['ｦ', 'ヲ'],\r\n    ['ｧ', 'ァ'],\r\n    ['ｨ', 'ィ'],\r\n    ['ｩ', 'ゥ'],\r\n    ['ｪ', 'ェ'],\r\n    ['ｫ', 'ォ'],\r\n    ['ｬ', 'ャ'],\r\n    ['ｭ', 'ュ'],\r\n    ['ｮ', 'ョ'],\r\n    ['ｯ', 'ッ'],\r\n    ['ｰ', 'ー'],\r\n    ['ｱ', 'ア'],\r\n    ['ｲ', 'イ'],\r\n    ['ｳ', 'ウ'],\r\n    ['ｴ', 'エ'],\r\n    ['ｵ', 'オ'],\r\n    ['ｶ', 'カ'],\r\n    ['ｷ', 'キ'],\r\n    ['ｸ', 'ク'],\r\n    ['ｹ', 'ケ'],\r\n    ['ｺ', 'コ'],\r\n    ['ｻ', 'サ'],\r\n    ['ｼ', 'シ'],\r\n    ['ｽ', 'ス'],\r\n    ['ｾ', 'セ'],\r\n    ['ｿ', 'ソ'],\r\n    ['ﾀ', 'タ'],\r\n    ['ﾁ', 'チ'],\r\n    ['ﾂ', 'ツ'],\r\n    ['ﾃ', 'テ'],\r\n    ['ﾄ', 'ト'],\r\n    ['ﾅ', 'ナ'],\r\n    ['ﾆ', 'ニ'],\r\n    ['ﾇ', 'ヌ'],\r\n    ['ﾈ', 'ネ'],\r\n    ['ﾉ', 'ノ'],\r\n    ['ﾊ', 'ハ'],\r\n    ['ﾋ', 'ヒ'],\r\n    ['ﾌ', 'フ'],\r\n    ['ﾍ', 'ヘ'],\r\n    ['ﾎ', 'ホ'],\r\n    ['ﾏ', 'マ'],\r\n    ['ﾐ', 'ミ'],\r\n    ['ﾑ', 'ム'],\r\n    ['ﾒ', 'メ'],\r\n    ['ﾓ', 'モ'],\r\n    ['ﾔ', 'ヤ'],\r\n    ['ﾕ', 'ユ'],\r\n    ['ﾖ', 'ヨ'],\r\n    ['ﾗ', 'ラ'],\r\n    ['ﾘ', 'リ'],\r\n    ['ﾙ', 'ル'],\r\n    ['ﾚ', 'レ'],\r\n    ['ﾛ', 'ロ'],\r\n    ['ﾜ', 'ワ'],\r\n    ['ﾝ', 'ン'],\r\n    ['ﾞ', '゛'],\r\n    ['ﾟ', '゜'],\r\n];\r\n\r\nconst han2zen = new Map<string, string>(han2zenEntries);\r\n\r\nconst zen2hanEntries: [string, string][] = [\r\n    ...han2zenEntries.map(([han, zen]): [string, string] => [zen, han]),\r\n    ['ヴ', \"ｳﾞ\"],\r\n    ['ガ', \"ｶﾞ\"],\r\n    ['ギ', \"ｷﾞ\"],\r\n    ['グ', \"ｸﾞ\"],\r\n    ['ゲ', \"ｹﾞ\"],\r\n    ['ゴ', \"ｺﾞ\"],\r\n    ['ザ', \"ｻﾞ\"],\r\n    ['ジ', \"ｼﾞ\"],\r\n    ['ズ', \"ｽﾞ\"],\r\n    ['ゼ', \"ｾﾞ\"],\r\n    ['ゾ', \"ｿﾞ\"],\r\n    ['ダ', \"ﾀﾞ\"],\r\n    ['ヂ', \"ﾁﾞ\"],\r\n    ['ヅ', \"ﾂﾞ\"],\r\n    ['デ', \"ﾃﾞ\"],\r\n    ['ド', \"ﾄﾞ\"],\r\n    ['バ', \"ﾊﾞ\"],\r\n    ['ビ', \"ﾋﾞ\"],\r\n    ['ブ', \"ﾌﾞ\"],\r\n    ['ベ', \"ﾍﾞ\"],\r\n    ['ボ', \"ﾎﾞ\"],\r\n    ['パ', \"ﾊﾟ\"],\r\n    ['ピ', \"ﾋﾟ\"],\r\n    ['プ', \"ﾌﾟ\"],\r\n    ['ペ', \"ﾍﾟ\"],\r\n    ['ポ', \"ﾎﾟ\"],\r\n];\r\n\r\nconst zen2han = new Map<string, string>(zen2hanEntries);\r\n\r\nexport function han2zen_conv(source: string): string {\r\n    let sb = \"\";\r\n    for (let c of source) {\r\n        let a = han2zen.get(c);\r\n        if (a==undefined) {\r\n            sb += c;\r\n        } else {\r\n            sb += a;\r\n        }\r\n    }\r\n    return sb;\r\n}\r\n\r\nexport function zen2han_conv(source: string): string {\r\n    let sb = \"\";\r\n    for (let c of source) {\r\n        let a = zen2han.get(c);\r\n        if (a==undefined) {\r\n            sb += c;\r\n        } else {\r\n            sb += a;\r\n        }\r\n    }\r\n    return sb;\r\n}\r\n\r\nexport function hira2kata_conv(source: string): string {\r\n    let sb = \"\";\r\n    for (let i = 0; i < source.length; i++) {\r\n        const c = source.charCodeAt(i);\r\n        if ('ぁ'.charCodeAt(0) <= c && c <= 'ん'.charCodeAt(0)) {\r\n            sb += String.fromCharCode((c - 'ぁ'.charCodeAt(0) + 'ァ'.charCodeAt(0)));\r\n        } else {\r\n            sb += String.fromCharCode(c);\r\n        }\r\n    }\r\n    return sb;\r\n}\r\n","import { binarySearch } from \"./utils\";\r\nimport { BitVector } from \"./BitVector\";\r\n\r\nexport class LOUDSTrie {\r\n    bitVector: BitVector;\r\n    edges: Uint16Array;\r\n\r\n    constructor(bitVector: BitVector, edges: Uint16Array) {\r\n        this.bitVector = bitVector;\r\n        this.edges = edges;\r\n    }\r\n\r\n    reverseLookup(index: number): string {\r\n        if (index <= 0 || this.edges.length <= index) {\r\n            throw new RangeError();\r\n        }\r\n        const sb = new Array<number>();\r\n        while (index > 1) {\r\n            sb.push(this.edges[index]);\r\n            index = this.parent(index);\r\n        }\r\n        return String.fromCharCode(...sb.reverse())\r\n    }\r\n\r\n    parent(x: number): number {\r\n        return this.bitVector.rank(this.bitVector.select(x, true), false);\r\n    }\r\n\r\n    firstChild(x: number): number {\r\n        const y = this.bitVector.select(x, false) + 1;\r\n        if (this.bitVector.get(y)) {\r\n            return this.bitVector.rank(y, true) + 1;\r\n        } else {\r\n            return -1;\r\n        }\r\n    }\r\n\r\n    traverse(index: number, c: number): number {\r\n        const firstChild = this.firstChild(index);\r\n        if (firstChild == -1) {\r\n            return -1;\r\n        }\r\n        const childStartBit = this.bitVector.select(firstChild, true);\r\n        const childEndBit = this.bitVector.nextClearBit(childStartBit);\r\n        const childSize = childEndBit - childStartBit;\r\n        const result = binarySearch(this.edges, firstChild, firstChild + childSize, c);\r\n        return result >= 0 ? result : -1;\r\n    }\r\n\r\n    lookup(key: string): number {\r\n        let nodeIndex = 1;\r\n        for (let i = 0; i < key.length; i++) {\r\n            const c = key.charCodeAt(i);\r\n            nodeIndex = this.traverse(nodeIndex, c);\r\n            if (nodeIndex == -1) {\r\n                break;\r\n            }\r\n        }\r\n        return (nodeIndex >= 0) ? nodeIndex : -1;\r\n    }\r\n\r\n    *predictiveSearch(index: number): IterableIterator<number> {\r\n        let lower = index;\r\n        let upper = index + 1;\r\n        while (upper - lower > 0) {\r\n            for (let i = lower; i < upper; i++) {\r\n                yield i;\r\n            }\r\n            lower = this.bitVector.rank(this.bitVector.select(lower, false) + 1, true) + 1;\r\n            upper = this.bitVector.rank(this.bitVector.select(upper, false) + 1, true) + 1;\r\n        }\r\n    }\r\n\r\n    size(): number {\r\n        return this.edges.length - 2;\r\n    }\r\n}","\r\nexport class CompactHiraganaString {\r\n    public static decodeBytes(bytes: Uint8Array): string {\r\n        let result = \"\";\r\n        for (let i = 0; i < bytes.length; i++) {\r\n            result += String.fromCharCode(CompactHiraganaString.decodeByte(bytes[i]));\r\n        }\r\n        return result;\r\n    }\r\n\r\n    public static decodeByte(c: number): number {\r\n        if (0x00 === c) {\r\n            return 0;\r\n        }\r\n        if (0x20 <= c && c <= 0x7e) {\r\n            return c;\r\n        }\r\n        if (0xa1 <= c && c <= 0xf6) {\r\n            return c + 0x3040 - 0xa0;\r\n        }\r\n        if (0xf7 === c) {\r\n            return 0x30fc;\r\n        }\r\n        throw new RangeError();\r\n    }\r\n\r\n    public static encodeString(str: string): Uint8Array {\r\n        const result = new Uint8Array(str.length);\r\n        for (let i = 0; i < str.length; i++) {\r\n            result[i] = CompactHiraganaString.encodeChar(str.charCodeAt(i));\r\n        }\r\n        return result;\r\n    }\r\n\r\n    public static encodeChar(b: number): number {\r\n        if (b === 0) {\r\n            return 0;\r\n        }\r\n        if (0x20 <= b && b <= 0x7e) {\r\n            return b;\r\n        }\r\n        if (0x3041 <= b && b <= 0x3096) {\r\n            return b - 0x3040 + 0xa0;\r\n        }\r\n        if (0x30fc === b) {\r\n            return 0xf7;\r\n        }\r\n        throw new RangeError('unknown character to encode: ' + b);\r\n    }\r\n}","import { LOUDSTrie } from \"./LOUDSTrie\";\r\nimport { BitVector } from \"./BitVector\";\r\nimport { BitList } from \"./BitList\";\r\nimport { CompactHiraganaString } from \"./CompactHiraganaString\";\r\n\r\nexport class CompactDictionary {\r\n    keyTrie: LOUDSTrie;\r\n    valueTrie: LOUDSTrie;\r\n    mappingBitVector: BitVector;\r\n    mapping: Int32Array;\r\n    hasMappingBitList: BitList;\r\n\r\n    constructor(buffer: ArrayBuffer) {\r\n        const dv = new DataView(buffer);\r\n        let offset = 0;\r\n        [this.keyTrie, offset] = CompactDictionary.readTrie(dv, offset, true);\r\n        [this.valueTrie, offset] = CompactDictionary.readTrie(dv, offset, false);\r\n        const mappingBitVectorSize = dv.getUint32(offset);\r\n        offset += 4;\r\n        const mappingBitVectorWords = new Uint32Array(((mappingBitVectorSize + 63) >> 6) * 2);\r\n        for (let i = 0; i < mappingBitVectorWords.length >> 1; i++) {\r\n            mappingBitVectorWords[i * 2 + 1] = dv.getUint32(offset);\r\n            offset += 4;\r\n            mappingBitVectorWords[i * 2] = dv.getUint32(offset);\r\n            offset += 4;\r\n        }\r\n        this.mappingBitVector = new BitVector(mappingBitVectorWords, mappingBitVectorSize);\r\n        const mappingSize = dv.getUint32(offset);\r\n        offset += 4;\r\n        this.mapping = new Int32Array(mappingSize);\r\n        for (let i = 0; i < mappingSize; i++) {\r\n            this.mapping[i] = dv.getInt32(offset);\r\n            offset += 4;\r\n        }\r\n        if (offset != buffer.byteLength) {\r\n            throw new Error();\r\n        }\r\n        this.hasMappingBitList = CompactDictionary.createHasMappingBitList(this.mappingBitVector);\r\n    }\r\n\r\n    private static readTrie(dv: DataView, offset: number, compactHiragana: boolean): [LOUDSTrie, number] {\r\n        const keyTrieEdgeSize = dv.getInt32(offset);\r\n        offset += 4;\r\n        const keyTrieEdges = new Uint16Array(keyTrieEdgeSize);\r\n        for (let i = 0; i < keyTrieEdgeSize; i++) {\r\n            let c: number;\r\n            if (compactHiragana) {\r\n                c = this.decode(dv.getUint8(offset));\r\n                offset += 1;\r\n            } else {\r\n                c = dv.getUint16(offset);\r\n                offset += 2;\r\n            }\r\n            keyTrieEdges[i] = c;\r\n        }\r\n        const keyTrieBitVectorSize = dv.getUint32(offset);\r\n        offset += 4;\r\n        const keyTrieBitVectorWords = new Uint32Array(((keyTrieBitVectorSize + 63) >> 6) * 2);\r\n        for (let i = 0; i < keyTrieBitVectorWords.length >>> 1; i++) {\r\n            keyTrieBitVectorWords[i * 2 + 1] = dv.getUint32(offset);\r\n            offset += 4;\r\n            keyTrieBitVectorWords[i * 2] = dv.getUint32(offset);\r\n            offset += 4;\r\n        }\r\n        return [new LOUDSTrie(new BitVector(keyTrieBitVectorWords, keyTrieBitVectorSize), keyTrieEdges), offset];\r\n    }\r\n\r\n    private static decode(c: number): number {\r\n        return CompactHiraganaString.decodeByte(c);\r\n    }\r\n\r\n    private static createHasMappingBitList(mappingBitVector: BitVector) {\r\n        const numOfNodes = mappingBitVector.rank(mappingBitVector.size() + 1, false);\r\n        const bitList = new BitList(numOfNodes);\r\n        let bitPosition = 0;\r\n        for (let node = 1; node < numOfNodes; node++) {\r\n            let hasMapping = mappingBitVector.get(bitPosition + 1);\r\n            bitList.set(node, hasMapping);\r\n            bitPosition = mappingBitVector.nextClearBit(bitPosition + 1);\r\n        }\r\n        return bitList;\r\n    }\r\n\r\n    *search(key: string): IterableIterator<string> {\r\n        const keyIndex = this.keyTrie.lookup(key);\r\n        if (keyIndex != -1 && this.hasMappingBitList.get(keyIndex)) {\r\n            const valueStartPos = this.mappingBitVector.select(keyIndex, false);\r\n            const valueEndPos = this.mappingBitVector.nextClearBit(valueStartPos + 1);\r\n            const size = valueEndPos - valueStartPos - 1;\r\n            if (size > 0) {\r\n                const offset = this.mappingBitVector.rank(valueStartPos, false);\r\n                for (let i = 0; i < size; i++) {\r\n                    yield this.valueTrie.reverseLookup(this.mapping[valueStartPos - offset + i]);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    *predictiveSearch(key: string): IterableIterator<string> {\r\n        const keyIndex = this.keyTrie.lookup(key);\r\n        if (keyIndex > 1) {\r\n            for (let i of this.keyTrie.predictiveSearch(keyIndex)) {\r\n                if (this.hasMappingBitList.get(i)) {\r\n                    const valueStartPos = this.mappingBitVector.select(i, false);\r\n                    const valueEndPos = this.mappingBitVector.nextClearBit(valueStartPos + 1);\r\n                    const size = valueEndPos - valueStartPos - 1;\r\n                    const offset = this.mappingBitVector.rank(valueStartPos, false);\r\n                    for (let j = 0; j < size; j++) {\r\n                        yield this.valueTrie.reverseLookup(this.mapping[valueStartPos - offset + j]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}","import { LOUDSTrie } from \"./LOUDSTrie\";\r\nimport { BitVector } from \"./BitVector\";\r\nimport { BitList } from \"./BitList\";\r\n\r\nexport class LOUDSTrieBuilder {\r\n    static build(keys: string[]): [LOUDSTrie, Uint32Array] {\r\n        for (let i = 0; i < keys.length; i++) {\r\n            if (keys[i] == null) {\r\n                throw new Error();\r\n            }\r\n            if (i > 0 && keys[i - 1] > keys[i]) {\r\n                throw new Error();\r\n            }\r\n        }\r\n        const nodes = new Uint32Array(keys.length)\r\n        for (let i = 0; i < nodes.length; i++) {\r\n            nodes[i] = 1;\r\n        }\r\n        let cursor = 0;\r\n        let currentNode = 1;\r\n        let edges = \"  \";\r\n        const louds = new BitList();\r\n        louds.add(true);\r\n        while (true) {\r\n            let lastChar = 0;\r\n            let lastParent = 0;\r\n            let restKeys = 0;\r\n            for (let i = 0; i < keys.length; i++) {\r\n                if (keys[i].length < cursor) {\r\n                    continue;\r\n                }\r\n                if (keys[i].length == cursor) {\r\n                    louds.add(false);\r\n                    lastParent = nodes[i];\r\n                    lastChar = 0;\r\n                    continue;\r\n                }\r\n                const currentChar = keys[i].charCodeAt(cursor);\r\n                const currentParent = nodes[i];\r\n                if (lastParent != currentParent) {\r\n                    louds.add(false);\r\n                    louds.add(true);\r\n                    edges += String.fromCharCode(currentChar);\r\n                    currentNode = currentNode + 1;\r\n                } else if (lastChar != currentChar) {\r\n                    louds.add(true);\r\n                    edges += String.fromCharCode(currentChar);\r\n                    currentNode = currentNode + 1;\r\n                }\r\n                nodes[i] = currentNode;\r\n                lastChar = currentChar;\r\n                lastParent = currentParent;\r\n                restKeys++;\r\n            }\r\n            if (restKeys == 0) {\r\n                break;\r\n            }\r\n            cursor++;\r\n        }\r\n        const bitVectorWords = new Uint32Array(louds.words.buffer, 0, ((louds.size + 63) >> 6) * 2);\r\n        const bitVector = new BitVector(bitVectorWords, louds.size);\r\n        const uint16Edges = new Uint16Array(edges.length);\r\n        for (let i = 0; i< edges.length; i++) {\r\n            uint16Edges[i] = edges.charCodeAt(i);\r\n        }\r\n        return [new LOUDSTrie(bitVector, uint16Edges), nodes];\r\n    }\r\n}","import { LOUDSTrieBuilder } from \"./LOUDSTrieBuilder\";\r\nimport { CompactHiraganaString } from \"./CompactHiraganaString\";\r\nimport { BitList } from \"./BitList\";\r\n\r\nexport class CompactDictionaryBuilder {\r\n    public static build(dict: Map<string, string[]>): ArrayBuffer {\r\n        // remove some keys\r\n        const keysToRemove = new Array<string>();\r\n        for (const key of dict.keys()) {\r\n            try {\r\n                CompactHiraganaString.encodeString(key);\r\n            } catch (e) {\r\n                keysToRemove.push(key);\r\n                console.log(\"skipped the world: \" + key);\r\n            }\r\n        }\r\n        for (const key of keysToRemove) {\r\n            dict.delete(key);\r\n        }\r\n\r\n        // build key trie\r\n        const keys = Array.from(dict.keys()).sort();\r\n        const keyTrie = LOUDSTrieBuilder.build(keys)[0];\r\n\r\n        // build value trie\r\n        const valuesSet = new Set<string>();\r\n        for (const value of dict.values()) {\r\n            for (const v of value) {\r\n                valuesSet.add(v);\r\n            }\r\n        }\r\n        const values = Array.from(valuesSet.values()).sort();\r\n        const valueTrie = LOUDSTrieBuilder.build(values)[0];\r\n\r\n        // build trie mapping\r\n        let mappingCount = 0;\r\n        for (const i of dict.values()) {\r\n            mappingCount += i.length;\r\n        }\r\n        const mapping = new Uint32Array(mappingCount);\r\n        let mappingIndex = 0;\r\n        const mappingBitList = new BitList();\r\n        for (let i = 1; i <= keyTrie.size()+1; i++) {\r\n            let key = keyTrie.reverseLookup(i);\r\n            mappingBitList.add(false);\r\n            let values = dict.get(key);\r\n            if (values != undefined) {\r\n                for (let j = 0; j < values.length; j++) {\r\n                    mappingBitList.add(true);\r\n                    mapping[mappingIndex] = valueTrie.lookup(values[j]);\r\n                    mappingIndex++;\r\n                }\r\n            }\r\n        }\r\n\r\n        // calculate output size\r\n        const keyTrieDataSize = 8 + keyTrie.edges.length + ((keyTrie.bitVector.size() + 63) >>> 6) * 8;\r\n        const valueTrieDataSize = 8 + valueTrie.edges.length * 2 + ((valueTrie.bitVector.size() + 63) >>> 6) * 8;\r\n        const mappingDataSize = 8 + ((mappingBitList.size + 63) >>> 6) * 8 + mapping.length * 4;\r\n        const outputDataSize = keyTrieDataSize + valueTrieDataSize + mappingDataSize;\r\n\r\n        // ready output\r\n        const arrayBuffer = new ArrayBuffer(outputDataSize);\r\n        const dataView = new DataView(arrayBuffer);\r\n        let dataViewIndex = 0;\r\n\r\n        // output key trie\r\n        dataView.setInt32(dataViewIndex, keyTrie.edges.length);\r\n        dataViewIndex += 4;\r\n        for (let i = 0; i < keyTrie.edges.length; i++) {\r\n            const compactChar = CompactHiraganaString.encodeChar(keyTrie.edges[i]);\r\n            dataView.setUint8(dataViewIndex, compactChar);\r\n            dataViewIndex += 1;\r\n        }\r\n        dataView.setInt32(dataViewIndex, keyTrie.bitVector.size());\r\n        dataViewIndex += 4;\r\n        const keyTrieBitVectorWords = keyTrie.bitVector.words;\r\n        for (let i = 0; i < keyTrieBitVectorWords.length >>> 1; i++) {\r\n            dataView.setUint32(dataViewIndex, keyTrieBitVectorWords[i * 2 + 1]);\r\n            dataViewIndex += 4;\r\n            dataView.setUint32(dataViewIndex, keyTrieBitVectorWords[i * 2]);\r\n            dataViewIndex += 4;\r\n        }\r\n\r\n        // output value trie\r\n        dataView.setInt32(dataViewIndex, valueTrie.edges.length);\r\n        dataViewIndex += 4;\r\n        for (let i = 0; i < valueTrie.edges.length; i++) {\r\n            dataView.setUint16(dataViewIndex, valueTrie.edges[i]);\r\n            dataViewIndex += 2;\r\n        }\r\n        dataView.setInt32(dataViewIndex, valueTrie.bitVector.size());\r\n        dataViewIndex += 4;\r\n        const valueTrieBitVectorWords = valueTrie.bitVector.words;\r\n        for (let i = 0; i < valueTrieBitVectorWords.length >>> 1; i++) {\r\n            dataView.setUint32(dataViewIndex, valueTrieBitVectorWords[i * 2 + 1]);\r\n            dataViewIndex += 4;\r\n            dataView.setUint32(dataViewIndex, valueTrieBitVectorWords[i * 2]);\r\n            dataViewIndex += 4;\r\n        }\r\n        \r\n        // output mapping\r\n        dataView.setInt32(dataViewIndex, mappingBitList.size);\r\n        dataViewIndex += 4;\r\n        const mappingWordsLen = (mappingBitList.size + 63) >> 6;\r\n        for (let i = 0; i < mappingWordsLen; i++) {\r\n            dataView.setUint32(dataViewIndex, mappingBitList.words[i * 2 + 1]);\r\n            dataViewIndex += 4;\r\n            dataView.setUint32(dataViewIndex, mappingBitList.words[i * 2]);\r\n            dataViewIndex += 4;\r\n        }\r\n        // TODO: padding to 64bit words\r\n        dataView.setInt32(dataViewIndex, mapping.length);\r\n        dataViewIndex += 4;\r\n        for (let i = 0; i < mapping.length; i++) {\r\n            dataView.setUint32(dataViewIndex, mapping[i]);\r\n            dataViewIndex += 4;\r\n        }\r\n\r\n        // check data size\r\n        if (dataViewIndex !== outputDataSize) {\r\n            throw new Error(`file size is not valid: expected=${outputDataSize} actual=${dataViewIndex}`);\r\n        }\r\n\r\n        return arrayBuffer;\r\n    }\r\n}","export class DoubleArray {\r\n    base: Int16Array;\r\n    check: Int16Array;\r\n    charConverter: (arg: number)=>number;\r\n    charSize: number;\r\n\r\n    constructor(base: Int16Array, check: Int16Array, charConverter: (arg: number)=>number, charSize: number) {\r\n        this.base = base;\r\n        this.check = check;\r\n        this.charConverter = charConverter;\r\n        this.charSize = charSize;\r\n    }\r\n\r\n    public traverse(n: number, k: number): number {\r\n        const m = this.base[n] + k;\r\n        if (this.check[m] == n) {\r\n            return m;\r\n        } else {\r\n            return -1;\r\n        }\r\n    }\r\n\r\n    public lookup(str: string): number {\r\n        if (str.length == 0) {\r\n            return 0;\r\n        }\r\n        let n = 0;\r\n        for (let i = 0; i < str.length; i++) {\r\n            const c = this.charConverter(str.charCodeAt(i))\r\n            if (c < 1) {\r\n                throw new Error();\r\n            }\r\n            n = this.traverse(n, c);\r\n            if (n == -1) {\r\n                return -1;\r\n            }\r\n        }\r\n        return n;\r\n    }\r\n\r\n    public *commonPrefixSearch(key: string): IterableIterator<number> {\r\n        let index = 0;\r\n        let offset = 0;\r\n        while (index != -1) {\r\n            const lastIndex = index;\r\n            if (offset == key.length) {\r\n                index = -1;\r\n            } else {\r\n                const c = this.charConverter(key.charCodeAt(offset));\r\n                index = this.traverse(index, c);\r\n                offset++;\r\n            }\r\n            yield lastIndex;\r\n        }\r\n    }\r\n\r\n    public *predictiveSearch(key: string): IterableIterator<number> {\r\n        const n = this.lookup(key);\r\n        if (n == -1) {\r\n            return;\r\n        }\r\n        yield *this.visitRecursive(n);\r\n    }\r\n\r\n    public *visitRecursive(n: number): IterableIterator<number> {\r\n        yield n;\r\n        for (let i = 0; i < this.charSize; i++) {\r\n            const m = this.base[n] + i + 1;\r\n            if (m >= this.check.length) {\r\n                return;\r\n            }\r\n            if (this.check[m] == n) {\r\n                yield *this.visitRecursive(m);\r\n            }\r\n        }\r\n    }\r\n\r\n}","import { BitList } from \"./BitList\";\r\n\r\nclass TernaryRegexNode {\r\n    value: number = 0;\r\n    child: TernaryRegexNode | null = null;\r\n    left: TernaryRegexNode | null = null;\r\n    right: TernaryRegexNode | null = null;\r\n    level: number = 0;\r\n    successor(): TernaryRegexNode {\r\n        let t = this.right!;\r\n        while (t.left != null) {\r\n            t = t.left;\r\n        }\r\n        return t;\r\n    }\r\n    predecessor(): TernaryRegexNode {\r\n        let t = this.left!;\r\n        while (t.left != null) {\r\n            t = t.left;\r\n        }\r\n        while (t.right != null) {\r\n            t = t.right;\r\n        }\r\n        return t;\r\n    }\r\n}\r\n\r\nfunction skew(t: TernaryRegexNode | null): TernaryRegexNode | null {\r\n    if (t == null) {\r\n        return null;\r\n    } else if (t.left == null) {\r\n        return t;\r\n    } else if (t.left.level == t.level) {\r\n        let l = t.left;\r\n        t.left = l.right;\r\n        l.right = t;\r\n        return l;\r\n    } else {\r\n        return t;\r\n    }\r\n}\r\n\r\nfunction split(t: TernaryRegexNode | null): TernaryRegexNode | null {\r\n    if (t == null) {\r\n        return null;\r\n    } else if (t.right == null || t.right.right == null) {\r\n        return t;\r\n    } else if (t.level == t.right.right.level) {\r\n        let r = t.right;\r\n        t.right = r.left;\r\n        r.left = t;\r\n        r.level = r.level + 1;\r\n        return r;\r\n    } else {\r\n        return t;\r\n    }\r\n}\r\n\r\nfunction add(node: TernaryRegexNode | null, word: string, offset: number): TernaryRegexNode | null {\r\n    if (offset < word.length) {\r\n        let [node_, target, inserted] = insert(word.charCodeAt(offset), node);\r\n        if (inserted || target.child != null) {\r\n            target.child = add(target.child, word, offset + 1);\r\n        }\r\n        return node_;\r\n    } else {\r\n        return null;\r\n    }\r\n}\r\n\r\nfunction* traverseSiblings(node: TernaryRegexNode | null): IterableIterator<TernaryRegexNode> {\r\n    if (node != null) {\r\n        yield* traverseSiblings(node.left);\r\n        yield node;\r\n        yield* traverseSiblings(node.right);\r\n    }\r\n}\r\n\r\nfunction insert(x: number, t: TernaryRegexNode | null): [TernaryRegexNode | null, TernaryRegexNode, boolean] {\r\n    let r: TernaryRegexNode | null;\r\n    let inserted = false;\r\n    if (t == null) {\r\n        r = new TernaryRegexNode();\r\n        r.value = x;\r\n        r.level = 1;\r\n        r.left = null;\r\n        r.right = null;\r\n        return [r, r, true];\r\n    } else if (x < t.value) {\r\n        [t.left, r, inserted] = insert(x, t.left);\r\n    } else if (x > t.value) {\r\n        [t.right, r, inserted] = insert(x, t.right);\r\n    } else {\r\n        return [t, t, false];\r\n    }\r\n    t = skew(t);\r\n    t = split(t);\r\n    return [t, r, inserted];\r\n}\r\n\r\nexport class TernaryRegexGenerator {\r\n    or: string;\r\n    beginGroup: string;\r\n    endGroup: string;\r\n    beginClass: string;\r\n    endClass: string;\r\n    newline: string;\r\n    root: TernaryRegexNode | null;\r\n    escapedCharacters: BitList;\r\n\r\n    constructor(or: string, beginGroup: string, endGroup: string, beginClass: string, endClass: string, newline: string, escape: string) {\r\n        this.or = or;\r\n        this.beginGroup = beginGroup;\r\n        this.endGroup = endGroup;\r\n        this.beginClass = beginClass;\r\n        this.endClass = endClass;\r\n        this.newline = newline;\r\n        this.root = null;\r\n        this.escapedCharacters = TernaryRegexGenerator.initializeEscapeCharacters(escape);\r\n    }\r\n\r\n    static getDEFAULT(): TernaryRegexGenerator {\r\n        const ESCAPE = \"\\\\.[]{}()*+-?^$|\";\r\n\t\treturn new TernaryRegexGenerator(\"|\", \"(\", \")\", \"[\", \"]\", \"\", ESCAPE);\r\n\t}\r\n\r\n    static initializeEscapeCharacters(escape: string): BitList {\r\n        const bits = new BitList(128);\r\n        for (let i = 0; i < escape.length; i++) {\r\n            const c = escape.charCodeAt(i)\r\n            if (c < 128) {\r\n                bits.set(c, true);\r\n            } else {\r\n                throw new Error(\"アスキー文字のみエスケープできます\")\r\n            }\r\n        }\r\n        return bits;\r\n    }\r\n\r\n    add(word: string) {\r\n        if (word.length == 0) {\r\n            return;\r\n        }\r\n        this.root = add(this.root, word, 0);\r\n    }\r\n\r\n    generateStub(node: TernaryRegexNode | null): string {\r\n        let buf = \"\";\r\n        let brother = 0;\r\n        let haschild = 0;\r\n        for (let n of traverseSiblings(node)) {\r\n            brother++;\r\n            if (n.child != null) {\r\n                haschild++;\r\n            }\r\n        }\r\n        const nochild = brother - haschild;\r\n\r\n        if (brother > 1 && haschild > 0) {\r\n            buf += this.beginGroup;\r\n        }\r\n\r\n        if (nochild > 0) {\r\n            if (nochild > 1) {\r\n                buf += this.beginClass;\r\n            }\r\n            for (let n of traverseSiblings(node)) {\r\n                if (n.child != null) {\r\n                    continue;\r\n                }\r\n                if (n.value < 128 && this.escapedCharacters.get(n.value)) {\r\n                    buf += '\\\\';\r\n                }\r\n                buf += String.fromCharCode(n.value);\r\n            }\r\n            if (nochild > 1) {\r\n                buf += this.endClass;\r\n            }\r\n        }\r\n\r\n        if (haschild > 0) {\r\n            if (nochild > 0) {\r\n                buf += this.or;\r\n            }\r\n            for (let n of traverseSiblings(node)) {\r\n                if (n.child != null) {\r\n                    if (n.value < 128 && this.escapedCharacters.get(n.value)) {\r\n                        buf += '\\\\';\r\n                    }\r\n                    buf += String.fromCharCode(n.value)\r\n                    if (this.newline != null) { // TODO: always true\r\n                        buf += this.newline;\r\n                    }\r\n                    buf += this.generateStub(n.child)\r\n                    if (haschild > 1) {\r\n                        buf += this.or;\r\n                    }\r\n                }\r\n            }\r\n            if (haschild > 1) {\r\n                buf = buf.substring(0, buf.length - this.or.length);\r\n            }\r\n        }\r\n        if (brother > 1 && haschild > 0) {\r\n            buf += this.endGroup;\r\n        }\r\n        return buf;\r\n    }\r\n\r\n    generate(): string {\r\n        if (this.root == null) {\r\n            return \"\";\r\n        } else {\r\n            return this.generateStub(this.root);\r\n        }\r\n    }\r\n}","export class RomajiPredictiveResult {\r\n    prefix: string;\r\n    suffixes: string[];\r\n    constructor(prefix: string, suffixes: string[]) {\r\n        this.prefix = prefix;\r\n        this.suffixes = suffixes;\r\n    }\r\n}\r\n\r\nexport interface RomajiProcessor {\r\n    romajiToHiragana(romaji: string): string;\r\n    romajiToHiraganaPredictively(romaji: string): RomajiPredictiveResult;\r\n}","import { DoubleArray } from \"./DoubleArray\";\r\nimport { RomajiProcessor, RomajiPredictiveResult } from \"./RomajiProcessor\";\r\n\r\nexport class RomajiProcessor2 implements RomajiProcessor {\r\n    trie: DoubleArray;\r\n    hiraganaList: Array<string>;\r\n    remainList: Int8Array;\r\n\r\n    constructor(trie: DoubleArray, hiraganaList: string[], remainList: Int8Array) {\r\n        this.trie = trie;\r\n        this.hiraganaList = hiraganaList;\r\n        this.remainList = remainList;\r\n    }\r\n\r\n    public static build() {\r\n        const base = new Int16Array([0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, 31, 95, -1, 100, 121, 147, -1, 175, 182, 203, 229, 251, -1, 266, 284, 291, 302, 334, -1, 379, 401, 420, 432, 464, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 28, -1, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, -1, -1, -1, -1, -1, -1, -1, 34, -1, -1, -1, -1, -1, -1, 76, -1, 93, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 118, -1, 136, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 149, -1, 158, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 160, -1, -1, -1, -1, 177, -1, 201, -1, -1, -1, -1, -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, 47, -1, 212, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 248, 86, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 269, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 317, -1, -1, -1, -1, -1, 293, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 319, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 343, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 360, -1, -1, -1, 361, -1, 362, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 384, -1, -1, -1, -1, 402, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, -1, 74, -1, -1, -1, -1, 85, -1, -1, -1, -1, -1, -1, -1, -1, 68, -1, -1, 83, -1, 427, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 445, -1]);\r\n        const check = new Int16Array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 98, 147, 0, 98, 99, 147, 99, 98, 99, 147, 100, 99, 99, 98, 171, 147, 270, 159, 99, 98, 322, 147, 135, 98, 99, 152, 135, 207, 99, 152, 135, 134, 221, 152, 310, 319, 135, 319, 310, 152, 199, 520, 135, 134, 199, 152, 221, 134, 199, 214, 183, 522, 221, 214, 199, 522, 539, 214, 527, 536, 199, 536, 527, 214, -1, -1, 216, 373, 100, 214, 216, 100, 100, 102, 216, 100, 100, 102, 102, 373, 216, 102, 100, 373, -1, -1, 216, 102, 100, -1, 100, 240, 100, 102, 103, 240, -1, 102, 103, 240, 103, -1, 103, -1, -1, 240, -1, -1, 103, 242, -1, 240, -1, 242, 103, -1, 103, 242, 103, -1, 104, -1, 266, 242, 104, -1, 266, 104, 104, 242, 266, 268, -1, 296, 104, 268, 266, 296, -1, 268, 104, 296, 104, -1, 104, 268, 266, 296, 106, -1, 301, 268, 106, 296, 301, 107, 106, 106, 301, 107, -1, -1, 106, 107, 301, 107, 110, -1, 106, 107, 301, -1, 106, -1, 303, 107, 108, 107, 303, 107, 108, -1, 303, -1, 108, 324, 108, 108, 303, 324, 108, -1, -1, 324, 303, 108, 108, -1, 108, 324, 108, -1, 109, 350, -1, 324, 109, 350, -1, -1, 109, 350, -1, -1, 109, -1, 109, 350, -1, -1, -1, 372, 109, 350, 110, 372, 109, -1, 110, 372, -1, -1, 110, -1, -1, 372, -1, 110, 110, 112, -1, 372, 387, 112, 110, -1, 387, 112, 110, 116, 387, -1, -1, 112, 112, -1, 387, 113, -1, 112, -1, 113, 387, 112, 114, 113, 412, -1, 114, -1, 412, 113, 114, 113, 412, 115, -1, 113, 114, 115, 412, 114, 115, 115, 114, -1, 412, -1, 114, 115, 406, -1, 423, 115, 406, 115, 423, -1, 406, 115, 423, -1, -1, -1, 406, -1, 423, 116, -1, -1, 406, 116, 423, -1, 116, 116, 438, -1, -1, -1, 438, 116, -1, -1, 438, 116, 116, 116, -1, 116, 438, 116, -1, 449, 453, 455, 438, 449, 453, 455, -1, 449, 453, 455, -1, -1, -1, 449, 453, 455, -1, -1, 118, 449, 453, 455, 118, 500, -1, -1, 118, 500, -1, -1, -1, 500, 118, -1, -1, -1, -1, 500, 118, 118, 119, 505, 118, 500, 119, 505, -1, 119, 119, 505, 122, 122, 122, 122, 119, 505, -1, -1, -1, 120, 119, 505, 119, 120, 119, -1, 541, 120, -1, 120, 541, 121, 120, 120, 541, 121, -1, -1, 120, 120, 541, 120, 120, 120, 585, 121, 541, -1, 585, -1, -1, 121, 585, -1, -1, 121, -1, 122, 585, 122, -1, -1, -1, 122, 585, -1, -1, 122, -1, -1, 122, 122, 122, 122, 122, -1, -1, 122, -1, -1, -1, -1, -1, 122, -1, -1, -1, 122, 122]);\r\n        const remainList = new Int8Array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, -1, -1, 0, -1, 0, 0, 0, -1, -1, 0, 0, 1, -1, 0, -1, -1, 0, -1, -1, 0, 0, -1, 0, -1, 0, 0, -1, -1, 0, -1, -1, 0, -1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, -1, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, -1, 0, 0, 0, 1, 0, -1, 0, 0, 0, -1, -1, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 1, 0, 0, 0, -1, -1, 0, 0, -1, 0, -1, -1, 0, -1, -1, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, -1, -1, 1, -1, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, -1, -1, 0, 0, -1, -1, 0, -1, -1, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, -1, -1, 0, -1, -1, 0, 1, -1, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 1, -1, 0, 0, -1, 0, -1, -1, 0, 0, -1, 0, 1, 0, 0, 0, -1, 0, -1, 0, -1, -1, -1, 0, -1, 0, 0, -1, -1, 0, 0, 0, -1, -1, 0, 0, -1, -1, -1, 0, 0, -1, -1, 0, -1, 1, 0, -1, -1, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, -1, -1, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, 0, 1, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 1, 0, -1, -1, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, -1, 1, -1, 0, 0, 0, -1, 0, -1, -1, 0, 0, -1, -1, 1, -1, 0, 0, 0, -1, -1, -1, 0, 0, -1, -1, 0, -1, -1, 0, 0, 0, 0, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, 1]);\r\n        const hiraganaList: Array<string> = [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"、\", \"ー\", \"。\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"「\", \"\", \"」\", \"\", \"\", \"\", \"あ\", \"\", \"\", \"\", \"え\", \"\", \"\", \"\", \"い\", \"\", \"\", \"\", \"\", \"ん\", \"お\", \"\", \"\", \"\", \"\", \"\", \"う\", \"\", \"\", \"\", \"\", \"\", \"ば\", \"っ\", \"びゃ\", \"〜\", \"べ\", \"か\", \"びぇ\", \"っ\", \"び\", \"せ\", \"びぃ\", \"\", \"\", \"し\", \"ぼ\", \"でゅ\", \"びょ\", \"ふゅ\", \"っ\", \"こ\", \"ぶ\", \"ゎ\", \"びゅ\", \"ちゃ\", \"\", \"く\", \"ちゃ\", \"ちぇ\", \"てゅ\", \"\", \"ちぇ\", \"ち\", \"でぃ\", \"ふゃ\", \"ちぃ\", \"ヵ\", \"\", \"ちょ\", \"っ\", \"ヶ\", \"ちょ\", \"でゃ\", \"w\", \"ちゅ\", \"どぅ\", \"でぇ\", \"ちゅ\", \"ふょ\", \"\", \"でぃ\", \"どぁ\", \"っ\", \"ゑ\", \"ふゅ\", \"どぇ\", \"でょ\", \"ゐ\", \"ゎ\", \"どぃ\", \"ヵ\", \"\", \"でゅ\", \"っ\", \"ヶ\", \"どぉ\", \"\", \"\", \"ぢゃ\", \"てぃ\", \"だ\", \"どぅ\", \"ぢぇ\", \"っ\", \"で\", \"ふぁ\", \"ぢぃ\", \"\", \"ぢ\", \"ふぇ\", \"っ\", \"とぅ\", \"ぢょ\", \"ふぃ\", \"ど\", \"\", \"\", \"\", \"ぢゅ\", \"ふぉ\", \"づ\", \"\", \"\", \"ぐぁ\", \"\", \"ふ\", \"が\", \"ぐぇ\", \"\", \"\", \"げ\", \"ぐぃ\", \"っ\", \"\", \"ぎ\", \"\", \"\", \"ぐぉ\", \"\", \"\", \"ご\", \"ぎゃ\", \"\", \"ぐぅ\", \"\", \"ぎぇ\", \"ぐ\", \"\", \"\", \"ぎぃ\", \"\", \"\", \"は\", \"\", \"ふぁ\", \"ぎょ\", \"へ\", \"\", \"ふぇ\", \"っ\", \"ひ\", \"ぎゅ\", \"ふぃ\", \"ひゃ\", \"\", \"じゃ\", \"ほ\", \"ひぇ\", \"ふぉ\", \"じぇ\", \"\", \"ひぃ\", \"ふ\", \"じぃ\", \"\", \"\", \"\", \"ひょ\", \"\", \"じょ\", \"じゃ\", \"\", \"くぁ\", \"ひゅ\", \"じぇ\", \"じゅ\", \"くぇ\", \"か\", \"じ\", \"っ\", \"くぃ\", \"け\", \"\", \"\", \"じょ\", \"き\", \"くぉ\", \"っ\", \"ん\", \"\", \"じゅ\", \"こ\", \"くぅ\", \"\", \"\", \"\", \"きゃ\", \"く\", \"ぁ\", \"\", \"きぇ\", \"\", \"ぇ\", \"\", \"きぃ\", \"\", \"ぃ\", \"ゃ\", \"\", \"っ\", \"きょ\", \"ぇ\", \"ぉ\", \"\", \"\", \"ぃ\", \"きゅ\", \"\", \"ぅ\", \"\", \"\", \"ょ\", \"\", \"\", \"ま\", \"みゃ\", \"\", \"ゅ\", \"め\", \"みぇ\", \"\", \"\", \"み\", \"みぃ\", \"\", \"\", \"っ\", \"\", \"も\", \"みょ\", \"\", \"\", \"\", \"にゃ\", \"む\", \"みゅ\", \"な\", \"にぇ\", \"\", \"\", \"ね\", \"にぃ\", \"\", \"\", \"に\", \"\", \"\", \"にょ\", \"\", \"ん\", \"の\", \"ぱ\", \"\", \"にゅ\", \"ぴゃ\", \"ぺ\", \"ぬ\", \"\", \"ぴぇ\", \"ぴ\", \"\", \"\", \"ぴぃ\", \"\", \"\", \"ぽ\", \"っ\", \"\", \"ぴょ\", \"くぁ\", \"\", \"ぷ\", \"\", \"くぇ\", \"ぴゅ\", \"\", \"ら\", \"くぃ\", \"りゃ\", \"\", \"れ\", \"\", \"りぇ\", \"くぉ\", \"り\", \"っ\", \"りぃ\", \"さ\", \"\", \"く\", \"ろ\", \"せ\", \"りょ\", \"っ\", \"\", \"し\", \"る\", \"\", \"りゅ\", \"\", \"\", \"そ\", \"しゃ\", \"\", \"しゃ\", \"っ\", \"しぇ\", \"す\", \"しぇ\", \"\", \"し\", \"\", \"しぃ\", \"\", \"\", \"\", \"しょ\", \"\", \"しょ\", \"た\", \"\", \"\", \"しゅ\", \"て\", \"しゅ\", \"\", \"\", \"ち\", \"てゃ\", \"\", \"\", \"\", \"てぇ\", \"と\", \"\", \"\", \"てぃ\", \"\", \"っ\", \"つ\", \"\", \"\", \"てょ\", \"\", \"\", \"つぁ\", \"とぁ\", \"ちゃ\", \"てゅ\", \"つぇ\", \"とぇ\", \"ちぇ\", \"\", \"つぃ\", \"とぃ\", \"ちぃ\", \"\", \"\", \"\", \"つぉ\", \"とぉ\", \"ちょ\", \"\", \"\", \"ゔぁ\", \"つ\", \"とぅ\", \"ちゅ\", \"ゔぇ\", \"ゔゃ\", \"\", \"\", \"ゔぃ\", \"ゔぇ\", \"\", \"\", \"\", \"ゔぃ\", \"ゔぉ\", \"\", \"\", \"\", \"\", \"ゔょ\", \"ゔ\", \"っ\", \"わ\", \"うぁ\", \"\", \"ゔゅ\", \"うぇ\", \"うぇ\", \"\", \"\", \"うぃ\", \"うぃ\", \"‥\", \"〜\", \"…\", \"・\", \"を\", \"うぉ\", \"\", \"\", \"\", \"ぁ\", \"う\", \"う\", \"っ\", \"ぇ\", \"\", \"\", \"ゃ\", \"ぃ\", \"\", \"\", \"ぇ\", \"や\", \"ん\", \"ぉ\", \"ぃ\", \"いぇ\", \"\", \"\", \"\", \"ぅ\", \"ょ\", \"\", \"っ\", \"\", \"じゃ\", \"よ\", \"ゅ\", \"\", \"じぇ\", \"\", \"\", \"ゆ\", \"じぃ\", \"\", \"\", \"っ\", \"\", \"『\", \"じょ\", \"』\", \"\", \"\", \"\", \"ざ\", \"じゅ\", \"\", \"\", \"ぜ\", \"\", \"\", \"←\", \"じ\", \"↓\", \"↑\", \"→\", \"\", \"\", \"ぞ\", \"\", \"\", \"\", \"\", \"\", \"ず\", \"\", \"\", \"\", \"\", \"っ\"];\r\n        const code = function (c: number): number {\r\n            return c;\r\n        }\r\n        const trie = new DoubleArray(base, check, code, 128);\r\n        return new RomajiProcessor2(trie, hiraganaList, remainList);\r\n    }\r\n\r\n    public romajiToHiragana(romaji: string): string {\r\n        let buffer = \"\";\r\n        let cursor = 0;\r\n        while (cursor < romaji.length) {\r\n            let longestNode = -1;\r\n            let length = -1;\r\n            for (let i of this.trie.commonPrefixSearch(romaji.substring(cursor))) {\r\n                if (this.remainList[i] != -1) {\r\n                    longestNode = i;\r\n                }\r\n                length++;\r\n            }\r\n            if (longestNode == -1) {\r\n                buffer = buffer + romaji.charAt(cursor);\r\n                cursor++;\r\n            } else {\r\n                buffer = buffer + this.hiraganaList[longestNode];\r\n                cursor = cursor + length - this.remainList[longestNode];\r\n            }\r\n        }\r\n        return buffer;\r\n    }\r\n\r\n    public romajiToHiraganaPredictively(romaji: string): RomajiPredictiveResult {\r\n        let builder = \"\";\r\n        let cursor = 0;\r\n        while (cursor < romaji.length) {\r\n            let longestNode = -1;\r\n            let length = 0;\r\n            for (let node of this.trie.commonPrefixSearch(romaji.substring(cursor))) {\r\n                if (this.remainList[node] != -1) {\r\n                    longestNode = node;\r\n                }\r\n                length++;\r\n            }\r\n            if (length+cursor-1 == romaji.length) {\r\n                let set = new Set<string>();\r\n                for (let node of this.trie.predictiveSearch(romaji.substring(cursor))) {\r\n                    if (this.remainList[node] != -1) {\r\n                        set.add(this.hiraganaList[node]);\r\n                    }\r\n                }\r\n                let list = new Array<string>();\r\n                for (let e of set) {\r\n                    list.push(e);\r\n                }\r\n                if (list.length == 1) {\r\n                    builder = builder + list[0];\r\n                    return new RomajiPredictiveResult(builder, [\"\"]);\r\n                } else {\r\n                    return new RomajiPredictiveResult(builder, list);\r\n                }\r\n            } else if (longestNode >= 0) {\r\n                builder = builder + this.hiraganaList[longestNode];\r\n                cursor = cursor + length - 1 - this.remainList[longestNode];\r\n            } else {\r\n                builder = builder + romaji[cursor];\r\n                cursor++;\r\n            }\r\n        }\r\n        return new RomajiPredictiveResult(builder, [\"\"]);\r\n    }\r\n}","import { CompactDictionary } from \"./CompactDictionary\";\r\nimport {zen2han_conv, han2zen_conv, hira2kata_conv} from \"./CharacterConverter\";\r\nimport { TernaryRegexGenerator } from \"./TernaryRegexGenerator\";\r\nimport { RomajiProcessor2 } from \"./RomajiProcessor2\";\r\nimport { RomajiProcessor } from \"./RomajiProcessor\";\r\nexport type Rxop = [string, string, string, string, string, string, string]\r\nexport class Migemo {\r\n    dict: CompactDictionary | null;\r\n    rxop: Rxop | null;\r\n    processor: RomajiProcessor;\r\n    constructor() {\r\n        this.dict = null;\r\n        this.rxop = null;\r\n        this.processor = RomajiProcessor2.build();\r\n    }\r\n    queryAWord(word: string): string {\r\n        const generator = this.rxop === null ? TernaryRegexGenerator.getDEFAULT() : new TernaryRegexGenerator(this.rxop[0], this.rxop[1], this.rxop[2], this.rxop[3], this.rxop[4], this.rxop[5], this.rxop[6]);\r\n        // query自信はもちろん候補に加える\r\n        generator.add(word);\r\n        // queryそのものでの辞書引き\r\n        const lower = word.toLowerCase();\r\n        if (this.dict != null) {\r\n            for (const word of this.dict.predictiveSearch(lower)) {\r\n                generator.add(word);\r\n            }\r\n        }\r\n        // queryを全角にして候補に加える\r\n        const zen = han2zen_conv(word);\r\n        generator.add(zen);\r\n        // queryを半角にして候補に加える\r\n        const han = zen2han_conv(word);\r\n        generator.add(han);\r\n\r\n        // 平仮名、カタカナ、及びそれによる辞書引き追加\r\n        const hiraganaResult = this.processor.romajiToHiraganaPredictively(lower);\r\n        for (const a of hiraganaResult.suffixes) {\r\n            const hira = hiraganaResult.prefix + a;\r\n            generator.add(hira);\r\n            // 平仮名による辞書引き\r\n            if (this.dict != null) {\r\n                for (const b of this.dict.predictiveSearch(hira)) {\r\n                    generator.add(b);\r\n                }\r\n            }\r\n            // 片仮名文字列を生成し候補に加える\r\n            const kata = hira2kata_conv(hira);\r\n            generator.add(kata);\r\n            // 半角カナを生成し候補に加える\r\n            generator.add(zen2han_conv(kata));\r\n        }\r\n        return generator.generate();\r\n    }\r\n\r\n    query(word: string): string {\r\n        if (word == \"\") {\r\n            return \"\";\r\n        }\r\n        const words = this.parseQuery(word);\r\n        let result = \"\";\r\n        for (const w of words) {\r\n            result += this.queryAWord(w);\r\n        }\r\n        return result;\r\n    }\r\n\r\n    setDict(dict: CompactDictionary | null) {\r\n        this.dict = dict;\r\n    }\r\n\r\n    setRxop(rxop: Rxop | null) {\r\n        this.rxop = rxop;\r\n    }\r\n\r\n    setRomajiProcessor(processor: RomajiProcessor) {\r\n        this.processor = processor;\r\n    }\r\n\r\n    *parseQuery(query: string): IterableIterator<string> {\r\n        const re = /[^A-Z\\s]+|[A-Z]{2,}|([A-Z][^A-Z\\s]+)|([A-Z]\\s*$)/g;\r\n        let myArray: RegExpExecArray|null;\r\n        while ((myArray = re.exec(query)) !== null) {\r\n            yield myArray[0];\r\n        }\r\n    }\r\n}","import {binarySearch} from \"./utils\";\r\nimport { RomajiPredictiveResult, RomajiProcessor } from \"./RomajiProcessor\";\r\n\r\nexport class RomanEntry {\r\n    roman: string;\r\n    hiragana: string;\r\n    remain: number;\r\n    index: number;\r\n    public constructor(roman: string, hiragana: string, remain: number) {\r\n        this.roman = roman;\r\n        this.hiragana = hiragana;\r\n        this.remain = remain;\r\n        this.index = RomanEntry.calculateIndex(roman);\r\n    }\r\n    static _calculateIndex(roman: string, start:number, end:number):number {\r\n        let result = 0;\r\n        for (let i = 0; i < 4; i++) {\r\n            const index = i + start;\r\n            const c = index < roman.length && index < end ? roman.charCodeAt(index) : 0;\r\n            result |= c;\r\n            if (i < 3) {\r\n                result <<= 8;\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n    static calculateIndex(roman: string): number {\r\n        return RomanEntry._calculateIndex(roman, 0, 4);\r\n    }\r\n\r\n}\r\n\r\nconst ROMAN_ENTRIES: RomanEntry[] = [\r\n    new RomanEntry(\"-\", \"ー\", 0),\r\n    new RomanEntry(\"~\", \"〜\", 0),\r\n    new RomanEntry(\".\", \"。\", 0),\r\n    new RomanEntry(\",\", \"、\", 0),\r\n    new RomanEntry(\"z/\", \"・\", 0),\r\n    new RomanEntry(\"z.\", \"…\", 0),\r\n    new RomanEntry(\"z,\", \"‥\", 0),\r\n    new RomanEntry(\"zh\", \"←\", 0),\r\n    new RomanEntry(\"zj\", \"↓\", 0),\r\n    new RomanEntry(\"zk\", \"↑\", 0),\r\n    new RomanEntry(\"zl\", \"→\", 0),\r\n    new RomanEntry(\"z-\", \"〜\", 0),\r\n    new RomanEntry(\"z[\", \"『\", 0),\r\n    new RomanEntry(\"z]\", \"』\", 0),\r\n    new RomanEntry(\"[\", \"「\", 0),\r\n    new RomanEntry(\"]\", \"」\", 0),\r\n    new RomanEntry(\"va\", \"ゔぁ\", 0),\r\n    new RomanEntry(\"vi\", \"ゔぃ\", 0),\r\n    new RomanEntry(\"vu\", \"ゔ\", 0),\r\n    new RomanEntry(\"ve\", \"ゔぇ\", 0),\r\n    new RomanEntry(\"vo\", \"ゔぉ\", 0),\r\n    new RomanEntry(\"vya\", \"ゔゃ\", 0),\r\n    new RomanEntry(\"vyi\", \"ゔぃ\", 0),\r\n    new RomanEntry(\"vyu\", \"ゔゅ\", 0),\r\n    new RomanEntry(\"vye\", \"ゔぇ\", 0),\r\n    new RomanEntry(\"vyo\", \"ゔょ\", 0),\r\n    new RomanEntry(\"qq\", \"っ\", 1),\r\n    new RomanEntry(\"vv\", \"っ\", 1),\r\n    new RomanEntry(\"ll\", \"っ\", 1),\r\n    new RomanEntry(\"xx\", \"っ\", 1),\r\n    new RomanEntry(\"kk\", \"っ\", 1),\r\n    new RomanEntry(\"gg\", \"っ\", 1),\r\n    new RomanEntry(\"ss\", \"っ\", 1),\r\n    new RomanEntry(\"zz\", \"っ\", 1),\r\n    new RomanEntry(\"jj\", \"っ\", 1),\r\n    new RomanEntry(\"tt\", \"っ\", 1),\r\n    new RomanEntry(\"dd\", \"っ\", 1),\r\n    new RomanEntry(\"hh\", \"っ\", 1),\r\n    new RomanEntry(\"ff\", \"っ\", 1),\r\n    new RomanEntry(\"bb\", \"っ\", 1),\r\n    new RomanEntry(\"pp\", \"っ\", 1),\r\n    new RomanEntry(\"mm\", \"っ\", 1),\r\n    new RomanEntry(\"yy\", \"っ\", 1),\r\n    new RomanEntry(\"rr\", \"っ\", 1),\r\n    new RomanEntry(\"ww\", \"っ\", 1),\r\n    new RomanEntry(\"www\", \"w\", 2),\r\n    new RomanEntry(\"cc\", \"っ\", 1),\r\n    new RomanEntry(\"kya\", \"きゃ\", 0),\r\n    new RomanEntry(\"kyi\", \"きぃ\", 0),\r\n    new RomanEntry(\"kyu\", \"きゅ\", 0),\r\n    new RomanEntry(\"kye\", \"きぇ\", 0),\r\n    new RomanEntry(\"kyo\", \"きょ\", 0),\r\n    new RomanEntry(\"gya\", \"ぎゃ\", 0),\r\n    new RomanEntry(\"gyi\", \"ぎぃ\", 0),\r\n    new RomanEntry(\"gyu\", \"ぎゅ\", 0),\r\n    new RomanEntry(\"gye\", \"ぎぇ\", 0),\r\n    new RomanEntry(\"gyo\", \"ぎょ\", 0),\r\n    new RomanEntry(\"sya\", \"しゃ\", 0),\r\n    new RomanEntry(\"syi\", \"しぃ\", 0),\r\n    new RomanEntry(\"syu\", \"しゅ\", 0),\r\n    new RomanEntry(\"sye\", \"しぇ\", 0),\r\n    new RomanEntry(\"syo\", \"しょ\", 0),\r\n    new RomanEntry(\"sha\", \"しゃ\", 0),\r\n    new RomanEntry(\"shi\", \"し\", 0),\r\n    new RomanEntry(\"shu\", \"しゅ\", 0),\r\n    new RomanEntry(\"she\", \"しぇ\", 0),\r\n    new RomanEntry(\"sho\", \"しょ\", 0),\r\n    new RomanEntry(\"zya\", \"じゃ\", 0),\r\n    new RomanEntry(\"zyi\", \"じぃ\", 0),\r\n    new RomanEntry(\"zyu\", \"じゅ\", 0),\r\n    new RomanEntry(\"zye\", \"じぇ\", 0),\r\n    new RomanEntry(\"zyo\", \"じょ\", 0),\r\n    new RomanEntry(\"tya\", \"ちゃ\", 0),\r\n    new RomanEntry(\"tyi\", \"ちぃ\", 0),\r\n    new RomanEntry(\"tyu\", \"ちゅ\", 0),\r\n    new RomanEntry(\"tye\", \"ちぇ\", 0),\r\n    new RomanEntry(\"tyo\", \"ちょ\", 0),\r\n    new RomanEntry(\"cha\", \"ちゃ\", 0),\r\n    new RomanEntry(\"chi\", \"ち\", 0),\r\n    new RomanEntry(\"chu\", \"ちゅ\", 0),\r\n    new RomanEntry(\"che\", \"ちぇ\", 0),\r\n    new RomanEntry(\"cho\", \"ちょ\", 0),\r\n    new RomanEntry(\"cya\", \"ちゃ\", 0),\r\n    new RomanEntry(\"cyi\", \"ちぃ\", 0),\r\n    new RomanEntry(\"cyu\", \"ちゅ\", 0),\r\n    new RomanEntry(\"cye\", \"ちぇ\", 0),\r\n    new RomanEntry(\"cyo\", \"ちょ\", 0),\r\n    new RomanEntry(\"dya\", \"ぢゃ\", 0),\r\n    new RomanEntry(\"dyi\", \"ぢぃ\", 0),\r\n    new RomanEntry(\"dyu\", \"ぢゅ\", 0),\r\n    new RomanEntry(\"dye\", \"ぢぇ\", 0),\r\n    new RomanEntry(\"dyo\", \"ぢょ\", 0),\r\n    new RomanEntry(\"tsa\", \"つぁ\", 0),\r\n    new RomanEntry(\"tsi\", \"つぃ\", 0),\r\n    new RomanEntry(\"tse\", \"つぇ\", 0),\r\n    new RomanEntry(\"tso\", \"つぉ\", 0),\r\n    new RomanEntry(\"tha\", \"てゃ\", 0),\r\n    new RomanEntry(\"thi\", \"てぃ\", 0),\r\n    new RomanEntry(\"t'i\", \"てぃ\", 0),\r\n    new RomanEntry(\"thu\", \"てゅ\", 0),\r\n    new RomanEntry(\"the\", \"てぇ\", 0),\r\n    new RomanEntry(\"tho\", \"てょ\", 0),\r\n    new RomanEntry(\"t'yu\", \"てゅ\", 0),\r\n    new RomanEntry(\"dha\", \"でゃ\", 0),\r\n    new RomanEntry(\"dhi\", \"でぃ\", 0),\r\n    new RomanEntry(\"d'i\", \"でぃ\", 0),\r\n    new RomanEntry(\"dhu\", \"でゅ\", 0),\r\n    new RomanEntry(\"dhe\", \"でぇ\", 0),\r\n    new RomanEntry(\"dho\", \"でょ\", 0),\r\n    new RomanEntry(\"d'yu\", \"でゅ\", 0),\r\n    new RomanEntry(\"twa\", \"とぁ\", 0),\r\n    new RomanEntry(\"twi\", \"とぃ\", 0),\r\n    new RomanEntry(\"twu\", \"とぅ\", 0),\r\n    new RomanEntry(\"twe\", \"とぇ\", 0),\r\n    new RomanEntry(\"two\", \"とぉ\", 0),\r\n    new RomanEntry(\"t'u\", \"とぅ\", 0),\r\n    new RomanEntry(\"dwa\", \"どぁ\", 0),\r\n    new RomanEntry(\"dwi\", \"どぃ\", 0),\r\n    new RomanEntry(\"dwu\", \"どぅ\", 0),\r\n    new RomanEntry(\"dwe\", \"どぇ\", 0),\r\n    new RomanEntry(\"dwo\", \"どぉ\", 0),\r\n    new RomanEntry(\"d'u\", \"どぅ\", 0),\r\n    new RomanEntry(\"nya\", \"にゃ\", 0),\r\n    new RomanEntry(\"nyi\", \"にぃ\", 0),\r\n    new RomanEntry(\"nyu\", \"にゅ\", 0),\r\n    new RomanEntry(\"nye\", \"にぇ\", 0),\r\n    new RomanEntry(\"nyo\", \"にょ\", 0),\r\n    new RomanEntry(\"hya\", \"ひゃ\", 0),\r\n    new RomanEntry(\"hyi\", \"ひぃ\", 0),\r\n    new RomanEntry(\"hyu\", \"ひゅ\", 0),\r\n    new RomanEntry(\"hye\", \"ひぇ\", 0),\r\n    new RomanEntry(\"hyo\", \"ひょ\", 0),\r\n    new RomanEntry(\"bya\", \"びゃ\", 0),\r\n    new RomanEntry(\"byi\", \"びぃ\", 0),\r\n    new RomanEntry(\"byu\", \"びゅ\", 0),\r\n    new RomanEntry(\"bye\", \"びぇ\", 0),\r\n    new RomanEntry(\"byo\", \"びょ\", 0),\r\n    new RomanEntry(\"pya\", \"ぴゃ\", 0),\r\n    new RomanEntry(\"pyi\", \"ぴぃ\", 0),\r\n    new RomanEntry(\"pyu\", \"ぴゅ\", 0),\r\n    new RomanEntry(\"pye\", \"ぴぇ\", 0),\r\n    new RomanEntry(\"pyo\", \"ぴょ\", 0),\r\n    new RomanEntry(\"fa\", \"ふぁ\", 0),\r\n    new RomanEntry(\"fi\", \"ふぃ\", 0),\r\n    new RomanEntry(\"fu\", \"ふ\", 0),\r\n    new RomanEntry(\"fe\", \"ふぇ\", 0),\r\n    new RomanEntry(\"fo\", \"ふぉ\", 0),\r\n    new RomanEntry(\"fya\", \"ふゃ\", 0),\r\n    new RomanEntry(\"fyu\", \"ふゅ\", 0),\r\n    new RomanEntry(\"fyo\", \"ふょ\", 0),\r\n    new RomanEntry(\"hwa\", \"ふぁ\", 0),\r\n    new RomanEntry(\"hwi\", \"ふぃ\", 0),\r\n    new RomanEntry(\"hwe\", \"ふぇ\", 0),\r\n    new RomanEntry(\"hwo\", \"ふぉ\", 0),\r\n    new RomanEntry(\"hwyu\", \"ふゅ\", 0),\r\n    new RomanEntry(\"mya\", \"みゃ\", 0),\r\n    new RomanEntry(\"myi\", \"みぃ\", 0),\r\n    new RomanEntry(\"myu\", \"みゅ\", 0),\r\n    new RomanEntry(\"mye\", \"みぇ\", 0),\r\n    new RomanEntry(\"myo\", \"みょ\", 0),\r\n    new RomanEntry(\"rya\", \"りゃ\", 0),\r\n    new RomanEntry(\"ryi\", \"りぃ\", 0),\r\n    new RomanEntry(\"ryu\", \"りゅ\", 0),\r\n    new RomanEntry(\"rye\", \"りぇ\", 0),\r\n    new RomanEntry(\"ryo\", \"りょ\", 0),\r\n    new RomanEntry(\"n'\", \"ん\", 0),\r\n    new RomanEntry(\"nn\", \"ん\", 0),\r\n    new RomanEntry(\"n\", \"ん\", 0),\r\n    new RomanEntry(\"xn\", \"ん\", 0),\r\n    new RomanEntry(\"a\", \"あ\", 0),\r\n    new RomanEntry(\"i\", \"い\", 0),\r\n    new RomanEntry(\"u\", \"う\", 0),\r\n    new RomanEntry(\"wu\", \"う\", 0),\r\n    new RomanEntry(\"e\", \"え\", 0),\r\n    new RomanEntry(\"o\", \"お\", 0),\r\n    new RomanEntry(\"xa\", \"ぁ\", 0),\r\n    new RomanEntry(\"xi\", \"ぃ\", 0),\r\n    new RomanEntry(\"xu\", \"ぅ\", 0),\r\n    new RomanEntry(\"xe\", \"ぇ\", 0),\r\n    new RomanEntry(\"xo\", \"ぉ\", 0),\r\n    new RomanEntry(\"la\", \"ぁ\", 0),\r\n    new RomanEntry(\"li\", \"ぃ\", 0),\r\n    new RomanEntry(\"lu\", \"ぅ\", 0),\r\n    new RomanEntry(\"le\", \"ぇ\", 0),\r\n    new RomanEntry(\"lo\", \"ぉ\", 0),\r\n    new RomanEntry(\"lyi\", \"ぃ\", 0),\r\n    new RomanEntry(\"xyi\", \"ぃ\", 0),\r\n    new RomanEntry(\"lye\", \"ぇ\", 0),\r\n    new RomanEntry(\"xye\", \"ぇ\", 0),\r\n    new RomanEntry(\"ye\", \"いぇ\", 0),\r\n    new RomanEntry(\"ka\", \"か\", 0),\r\n    new RomanEntry(\"ki\", \"き\", 0),\r\n    new RomanEntry(\"ku\", \"く\", 0),\r\n    new RomanEntry(\"ke\", \"け\", 0),\r\n    new RomanEntry(\"ko\", \"こ\", 0),\r\n    new RomanEntry(\"xka\", \"ヵ\", 0),\r\n    new RomanEntry(\"xke\", \"ヶ\", 0),\r\n    new RomanEntry(\"lka\", \"ヵ\", 0),\r\n    new RomanEntry(\"lke\", \"ヶ\", 0),\r\n    new RomanEntry(\"ga\", \"が\", 0),\r\n    new RomanEntry(\"gi\", \"ぎ\", 0),\r\n    new RomanEntry(\"gu\", \"ぐ\", 0),\r\n    new RomanEntry(\"ge\", \"げ\", 0),\r\n    new RomanEntry(\"go\", \"ご\", 0),\r\n    new RomanEntry(\"sa\", \"さ\", 0),\r\n    new RomanEntry(\"si\", \"し\", 0),\r\n    new RomanEntry(\"su\", \"す\", 0),\r\n    new RomanEntry(\"se\", \"せ\", 0),\r\n    new RomanEntry(\"so\", \"そ\", 0),\r\n    new RomanEntry(\"ca\", \"か\", 0),\r\n    new RomanEntry(\"ci\", \"し\", 0),\r\n    new RomanEntry(\"cu\", \"く\", 0),\r\n    new RomanEntry(\"ce\", \"せ\", 0),\r\n    new RomanEntry(\"co\", \"こ\", 0),\r\n    new RomanEntry(\"qa\", \"くぁ\", 0),\r\n    new RomanEntry(\"qi\", \"くぃ\", 0),\r\n    new RomanEntry(\"qu\", \"く\", 0),\r\n    new RomanEntry(\"qe\", \"くぇ\", 0),\r\n    new RomanEntry(\"qo\", \"くぉ\", 0),\r\n    new RomanEntry(\"kwa\", \"くぁ\", 0),\r\n    new RomanEntry(\"kwi\", \"くぃ\", 0),\r\n    new RomanEntry(\"kwu\", \"くぅ\", 0),\r\n    new RomanEntry(\"kwe\", \"くぇ\", 0),\r\n    new RomanEntry(\"kwo\", \"くぉ\", 0),\r\n    new RomanEntry(\"gwa\", \"ぐぁ\", 0),\r\n    new RomanEntry(\"gwi\", \"ぐぃ\", 0),\r\n    new RomanEntry(\"gwu\", \"ぐぅ\", 0),\r\n    new RomanEntry(\"gwe\", \"ぐぇ\", 0),\r\n    new RomanEntry(\"gwo\", \"ぐぉ\", 0),\r\n    new RomanEntry(\"za\", \"ざ\", 0),\r\n    new RomanEntry(\"zi\", \"じ\", 0),\r\n    new RomanEntry(\"zu\", \"ず\", 0),\r\n    new RomanEntry(\"ze\", \"ぜ\", 0),\r\n    new RomanEntry(\"zo\", \"ぞ\", 0),\r\n    new RomanEntry(\"ja\", \"じゃ\", 0),\r\n    new RomanEntry(\"ji\", \"じ\", 0),\r\n    new RomanEntry(\"ju\", \"じゅ\", 0),\r\n    new RomanEntry(\"je\", \"じぇ\", 0),\r\n    new RomanEntry(\"jo\", \"じょ\", 0),\r\n    new RomanEntry(\"jya\", \"じゃ\", 0),\r\n    new RomanEntry(\"jyi\", \"じぃ\", 0),\r\n    new RomanEntry(\"jyu\", \"じゅ\", 0),\r\n    new RomanEntry(\"jye\", \"じぇ\", 0),\r\n    new RomanEntry(\"jyo\", \"じょ\", 0),\r\n    new RomanEntry(\"ta\", \"た\", 0),\r\n    new RomanEntry(\"ti\", \"ち\", 0),\r\n    new RomanEntry(\"tu\", \"つ\", 0),\r\n    new RomanEntry(\"tsu\", \"つ\", 0),\r\n    new RomanEntry(\"te\", \"て\", 0),\r\n    new RomanEntry(\"to\", \"と\", 0),\r\n    new RomanEntry(\"da\", \"だ\", 0),\r\n    new RomanEntry(\"di\", \"ぢ\", 0),\r\n    new RomanEntry(\"du\", \"づ\", 0),\r\n    new RomanEntry(\"de\", \"で\", 0),\r\n    new RomanEntry(\"do\", \"ど\", 0),\r\n    new RomanEntry(\"xtu\", \"っ\", 0),\r\n    new RomanEntry(\"xtsu\", \"っ\", 0),\r\n    new RomanEntry(\"ltu\", \"っ\", 0),\r\n    new RomanEntry(\"ltsu\", \"っ\", 0),\r\n    new RomanEntry(\"na\", \"な\", 0),\r\n    new RomanEntry(\"ni\", \"に\", 0),\r\n    new RomanEntry(\"nu\", \"ぬ\", 0),\r\n    new RomanEntry(\"ne\", \"ね\", 0),\r\n    new RomanEntry(\"no\", \"の\", 0),\r\n    new RomanEntry(\"ha\", \"は\", 0),\r\n    new RomanEntry(\"hi\", \"ひ\", 0),\r\n    new RomanEntry(\"hu\", \"ふ\", 0),\r\n    new RomanEntry(\"fu\", \"ふ\", 0),\r\n    new RomanEntry(\"he\", \"へ\", 0),\r\n    new RomanEntry(\"ho\", \"ほ\", 0),\r\n    new RomanEntry(\"ba\", \"ば\", 0),\r\n    new RomanEntry(\"bi\", \"び\", 0),\r\n    new RomanEntry(\"bu\", \"ぶ\", 0),\r\n    new RomanEntry(\"be\", \"べ\", 0),\r\n    new RomanEntry(\"bo\", \"ぼ\", 0),\r\n    new RomanEntry(\"pa\", \"ぱ\", 0),\r\n    new RomanEntry(\"pi\", \"ぴ\", 0),\r\n    new RomanEntry(\"pu\", \"ぷ\", 0),\r\n    new RomanEntry(\"pe\", \"ぺ\", 0),\r\n    new RomanEntry(\"po\", \"ぽ\", 0),\r\n    new RomanEntry(\"ma\", \"ま\", 0),\r\n    new RomanEntry(\"mi\", \"み\", 0),\r\n    new RomanEntry(\"mu\", \"む\", 0),\r\n    new RomanEntry(\"me\", \"め\", 0),\r\n    new RomanEntry(\"mo\", \"も\", 0),\r\n    new RomanEntry(\"xya\", \"ゃ\", 0),\r\n    new RomanEntry(\"lya\", \"ゃ\", 0),\r\n    new RomanEntry(\"ya\", \"や\", 0),\r\n    new RomanEntry(\"wyi\", \"ゐ\", 0),\r\n    new RomanEntry(\"xyu\", \"ゅ\", 0),\r\n    new RomanEntry(\"lyu\", \"ゅ\", 0),\r\n    new RomanEntry(\"yu\", \"ゆ\", 0),\r\n    new RomanEntry(\"wye\", \"ゑ\", 0),\r\n    new RomanEntry(\"xyo\", \"ょ\", 0),\r\n    new RomanEntry(\"lyo\", \"ょ\", 0),\r\n    new RomanEntry(\"yo\", \"よ\", 0),\r\n    new RomanEntry(\"ra\", \"ら\", 0),\r\n    new RomanEntry(\"ri\", \"り\", 0),\r\n    new RomanEntry(\"ru\", \"る\", 0),\r\n    new RomanEntry(\"re\", \"れ\", 0),\r\n    new RomanEntry(\"ro\", \"ろ\", 0),\r\n    new RomanEntry(\"xwa\", \"ゎ\", 0),\r\n    new RomanEntry(\"lwa\", \"ゎ\", 0),\r\n    new RomanEntry(\"wa\", \"わ\", 0),\r\n    new RomanEntry(\"wi\", \"うぃ\", 0),\r\n    new RomanEntry(\"we\", \"うぇ\", 0),\r\n    new RomanEntry(\"wo\", \"を\", 0),\r\n    new RomanEntry(\"wha\", \"うぁ\", 0),\r\n    new RomanEntry(\"whi\", \"うぃ\", 0),\r\n    new RomanEntry(\"whu\", \"う\", 0),\r\n    new RomanEntry(\"whe\", \"うぇ\", 0),\r\n    new RomanEntry(\"who\", \"うぉ\", 0)]\r\n    .sort((a,b)=>a.index - b.index);\r\n\r\nexport class RomajiProcessor1 implements RomajiProcessor {\r\n    private roman_indexes: number[] = []\r\n    private roman_entries: RomanEntry[] = []\r\n\r\n    public constructor(entries: RomanEntry[]) {\r\n        this.roman_entries = entries.sort((a,b)=>a.index - b.index);\r\n        this.roman_indexes = this.roman_entries.map(e => e.index);\r\n    }\r\n\r\n    public static build(): RomajiProcessor1 {\r\n        return new RomajiProcessor1(ROMAN_ENTRIES)\r\n    }\r\n\r\n    public romajiToHiragana(romaji: string): string {\r\n        if (romaji.length == 0) {\r\n            return \"\";\r\n        }\r\n        let hiragana = \"\";\r\n        let start = 0;\r\n        let end = 1;\r\n        while (start < romaji.length) {\r\n            let lastFound = -1;\r\n            let lower = 0;\r\n            let upper = this.roman_indexes.length;\r\n            while (upper - lower > 1 && end <= romaji.length) {\r\n                const lowerKey = RomanEntry._calculateIndex(romaji, start, end);\r\n                lower = binarySearch(this.roman_indexes, lower, upper, lowerKey);\r\n                if (lower >= 0) {\r\n                    lastFound = lower;\r\n                } else {\r\n                    lower = -lower - 1;\r\n                }\r\n                const upperKey = lowerKey + (1 << (32 - 8 * (end - start)));\r\n                upper = binarySearch(this.roman_indexes, lower, upper, upperKey);\r\n                if (upper < 0) {\r\n                    upper = -upper - 1;\r\n                }\r\n                end++;\r\n            }\r\n            if (lastFound >= 0) {\r\n                const entry = this.roman_entries[lastFound];\r\n                hiragana = hiragana + entry.hiragana;\r\n                start = start + entry.roman.length - entry.remain;\r\n                end = start + 1;\r\n            } else {\r\n                hiragana = hiragana + romaji.charAt(start);\r\n                start++;\r\n                end = start + 1;\r\n            }\r\n        }\r\n        return hiragana;\r\n    }\r\n\r\n    public findRomanEntryPredicatively(roman: string, offset: number): Set<RomanEntry>  {\r\n        let lastFound = -1;\r\n        let startIndex = 0;\r\n        let endIndex = this.roman_indexes.length;\r\n        for (let i = 0; i < 4; i++) {\r\n            if (roman.length <= offset + i) {\r\n                break;\r\n            }\r\n            const startKey = RomanEntry._calculateIndex(roman, offset, offset + i + 1);\r\n            startIndex = binarySearch(this.roman_indexes, startIndex, endIndex, startKey);\r\n            if (startIndex >= 0) {\r\n                lastFound = startIndex;\r\n            } else {\r\n                startIndex = -startIndex - 1;\r\n            }\r\n            const endKey = startKey + (1 << (24 - 8 * i));\r\n            endIndex = binarySearch(this.roman_indexes, startIndex, endIndex, endKey);\r\n            if (endIndex < 0) {\r\n                endIndex = -endIndex - 1;\r\n            }\r\n            if (endIndex - startIndex == 1) {\r\n                return new Set([this.roman_entries[startIndex]]);\r\n            }\r\n        }\r\n        const result = new Set<RomanEntry>();\r\n        for (let i = startIndex; i < endIndex; i++) {\r\n            result.add(this.roman_entries[i]);\r\n        }\r\n        return result;\r\n    }\r\n\r\n    public romajiToHiraganaPredictively(romaji: string): RomajiPredictiveResult {\r\n        if (romaji.length == 0) {\r\n            return new RomajiPredictiveResult(\"\", [\"\"]);\r\n        }\r\n        let hiragana = \"\";\r\n        let start = 0;\r\n        let end = 1;\r\n        while (start < romaji.length) {\r\n            let lastFound = -1;\r\n            let lower = 0;\r\n            let upper = this.roman_indexes.length;\r\n            while (upper - lower > 1 && end <= romaji.length) {\r\n                const lowerKey = RomanEntry._calculateIndex(romaji, start, end);\r\n                lower = binarySearch(this.roman_indexes, lower, upper, lowerKey);\r\n                if (lower >= 0) {\r\n                    lastFound = lower;\r\n                } else {\r\n                    lower = -lower - 1;\r\n                }\r\n                const upperKey = lowerKey + (1 << (32 - 8 * (end - start)));\r\n                upper = binarySearch(this.roman_indexes, lower, upper, upperKey);\r\n                if (upper < 0) {\r\n                    upper = -upper - 1;\r\n                }\r\n                end++;\r\n            }\r\n            if (end > romaji.length && upper - lower > 1) {\r\n                const set = new Set<string>();\r\n                for (let i = lower; i < upper; i++) {\r\n                    const re = this.roman_entries[i];\r\n                    if (re.remain > 0) {\r\n                        let set2 = this.findRomanEntryPredicatively(romaji, end - 1 - re.remain);\r\n                        for (let re2 of set2) {\r\n                            if (re2.remain == 0) {\r\n                                set.add(re.hiragana + re2.hiragana);\r\n                            }\r\n                        }\r\n                    } else {\r\n                        set.add(re.hiragana);\r\n                    }\r\n                }\r\n                let list = new Array<string>();\r\n                for (let e of set) {\r\n                    list.push(e);\r\n                }\r\n                if (list.length == 1) {\r\n                    return new RomajiPredictiveResult(hiragana + list[0], [\"\"]);\r\n                } else {\r\n                    return new RomajiPredictiveResult(hiragana, list);\r\n                }\r\n            }\r\n            if (lastFound >= 0) {\r\n                const entry = this.roman_entries[lastFound];\r\n                hiragana = hiragana + entry.hiragana;\r\n                start = start + entry.roman.length - entry.remain;\r\n                end = start + 1;\r\n            } else {\r\n                hiragana = hiragana + romaji.charAt(start);\r\n                start++;\r\n                end = start + 1;\r\n            }\r\n        }\r\n        return new RomajiPredictiveResult(hiragana, [\"\"] );\r\n    }\r\n}"],"mappings":"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,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,KAAM,IAAI,CACX,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC,IAAK,IAAI,CACV,CAAC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AAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAG,CAAC,CAC12E,EAAQ,IAAI,WAAW,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,IAAK,EAAG,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAI,CAAC,CAC3mF,EAAa,IAAI,UAAU,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EA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AAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAA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C5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,KAAM,EAAE,CAC7B,IAAI,EAAW,KAAM,KAAM,EAAE,CAC7B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,KAAM,EAAE,CAC7B,IAAI,EAAW,KAAM,KAAM,EAAE,CAC7B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,KAAM,EAAE,CAC7B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,KAAM,EAAE,CAC7B,IAAI,EAAW,KAAM,KAAM,EAAE,CAC7B,IAAI,EAAW,KAAM,KAAM,EAAE,CAC7B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,OAAQ,IAAK,EAAE,CAC9B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,OAAQ,IAAK,EAAE,CAC9B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,KAAM,KAAM,EAAE,CAC7B,IAAI,EAAW,KAAM,KAAM,EAAE,CAC7B,IAAI,EAAW,KAAM,IAAK,EAAE,CAC5B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,KAAM,EAAE,CAC9B,IAAI,EAAW,MAAO,IAAK,EAAE,CAC7B,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"}