diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-16 19:23:18 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-16 19:23:18 +0000 |
commit | 43a123c1ae6613b3efeed291fa552ecd909d3acf (patch) | |
tree | fd92518b7024bc74031f78a1cf9e454b65e73665 /src/unicode | |
parent | Initial commit. (diff) | |
download | golang-1.20-upstream.tar.xz golang-1.20-upstream.zip |
Adding upstream version 1.20.14.upstream/1.20.14upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | src/unicode/casetables.go | 20 | ||||
-rw-r--r-- | src/unicode/digit.go | 13 | ||||
-rw-r--r-- | src/unicode/digit_test.go | 126 | ||||
-rw-r--r-- | src/unicode/example_test.go | 256 | ||||
-rw-r--r-- | src/unicode/graphic.go | 146 | ||||
-rw-r--r-- | src/unicode/graphic_test.go | 122 | ||||
-rw-r--r-- | src/unicode/letter.go | 371 | ||||
-rw-r--r-- | src/unicode/letter_test.go | 644 | ||||
-rw-r--r-- | src/unicode/script_test.go | 131 | ||||
-rw-r--r-- | src/unicode/tables.go | 8054 | ||||
-rw-r--r-- | src/unicode/utf16/export_test.go | 11 | ||||
-rw-r--r-- | src/unicode/utf16/utf16.go | 125 | ||||
-rw-r--r-- | src/unicode/utf16/utf16_test.go | 236 | ||||
-rw-r--r-- | src/unicode/utf8/example_test.go | 226 | ||||
-rw-r--r-- | src/unicode/utf8/utf8.go | 583 | ||||
-rw-r--r-- | src/unicode/utf8/utf8_test.go | 703 |
16 files changed, 11767 insertions, 0 deletions
diff --git a/src/unicode/casetables.go b/src/unicode/casetables.go new file mode 100644 index 0000000..29bf167 --- /dev/null +++ b/src/unicode/casetables.go @@ -0,0 +1,20 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// TODO: This file contains the special casing rules for Turkish and Azeri only. +// It should encompass all the languages with special casing rules +// and be generated automatically, but that requires some API +// development first. + +package unicode + +var TurkishCase SpecialCase = _TurkishCase +var _TurkishCase = SpecialCase{ + CaseRange{0x0049, 0x0049, d{0, 0x131 - 0x49, 0}}, + CaseRange{0x0069, 0x0069, d{0x130 - 0x69, 0, 0x130 - 0x69}}, + CaseRange{0x0130, 0x0130, d{0, 0x69 - 0x130, 0}}, + CaseRange{0x0131, 0x0131, d{0x49 - 0x131, 0, 0x49 - 0x131}}, +} + +var AzeriCase SpecialCase = _TurkishCase diff --git a/src/unicode/digit.go b/src/unicode/digit.go new file mode 100644 index 0000000..53171b3 --- /dev/null +++ b/src/unicode/digit.go @@ -0,0 +1,13 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unicode + +// IsDigit reports whether the rune is a decimal digit. +func IsDigit(r rune) bool { + if r <= MaxLatin1 { + return '0' <= r && r <= '9' + } + return isExcludingLatin(Digit, r) +} diff --git a/src/unicode/digit_test.go b/src/unicode/digit_test.go new file mode 100644 index 0000000..551c42a --- /dev/null +++ b/src/unicode/digit_test.go @@ -0,0 +1,126 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unicode_test + +import ( + "testing" + . "unicode" +) + +var testDigit = []rune{ + 0x0030, + 0x0039, + 0x0661, + 0x06F1, + 0x07C9, + 0x0966, + 0x09EF, + 0x0A66, + 0x0AEF, + 0x0B66, + 0x0B6F, + 0x0BE6, + 0x0BEF, + 0x0C66, + 0x0CEF, + 0x0D66, + 0x0D6F, + 0x0E50, + 0x0E59, + 0x0ED0, + 0x0ED9, + 0x0F20, + 0x0F29, + 0x1040, + 0x1049, + 0x1090, + 0x1091, + 0x1099, + 0x17E0, + 0x17E9, + 0x1810, + 0x1819, + 0x1946, + 0x194F, + 0x19D0, + 0x19D9, + 0x1B50, + 0x1B59, + 0x1BB0, + 0x1BB9, + 0x1C40, + 0x1C49, + 0x1C50, + 0x1C59, + 0xA620, + 0xA629, + 0xA8D0, + 0xA8D9, + 0xA900, + 0xA909, + 0xAA50, + 0xAA59, + 0xFF10, + 0xFF19, + 0x104A1, + 0x1D7CE, +} + +var testLetter = []rune{ + 0x0041, + 0x0061, + 0x00AA, + 0x00BA, + 0x00C8, + 0x00DB, + 0x00F9, + 0x02EC, + 0x0535, + 0x06E6, + 0x093D, + 0x0A15, + 0x0B99, + 0x0DC0, + 0x0EDD, + 0x1000, + 0x1200, + 0x1312, + 0x1401, + 0x1885, + 0x2C00, + 0xA800, + 0xF900, + 0xFA30, + 0xFFDA, + 0xFFDC, + 0x10000, + 0x10300, + 0x10400, + 0x20000, + 0x2F800, + 0x2FA1D, +} + +func TestDigit(t *testing.T) { + for _, r := range testDigit { + if !IsDigit(r) { + t.Errorf("IsDigit(U+%04X) = false, want true", r) + } + } + for _, r := range testLetter { + if IsDigit(r) { + t.Errorf("IsDigit(U+%04X) = true, want false", r) + } + } +} + +// Test that the special case in IsDigit agrees with the table +func TestDigitOptimization(t *testing.T) { + for i := rune(0); i <= MaxLatin1; i++ { + if Is(Digit, i) != IsDigit(i) { + t.Errorf("IsDigit(U+%04X) disagrees with Is(Digit)", i) + } + } +} diff --git a/src/unicode/example_test.go b/src/unicode/example_test.go new file mode 100644 index 0000000..d3a47ac --- /dev/null +++ b/src/unicode/example_test.go @@ -0,0 +1,256 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unicode_test + +import ( + "fmt" + "unicode" +) + +// Functions starting with "Is" can be used to inspect which table of range a +// rune belongs to. Note that runes may fit into more than one range. +func Example_is() { + + // constant with mixed type runes + const mixed = "\b5Ὂg̀9! ℃ᾭG" + for _, c := range mixed { + fmt.Printf("For %q:\n", c) + if unicode.IsControl(c) { + fmt.Println("\tis control rune") + } + if unicode.IsDigit(c) { + fmt.Println("\tis digit rune") + } + if unicode.IsGraphic(c) { + fmt.Println("\tis graphic rune") + } + if unicode.IsLetter(c) { + fmt.Println("\tis letter rune") + } + if unicode.IsLower(c) { + fmt.Println("\tis lower case rune") + } + if unicode.IsMark(c) { + fmt.Println("\tis mark rune") + } + if unicode.IsNumber(c) { + fmt.Println("\tis number rune") + } + if unicode.IsPrint(c) { + fmt.Println("\tis printable rune") + } + if !unicode.IsPrint(c) { + fmt.Println("\tis not printable rune") + } + if unicode.IsPunct(c) { + fmt.Println("\tis punct rune") + } + if unicode.IsSpace(c) { + fmt.Println("\tis space rune") + } + if unicode.IsSymbol(c) { + fmt.Println("\tis symbol rune") + } + if unicode.IsTitle(c) { + fmt.Println("\tis title case rune") + } + if unicode.IsUpper(c) { + fmt.Println("\tis upper case rune") + } + } + + // Output: + // For '\b': + // is control rune + // is not printable rune + // For '5': + // is digit rune + // is graphic rune + // is number rune + // is printable rune + // For 'Ὂ': + // is graphic rune + // is letter rune + // is printable rune + // is upper case rune + // For 'g': + // is graphic rune + // is letter rune + // is lower case rune + // is printable rune + // For '̀': + // is graphic rune + // is mark rune + // is printable rune + // For '9': + // is digit rune + // is graphic rune + // is number rune + // is printable rune + // For '!': + // is graphic rune + // is printable rune + // is punct rune + // For ' ': + // is graphic rune + // is printable rune + // is space rune + // For '℃': + // is graphic rune + // is printable rune + // is symbol rune + // For 'ᾭ': + // is graphic rune + // is letter rune + // is printable rune + // is title case rune + // For 'G': + // is graphic rune + // is letter rune + // is printable rune + // is upper case rune +} + +func ExampleSimpleFold() { + fmt.Printf("%#U\n", unicode.SimpleFold('A')) // 'a' + fmt.Printf("%#U\n", unicode.SimpleFold('a')) // 'A' + fmt.Printf("%#U\n", unicode.SimpleFold('K')) // 'k' + fmt.Printf("%#U\n", unicode.SimpleFold('k')) // '\u212A' (Kelvin symbol, K) + fmt.Printf("%#U\n", unicode.SimpleFold('\u212A')) // 'K' + fmt.Printf("%#U\n", unicode.SimpleFold('1')) // '1' + + // Output: + // U+0061 'a' + // U+0041 'A' + // U+006B 'k' + // U+212A 'K' + // U+004B 'K' + // U+0031 '1' +} + +func ExampleTo() { + const lcG = 'g' + fmt.Printf("%#U\n", unicode.To(unicode.UpperCase, lcG)) + fmt.Printf("%#U\n", unicode.To(unicode.LowerCase, lcG)) + fmt.Printf("%#U\n", unicode.To(unicode.TitleCase, lcG)) + + const ucG = 'G' + fmt.Printf("%#U\n", unicode.To(unicode.UpperCase, ucG)) + fmt.Printf("%#U\n", unicode.To(unicode.LowerCase, ucG)) + fmt.Printf("%#U\n", unicode.To(unicode.TitleCase, ucG)) + + // Output: + // U+0047 'G' + // U+0067 'g' + // U+0047 'G' + // U+0047 'G' + // U+0067 'g' + // U+0047 'G' +} + +func ExampleToLower() { + const ucG = 'G' + fmt.Printf("%#U\n", unicode.ToLower(ucG)) + + // Output: + // U+0067 'g' +} +func ExampleToTitle() { + const ucG = 'g' + fmt.Printf("%#U\n", unicode.ToTitle(ucG)) + + // Output: + // U+0047 'G' +} + +func ExampleToUpper() { + const ucG = 'g' + fmt.Printf("%#U\n", unicode.ToUpper(ucG)) + + // Output: + // U+0047 'G' +} + +func ExampleSpecialCase() { + t := unicode.TurkishCase + + const lci = 'i' + fmt.Printf("%#U\n", t.ToLower(lci)) + fmt.Printf("%#U\n", t.ToTitle(lci)) + fmt.Printf("%#U\n", t.ToUpper(lci)) + + const uci = 'İ' + fmt.Printf("%#U\n", t.ToLower(uci)) + fmt.Printf("%#U\n", t.ToTitle(uci)) + fmt.Printf("%#U\n", t.ToUpper(uci)) + + // Output: + // U+0069 'i' + // U+0130 'İ' + // U+0130 'İ' + // U+0069 'i' + // U+0130 'İ' + // U+0130 'İ' +} + +func ExampleIsDigit() { + fmt.Printf("%t\n", unicode.IsDigit('৩')) + fmt.Printf("%t\n", unicode.IsDigit('A')) + // Output: + // true + // false +} + +func ExampleIsNumber() { + fmt.Printf("%t\n", unicode.IsNumber('Ⅷ')) + fmt.Printf("%t\n", unicode.IsNumber('A')) + // Output: + // true + // false +} + +func ExampleIsLetter() { + fmt.Printf("%t\n", unicode.IsLetter('A')) + fmt.Printf("%t\n", unicode.IsLetter('7')) + // Output: + // true + // false +} + +func ExampleIsLower() { + fmt.Printf("%t\n", unicode.IsLower('a')) + fmt.Printf("%t\n", unicode.IsLower('A')) + // Output: + // true + // false +} + +func ExampleIsUpper() { + fmt.Printf("%t\n", unicode.IsUpper('A')) + fmt.Printf("%t\n", unicode.IsUpper('a')) + // Output: + // true + // false +} + +func ExampleIsTitle() { + fmt.Printf("%t\n", unicode.IsTitle('Dž')) + fmt.Printf("%t\n", unicode.IsTitle('a')) + // Output: + // true + // false +} + +func ExampleIsSpace() { + fmt.Printf("%t\n", unicode.IsSpace(' ')) + fmt.Printf("%t\n", unicode.IsSpace('\n')) + fmt.Printf("%t\n", unicode.IsSpace('\t')) + fmt.Printf("%t\n", unicode.IsSpace('a')) + // Output: + // true + // true + // true + // false +} diff --git a/src/unicode/graphic.go b/src/unicode/graphic.go new file mode 100644 index 0000000..2af2977 --- /dev/null +++ b/src/unicode/graphic.go @@ -0,0 +1,146 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unicode + +// Bit masks for each code point under U+0100, for fast lookup. +const ( + pC = 1 << iota // a control character. + pP // a punctuation character. + pN // a numeral. + pS // a symbolic character. + pZ // a spacing character. + pLu // an upper-case letter. + pLl // a lower-case letter. + pp // a printable character according to Go's definition. + pg = pp | pZ // a graphical character according to the Unicode definition. + pLo = pLl | pLu // a letter that is neither upper nor lower case. + pLmask = pLo +) + +// GraphicRanges defines the set of graphic characters according to Unicode. +var GraphicRanges = []*RangeTable{ + L, M, N, P, S, Zs, +} + +// PrintRanges defines the set of printable characters according to Go. +// ASCII space, U+0020, is handled separately. +var PrintRanges = []*RangeTable{ + L, M, N, P, S, +} + +// IsGraphic reports whether the rune is defined as a Graphic by Unicode. +// Such characters include letters, marks, numbers, punctuation, symbols, and +// spaces, from categories L, M, N, P, S, Zs. +func IsGraphic(r rune) bool { + // We convert to uint32 to avoid the extra test for negative, + // and in the index we convert to uint8 to avoid the range check. + if uint32(r) <= MaxLatin1 { + return properties[uint8(r)]&pg != 0 + } + return In(r, GraphicRanges...) +} + +// IsPrint reports whether the rune is defined as printable by Go. Such +// characters include letters, marks, numbers, punctuation, symbols, and the +// ASCII space character, from categories L, M, N, P, S and the ASCII space +// character. This categorization is the same as IsGraphic except that the +// only spacing character is ASCII space, U+0020. +func IsPrint(r rune) bool { + if uint32(r) <= MaxLatin1 { + return properties[uint8(r)]&pp != 0 + } + return In(r, PrintRanges...) +} + +// IsOneOf reports whether the rune is a member of one of the ranges. +// The function "In" provides a nicer signature and should be used in preference to IsOneOf. +func IsOneOf(ranges []*RangeTable, r rune) bool { + for _, inside := range ranges { + if Is(inside, r) { + return true + } + } + return false +} + +// In reports whether the rune is a member of one of the ranges. +func In(r rune, ranges ...*RangeTable) bool { + for _, inside := range ranges { + if Is(inside, r) { + return true + } + } + return false +} + +// IsControl reports whether the rune is a control character. +// The C (Other) Unicode category includes more code points +// such as surrogates; use Is(C, r) to test for them. +func IsControl(r rune) bool { + if uint32(r) <= MaxLatin1 { + return properties[uint8(r)]&pC != 0 + } + // All control characters are < MaxLatin1. + return false +} + +// IsLetter reports whether the rune is a letter (category L). +func IsLetter(r rune) bool { + if uint32(r) <= MaxLatin1 { + return properties[uint8(r)]&(pLmask) != 0 + } + return isExcludingLatin(Letter, r) +} + +// IsMark reports whether the rune is a mark character (category M). +func IsMark(r rune) bool { + // There are no mark characters in Latin-1. + return isExcludingLatin(Mark, r) +} + +// IsNumber reports whether the rune is a number (category N). +func IsNumber(r rune) bool { + if uint32(r) <= MaxLatin1 { + return properties[uint8(r)]&pN != 0 + } + return isExcludingLatin(Number, r) +} + +// IsPunct reports whether the rune is a Unicode punctuation character +// (category P). +func IsPunct(r rune) bool { + if uint32(r) <= MaxLatin1 { + return properties[uint8(r)]&pP != 0 + } + return Is(Punct, r) +} + +// IsSpace reports whether the rune is a space character as defined +// by Unicode's White Space property; in the Latin-1 space +// this is +// +// '\t', '\n', '\v', '\f', '\r', ' ', U+0085 (NEL), U+00A0 (NBSP). +// +// Other definitions of spacing characters are set by category +// Z and property Pattern_White_Space. +func IsSpace(r rune) bool { + // This property isn't the same as Z; special-case it. + if uint32(r) <= MaxLatin1 { + switch r { + case '\t', '\n', '\v', '\f', '\r', ' ', 0x85, 0xA0: + return true + } + return false + } + return isExcludingLatin(White_Space, r) +} + +// IsSymbol reports whether the rune is a symbolic character. +func IsSymbol(r rune) bool { + if uint32(r) <= MaxLatin1 { + return properties[uint8(r)]&pS != 0 + } + return isExcludingLatin(Symbol, r) +} diff --git a/src/unicode/graphic_test.go b/src/unicode/graphic_test.go new file mode 100644 index 0000000..c9f289c --- /dev/null +++ b/src/unicode/graphic_test.go @@ -0,0 +1,122 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unicode_test + +import ( + "testing" + . "unicode" +) + +// Independently check that the special "Is" functions work +// in the Latin-1 range through the property table. + +func TestIsControlLatin1(t *testing.T) { + for i := rune(0); i <= MaxLatin1; i++ { + got := IsControl(i) + want := false + switch { + case 0x00 <= i && i <= 0x1F: + want = true + case 0x7F <= i && i <= 0x9F: + want = true + } + if got != want { + t.Errorf("%U incorrect: got %t; want %t", i, got, want) + } + } +} + +func TestIsLetterLatin1(t *testing.T) { + for i := rune(0); i <= MaxLatin1; i++ { + got := IsLetter(i) + want := Is(Letter, i) + if got != want { + t.Errorf("%U incorrect: got %t; want %t", i, got, want) + } + } +} + +func TestIsUpperLatin1(t *testing.T) { + for i := rune(0); i <= MaxLatin1; i++ { + got := IsUpper(i) + want := Is(Upper, i) + if got != want { + t.Errorf("%U incorrect: got %t; want %t", i, got, want) + } + } +} + +func TestIsLowerLatin1(t *testing.T) { + for i := rune(0); i <= MaxLatin1; i++ { + got := IsLower(i) + want := Is(Lower, i) + if got != want { + t.Errorf("%U incorrect: got %t; want %t", i, got, want) + } + } +} + +func TestNumberLatin1(t *testing.T) { + for i := rune(0); i <= MaxLatin1; i++ { + got := IsNumber(i) + want := Is(Number, i) + if got != want { + t.Errorf("%U incorrect: got %t; want %t", i, got, want) + } + } +} + +func TestIsPrintLatin1(t *testing.T) { + for i := rune(0); i <= MaxLatin1; i++ { + got := IsPrint(i) + want := In(i, PrintRanges...) + if i == ' ' { + want = true + } + if got != want { + t.Errorf("%U incorrect: got %t; want %t", i, got, want) + } + } +} + +func TestIsGraphicLatin1(t *testing.T) { + for i := rune(0); i <= MaxLatin1; i++ { + got := IsGraphic(i) + want := In(i, GraphicRanges...) + if got != want { + t.Errorf("%U incorrect: got %t; want %t", i, got, want) + } + } +} + +func TestIsPunctLatin1(t *testing.T) { + for i := rune(0); i <= MaxLatin1; i++ { + got := IsPunct(i) + want := Is(Punct, i) + if got != want { + t.Errorf("%U incorrect: got %t; want %t", i, got, want) + } + } +} + +func TestIsSpaceLatin1(t *testing.T) { + for i := rune(0); i <= MaxLatin1; i++ { + got := IsSpace(i) + want := Is(White_Space, i) + if got != want { + t.Errorf("%U incorrect: got %t; want %t", i, got, want) + } + } +} + +func TestIsSymbolLatin1(t *testing.T) { + for i := rune(0); i <= MaxLatin1; i++ { + got := IsSymbol(i) + want := Is(Symbol, i) + if got != want { + t.Errorf("%U incorrect: got %t; want %t", i, got, want) + } + } +} diff --git a/src/unicode/letter.go b/src/unicode/letter.go new file mode 100644 index 0000000..f3f8e52 --- /dev/null +++ b/src/unicode/letter.go @@ -0,0 +1,371 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package unicode provides data and functions to test some properties of +// Unicode code points. +package unicode + +const ( + MaxRune = '\U0010FFFF' // Maximum valid Unicode code point. + ReplacementChar = '\uFFFD' // Represents invalid code points. + MaxASCII = '\u007F' // maximum ASCII value. + MaxLatin1 = '\u00FF' // maximum Latin-1 value. +) + +// RangeTable defines a set of Unicode code points by listing the ranges of +// code points within the set. The ranges are listed in two slices +// to save space: a slice of 16-bit ranges and a slice of 32-bit ranges. +// The two slices must be in sorted order and non-overlapping. +// Also, R32 should contain only values >= 0x10000 (1<<16). +type RangeTable struct { + R16 []Range16 + R32 []Range32 + LatinOffset int // number of entries in R16 with Hi <= MaxLatin1 +} + +// Range16 represents of a range of 16-bit Unicode code points. The range runs from Lo to Hi +// inclusive and has the specified stride. +type Range16 struct { + Lo uint16 + Hi uint16 + Stride uint16 +} + +// Range32 represents of a range of Unicode code points and is used when one or +// more of the values will not fit in 16 bits. The range runs from Lo to Hi +// inclusive and has the specified stride. Lo and Hi must always be >= 1<<16. +type Range32 struct { + Lo uint32 + Hi uint32 + Stride uint32 +} + +// CaseRange represents a range of Unicode code points for simple (one +// code point to one code point) case conversion. +// The range runs from Lo to Hi inclusive, with a fixed stride of 1. Deltas +// are the number to add to the code point to reach the code point for a +// different case for that character. They may be negative. If zero, it +// means the character is in the corresponding case. There is a special +// case representing sequences of alternating corresponding Upper and Lower +// pairs. It appears with a fixed Delta of +// +// {UpperLower, UpperLower, UpperLower} +// +// The constant UpperLower has an otherwise impossible delta value. +type CaseRange struct { + Lo uint32 + Hi uint32 + Delta d +} + +// SpecialCase represents language-specific case mappings such as Turkish. +// Methods of SpecialCase customize (by overriding) the standard mappings. +type SpecialCase []CaseRange + +// BUG(r): There is no mechanism for full case folding, that is, for +// characters that involve multiple runes in the input or output. + +// Indices into the Delta arrays inside CaseRanges for case mapping. +const ( + UpperCase = iota + LowerCase + TitleCase + MaxCase +) + +type d [MaxCase]rune // to make the CaseRanges text shorter + +// If the Delta field of a CaseRange is UpperLower, it means +// this CaseRange represents a sequence of the form (say) +// Upper Lower Upper Lower. +const ( + UpperLower = MaxRune + 1 // (Cannot be a valid delta.) +) + +// linearMax is the maximum size table for linear search for non-Latin1 rune. +// Derived by running 'go test -calibrate'. +const linearMax = 18 + +// is16 reports whether r is in the sorted slice of 16-bit ranges. +func is16(ranges []Range16, r uint16) bool { + if len(ranges) <= linearMax || r <= MaxLatin1 { + for i := range ranges { + range_ := &ranges[i] + if r < range_.Lo { + return false + } + if r <= range_.Hi { + return range_.Stride == 1 || (r-range_.Lo)%range_.Stride == 0 + } + } + return false + } + + // binary search over ranges + lo := 0 + hi := len(ranges) + for lo < hi { + m := lo + (hi-lo)/2 + range_ := &ranges[m] + if range_.Lo <= r && r <= range_.Hi { + return range_.Stride == 1 || (r-range_.Lo)%range_.Stride == 0 + } + if r < range_.Lo { + hi = m + } else { + lo = m + 1 + } + } + return false +} + +// is32 reports whether r is in the sorted slice of 32-bit ranges. +func is32(ranges []Range32, r uint32) bool { + if len(ranges) <= linearMax { + for i := range ranges { + range_ := &ranges[i] + if r < range_.Lo { + return false + } + if r <= range_.Hi { + return range_.Stride == 1 || (r-range_.Lo)%range_.Stride == 0 + } + } + return false + } + + // binary search over ranges + lo := 0 + hi := len(ranges) + for lo < hi { + m := lo + (hi-lo)/2 + range_ := ranges[m] + if range_.Lo <= r && r <= range_.Hi { + return range_.Stride == 1 || (r-range_.Lo)%range_.Stride == 0 + } + if r < range_.Lo { + hi = m + } else { + lo = m + 1 + } + } + return false +} + +// Is reports whether the rune is in the specified table of ranges. +func Is(rangeTab *RangeTable, r rune) bool { + r16 := rangeTab.R16 + // Compare as uint32 to correctly handle negative runes. + if len(r16) > 0 && uint32(r) <= uint32(r16[len(r16)-1].Hi) { + return is16(r16, uint16(r)) + } + r32 := rangeTab.R32 + if len(r32) > 0 && r >= rune(r32[0].Lo) { + return is32(r32, uint32(r)) + } + return false +} + +func isExcludingLatin(rangeTab *RangeTable, r rune) bool { + r16 := rangeTab.R16 + // Compare as uint32 to correctly handle negative runes. + if off := rangeTab.LatinOffset; len(r16) > off && uint32(r) <= uint32(r16[len(r16)-1].Hi) { + return is16(r16[off:], uint16(r)) + } + r32 := rangeTab.R32 + if len(r32) > 0 && r >= rune(r32[0].Lo) { + return is32(r32, uint32(r)) + } + return false +} + +// IsUpper reports whether the rune is an upper case letter. +func IsUpper(r rune) bool { + // See comment in IsGraphic. + if uint32(r) <= MaxLatin1 { + return properties[uint8(r)]&pLmask == pLu + } + return isExcludingLatin(Upper, r) +} + +// IsLower reports whether the rune is a lower case letter. +func IsLower(r rune) bool { + // See comment in IsGraphic. + if uint32(r) <= MaxLatin1 { + return properties[uint8(r)]&pLmask == pLl + } + return isExcludingLatin(Lower, r) +} + +// IsTitle reports whether the rune is a title case letter. +func IsTitle(r rune) bool { + if r <= MaxLatin1 { + return false + } + return isExcludingLatin(Title, r) +} + +// to maps the rune using the specified case mapping. +// It additionally reports whether caseRange contained a mapping for r. +func to(_case int, r rune, caseRange []CaseRange) (mappedRune rune, foundMapping bool) { + if _case < 0 || MaxCase <= _case { + return ReplacementChar, false // as reasonable an error as any + } + // binary search over ranges + lo := 0 + hi := len(caseRange) + for lo < hi { + m := lo + (hi-lo)/2 + cr := caseRange[m] + if rune(cr.Lo) <= r && r <= rune(cr.Hi) { + delta := cr.Delta[_case] + if delta > MaxRune { + // In an Upper-Lower sequence, which always starts with + // an UpperCase letter, the real deltas always look like: + // {0, 1, 0} UpperCase (Lower is next) + // {-1, 0, -1} LowerCase (Upper, Title are previous) + // The characters at even offsets from the beginning of the + // sequence are upper case; the ones at odd offsets are lower. + // The correct mapping can be done by clearing or setting the low + // bit in the sequence offset. + // The constants UpperCase and TitleCase are even while LowerCase + // is odd so we take the low bit from _case. + return rune(cr.Lo) + ((r-rune(cr.Lo))&^1 | rune(_case&1)), true + } + return r + delta, true + } + if r < rune(cr.Lo) { + hi = m + } else { + lo = m + 1 + } + } + return r, false +} + +// To maps the rune to the specified case: UpperCase, LowerCase, or TitleCase. +func To(_case int, r rune) rune { + r, _ = to(_case, r, CaseRanges) + return r +} + +// ToUpper maps the rune to upper case. +func ToUpper(r rune) rune { + if r <= MaxASCII { + if 'a' <= r && r <= 'z' { + r -= 'a' - 'A' + } + return r + } + return To(UpperCase, r) +} + +// ToLower maps the rune to lower case. +func ToLower(r rune) rune { + if r <= MaxASCII { + if 'A' <= r && r <= 'Z' { + r += 'a' - 'A' + } + return r + } + return To(LowerCase, r) +} + +// ToTitle maps the rune to title case. +func ToTitle(r rune) rune { + if r <= MaxASCII { + if 'a' <= r && r <= 'z' { // title case is upper case for ASCII + r -= 'a' - 'A' + } + return r + } + return To(TitleCase, r) +} + +// ToUpper maps the rune to upper case giving priority to the special mapping. +func (special SpecialCase) ToUpper(r rune) rune { + r1, hadMapping := to(UpperCase, r, []CaseRange(special)) + if r1 == r && !hadMapping { + r1 = ToUpper(r) + } + return r1 +} + +// ToTitle maps the rune to title case giving priority to the special mapping. +func (special SpecialCase) ToTitle(r rune) rune { + r1, hadMapping := to(TitleCase, r, []CaseRange(special)) + if r1 == r && !hadMapping { + r1 = ToTitle(r) + } + return r1 +} + +// ToLower maps the rune to lower case giving priority to the special mapping. +func (special SpecialCase) ToLower(r rune) rune { + r1, hadMapping := to(LowerCase, r, []CaseRange(special)) + if r1 == r && !hadMapping { + r1 = ToLower(r) + } + return r1 +} + +// caseOrbit is defined in tables.go as []foldPair. Right now all the +// entries fit in uint16, so use uint16. If that changes, compilation +// will fail (the constants in the composite literal will not fit in uint16) +// and the types here can change to uint32. +type foldPair struct { + From uint16 + To uint16 +} + +// SimpleFold iterates over Unicode code points equivalent under +// the Unicode-defined simple case folding. Among the code points +// equivalent to rune (including rune itself), SimpleFold returns the +// smallest rune > r if one exists, or else the smallest rune >= 0. +// If r is not a valid Unicode code point, SimpleFold(r) returns r. +// +// For example: +// +// SimpleFold('A') = 'a' +// SimpleFold('a') = 'A' +// +// SimpleFold('K') = 'k' +// SimpleFold('k') = '\u212A' (Kelvin symbol, K) +// SimpleFold('\u212A') = 'K' +// +// SimpleFold('1') = '1' +// +// SimpleFold(-2) = -2 +func SimpleFold(r rune) rune { + if r < 0 || r > MaxRune { + return r + } + + if int(r) < len(asciiFold) { + return rune(asciiFold[r]) + } + + // Consult caseOrbit table for special cases. + lo := 0 + hi := len(caseOrbit) + for lo < hi { + m := lo + (hi-lo)/2 + if rune(caseOrbit[m].From) < r { + lo = m + 1 + } else { + hi = m + } + } + if lo < len(caseOrbit) && rune(caseOrbit[lo].From) == r { + return rune(caseOrbit[lo].To) + } + + // No folding specified. This is a one- or two-element + // equivalence class containing rune and ToLower(rune) + // and ToUpper(rune) if they are different from rune. + if l := ToLower(r); l != r { + return l + } + return ToUpper(r) +} diff --git a/src/unicode/letter_test.go b/src/unicode/letter_test.go new file mode 100644 index 0000000..a91e3a3 --- /dev/null +++ b/src/unicode/letter_test.go @@ -0,0 +1,644 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unicode_test + +import ( + "flag" + "fmt" + "runtime" + "sort" + "strings" + "testing" + . "unicode" +) + +var upperTest = []rune{ + 0x41, + 0xc0, + 0xd8, + 0x100, + 0x139, + 0x14a, + 0x178, + 0x181, + 0x376, + 0x3cf, + 0x13bd, + 0x1f2a, + 0x2102, + 0x2c00, + 0x2c10, + 0x2c20, + 0xa650, + 0xa722, + 0xff3a, + 0x10400, + 0x1d400, + 0x1d7ca, +} + +var notupperTest = []rune{ + 0x40, + 0x5b, + 0x61, + 0x185, + 0x1b0, + 0x377, + 0x387, + 0x2150, + 0xab7d, + 0xffff, + 0x10000, +} + +var letterTest = []rune{ + 0x41, + 0x61, + 0xaa, + 0xba, + 0xc8, + 0xdb, + 0xf9, + 0x2ec, + 0x535, + 0x620, + 0x6e6, + 0x93d, + 0xa15, + 0xb99, + 0xdc0, + 0xedd, + 0x1000, + 0x1200, + 0x1312, + 0x1401, + 0x2c00, + 0xa800, + 0xf900, + 0xfa30, + 0xffda, + 0xffdc, + 0x10000, + 0x10300, + 0x10400, + 0x20000, + 0x2f800, + 0x2fa1d, +} + +var notletterTest = []rune{ + 0x20, + 0x35, + 0x375, + 0x619, + 0x700, + 0x1885, + 0xfffe, + 0x1ffff, + 0x10ffff, +} + +// Contains all the special cased Latin-1 chars. +var spaceTest = []rune{ + 0x09, + 0x0a, + 0x0b, + 0x0c, + 0x0d, + 0x20, + 0x85, + 0xA0, + 0x2000, + 0x3000, +} + +type caseT struct { + cas int + in, out rune +} + +var caseTest = []caseT{ + // errors + {-1, '\n', 0xFFFD}, + {UpperCase, -1, -1}, + {UpperCase, 1 << 30, 1 << 30}, + + // ASCII (special-cased so test carefully) + {UpperCase, '\n', '\n'}, + {UpperCase, 'a', 'A'}, + {UpperCase, 'A', 'A'}, + {UpperCase, '7', '7'}, + {LowerCase, '\n', '\n'}, + {LowerCase, 'a', 'a'}, + {LowerCase, 'A', 'a'}, + {LowerCase, '7', '7'}, + {TitleCase, '\n', '\n'}, + {TitleCase, 'a', 'A'}, + {TitleCase, 'A', 'A'}, + {TitleCase, '7', '7'}, + + // Latin-1: easy to read the tests! + {UpperCase, 0x80, 0x80}, + {UpperCase, 'Å', 'Å'}, + {UpperCase, 'å', 'Å'}, + {LowerCase, 0x80, 0x80}, + {LowerCase, 'Å', 'å'}, + {LowerCase, 'å', 'å'}, + {TitleCase, 0x80, 0x80}, + {TitleCase, 'Å', 'Å'}, + {TitleCase, 'å', 'Å'}, + + // 0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 + {UpperCase, 0x0131, 'I'}, + {LowerCase, 0x0131, 0x0131}, + {TitleCase, 0x0131, 'I'}, + + // 0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 + {UpperCase, 0x0133, 0x0132}, + {LowerCase, 0x0133, 0x0133}, + {TitleCase, 0x0133, 0x0132}, + + // 212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; + {UpperCase, 0x212A, 0x212A}, + {LowerCase, 0x212A, 'k'}, + {TitleCase, 0x212A, 0x212A}, + + // From an UpperLower sequence + // A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641; + {UpperCase, 0xA640, 0xA640}, + {LowerCase, 0xA640, 0xA641}, + {TitleCase, 0xA640, 0xA640}, + // A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640 + {UpperCase, 0xA641, 0xA640}, + {LowerCase, 0xA641, 0xA641}, + {TitleCase, 0xA641, 0xA640}, + // A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F; + {UpperCase, 0xA64E, 0xA64E}, + {LowerCase, 0xA64E, 0xA64F}, + {TitleCase, 0xA64E, 0xA64E}, + // A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E + {UpperCase, 0xA65F, 0xA65E}, + {LowerCase, 0xA65F, 0xA65F}, + {TitleCase, 0xA65F, 0xA65E}, + + // From another UpperLower sequence + // 0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; + {UpperCase, 0x0139, 0x0139}, + {LowerCase, 0x0139, 0x013A}, + {TitleCase, 0x0139, 0x0139}, + // 013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140; + {UpperCase, 0x013f, 0x013f}, + {LowerCase, 0x013f, 0x0140}, + {TitleCase, 0x013f, 0x013f}, + // 0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 + {UpperCase, 0x0148, 0x0147}, + {LowerCase, 0x0148, 0x0148}, + {TitleCase, 0x0148, 0x0147}, + + // Lowercase lower than uppercase. + // AB78;CHEROKEE SMALL LETTER GE;Ll;0;L;;;;;N;;;13A8;;13A8 + {UpperCase, 0xab78, 0x13a8}, + {LowerCase, 0xab78, 0xab78}, + {TitleCase, 0xab78, 0x13a8}, + {UpperCase, 0x13a8, 0x13a8}, + {LowerCase, 0x13a8, 0xab78}, + {TitleCase, 0x13a8, 0x13a8}, + + // Last block in the 5.1.0 table + // 10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; + {UpperCase, 0x10400, 0x10400}, + {LowerCase, 0x10400, 0x10428}, + {TitleCase, 0x10400, 0x10400}, + // 10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F; + {UpperCase, 0x10427, 0x10427}, + {LowerCase, 0x10427, 0x1044F}, + {TitleCase, 0x10427, 0x10427}, + // 10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400 + {UpperCase, 0x10428, 0x10400}, + {LowerCase, 0x10428, 0x10428}, + {TitleCase, 0x10428, 0x10400}, + // 1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427 + {UpperCase, 0x1044F, 0x10427}, + {LowerCase, 0x1044F, 0x1044F}, + {TitleCase, 0x1044F, 0x10427}, + + // First one not in the 5.1.0 table + // 10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;; + {UpperCase, 0x10450, 0x10450}, + {LowerCase, 0x10450, 0x10450}, + {TitleCase, 0x10450, 0x10450}, + + // Non-letters with case. + {LowerCase, 0x2161, 0x2171}, + {UpperCase, 0x0345, 0x0399}, +} + +func TestIsLetter(t *testing.T) { + for _, r := range upperTest { + if !IsLetter(r) { + t.Errorf("IsLetter(U+%04X) = false, want true", r) + } + } + for _, r := range letterTest { + if !IsLetter(r) { + t.Errorf("IsLetter(U+%04X) = false, want true", r) + } + } + for _, r := range notletterTest { + if IsLetter(r) { + t.Errorf("IsLetter(U+%04X) = true, want false", r) + } + } +} + +func TestIsUpper(t *testing.T) { + for _, r := range upperTest { + if !IsUpper(r) { + t.Errorf("IsUpper(U+%04X) = false, want true", r) + } + } + for _, r := range notupperTest { + if IsUpper(r) { + t.Errorf("IsUpper(U+%04X) = true, want false", r) + } + } + for _, r := range notletterTest { + if IsUpper(r) { + t.Errorf("IsUpper(U+%04X) = true, want false", r) + } + } +} + +func caseString(c int) string { + switch c { + case UpperCase: + return "UpperCase" + case LowerCase: + return "LowerCase" + case TitleCase: + return "TitleCase" + } + return "ErrorCase" +} + +func TestTo(t *testing.T) { + for _, c := range caseTest { + r := To(c.cas, c.in) + if c.out != r { + t.Errorf("To(U+%04X, %s) = U+%04X want U+%04X", c.in, caseString(c.cas), r, c.out) + } + } +} + +func TestToUpperCase(t *testing.T) { + for _, c := range caseTest { + if c.cas != UpperCase { + continue + } + r := ToUpper(c.in) + if c.out != r { + t.Errorf("ToUpper(U+%04X) = U+%04X want U+%04X", c.in, r, c.out) + } + } +} + +func TestToLowerCase(t *testing.T) { + for _, c := range caseTest { + if c.cas != LowerCase { + continue + } + r := ToLower(c.in) + if c.out != r { + t.Errorf("ToLower(U+%04X) = U+%04X want U+%04X", c.in, r, c.out) + } + } +} + +func TestToTitleCase(t *testing.T) { + for _, c := range caseTest { + if c.cas != TitleCase { + continue + } + r := ToTitle(c.in) + if c.out != r { + t.Errorf("ToTitle(U+%04X) = U+%04X want U+%04X", c.in, r, c.out) + } + } +} + +func TestIsSpace(t *testing.T) { + for _, c := range spaceTest { + if !IsSpace(c) { + t.Errorf("IsSpace(U+%04X) = false; want true", c) + } + } + for _, c := range letterTest { + if IsSpace(c) { + t.Errorf("IsSpace(U+%04X) = true; want false", c) + } + } +} + +// Check that the optimizations for IsLetter etc. agree with the tables. +// We only need to check the Latin-1 range. +func TestLetterOptimizations(t *testing.T) { + for i := rune(0); i <= MaxLatin1; i++ { + if Is(Letter, i) != IsLetter(i) { + t.Errorf("IsLetter(U+%04X) disagrees with Is(Letter)", i) + } + if Is(Upper, i) != IsUpper(i) { + t.Errorf("IsUpper(U+%04X) disagrees with Is(Upper)", i) + } + if Is(Lower, i) != IsLower(i) { + t.Errorf("IsLower(U+%04X) disagrees with Is(Lower)", i) + } + if Is(Title, i) != IsTitle(i) { + t.Errorf("IsTitle(U+%04X) disagrees with Is(Title)", i) + } + if Is(White_Space, i) != IsSpace(i) { + t.Errorf("IsSpace(U+%04X) disagrees with Is(White_Space)", i) + } + if To(UpperCase, i) != ToUpper(i) { + t.Errorf("ToUpper(U+%04X) disagrees with To(Upper)", i) + } + if To(LowerCase, i) != ToLower(i) { + t.Errorf("ToLower(U+%04X) disagrees with To(Lower)", i) + } + if To(TitleCase, i) != ToTitle(i) { + t.Errorf("ToTitle(U+%04X) disagrees with To(Title)", i) + } + } +} + +func TestTurkishCase(t *testing.T) { + lower := []rune("abcçdefgğhıijklmnoöprsştuüvyz") + upper := []rune("ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ") + for i, l := range lower { + u := upper[i] + if TurkishCase.ToLower(l) != l { + t.Errorf("lower(U+%04X) is U+%04X not U+%04X", l, TurkishCase.ToLower(l), l) + } + if TurkishCase.ToUpper(u) != u { + t.Errorf("upper(U+%04X) is U+%04X not U+%04X", u, TurkishCase.ToUpper(u), u) + } + if TurkishCase.ToUpper(l) != u { + t.Errorf("upper(U+%04X) is U+%04X not U+%04X", l, TurkishCase.ToUpper(l), u) + } + if TurkishCase.ToLower(u) != l { + t.Errorf("lower(U+%04X) is U+%04X not U+%04X", u, TurkishCase.ToLower(l), l) + } + if TurkishCase.ToTitle(u) != u { + t.Errorf("title(U+%04X) is U+%04X not U+%04X", u, TurkishCase.ToTitle(u), u) + } + if TurkishCase.ToTitle(l) != u { + t.Errorf("title(U+%04X) is U+%04X not U+%04X", l, TurkishCase.ToTitle(l), u) + } + } +} + +var simpleFoldTests = []string{ + // SimpleFold(x) returns the next equivalent rune > x or wraps + // around to smaller values. + + // Easy cases. + "Aa", + "δΔ", + + // ASCII special cases. + "KkK", + "Ssſ", + + // Non-ASCII special cases. + "ρϱΡ", + "ͅΙιι", + + // Extra special cases: has lower/upper but no case fold. + "İ", + "ı", + + // Upper comes before lower (Cherokee). + "\u13b0\uab80", +} + +func TestSimpleFold(t *testing.T) { + for _, tt := range simpleFoldTests { + cycle := []rune(tt) + r := cycle[len(cycle)-1] + for _, out := range cycle { + if r := SimpleFold(r); r != out { + t.Errorf("SimpleFold(%#U) = %#U, want %#U", r, r, out) + } + r = out + } + } + + if r := SimpleFold(-42); r != -42 { + t.Errorf("SimpleFold(-42) = %v, want -42", r) + } +} + +// Running 'go test -calibrate' runs the calibration to find a plausible +// cutoff point for linear search of a range list vs. binary search. +// We create a fake table and then time how long it takes to do a +// sequence of searches within that table, for all possible inputs +// relative to the ranges (something before all, in each, between each, after all). +// This assumes that all possible runes are equally likely. +// In practice most runes are ASCII so this is a conservative estimate +// of an effective cutoff value. In practice we could probably set it higher +// than what this function recommends. + +var calibrate = flag.Bool("calibrate", false, "compute crossover for linear vs. binary search") + +func TestCalibrate(t *testing.T) { + if !*calibrate { + return + } + + if runtime.GOARCH == "amd64" { + fmt.Printf("warning: running calibration on %s\n", runtime.GOARCH) + } + + // Find the point where binary search wins by more than 10%. + // The 10% bias gives linear search an edge when they're close, + // because on predominantly ASCII inputs linear search is even + // better than our benchmarks measure. + n := sort.Search(64, func(n int) bool { + tab := fakeTable(n) + blinear := func(b *testing.B) { + tab := tab + max := n*5 + 20 + for i := 0; i < b.N; i++ { + for j := 0; j <= max; j++ { + linear(tab, uint16(j)) + } + } + } + bbinary := func(b *testing.B) { + tab := tab + max := n*5 + 20 + for i := 0; i < b.N; i++ { + for j := 0; j <= max; j++ { + binary(tab, uint16(j)) + } + } + } + bmlinear := testing.Benchmark(blinear) + bmbinary := testing.Benchmark(bbinary) + fmt.Printf("n=%d: linear=%d binary=%d\n", n, bmlinear.NsPerOp(), bmbinary.NsPerOp()) + return bmlinear.NsPerOp()*100 > bmbinary.NsPerOp()*110 + }) + fmt.Printf("calibration: linear cutoff = %d\n", n) +} + +func fakeTable(n int) []Range16 { + var r16 []Range16 + for i := 0; i < n; i++ { + r16 = append(r16, Range16{uint16(i*5 + 10), uint16(i*5 + 12), 1}) + } + return r16 +} + +func linear(ranges []Range16, r uint16) bool { + for i := range ranges { + range_ := &ranges[i] + if r < range_.Lo { + return false + } + if r <= range_.Hi { + return (r-range_.Lo)%range_.Stride == 0 + } + } + return false +} + +func binary(ranges []Range16, r uint16) bool { + // binary search over ranges + lo := 0 + hi := len(ranges) + for lo < hi { + m := lo + (hi-lo)/2 + range_ := &ranges[m] + if range_.Lo <= r && r <= range_.Hi { + return (r-range_.Lo)%range_.Stride == 0 + } + if r < range_.Lo { + hi = m + } else { + lo = m + 1 + } + } + return false +} + +func TestLatinOffset(t *testing.T) { + var maps = []map[string]*RangeTable{ + Categories, + FoldCategory, + FoldScript, + Properties, + Scripts, + } + for _, m := range maps { + for name, tab := range m { + i := 0 + for i < len(tab.R16) && tab.R16[i].Hi <= MaxLatin1 { + i++ + } + if tab.LatinOffset != i { + t.Errorf("%s: LatinOffset=%d, want %d", name, tab.LatinOffset, i) + } + } + } +} + +func TestSpecialCaseNoMapping(t *testing.T) { + // Issue 25636 + // no change for rune 'A', zero delta, under upper/lower/title case change. + var noChangeForCapitalA = CaseRange{'A', 'A', [MaxCase]rune{0, 0, 0}} + got := strings.ToLowerSpecial(SpecialCase([]CaseRange{noChangeForCapitalA}), "ABC") + want := "Abc" + if got != want { + t.Errorf("got %q; want %q", got, want) + } +} + +func TestNegativeRune(t *testing.T) { + // Issue 43254 + // These tests cover negative rune handling by testing values which, + // when cast to uint8 or uint16, look like a particular valid rune. + // This package has Latin-1-specific optimizations, so we test all of + // Latin-1 and representative non-Latin-1 values in the character + // categories covered by IsGraphic, etc. + nonLatin1 := []uint32{ + // Lu: LATIN CAPITAL LETTER A WITH MACRON + 0x0100, + // Ll: LATIN SMALL LETTER A WITH MACRON + 0x0101, + // Lt: LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON + 0x01C5, + // M: COMBINING GRAVE ACCENT + 0x0300, + // Nd: ARABIC-INDIC DIGIT ZERO + 0x0660, + // P: GREEK QUESTION MARK + 0x037E, + // S: MODIFIER LETTER LEFT ARROWHEAD + 0x02C2, + // Z: OGHAM SPACE MARK + 0x1680, + } + for i := 0; i < MaxLatin1+len(nonLatin1); i++ { + base := uint32(i) + if i >= MaxLatin1 { + base = nonLatin1[i-MaxLatin1] + } + + // Note r is negative, but uint8(r) == uint8(base) and + // uint16(r) == uint16(base). + r := rune(base - 1<<31) + if Is(Letter, r) { + t.Errorf("Is(Letter, 0x%x - 1<<31) = true, want false", base) + } + if IsControl(r) { + t.Errorf("IsControl(0x%x - 1<<31) = true, want false", base) + } + if IsDigit(r) { + t.Errorf("IsDigit(0x%x - 1<<31) = true, want false", base) + } + if IsGraphic(r) { + t.Errorf("IsGraphic(0x%x - 1<<31) = true, want false", base) + } + if IsLetter(r) { + t.Errorf("IsLetter(0x%x - 1<<31) = true, want false", base) + } + if IsLower(r) { + t.Errorf("IsLower(0x%x - 1<<31) = true, want false", base) + } + if IsMark(r) { + t.Errorf("IsMark(0x%x - 1<<31) = true, want false", base) + } + if IsNumber(r) { + t.Errorf("IsNumber(0x%x - 1<<31) = true, want false", base) + } + if IsPrint(r) { + t.Errorf("IsPrint(0x%x - 1<<31) = true, want false", base) + } + if IsPunct(r) { + t.Errorf("IsPunct(0x%x - 1<<31) = true, want false", base) + } + if IsSpace(r) { + t.Errorf("IsSpace(0x%x - 1<<31) = true, want false", base) + } + if IsSymbol(r) { + t.Errorf("IsSymbol(0x%x - 1<<31) = true, want false", base) + } + if IsTitle(r) { + t.Errorf("IsTitle(0x%x - 1<<31) = true, want false", base) + } + if IsUpper(r) { + t.Errorf("IsUpper(0x%x - 1<<31) = true, want false", base) + } + } +} diff --git a/src/unicode/script_test.go b/src/unicode/script_test.go new file mode 100644 index 0000000..66bfa3c --- /dev/null +++ b/src/unicode/script_test.go @@ -0,0 +1,131 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unicode_test + +import ( + "testing" + . "unicode" +) + +type T struct { + rune rune + script string +} + +var inCategoryTest = []T{ + {0x0081, "Cc"}, + {0x200B, "Cf"}, + {0xf0000, "Co"}, + {0xdb80, "Cs"}, + {0x0236, "Ll"}, + {0x1d9d, "Lm"}, + {0x07cf, "Lo"}, + {0x1f8a, "Lt"}, + {0x03ff, "Lu"}, + {0x0bc1, "Mc"}, + {0x20df, "Me"}, + {0x07f0, "Mn"}, + {0x1bb2, "Nd"}, + {0x10147, "Nl"}, + {0x2478, "No"}, + {0xfe33, "Pc"}, + {0x2011, "Pd"}, + {0x301e, "Pe"}, + {0x2e03, "Pf"}, + {0x2e02, "Pi"}, + {0x0022, "Po"}, + {0x2770, "Ps"}, + {0x00a4, "Sc"}, + {0xa711, "Sk"}, + {0x25f9, "Sm"}, + {0x2108, "So"}, + {0x2028, "Zl"}, + {0x2029, "Zp"}, + {0x202f, "Zs"}, + // Unifieds. + {0x04aa, "L"}, + {0x0009, "C"}, + {0x1712, "M"}, + {0x0031, "N"}, + {0x00bb, "P"}, + {0x00a2, "S"}, + {0x00a0, "Z"}, +} + +var inPropTest = []T{ + {0x0046, "ASCII_Hex_Digit"}, + {0x200F, "Bidi_Control"}, + {0x2212, "Dash"}, + {0xE0001, "Deprecated"}, + {0x00B7, "Diacritic"}, + {0x30FE, "Extender"}, + {0xFF46, "Hex_Digit"}, + {0x2E17, "Hyphen"}, + {0x2FFB, "IDS_Binary_Operator"}, + {0x2FF3, "IDS_Trinary_Operator"}, + {0xFA6A, "Ideographic"}, + {0x200D, "Join_Control"}, + {0x0EC4, "Logical_Order_Exception"}, + {0x2FFFF, "Noncharacter_Code_Point"}, + {0x065E, "Other_Alphabetic"}, + {0x2065, "Other_Default_Ignorable_Code_Point"}, + {0x0BD7, "Other_Grapheme_Extend"}, + {0x0387, "Other_ID_Continue"}, + {0x212E, "Other_ID_Start"}, + {0x2094, "Other_Lowercase"}, + {0x2040, "Other_Math"}, + {0x216F, "Other_Uppercase"}, + {0x0027, "Pattern_Syntax"}, + {0x0020, "Pattern_White_Space"}, + {0x06DD, "Prepended_Concatenation_Mark"}, + {0x300D, "Quotation_Mark"}, + {0x2EF3, "Radical"}, + {0x1f1ff, "Regional_Indicator"}, + {0x061F, "STerm"}, // Deprecated alias of Sentence_Terminal + {0x061F, "Sentence_Terminal"}, + {0x2071, "Soft_Dotted"}, + {0x003A, "Terminal_Punctuation"}, + {0x9FC3, "Unified_Ideograph"}, + {0xFE0F, "Variation_Selector"}, + {0x0020, "White_Space"}, +} + +func TestCategories(t *testing.T) { + notTested := make(map[string]bool) + for k := range Categories { + notTested[k] = true + } + for _, test := range inCategoryTest { + if _, ok := Categories[test.script]; !ok { + t.Fatal(test.script, "not a known category") + } + if !Is(Categories[test.script], test.rune) { + t.Errorf("IsCategory(%U, %s) = false, want true", test.rune, test.script) + } + delete(notTested, test.script) + } + for k := range notTested { + t.Error("category not tested:", k) + } +} + +func TestProperties(t *testing.T) { + notTested := make(map[string]bool) + for k := range Properties { + notTested[k] = true + } + for _, test := range inPropTest { + if _, ok := Properties[test.script]; !ok { + t.Fatal(test.script, "not a known prop") + } + if !Is(Properties[test.script], test.rune) { + t.Errorf("IsCategory(%U, %s) = false, want true", test.rune, test.script) + } + delete(notTested, test.script) + } + for k := range notTested { + t.Error("property not tested:", k) + } +} diff --git a/src/unicode/tables.go b/src/unicode/tables.go new file mode 100644 index 0000000..a9b23bf --- /dev/null +++ b/src/unicode/tables.go @@ -0,0 +1,8054 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package unicode + +// Version is the Unicode edition from which the tables are derived. +const Version = "13.0.0" + +// Categories is the set of Unicode category tables. +var Categories = map[string]*RangeTable{ + "C": C, + "Cc": Cc, + "Cf": Cf, + "Co": Co, + "Cs": Cs, + "L": L, + "Ll": Ll, + "Lm": Lm, + "Lo": Lo, + "Lt": Lt, + "Lu": Lu, + "M": M, + "Mc": Mc, + "Me": Me, + "Mn": Mn, + "N": N, + "Nd": Nd, + "Nl": Nl, + "No": No, + "P": P, + "Pc": Pc, + "Pd": Pd, + "Pe": Pe, + "Pf": Pf, + "Pi": Pi, + "Po": Po, + "Ps": Ps, + "S": S, + "Sc": Sc, + "Sk": Sk, + "Sm": Sm, + "So": So, + "Z": Z, + "Zl": Zl, + "Zp": Zp, + "Zs": Zs, +} + +var _C = &RangeTable{ + R16: []Range16{ + {0x0000, 0x001f, 1}, + {0x007f, 0x009f, 1}, + {0x00ad, 0x0600, 1363}, + {0x0601, 0x0605, 1}, + {0x061c, 0x06dd, 193}, + {0x070f, 0x08e2, 467}, + {0x180e, 0x200b, 2045}, + {0x200c, 0x200f, 1}, + {0x202a, 0x202e, 1}, + {0x2060, 0x2064, 1}, + {0x2066, 0x206f, 1}, + {0xd800, 0xf8ff, 1}, + {0xfeff, 0xfff9, 250}, + {0xfffa, 0xfffb, 1}, + }, + R32: []Range32{ + {0x110bd, 0x110cd, 16}, + {0x13430, 0x13438, 1}, + {0x1bca0, 0x1bca3, 1}, + {0x1d173, 0x1d17a, 1}, + {0xe0001, 0xe0020, 31}, + {0xe0021, 0xe007f, 1}, + {0xf0000, 0xffffd, 1}, + {0x100000, 0x10fffd, 1}, + }, + LatinOffset: 2, +} + +var _Cc = &RangeTable{ + R16: []Range16{ + {0x0000, 0x001f, 1}, + {0x007f, 0x009f, 1}, + }, + LatinOffset: 2, +} + +var _Cf = &RangeTable{ + R16: []Range16{ + {0x00ad, 0x0600, 1363}, + {0x0601, 0x0605, 1}, + {0x061c, 0x06dd, 193}, + {0x070f, 0x08e2, 467}, + {0x180e, 0x200b, 2045}, + {0x200c, 0x200f, 1}, + {0x202a, 0x202e, 1}, + {0x2060, 0x2064, 1}, + {0x2066, 0x206f, 1}, + {0xfeff, 0xfff9, 250}, + {0xfffa, 0xfffb, 1}, + }, + R32: []Range32{ + {0x110bd, 0x110cd, 16}, + {0x13430, 0x13438, 1}, + {0x1bca0, 0x1bca3, 1}, + {0x1d173, 0x1d17a, 1}, + {0xe0001, 0xe0020, 31}, + {0xe0021, 0xe007f, 1}, + }, +} + +var _Co = &RangeTable{ + R16: []Range16{ + {0xe000, 0xf8ff, 1}, + }, + R32: []Range32{ + {0xf0000, 0xffffd, 1}, + {0x100000, 0x10fffd, 1}, + }, +} + +var _Cs = &RangeTable{ + R16: []Range16{ + {0xd800, 0xdfff, 1}, + }, +} + +var _L = &RangeTable{ + R16: []Range16{ + {0x0041, 0x005a, 1}, + {0x0061, 0x007a, 1}, + {0x00aa, 0x00b5, 11}, + {0x00ba, 0x00c0, 6}, + {0x00c1, 0x00d6, 1}, + {0x00d8, 0x00f6, 1}, + {0x00f8, 0x02c1, 1}, + {0x02c6, 0x02d1, 1}, + {0x02e0, 0x02e4, 1}, + {0x02ec, 0x02ee, 2}, + {0x0370, 0x0374, 1}, + {0x0376, 0x0377, 1}, + {0x037a, 0x037d, 1}, + {0x037f, 0x0386, 7}, + {0x0388, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x03a1, 1}, + {0x03a3, 0x03f5, 1}, + {0x03f7, 0x0481, 1}, + {0x048a, 0x052f, 1}, + {0x0531, 0x0556, 1}, + {0x0559, 0x0560, 7}, + {0x0561, 0x0588, 1}, + {0x05d0, 0x05ea, 1}, + {0x05ef, 0x05f2, 1}, + {0x0620, 0x064a, 1}, + {0x066e, 0x066f, 1}, + {0x0671, 0x06d3, 1}, + {0x06d5, 0x06e5, 16}, + {0x06e6, 0x06ee, 8}, + {0x06ef, 0x06fa, 11}, + {0x06fb, 0x06fc, 1}, + {0x06ff, 0x0710, 17}, + {0x0712, 0x072f, 1}, + {0x074d, 0x07a5, 1}, + {0x07b1, 0x07ca, 25}, + {0x07cb, 0x07ea, 1}, + {0x07f4, 0x07f5, 1}, + {0x07fa, 0x0800, 6}, + {0x0801, 0x0815, 1}, + {0x081a, 0x0824, 10}, + {0x0828, 0x0840, 24}, + {0x0841, 0x0858, 1}, + {0x0860, 0x086a, 1}, + {0x08a0, 0x08b4, 1}, + {0x08b6, 0x08c7, 1}, + {0x0904, 0x0939, 1}, + {0x093d, 0x0950, 19}, + {0x0958, 0x0961, 1}, + {0x0971, 0x0980, 1}, + {0x0985, 0x098c, 1}, + {0x098f, 0x0990, 1}, + {0x0993, 0x09a8, 1}, + {0x09aa, 0x09b0, 1}, + {0x09b2, 0x09b6, 4}, + {0x09b7, 0x09b9, 1}, + {0x09bd, 0x09ce, 17}, + {0x09dc, 0x09dd, 1}, + {0x09df, 0x09e1, 1}, + {0x09f0, 0x09f1, 1}, + {0x09fc, 0x0a05, 9}, + {0x0a06, 0x0a0a, 1}, + {0x0a0f, 0x0a10, 1}, + {0x0a13, 0x0a28, 1}, + {0x0a2a, 0x0a30, 1}, + {0x0a32, 0x0a33, 1}, + {0x0a35, 0x0a36, 1}, + {0x0a38, 0x0a39, 1}, + {0x0a59, 0x0a5c, 1}, + {0x0a5e, 0x0a72, 20}, + {0x0a73, 0x0a74, 1}, + {0x0a85, 0x0a8d, 1}, + {0x0a8f, 0x0a91, 1}, + {0x0a93, 0x0aa8, 1}, + {0x0aaa, 0x0ab0, 1}, + {0x0ab2, 0x0ab3, 1}, + {0x0ab5, 0x0ab9, 1}, + {0x0abd, 0x0ad0, 19}, + {0x0ae0, 0x0ae1, 1}, + {0x0af9, 0x0b05, 12}, + {0x0b06, 0x0b0c, 1}, + {0x0b0f, 0x0b10, 1}, + {0x0b13, 0x0b28, 1}, + {0x0b2a, 0x0b30, 1}, + {0x0b32, 0x0b33, 1}, + {0x0b35, 0x0b39, 1}, + {0x0b3d, 0x0b5c, 31}, + {0x0b5d, 0x0b5f, 2}, + {0x0b60, 0x0b61, 1}, + {0x0b71, 0x0b83, 18}, + {0x0b85, 0x0b8a, 1}, + {0x0b8e, 0x0b90, 1}, + {0x0b92, 0x0b95, 1}, + {0x0b99, 0x0b9a, 1}, + {0x0b9c, 0x0b9e, 2}, + {0x0b9f, 0x0ba3, 4}, + {0x0ba4, 0x0ba8, 4}, + {0x0ba9, 0x0baa, 1}, + {0x0bae, 0x0bb9, 1}, + {0x0bd0, 0x0c05, 53}, + {0x0c06, 0x0c0c, 1}, + {0x0c0e, 0x0c10, 1}, + {0x0c12, 0x0c28, 1}, + {0x0c2a, 0x0c39, 1}, + {0x0c3d, 0x0c58, 27}, + {0x0c59, 0x0c5a, 1}, + {0x0c60, 0x0c61, 1}, + {0x0c80, 0x0c85, 5}, + {0x0c86, 0x0c8c, 1}, + {0x0c8e, 0x0c90, 1}, + {0x0c92, 0x0ca8, 1}, + {0x0caa, 0x0cb3, 1}, + {0x0cb5, 0x0cb9, 1}, + {0x0cbd, 0x0cde, 33}, + {0x0ce0, 0x0ce1, 1}, + {0x0cf1, 0x0cf2, 1}, + {0x0d04, 0x0d0c, 1}, + {0x0d0e, 0x0d10, 1}, + {0x0d12, 0x0d3a, 1}, + {0x0d3d, 0x0d4e, 17}, + {0x0d54, 0x0d56, 1}, + {0x0d5f, 0x0d61, 1}, + {0x0d7a, 0x0d7f, 1}, + {0x0d85, 0x0d96, 1}, + {0x0d9a, 0x0db1, 1}, + {0x0db3, 0x0dbb, 1}, + {0x0dbd, 0x0dc0, 3}, + {0x0dc1, 0x0dc6, 1}, + {0x0e01, 0x0e30, 1}, + {0x0e32, 0x0e33, 1}, + {0x0e40, 0x0e46, 1}, + {0x0e81, 0x0e82, 1}, + {0x0e84, 0x0e86, 2}, + {0x0e87, 0x0e8a, 1}, + {0x0e8c, 0x0ea3, 1}, + {0x0ea5, 0x0ea7, 2}, + {0x0ea8, 0x0eb0, 1}, + {0x0eb2, 0x0eb3, 1}, + {0x0ebd, 0x0ec0, 3}, + {0x0ec1, 0x0ec4, 1}, + {0x0ec6, 0x0edc, 22}, + {0x0edd, 0x0edf, 1}, + {0x0f00, 0x0f40, 64}, + {0x0f41, 0x0f47, 1}, + {0x0f49, 0x0f6c, 1}, + {0x0f88, 0x0f8c, 1}, + {0x1000, 0x102a, 1}, + {0x103f, 0x1050, 17}, + {0x1051, 0x1055, 1}, + {0x105a, 0x105d, 1}, + {0x1061, 0x1065, 4}, + {0x1066, 0x106e, 8}, + {0x106f, 0x1070, 1}, + {0x1075, 0x1081, 1}, + {0x108e, 0x10a0, 18}, + {0x10a1, 0x10c5, 1}, + {0x10c7, 0x10cd, 6}, + {0x10d0, 0x10fa, 1}, + {0x10fc, 0x1248, 1}, + {0x124a, 0x124d, 1}, + {0x1250, 0x1256, 1}, + {0x1258, 0x125a, 2}, + {0x125b, 0x125d, 1}, + {0x1260, 0x1288, 1}, + {0x128a, 0x128d, 1}, + {0x1290, 0x12b0, 1}, + {0x12b2, 0x12b5, 1}, + {0x12b8, 0x12be, 1}, + {0x12c0, 0x12c2, 2}, + {0x12c3, 0x12c5, 1}, + {0x12c8, 0x12d6, 1}, + {0x12d8, 0x1310, 1}, + {0x1312, 0x1315, 1}, + {0x1318, 0x135a, 1}, + {0x1380, 0x138f, 1}, + {0x13a0, 0x13f5, 1}, + {0x13f8, 0x13fd, 1}, + {0x1401, 0x166c, 1}, + {0x166f, 0x167f, 1}, + {0x1681, 0x169a, 1}, + {0x16a0, 0x16ea, 1}, + {0x16f1, 0x16f8, 1}, + {0x1700, 0x170c, 1}, + {0x170e, 0x1711, 1}, + {0x1720, 0x1731, 1}, + {0x1740, 0x1751, 1}, + {0x1760, 0x176c, 1}, + {0x176e, 0x1770, 1}, + {0x1780, 0x17b3, 1}, + {0x17d7, 0x17dc, 5}, + {0x1820, 0x1878, 1}, + {0x1880, 0x1884, 1}, + {0x1887, 0x18a8, 1}, + {0x18aa, 0x18b0, 6}, + {0x18b1, 0x18f5, 1}, + {0x1900, 0x191e, 1}, + {0x1950, 0x196d, 1}, + {0x1970, 0x1974, 1}, + {0x1980, 0x19ab, 1}, + {0x19b0, 0x19c9, 1}, + {0x1a00, 0x1a16, 1}, + {0x1a20, 0x1a54, 1}, + {0x1aa7, 0x1b05, 94}, + {0x1b06, 0x1b33, 1}, + {0x1b45, 0x1b4b, 1}, + {0x1b83, 0x1ba0, 1}, + {0x1bae, 0x1baf, 1}, + {0x1bba, 0x1be5, 1}, + {0x1c00, 0x1c23, 1}, + {0x1c4d, 0x1c4f, 1}, + {0x1c5a, 0x1c7d, 1}, + {0x1c80, 0x1c88, 1}, + {0x1c90, 0x1cba, 1}, + {0x1cbd, 0x1cbf, 1}, + {0x1ce9, 0x1cec, 1}, + {0x1cee, 0x1cf3, 1}, + {0x1cf5, 0x1cf6, 1}, + {0x1cfa, 0x1d00, 6}, + {0x1d01, 0x1dbf, 1}, + {0x1e00, 0x1f15, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f20, 0x1f45, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f50, 0x1f57, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f60, 0x1f7d, 1}, + {0x1f80, 0x1fb4, 1}, + {0x1fb6, 0x1fbc, 1}, + {0x1fbe, 0x1fc2, 4}, + {0x1fc3, 0x1fc4, 1}, + {0x1fc6, 0x1fcc, 1}, + {0x1fd0, 0x1fd3, 1}, + {0x1fd6, 0x1fdb, 1}, + {0x1fe0, 0x1fec, 1}, + {0x1ff2, 0x1ff4, 1}, + {0x1ff6, 0x1ffc, 1}, + {0x2071, 0x207f, 14}, + {0x2090, 0x209c, 1}, + {0x2102, 0x2107, 5}, + {0x210a, 0x2113, 1}, + {0x2115, 0x2119, 4}, + {0x211a, 0x211d, 1}, + {0x2124, 0x212a, 2}, + {0x212b, 0x212d, 1}, + {0x212f, 0x2139, 1}, + {0x213c, 0x213f, 1}, + {0x2145, 0x2149, 1}, + {0x214e, 0x2183, 53}, + {0x2184, 0x2c00, 2684}, + {0x2c01, 0x2c2e, 1}, + {0x2c30, 0x2c5e, 1}, + {0x2c60, 0x2ce4, 1}, + {0x2ceb, 0x2cee, 1}, + {0x2cf2, 0x2cf3, 1}, + {0x2d00, 0x2d25, 1}, + {0x2d27, 0x2d2d, 6}, + {0x2d30, 0x2d67, 1}, + {0x2d6f, 0x2d80, 17}, + {0x2d81, 0x2d96, 1}, + {0x2da0, 0x2da6, 1}, + {0x2da8, 0x2dae, 1}, + {0x2db0, 0x2db6, 1}, + {0x2db8, 0x2dbe, 1}, + {0x2dc0, 0x2dc6, 1}, + {0x2dc8, 0x2dce, 1}, + {0x2dd0, 0x2dd6, 1}, + {0x2dd8, 0x2dde, 1}, + {0x2e2f, 0x3005, 470}, + {0x3006, 0x3031, 43}, + {0x3032, 0x3035, 1}, + {0x303b, 0x303c, 1}, + {0x3041, 0x3096, 1}, + {0x309d, 0x309f, 1}, + {0x30a1, 0x30fa, 1}, + {0x30fc, 0x30ff, 1}, + {0x3105, 0x312f, 1}, + {0x3131, 0x318e, 1}, + {0x31a0, 0x31bf, 1}, + {0x31f0, 0x31ff, 1}, + {0x3400, 0x4dbf, 1}, + {0x4e00, 0x9ffc, 1}, + {0xa000, 0xa48c, 1}, + {0xa4d0, 0xa4fd, 1}, + {0xa500, 0xa60c, 1}, + {0xa610, 0xa61f, 1}, + {0xa62a, 0xa62b, 1}, + {0xa640, 0xa66e, 1}, + {0xa67f, 0xa69d, 1}, + {0xa6a0, 0xa6e5, 1}, + {0xa717, 0xa71f, 1}, + {0xa722, 0xa788, 1}, + {0xa78b, 0xa7bf, 1}, + {0xa7c2, 0xa7ca, 1}, + {0xa7f5, 0xa801, 1}, + {0xa803, 0xa805, 1}, + {0xa807, 0xa80a, 1}, + {0xa80c, 0xa822, 1}, + {0xa840, 0xa873, 1}, + {0xa882, 0xa8b3, 1}, + {0xa8f2, 0xa8f7, 1}, + {0xa8fb, 0xa8fd, 2}, + {0xa8fe, 0xa90a, 12}, + {0xa90b, 0xa925, 1}, + {0xa930, 0xa946, 1}, + {0xa960, 0xa97c, 1}, + {0xa984, 0xa9b2, 1}, + {0xa9cf, 0xa9e0, 17}, + {0xa9e1, 0xa9e4, 1}, + {0xa9e6, 0xa9ef, 1}, + {0xa9fa, 0xa9fe, 1}, + {0xaa00, 0xaa28, 1}, + {0xaa40, 0xaa42, 1}, + {0xaa44, 0xaa4b, 1}, + {0xaa60, 0xaa76, 1}, + {0xaa7a, 0xaa7e, 4}, + {0xaa7f, 0xaaaf, 1}, + {0xaab1, 0xaab5, 4}, + {0xaab6, 0xaab9, 3}, + {0xaaba, 0xaabd, 1}, + {0xaac0, 0xaac2, 2}, + {0xaadb, 0xaadd, 1}, + {0xaae0, 0xaaea, 1}, + {0xaaf2, 0xaaf4, 1}, + {0xab01, 0xab06, 1}, + {0xab09, 0xab0e, 1}, + {0xab11, 0xab16, 1}, + {0xab20, 0xab26, 1}, + {0xab28, 0xab2e, 1}, + {0xab30, 0xab5a, 1}, + {0xab5c, 0xab69, 1}, + {0xab70, 0xabe2, 1}, + {0xac00, 0xd7a3, 1}, + {0xd7b0, 0xd7c6, 1}, + {0xd7cb, 0xd7fb, 1}, + {0xf900, 0xfa6d, 1}, + {0xfa70, 0xfad9, 1}, + {0xfb00, 0xfb06, 1}, + {0xfb13, 0xfb17, 1}, + {0xfb1d, 0xfb1f, 2}, + {0xfb20, 0xfb28, 1}, + {0xfb2a, 0xfb36, 1}, + {0xfb38, 0xfb3c, 1}, + {0xfb3e, 0xfb40, 2}, + {0xfb41, 0xfb43, 2}, + {0xfb44, 0xfb46, 2}, + {0xfb47, 0xfbb1, 1}, + {0xfbd3, 0xfd3d, 1}, + {0xfd50, 0xfd8f, 1}, + {0xfd92, 0xfdc7, 1}, + {0xfdf0, 0xfdfb, 1}, + {0xfe70, 0xfe74, 1}, + {0xfe76, 0xfefc, 1}, + {0xff21, 0xff3a, 1}, + {0xff41, 0xff5a, 1}, + {0xff66, 0xffbe, 1}, + {0xffc2, 0xffc7, 1}, + {0xffca, 0xffcf, 1}, + {0xffd2, 0xffd7, 1}, + {0xffda, 0xffdc, 1}, + }, + R32: []Range32{ + {0x10000, 0x1000b, 1}, + {0x1000d, 0x10026, 1}, + {0x10028, 0x1003a, 1}, + {0x1003c, 0x1003d, 1}, + {0x1003f, 0x1004d, 1}, + {0x10050, 0x1005d, 1}, + {0x10080, 0x100fa, 1}, + {0x10280, 0x1029c, 1}, + {0x102a0, 0x102d0, 1}, + {0x10300, 0x1031f, 1}, + {0x1032d, 0x10340, 1}, + {0x10342, 0x10349, 1}, + {0x10350, 0x10375, 1}, + {0x10380, 0x1039d, 1}, + {0x103a0, 0x103c3, 1}, + {0x103c8, 0x103cf, 1}, + {0x10400, 0x1049d, 1}, + {0x104b0, 0x104d3, 1}, + {0x104d8, 0x104fb, 1}, + {0x10500, 0x10527, 1}, + {0x10530, 0x10563, 1}, + {0x10600, 0x10736, 1}, + {0x10740, 0x10755, 1}, + {0x10760, 0x10767, 1}, + {0x10800, 0x10805, 1}, + {0x10808, 0x1080a, 2}, + {0x1080b, 0x10835, 1}, + {0x10837, 0x10838, 1}, + {0x1083c, 0x1083f, 3}, + {0x10840, 0x10855, 1}, + {0x10860, 0x10876, 1}, + {0x10880, 0x1089e, 1}, + {0x108e0, 0x108f2, 1}, + {0x108f4, 0x108f5, 1}, + {0x10900, 0x10915, 1}, + {0x10920, 0x10939, 1}, + {0x10980, 0x109b7, 1}, + {0x109be, 0x109bf, 1}, + {0x10a00, 0x10a10, 16}, + {0x10a11, 0x10a13, 1}, + {0x10a15, 0x10a17, 1}, + {0x10a19, 0x10a35, 1}, + {0x10a60, 0x10a7c, 1}, + {0x10a80, 0x10a9c, 1}, + {0x10ac0, 0x10ac7, 1}, + {0x10ac9, 0x10ae4, 1}, + {0x10b00, 0x10b35, 1}, + {0x10b40, 0x10b55, 1}, + {0x10b60, 0x10b72, 1}, + {0x10b80, 0x10b91, 1}, + {0x10c00, 0x10c48, 1}, + {0x10c80, 0x10cb2, 1}, + {0x10cc0, 0x10cf2, 1}, + {0x10d00, 0x10d23, 1}, + {0x10e80, 0x10ea9, 1}, + {0x10eb0, 0x10eb1, 1}, + {0x10f00, 0x10f1c, 1}, + {0x10f27, 0x10f30, 9}, + {0x10f31, 0x10f45, 1}, + {0x10fb0, 0x10fc4, 1}, + {0x10fe0, 0x10ff6, 1}, + {0x11003, 0x11037, 1}, + {0x11083, 0x110af, 1}, + {0x110d0, 0x110e8, 1}, + {0x11103, 0x11126, 1}, + {0x11144, 0x11147, 3}, + {0x11150, 0x11172, 1}, + {0x11176, 0x11183, 13}, + {0x11184, 0x111b2, 1}, + {0x111c1, 0x111c4, 1}, + {0x111da, 0x111dc, 2}, + {0x11200, 0x11211, 1}, + {0x11213, 0x1122b, 1}, + {0x11280, 0x11286, 1}, + {0x11288, 0x1128a, 2}, + {0x1128b, 0x1128d, 1}, + {0x1128f, 0x1129d, 1}, + {0x1129f, 0x112a8, 1}, + {0x112b0, 0x112de, 1}, + {0x11305, 0x1130c, 1}, + {0x1130f, 0x11310, 1}, + {0x11313, 0x11328, 1}, + {0x1132a, 0x11330, 1}, + {0x11332, 0x11333, 1}, + {0x11335, 0x11339, 1}, + {0x1133d, 0x11350, 19}, + {0x1135d, 0x11361, 1}, + {0x11400, 0x11434, 1}, + {0x11447, 0x1144a, 1}, + {0x1145f, 0x11461, 1}, + {0x11480, 0x114af, 1}, + {0x114c4, 0x114c5, 1}, + {0x114c7, 0x11580, 185}, + {0x11581, 0x115ae, 1}, + {0x115d8, 0x115db, 1}, + {0x11600, 0x1162f, 1}, + {0x11644, 0x11680, 60}, + {0x11681, 0x116aa, 1}, + {0x116b8, 0x11700, 72}, + {0x11701, 0x1171a, 1}, + {0x11800, 0x1182b, 1}, + {0x118a0, 0x118df, 1}, + {0x118ff, 0x11906, 1}, + {0x11909, 0x1190c, 3}, + {0x1190d, 0x11913, 1}, + {0x11915, 0x11916, 1}, + {0x11918, 0x1192f, 1}, + {0x1193f, 0x11941, 2}, + {0x119a0, 0x119a7, 1}, + {0x119aa, 0x119d0, 1}, + {0x119e1, 0x119e3, 2}, + {0x11a00, 0x11a0b, 11}, + {0x11a0c, 0x11a32, 1}, + {0x11a3a, 0x11a50, 22}, + {0x11a5c, 0x11a89, 1}, + {0x11a9d, 0x11ac0, 35}, + {0x11ac1, 0x11af8, 1}, + {0x11c00, 0x11c08, 1}, + {0x11c0a, 0x11c2e, 1}, + {0x11c40, 0x11c72, 50}, + {0x11c73, 0x11c8f, 1}, + {0x11d00, 0x11d06, 1}, + {0x11d08, 0x11d09, 1}, + {0x11d0b, 0x11d30, 1}, + {0x11d46, 0x11d60, 26}, + {0x11d61, 0x11d65, 1}, + {0x11d67, 0x11d68, 1}, + {0x11d6a, 0x11d89, 1}, + {0x11d98, 0x11ee0, 328}, + {0x11ee1, 0x11ef2, 1}, + {0x11fb0, 0x12000, 80}, + {0x12001, 0x12399, 1}, + {0x12480, 0x12543, 1}, + {0x13000, 0x1342e, 1}, + {0x14400, 0x14646, 1}, + {0x16800, 0x16a38, 1}, + {0x16a40, 0x16a5e, 1}, + {0x16ad0, 0x16aed, 1}, + {0x16b00, 0x16b2f, 1}, + {0x16b40, 0x16b43, 1}, + {0x16b63, 0x16b77, 1}, + {0x16b7d, 0x16b8f, 1}, + {0x16e40, 0x16e7f, 1}, + {0x16f00, 0x16f4a, 1}, + {0x16f50, 0x16f93, 67}, + {0x16f94, 0x16f9f, 1}, + {0x16fe0, 0x16fe1, 1}, + {0x16fe3, 0x17000, 29}, + {0x17001, 0x187f7, 1}, + {0x18800, 0x18cd5, 1}, + {0x18d00, 0x18d08, 1}, + {0x1b000, 0x1b11e, 1}, + {0x1b150, 0x1b152, 1}, + {0x1b164, 0x1b167, 1}, + {0x1b170, 0x1b2fb, 1}, + {0x1bc00, 0x1bc6a, 1}, + {0x1bc70, 0x1bc7c, 1}, + {0x1bc80, 0x1bc88, 1}, + {0x1bc90, 0x1bc99, 1}, + {0x1d400, 0x1d454, 1}, + {0x1d456, 0x1d49c, 1}, + {0x1d49e, 0x1d49f, 1}, + {0x1d4a2, 0x1d4a5, 3}, + {0x1d4a6, 0x1d4a9, 3}, + {0x1d4aa, 0x1d4ac, 1}, + {0x1d4ae, 0x1d4b9, 1}, + {0x1d4bb, 0x1d4bd, 2}, + {0x1d4be, 0x1d4c3, 1}, + {0x1d4c5, 0x1d505, 1}, + {0x1d507, 0x1d50a, 1}, + {0x1d50d, 0x1d514, 1}, + {0x1d516, 0x1d51c, 1}, + {0x1d51e, 0x1d539, 1}, + {0x1d53b, 0x1d53e, 1}, + {0x1d540, 0x1d544, 1}, + {0x1d546, 0x1d54a, 4}, + {0x1d54b, 0x1d550, 1}, + {0x1d552, 0x1d6a5, 1}, + {0x1d6a8, 0x1d6c0, 1}, + {0x1d6c2, 0x1d6da, 1}, + {0x1d6dc, 0x1d6fa, 1}, + {0x1d6fc, 0x1d714, 1}, + {0x1d716, 0x1d734, 1}, + {0x1d736, 0x1d74e, 1}, + {0x1d750, 0x1d76e, 1}, + {0x1d770, 0x1d788, 1}, + {0x1d78a, 0x1d7a8, 1}, + {0x1d7aa, 0x1d7c2, 1}, + {0x1d7c4, 0x1d7cb, 1}, + {0x1e100, 0x1e12c, 1}, + {0x1e137, 0x1e13d, 1}, + {0x1e14e, 0x1e2c0, 370}, + {0x1e2c1, 0x1e2eb, 1}, + {0x1e800, 0x1e8c4, 1}, + {0x1e900, 0x1e943, 1}, + {0x1e94b, 0x1ee00, 1205}, + {0x1ee01, 0x1ee03, 1}, + {0x1ee05, 0x1ee1f, 1}, + {0x1ee21, 0x1ee22, 1}, + {0x1ee24, 0x1ee27, 3}, + {0x1ee29, 0x1ee32, 1}, + {0x1ee34, 0x1ee37, 1}, + {0x1ee39, 0x1ee3b, 2}, + {0x1ee42, 0x1ee47, 5}, + {0x1ee49, 0x1ee4d, 2}, + {0x1ee4e, 0x1ee4f, 1}, + {0x1ee51, 0x1ee52, 1}, + {0x1ee54, 0x1ee57, 3}, + {0x1ee59, 0x1ee61, 2}, + {0x1ee62, 0x1ee64, 2}, + {0x1ee67, 0x1ee6a, 1}, + {0x1ee6c, 0x1ee72, 1}, + {0x1ee74, 0x1ee77, 1}, + {0x1ee79, 0x1ee7c, 1}, + {0x1ee7e, 0x1ee80, 2}, + {0x1ee81, 0x1ee89, 1}, + {0x1ee8b, 0x1ee9b, 1}, + {0x1eea1, 0x1eea3, 1}, + {0x1eea5, 0x1eea9, 1}, + {0x1eeab, 0x1eebb, 1}, + {0x20000, 0x2a6dd, 1}, + {0x2a700, 0x2b734, 1}, + {0x2b740, 0x2b81d, 1}, + {0x2b820, 0x2cea1, 1}, + {0x2ceb0, 0x2ebe0, 1}, + {0x2f800, 0x2fa1d, 1}, + {0x30000, 0x3134a, 1}, + }, + LatinOffset: 6, +} + +var _Ll = &RangeTable{ + R16: []Range16{ + {0x0061, 0x007a, 1}, + {0x00b5, 0x00df, 42}, + {0x00e0, 0x00f6, 1}, + {0x00f8, 0x00ff, 1}, + {0x0101, 0x0137, 2}, + {0x0138, 0x0148, 2}, + {0x0149, 0x0177, 2}, + {0x017a, 0x017e, 2}, + {0x017f, 0x0180, 1}, + {0x0183, 0x0185, 2}, + {0x0188, 0x018c, 4}, + {0x018d, 0x0192, 5}, + {0x0195, 0x0199, 4}, + {0x019a, 0x019b, 1}, + {0x019e, 0x01a1, 3}, + {0x01a3, 0x01a5, 2}, + {0x01a8, 0x01aa, 2}, + {0x01ab, 0x01ad, 2}, + {0x01b0, 0x01b4, 4}, + {0x01b6, 0x01b9, 3}, + {0x01ba, 0x01bd, 3}, + {0x01be, 0x01bf, 1}, + {0x01c6, 0x01cc, 3}, + {0x01ce, 0x01dc, 2}, + {0x01dd, 0x01ef, 2}, + {0x01f0, 0x01f3, 3}, + {0x01f5, 0x01f9, 4}, + {0x01fb, 0x0233, 2}, + {0x0234, 0x0239, 1}, + {0x023c, 0x023f, 3}, + {0x0240, 0x0242, 2}, + {0x0247, 0x024f, 2}, + {0x0250, 0x0293, 1}, + {0x0295, 0x02af, 1}, + {0x0371, 0x0373, 2}, + {0x0377, 0x037b, 4}, + {0x037c, 0x037d, 1}, + {0x0390, 0x03ac, 28}, + {0x03ad, 0x03ce, 1}, + {0x03d0, 0x03d1, 1}, + {0x03d5, 0x03d7, 1}, + {0x03d9, 0x03ef, 2}, + {0x03f0, 0x03f3, 1}, + {0x03f5, 0x03fb, 3}, + {0x03fc, 0x0430, 52}, + {0x0431, 0x045f, 1}, + {0x0461, 0x0481, 2}, + {0x048b, 0x04bf, 2}, + {0x04c2, 0x04ce, 2}, + {0x04cf, 0x052f, 2}, + {0x0560, 0x0588, 1}, + {0x10d0, 0x10fa, 1}, + {0x10fd, 0x10ff, 1}, + {0x13f8, 0x13fd, 1}, + {0x1c80, 0x1c88, 1}, + {0x1d00, 0x1d2b, 1}, + {0x1d6b, 0x1d77, 1}, + {0x1d79, 0x1d9a, 1}, + {0x1e01, 0x1e95, 2}, + {0x1e96, 0x1e9d, 1}, + {0x1e9f, 0x1eff, 2}, + {0x1f00, 0x1f07, 1}, + {0x1f10, 0x1f15, 1}, + {0x1f20, 0x1f27, 1}, + {0x1f30, 0x1f37, 1}, + {0x1f40, 0x1f45, 1}, + {0x1f50, 0x1f57, 1}, + {0x1f60, 0x1f67, 1}, + {0x1f70, 0x1f7d, 1}, + {0x1f80, 0x1f87, 1}, + {0x1f90, 0x1f97, 1}, + {0x1fa0, 0x1fa7, 1}, + {0x1fb0, 0x1fb4, 1}, + {0x1fb6, 0x1fb7, 1}, + {0x1fbe, 0x1fc2, 4}, + {0x1fc3, 0x1fc4, 1}, + {0x1fc6, 0x1fc7, 1}, + {0x1fd0, 0x1fd3, 1}, + {0x1fd6, 0x1fd7, 1}, + {0x1fe0, 0x1fe7, 1}, + {0x1ff2, 0x1ff4, 1}, + {0x1ff6, 0x1ff7, 1}, + {0x210a, 0x210e, 4}, + {0x210f, 0x2113, 4}, + {0x212f, 0x2139, 5}, + {0x213c, 0x213d, 1}, + {0x2146, 0x2149, 1}, + {0x214e, 0x2184, 54}, + {0x2c30, 0x2c5e, 1}, + {0x2c61, 0x2c65, 4}, + {0x2c66, 0x2c6c, 2}, + {0x2c71, 0x2c73, 2}, + {0x2c74, 0x2c76, 2}, + {0x2c77, 0x2c7b, 1}, + {0x2c81, 0x2ce3, 2}, + {0x2ce4, 0x2cec, 8}, + {0x2cee, 0x2cf3, 5}, + {0x2d00, 0x2d25, 1}, + {0x2d27, 0x2d2d, 6}, + {0xa641, 0xa66d, 2}, + {0xa681, 0xa69b, 2}, + {0xa723, 0xa72f, 2}, + {0xa730, 0xa731, 1}, + {0xa733, 0xa771, 2}, + {0xa772, 0xa778, 1}, + {0xa77a, 0xa77c, 2}, + {0xa77f, 0xa787, 2}, + {0xa78c, 0xa78e, 2}, + {0xa791, 0xa793, 2}, + {0xa794, 0xa795, 1}, + {0xa797, 0xa7a9, 2}, + {0xa7af, 0xa7b5, 6}, + {0xa7b7, 0xa7bf, 2}, + {0xa7c3, 0xa7c8, 5}, + {0xa7ca, 0xa7f6, 44}, + {0xa7fa, 0xab30, 822}, + {0xab31, 0xab5a, 1}, + {0xab60, 0xab68, 1}, + {0xab70, 0xabbf, 1}, + {0xfb00, 0xfb06, 1}, + {0xfb13, 0xfb17, 1}, + {0xff41, 0xff5a, 1}, + }, + R32: []Range32{ + {0x10428, 0x1044f, 1}, + {0x104d8, 0x104fb, 1}, + {0x10cc0, 0x10cf2, 1}, + {0x118c0, 0x118df, 1}, + {0x16e60, 0x16e7f, 1}, + {0x1d41a, 0x1d433, 1}, + {0x1d44e, 0x1d454, 1}, + {0x1d456, 0x1d467, 1}, + {0x1d482, 0x1d49b, 1}, + {0x1d4b6, 0x1d4b9, 1}, + {0x1d4bb, 0x1d4bd, 2}, + {0x1d4be, 0x1d4c3, 1}, + {0x1d4c5, 0x1d4cf, 1}, + {0x1d4ea, 0x1d503, 1}, + {0x1d51e, 0x1d537, 1}, + {0x1d552, 0x1d56b, 1}, + {0x1d586, 0x1d59f, 1}, + {0x1d5ba, 0x1d5d3, 1}, + {0x1d5ee, 0x1d607, 1}, + {0x1d622, 0x1d63b, 1}, + {0x1d656, 0x1d66f, 1}, + {0x1d68a, 0x1d6a5, 1}, + {0x1d6c2, 0x1d6da, 1}, + {0x1d6dc, 0x1d6e1, 1}, + {0x1d6fc, 0x1d714, 1}, + {0x1d716, 0x1d71b, 1}, + {0x1d736, 0x1d74e, 1}, + {0x1d750, 0x1d755, 1}, + {0x1d770, 0x1d788, 1}, + {0x1d78a, 0x1d78f, 1}, + {0x1d7aa, 0x1d7c2, 1}, + {0x1d7c4, 0x1d7c9, 1}, + {0x1d7cb, 0x1e922, 4439}, + {0x1e923, 0x1e943, 1}, + }, + LatinOffset: 4, +} + +var _Lm = &RangeTable{ + R16: []Range16{ + {0x02b0, 0x02c1, 1}, + {0x02c6, 0x02d1, 1}, + {0x02e0, 0x02e4, 1}, + {0x02ec, 0x02ee, 2}, + {0x0374, 0x037a, 6}, + {0x0559, 0x0640, 231}, + {0x06e5, 0x06e6, 1}, + {0x07f4, 0x07f5, 1}, + {0x07fa, 0x081a, 32}, + {0x0824, 0x0828, 4}, + {0x0971, 0x0e46, 1237}, + {0x0ec6, 0x10fc, 566}, + {0x17d7, 0x1843, 108}, + {0x1aa7, 0x1c78, 465}, + {0x1c79, 0x1c7d, 1}, + {0x1d2c, 0x1d6a, 1}, + {0x1d78, 0x1d9b, 35}, + {0x1d9c, 0x1dbf, 1}, + {0x2071, 0x207f, 14}, + {0x2090, 0x209c, 1}, + {0x2c7c, 0x2c7d, 1}, + {0x2d6f, 0x2e2f, 192}, + {0x3005, 0x3031, 44}, + {0x3032, 0x3035, 1}, + {0x303b, 0x309d, 98}, + {0x309e, 0x30fc, 94}, + {0x30fd, 0x30fe, 1}, + {0xa015, 0xa4f8, 1251}, + {0xa4f9, 0xa4fd, 1}, + {0xa60c, 0xa67f, 115}, + {0xa69c, 0xa69d, 1}, + {0xa717, 0xa71f, 1}, + {0xa770, 0xa788, 24}, + {0xa7f8, 0xa7f9, 1}, + {0xa9cf, 0xa9e6, 23}, + {0xaa70, 0xaadd, 109}, + {0xaaf3, 0xaaf4, 1}, + {0xab5c, 0xab5f, 1}, + {0xab69, 0xff70, 21511}, + {0xff9e, 0xff9f, 1}, + }, + R32: []Range32{ + {0x16b40, 0x16b43, 1}, + {0x16f93, 0x16f9f, 1}, + {0x16fe0, 0x16fe1, 1}, + {0x16fe3, 0x1e137, 29012}, + {0x1e138, 0x1e13d, 1}, + {0x1e94b, 0x1e94b, 1}, + }, +} + +var _Lo = &RangeTable{ + R16: []Range16{ + {0x00aa, 0x00ba, 16}, + {0x01bb, 0x01c0, 5}, + {0x01c1, 0x01c3, 1}, + {0x0294, 0x05d0, 828}, + {0x05d1, 0x05ea, 1}, + {0x05ef, 0x05f2, 1}, + {0x0620, 0x063f, 1}, + {0x0641, 0x064a, 1}, + {0x066e, 0x066f, 1}, + {0x0671, 0x06d3, 1}, + {0x06d5, 0x06ee, 25}, + {0x06ef, 0x06fa, 11}, + {0x06fb, 0x06fc, 1}, + {0x06ff, 0x0710, 17}, + {0x0712, 0x072f, 1}, + {0x074d, 0x07a5, 1}, + {0x07b1, 0x07ca, 25}, + {0x07cb, 0x07ea, 1}, + {0x0800, 0x0815, 1}, + {0x0840, 0x0858, 1}, + {0x0860, 0x086a, 1}, + {0x08a0, 0x08b4, 1}, + {0x08b6, 0x08c7, 1}, + {0x0904, 0x0939, 1}, + {0x093d, 0x0950, 19}, + {0x0958, 0x0961, 1}, + {0x0972, 0x0980, 1}, + {0x0985, 0x098c, 1}, + {0x098f, 0x0990, 1}, + {0x0993, 0x09a8, 1}, + {0x09aa, 0x09b0, 1}, + {0x09b2, 0x09b6, 4}, + {0x09b7, 0x09b9, 1}, + {0x09bd, 0x09ce, 17}, + {0x09dc, 0x09dd, 1}, + {0x09df, 0x09e1, 1}, + {0x09f0, 0x09f1, 1}, + {0x09fc, 0x0a05, 9}, + {0x0a06, 0x0a0a, 1}, + {0x0a0f, 0x0a10, 1}, + {0x0a13, 0x0a28, 1}, + {0x0a2a, 0x0a30, 1}, + {0x0a32, 0x0a33, 1}, + {0x0a35, 0x0a36, 1}, + {0x0a38, 0x0a39, 1}, + {0x0a59, 0x0a5c, 1}, + {0x0a5e, 0x0a72, 20}, + {0x0a73, 0x0a74, 1}, + {0x0a85, 0x0a8d, 1}, + {0x0a8f, 0x0a91, 1}, + {0x0a93, 0x0aa8, 1}, + {0x0aaa, 0x0ab0, 1}, + {0x0ab2, 0x0ab3, 1}, + {0x0ab5, 0x0ab9, 1}, + {0x0abd, 0x0ad0, 19}, + {0x0ae0, 0x0ae1, 1}, + {0x0af9, 0x0b05, 12}, + {0x0b06, 0x0b0c, 1}, + {0x0b0f, 0x0b10, 1}, + {0x0b13, 0x0b28, 1}, + {0x0b2a, 0x0b30, 1}, + {0x0b32, 0x0b33, 1}, + {0x0b35, 0x0b39, 1}, + {0x0b3d, 0x0b5c, 31}, + {0x0b5d, 0x0b5f, 2}, + {0x0b60, 0x0b61, 1}, + {0x0b71, 0x0b83, 18}, + {0x0b85, 0x0b8a, 1}, + {0x0b8e, 0x0b90, 1}, + {0x0b92, 0x0b95, 1}, + {0x0b99, 0x0b9a, 1}, + {0x0b9c, 0x0b9e, 2}, + {0x0b9f, 0x0ba3, 4}, + {0x0ba4, 0x0ba8, 4}, + {0x0ba9, 0x0baa, 1}, + {0x0bae, 0x0bb9, 1}, + {0x0bd0, 0x0c05, 53}, + {0x0c06, 0x0c0c, 1}, + {0x0c0e, 0x0c10, 1}, + {0x0c12, 0x0c28, 1}, + {0x0c2a, 0x0c39, 1}, + {0x0c3d, 0x0c58, 27}, + {0x0c59, 0x0c5a, 1}, + {0x0c60, 0x0c61, 1}, + {0x0c80, 0x0c85, 5}, + {0x0c86, 0x0c8c, 1}, + {0x0c8e, 0x0c90, 1}, + {0x0c92, 0x0ca8, 1}, + {0x0caa, 0x0cb3, 1}, + {0x0cb5, 0x0cb9, 1}, + {0x0cbd, 0x0cde, 33}, + {0x0ce0, 0x0ce1, 1}, + {0x0cf1, 0x0cf2, 1}, + {0x0d04, 0x0d0c, 1}, + {0x0d0e, 0x0d10, 1}, + {0x0d12, 0x0d3a, 1}, + {0x0d3d, 0x0d4e, 17}, + {0x0d54, 0x0d56, 1}, + {0x0d5f, 0x0d61, 1}, + {0x0d7a, 0x0d7f, 1}, + {0x0d85, 0x0d96, 1}, + {0x0d9a, 0x0db1, 1}, + {0x0db3, 0x0dbb, 1}, + {0x0dbd, 0x0dc0, 3}, + {0x0dc1, 0x0dc6, 1}, + {0x0e01, 0x0e30, 1}, + {0x0e32, 0x0e33, 1}, + {0x0e40, 0x0e45, 1}, + {0x0e81, 0x0e82, 1}, + {0x0e84, 0x0e86, 2}, + {0x0e87, 0x0e8a, 1}, + {0x0e8c, 0x0ea3, 1}, + {0x0ea5, 0x0ea7, 2}, + {0x0ea8, 0x0eb0, 1}, + {0x0eb2, 0x0eb3, 1}, + {0x0ebd, 0x0ec0, 3}, + {0x0ec1, 0x0ec4, 1}, + {0x0edc, 0x0edf, 1}, + {0x0f00, 0x0f40, 64}, + {0x0f41, 0x0f47, 1}, + {0x0f49, 0x0f6c, 1}, + {0x0f88, 0x0f8c, 1}, + {0x1000, 0x102a, 1}, + {0x103f, 0x1050, 17}, + {0x1051, 0x1055, 1}, + {0x105a, 0x105d, 1}, + {0x1061, 0x1065, 4}, + {0x1066, 0x106e, 8}, + {0x106f, 0x1070, 1}, + {0x1075, 0x1081, 1}, + {0x108e, 0x1100, 114}, + {0x1101, 0x1248, 1}, + {0x124a, 0x124d, 1}, + {0x1250, 0x1256, 1}, + {0x1258, 0x125a, 2}, + {0x125b, 0x125d, 1}, + {0x1260, 0x1288, 1}, + {0x128a, 0x128d, 1}, + {0x1290, 0x12b0, 1}, + {0x12b2, 0x12b5, 1}, + {0x12b8, 0x12be, 1}, + {0x12c0, 0x12c2, 2}, + {0x12c3, 0x12c5, 1}, + {0x12c8, 0x12d6, 1}, + {0x12d8, 0x1310, 1}, + {0x1312, 0x1315, 1}, + {0x1318, 0x135a, 1}, + {0x1380, 0x138f, 1}, + {0x1401, 0x166c, 1}, + {0x166f, 0x167f, 1}, + {0x1681, 0x169a, 1}, + {0x16a0, 0x16ea, 1}, + {0x16f1, 0x16f8, 1}, + {0x1700, 0x170c, 1}, + {0x170e, 0x1711, 1}, + {0x1720, 0x1731, 1}, + {0x1740, 0x1751, 1}, + {0x1760, 0x176c, 1}, + {0x176e, 0x1770, 1}, + {0x1780, 0x17b3, 1}, + {0x17dc, 0x1820, 68}, + {0x1821, 0x1842, 1}, + {0x1844, 0x1878, 1}, + {0x1880, 0x1884, 1}, + {0x1887, 0x18a8, 1}, + {0x18aa, 0x18b0, 6}, + {0x18b1, 0x18f5, 1}, + {0x1900, 0x191e, 1}, + {0x1950, 0x196d, 1}, + {0x1970, 0x1974, 1}, + {0x1980, 0x19ab, 1}, + {0x19b0, 0x19c9, 1}, + {0x1a00, 0x1a16, 1}, + {0x1a20, 0x1a54, 1}, + {0x1b05, 0x1b33, 1}, + {0x1b45, 0x1b4b, 1}, + {0x1b83, 0x1ba0, 1}, + {0x1bae, 0x1baf, 1}, + {0x1bba, 0x1be5, 1}, + {0x1c00, 0x1c23, 1}, + {0x1c4d, 0x1c4f, 1}, + {0x1c5a, 0x1c77, 1}, + {0x1ce9, 0x1cec, 1}, + {0x1cee, 0x1cf3, 1}, + {0x1cf5, 0x1cf6, 1}, + {0x1cfa, 0x2135, 1083}, + {0x2136, 0x2138, 1}, + {0x2d30, 0x2d67, 1}, + {0x2d80, 0x2d96, 1}, + {0x2da0, 0x2da6, 1}, + {0x2da8, 0x2dae, 1}, + {0x2db0, 0x2db6, 1}, + {0x2db8, 0x2dbe, 1}, + {0x2dc0, 0x2dc6, 1}, + {0x2dc8, 0x2dce, 1}, + {0x2dd0, 0x2dd6, 1}, + {0x2dd8, 0x2dde, 1}, + {0x3006, 0x303c, 54}, + {0x3041, 0x3096, 1}, + {0x309f, 0x30a1, 2}, + {0x30a2, 0x30fa, 1}, + {0x30ff, 0x3105, 6}, + {0x3106, 0x312f, 1}, + {0x3131, 0x318e, 1}, + {0x31a0, 0x31bf, 1}, + {0x31f0, 0x31ff, 1}, + {0x3400, 0x4dbf, 1}, + {0x4e00, 0x9ffc, 1}, + {0xa000, 0xa014, 1}, + {0xa016, 0xa48c, 1}, + {0xa4d0, 0xa4f7, 1}, + {0xa500, 0xa60b, 1}, + {0xa610, 0xa61f, 1}, + {0xa62a, 0xa62b, 1}, + {0xa66e, 0xa6a0, 50}, + {0xa6a1, 0xa6e5, 1}, + {0xa78f, 0xa7f7, 104}, + {0xa7fb, 0xa801, 1}, + {0xa803, 0xa805, 1}, + {0xa807, 0xa80a, 1}, + {0xa80c, 0xa822, 1}, + {0xa840, 0xa873, 1}, + {0xa882, 0xa8b3, 1}, + {0xa8f2, 0xa8f7, 1}, + {0xa8fb, 0xa8fd, 2}, + {0xa8fe, 0xa90a, 12}, + {0xa90b, 0xa925, 1}, + {0xa930, 0xa946, 1}, + {0xa960, 0xa97c, 1}, + {0xa984, 0xa9b2, 1}, + {0xa9e0, 0xa9e4, 1}, + {0xa9e7, 0xa9ef, 1}, + {0xa9fa, 0xa9fe, 1}, + {0xaa00, 0xaa28, 1}, + {0xaa40, 0xaa42, 1}, + {0xaa44, 0xaa4b, 1}, + {0xaa60, 0xaa6f, 1}, + {0xaa71, 0xaa76, 1}, + {0xaa7a, 0xaa7e, 4}, + {0xaa7f, 0xaaaf, 1}, + {0xaab1, 0xaab5, 4}, + {0xaab6, 0xaab9, 3}, + {0xaaba, 0xaabd, 1}, + {0xaac0, 0xaac2, 2}, + {0xaadb, 0xaadc, 1}, + {0xaae0, 0xaaea, 1}, + {0xaaf2, 0xab01, 15}, + {0xab02, 0xab06, 1}, + {0xab09, 0xab0e, 1}, + {0xab11, 0xab16, 1}, + {0xab20, 0xab26, 1}, + {0xab28, 0xab2e, 1}, + {0xabc0, 0xabe2, 1}, + {0xac00, 0xd7a3, 1}, + {0xd7b0, 0xd7c6, 1}, + {0xd7cb, 0xd7fb, 1}, + {0xf900, 0xfa6d, 1}, + {0xfa70, 0xfad9, 1}, + {0xfb1d, 0xfb1f, 2}, + {0xfb20, 0xfb28, 1}, + {0xfb2a, 0xfb36, 1}, + {0xfb38, 0xfb3c, 1}, + {0xfb3e, 0xfb40, 2}, + {0xfb41, 0xfb43, 2}, + {0xfb44, 0xfb46, 2}, + {0xfb47, 0xfbb1, 1}, + {0xfbd3, 0xfd3d, 1}, + {0xfd50, 0xfd8f, 1}, + {0xfd92, 0xfdc7, 1}, + {0xfdf0, 0xfdfb, 1}, + {0xfe70, 0xfe74, 1}, + {0xfe76, 0xfefc, 1}, + {0xff66, 0xff6f, 1}, + {0xff71, 0xff9d, 1}, + {0xffa0, 0xffbe, 1}, + {0xffc2, 0xffc7, 1}, + {0xffca, 0xffcf, 1}, + {0xffd2, 0xffd7, 1}, + {0xffda, 0xffdc, 1}, + }, + R32: []Range32{ + {0x10000, 0x1000b, 1}, + {0x1000d, 0x10026, 1}, + {0x10028, 0x1003a, 1}, + {0x1003c, 0x1003d, 1}, + {0x1003f, 0x1004d, 1}, + {0x10050, 0x1005d, 1}, + {0x10080, 0x100fa, 1}, + {0x10280, 0x1029c, 1}, + {0x102a0, 0x102d0, 1}, + {0x10300, 0x1031f, 1}, + {0x1032d, 0x10340, 1}, + {0x10342, 0x10349, 1}, + {0x10350, 0x10375, 1}, + {0x10380, 0x1039d, 1}, + {0x103a0, 0x103c3, 1}, + {0x103c8, 0x103cf, 1}, + {0x10450, 0x1049d, 1}, + {0x10500, 0x10527, 1}, + {0x10530, 0x10563, 1}, + {0x10600, 0x10736, 1}, + {0x10740, 0x10755, 1}, + {0x10760, 0x10767, 1}, + {0x10800, 0x10805, 1}, + {0x10808, 0x1080a, 2}, + {0x1080b, 0x10835, 1}, + {0x10837, 0x10838, 1}, + {0x1083c, 0x1083f, 3}, + {0x10840, 0x10855, 1}, + {0x10860, 0x10876, 1}, + {0x10880, 0x1089e, 1}, + {0x108e0, 0x108f2, 1}, + {0x108f4, 0x108f5, 1}, + {0x10900, 0x10915, 1}, + {0x10920, 0x10939, 1}, + {0x10980, 0x109b7, 1}, + {0x109be, 0x109bf, 1}, + {0x10a00, 0x10a10, 16}, + {0x10a11, 0x10a13, 1}, + {0x10a15, 0x10a17, 1}, + {0x10a19, 0x10a35, 1}, + {0x10a60, 0x10a7c, 1}, + {0x10a80, 0x10a9c, 1}, + {0x10ac0, 0x10ac7, 1}, + {0x10ac9, 0x10ae4, 1}, + {0x10b00, 0x10b35, 1}, + {0x10b40, 0x10b55, 1}, + {0x10b60, 0x10b72, 1}, + {0x10b80, 0x10b91, 1}, + {0x10c00, 0x10c48, 1}, + {0x10d00, 0x10d23, 1}, + {0x10e80, 0x10ea9, 1}, + {0x10eb0, 0x10eb1, 1}, + {0x10f00, 0x10f1c, 1}, + {0x10f27, 0x10f30, 9}, + {0x10f31, 0x10f45, 1}, + {0x10fb0, 0x10fc4, 1}, + {0x10fe0, 0x10ff6, 1}, + {0x11003, 0x11037, 1}, + {0x11083, 0x110af, 1}, + {0x110d0, 0x110e8, 1}, + {0x11103, 0x11126, 1}, + {0x11144, 0x11147, 3}, + {0x11150, 0x11172, 1}, + {0x11176, 0x11183, 13}, + {0x11184, 0x111b2, 1}, + {0x111c1, 0x111c4, 1}, + {0x111da, 0x111dc, 2}, + {0x11200, 0x11211, 1}, + {0x11213, 0x1122b, 1}, + {0x11280, 0x11286, 1}, + {0x11288, 0x1128a, 2}, + {0x1128b, 0x1128d, 1}, + {0x1128f, 0x1129d, 1}, + {0x1129f, 0x112a8, 1}, + {0x112b0, 0x112de, 1}, + {0x11305, 0x1130c, 1}, + {0x1130f, 0x11310, 1}, + {0x11313, 0x11328, 1}, + {0x1132a, 0x11330, 1}, + {0x11332, 0x11333, 1}, + {0x11335, 0x11339, 1}, + {0x1133d, 0x11350, 19}, + {0x1135d, 0x11361, 1}, + {0x11400, 0x11434, 1}, + {0x11447, 0x1144a, 1}, + {0x1145f, 0x11461, 1}, + {0x11480, 0x114af, 1}, + {0x114c4, 0x114c5, 1}, + {0x114c7, 0x11580, 185}, + {0x11581, 0x115ae, 1}, + {0x115d8, 0x115db, 1}, + {0x11600, 0x1162f, 1}, + {0x11644, 0x11680, 60}, + {0x11681, 0x116aa, 1}, + {0x116b8, 0x11700, 72}, + {0x11701, 0x1171a, 1}, + {0x11800, 0x1182b, 1}, + {0x118ff, 0x11906, 1}, + {0x11909, 0x1190c, 3}, + {0x1190d, 0x11913, 1}, + {0x11915, 0x11916, 1}, + {0x11918, 0x1192f, 1}, + {0x1193f, 0x11941, 2}, + {0x119a0, 0x119a7, 1}, + {0x119aa, 0x119d0, 1}, + {0x119e1, 0x119e3, 2}, + {0x11a00, 0x11a0b, 11}, + {0x11a0c, 0x11a32, 1}, + {0x11a3a, 0x11a50, 22}, + {0x11a5c, 0x11a89, 1}, + {0x11a9d, 0x11ac0, 35}, + {0x11ac1, 0x11af8, 1}, + {0x11c00, 0x11c08, 1}, + {0x11c0a, 0x11c2e, 1}, + {0x11c40, 0x11c72, 50}, + {0x11c73, 0x11c8f, 1}, + {0x11d00, 0x11d06, 1}, + {0x11d08, 0x11d09, 1}, + {0x11d0b, 0x11d30, 1}, + {0x11d46, 0x11d60, 26}, + {0x11d61, 0x11d65, 1}, + {0x11d67, 0x11d68, 1}, + {0x11d6a, 0x11d89, 1}, + {0x11d98, 0x11ee0, 328}, + {0x11ee1, 0x11ef2, 1}, + {0x11fb0, 0x12000, 80}, + {0x12001, 0x12399, 1}, + {0x12480, 0x12543, 1}, + {0x13000, 0x1342e, 1}, + {0x14400, 0x14646, 1}, + {0x16800, 0x16a38, 1}, + {0x16a40, 0x16a5e, 1}, + {0x16ad0, 0x16aed, 1}, + {0x16b00, 0x16b2f, 1}, + {0x16b63, 0x16b77, 1}, + {0x16b7d, 0x16b8f, 1}, + {0x16f00, 0x16f4a, 1}, + {0x16f50, 0x17000, 176}, + {0x17001, 0x187f7, 1}, + {0x18800, 0x18cd5, 1}, + {0x18d00, 0x18d08, 1}, + {0x1b000, 0x1b11e, 1}, + {0x1b150, 0x1b152, 1}, + {0x1b164, 0x1b167, 1}, + {0x1b170, 0x1b2fb, 1}, + {0x1bc00, 0x1bc6a, 1}, + {0x1bc70, 0x1bc7c, 1}, + {0x1bc80, 0x1bc88, 1}, + {0x1bc90, 0x1bc99, 1}, + {0x1e100, 0x1e12c, 1}, + {0x1e14e, 0x1e2c0, 370}, + {0x1e2c1, 0x1e2eb, 1}, + {0x1e800, 0x1e8c4, 1}, + {0x1ee00, 0x1ee03, 1}, + {0x1ee05, 0x1ee1f, 1}, + {0x1ee21, 0x1ee22, 1}, + {0x1ee24, 0x1ee27, 3}, + {0x1ee29, 0x1ee32, 1}, + {0x1ee34, 0x1ee37, 1}, + {0x1ee39, 0x1ee3b, 2}, + {0x1ee42, 0x1ee47, 5}, + {0x1ee49, 0x1ee4d, 2}, + {0x1ee4e, 0x1ee4f, 1}, + {0x1ee51, 0x1ee52, 1}, + {0x1ee54, 0x1ee57, 3}, + {0x1ee59, 0x1ee61, 2}, + {0x1ee62, 0x1ee64, 2}, + {0x1ee67, 0x1ee6a, 1}, + {0x1ee6c, 0x1ee72, 1}, + {0x1ee74, 0x1ee77, 1}, + {0x1ee79, 0x1ee7c, 1}, + {0x1ee7e, 0x1ee80, 2}, + {0x1ee81, 0x1ee89, 1}, + {0x1ee8b, 0x1ee9b, 1}, + {0x1eea1, 0x1eea3, 1}, + {0x1eea5, 0x1eea9, 1}, + {0x1eeab, 0x1eebb, 1}, + {0x20000, 0x2a6dd, 1}, + {0x2a700, 0x2b734, 1}, + {0x2b740, 0x2b81d, 1}, + {0x2b820, 0x2cea1, 1}, + {0x2ceb0, 0x2ebe0, 1}, + {0x2f800, 0x2fa1d, 1}, + {0x30000, 0x3134a, 1}, + }, + LatinOffset: 1, +} + +var _Lt = &RangeTable{ + R16: []Range16{ + {0x01c5, 0x01cb, 3}, + {0x01f2, 0x1f88, 7574}, + {0x1f89, 0x1f8f, 1}, + {0x1f98, 0x1f9f, 1}, + {0x1fa8, 0x1faf, 1}, + {0x1fbc, 0x1fcc, 16}, + {0x1ffc, 0x1ffc, 1}, + }, +} + +var _Lu = &RangeTable{ + R16: []Range16{ + {0x0041, 0x005a, 1}, + {0x00c0, 0x00d6, 1}, + {0x00d8, 0x00de, 1}, + {0x0100, 0x0136, 2}, + {0x0139, 0x0147, 2}, + {0x014a, 0x0178, 2}, + {0x0179, 0x017d, 2}, + {0x0181, 0x0182, 1}, + {0x0184, 0x0186, 2}, + {0x0187, 0x0189, 2}, + {0x018a, 0x018b, 1}, + {0x018e, 0x0191, 1}, + {0x0193, 0x0194, 1}, + {0x0196, 0x0198, 1}, + {0x019c, 0x019d, 1}, + {0x019f, 0x01a0, 1}, + {0x01a2, 0x01a6, 2}, + {0x01a7, 0x01a9, 2}, + {0x01ac, 0x01ae, 2}, + {0x01af, 0x01b1, 2}, + {0x01b2, 0x01b3, 1}, + {0x01b5, 0x01b7, 2}, + {0x01b8, 0x01bc, 4}, + {0x01c4, 0x01cd, 3}, + {0x01cf, 0x01db, 2}, + {0x01de, 0x01ee, 2}, + {0x01f1, 0x01f4, 3}, + {0x01f6, 0x01f8, 1}, + {0x01fa, 0x0232, 2}, + {0x023a, 0x023b, 1}, + {0x023d, 0x023e, 1}, + {0x0241, 0x0243, 2}, + {0x0244, 0x0246, 1}, + {0x0248, 0x024e, 2}, + {0x0370, 0x0372, 2}, + {0x0376, 0x037f, 9}, + {0x0386, 0x0388, 2}, + {0x0389, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x0391, 2}, + {0x0392, 0x03a1, 1}, + {0x03a3, 0x03ab, 1}, + {0x03cf, 0x03d2, 3}, + {0x03d3, 0x03d4, 1}, + {0x03d8, 0x03ee, 2}, + {0x03f4, 0x03f7, 3}, + {0x03f9, 0x03fa, 1}, + {0x03fd, 0x042f, 1}, + {0x0460, 0x0480, 2}, + {0x048a, 0x04c0, 2}, + {0x04c1, 0x04cd, 2}, + {0x04d0, 0x052e, 2}, + {0x0531, 0x0556, 1}, + {0x10a0, 0x10c5, 1}, + {0x10c7, 0x10cd, 6}, + {0x13a0, 0x13f5, 1}, + {0x1c90, 0x1cba, 1}, + {0x1cbd, 0x1cbf, 1}, + {0x1e00, 0x1e94, 2}, + {0x1e9e, 0x1efe, 2}, + {0x1f08, 0x1f0f, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f28, 0x1f2f, 1}, + {0x1f38, 0x1f3f, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f68, 0x1f6f, 1}, + {0x1fb8, 0x1fbb, 1}, + {0x1fc8, 0x1fcb, 1}, + {0x1fd8, 0x1fdb, 1}, + {0x1fe8, 0x1fec, 1}, + {0x1ff8, 0x1ffb, 1}, + {0x2102, 0x2107, 5}, + {0x210b, 0x210d, 1}, + {0x2110, 0x2112, 1}, + {0x2115, 0x2119, 4}, + {0x211a, 0x211d, 1}, + {0x2124, 0x212a, 2}, + {0x212b, 0x212d, 1}, + {0x2130, 0x2133, 1}, + {0x213e, 0x213f, 1}, + {0x2145, 0x2183, 62}, + {0x2c00, 0x2c2e, 1}, + {0x2c60, 0x2c62, 2}, + {0x2c63, 0x2c64, 1}, + {0x2c67, 0x2c6d, 2}, + {0x2c6e, 0x2c70, 1}, + {0x2c72, 0x2c75, 3}, + {0x2c7e, 0x2c80, 1}, + {0x2c82, 0x2ce2, 2}, + {0x2ceb, 0x2ced, 2}, + {0x2cf2, 0xa640, 31054}, + {0xa642, 0xa66c, 2}, + {0xa680, 0xa69a, 2}, + {0xa722, 0xa72e, 2}, + {0xa732, 0xa76e, 2}, + {0xa779, 0xa77d, 2}, + {0xa77e, 0xa786, 2}, + {0xa78b, 0xa78d, 2}, + {0xa790, 0xa792, 2}, + {0xa796, 0xa7aa, 2}, + {0xa7ab, 0xa7ae, 1}, + {0xa7b0, 0xa7b4, 1}, + {0xa7b6, 0xa7be, 2}, + {0xa7c2, 0xa7c4, 2}, + {0xa7c5, 0xa7c7, 1}, + {0xa7c9, 0xa7f5, 44}, + {0xff21, 0xff3a, 1}, + }, + R32: []Range32{ + {0x10400, 0x10427, 1}, + {0x104b0, 0x104d3, 1}, + {0x10c80, 0x10cb2, 1}, + {0x118a0, 0x118bf, 1}, + {0x16e40, 0x16e5f, 1}, + {0x1d400, 0x1d419, 1}, + {0x1d434, 0x1d44d, 1}, + {0x1d468, 0x1d481, 1}, + {0x1d49c, 0x1d49e, 2}, + {0x1d49f, 0x1d4a5, 3}, + {0x1d4a6, 0x1d4a9, 3}, + {0x1d4aa, 0x1d4ac, 1}, + {0x1d4ae, 0x1d4b5, 1}, + {0x1d4d0, 0x1d4e9, 1}, + {0x1d504, 0x1d505, 1}, + {0x1d507, 0x1d50a, 1}, + {0x1d50d, 0x1d514, 1}, + {0x1d516, 0x1d51c, 1}, + {0x1d538, 0x1d539, 1}, + {0x1d53b, 0x1d53e, 1}, + {0x1d540, 0x1d544, 1}, + {0x1d546, 0x1d54a, 4}, + {0x1d54b, 0x1d550, 1}, + {0x1d56c, 0x1d585, 1}, + {0x1d5a0, 0x1d5b9, 1}, + {0x1d5d4, 0x1d5ed, 1}, + {0x1d608, 0x1d621, 1}, + {0x1d63c, 0x1d655, 1}, + {0x1d670, 0x1d689, 1}, + {0x1d6a8, 0x1d6c0, 1}, + {0x1d6e2, 0x1d6fa, 1}, + {0x1d71c, 0x1d734, 1}, + {0x1d756, 0x1d76e, 1}, + {0x1d790, 0x1d7a8, 1}, + {0x1d7ca, 0x1e900, 4406}, + {0x1e901, 0x1e921, 1}, + }, + LatinOffset: 3, +} + +var _M = &RangeTable{ + R16: []Range16{ + {0x0300, 0x036f, 1}, + {0x0483, 0x0489, 1}, + {0x0591, 0x05bd, 1}, + {0x05bf, 0x05c1, 2}, + {0x05c2, 0x05c4, 2}, + {0x05c5, 0x05c7, 2}, + {0x0610, 0x061a, 1}, + {0x064b, 0x065f, 1}, + {0x0670, 0x06d6, 102}, + {0x06d7, 0x06dc, 1}, + {0x06df, 0x06e4, 1}, + {0x06e7, 0x06e8, 1}, + {0x06ea, 0x06ed, 1}, + {0x0711, 0x0730, 31}, + {0x0731, 0x074a, 1}, + {0x07a6, 0x07b0, 1}, + {0x07eb, 0x07f3, 1}, + {0x07fd, 0x0816, 25}, + {0x0817, 0x0819, 1}, + {0x081b, 0x0823, 1}, + {0x0825, 0x0827, 1}, + {0x0829, 0x082d, 1}, + {0x0859, 0x085b, 1}, + {0x08d3, 0x08e1, 1}, + {0x08e3, 0x0903, 1}, + {0x093a, 0x093c, 1}, + {0x093e, 0x094f, 1}, + {0x0951, 0x0957, 1}, + {0x0962, 0x0963, 1}, + {0x0981, 0x0983, 1}, + {0x09bc, 0x09be, 2}, + {0x09bf, 0x09c4, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09cd, 1}, + {0x09d7, 0x09e2, 11}, + {0x09e3, 0x09fe, 27}, + {0x0a01, 0x0a03, 1}, + {0x0a3c, 0x0a3e, 2}, + {0x0a3f, 0x0a42, 1}, + {0x0a47, 0x0a48, 1}, + {0x0a4b, 0x0a4d, 1}, + {0x0a51, 0x0a70, 31}, + {0x0a71, 0x0a75, 4}, + {0x0a81, 0x0a83, 1}, + {0x0abc, 0x0abe, 2}, + {0x0abf, 0x0ac5, 1}, + {0x0ac7, 0x0ac9, 1}, + {0x0acb, 0x0acd, 1}, + {0x0ae2, 0x0ae3, 1}, + {0x0afa, 0x0aff, 1}, + {0x0b01, 0x0b03, 1}, + {0x0b3c, 0x0b3e, 2}, + {0x0b3f, 0x0b44, 1}, + {0x0b47, 0x0b48, 1}, + {0x0b4b, 0x0b4d, 1}, + {0x0b55, 0x0b57, 1}, + {0x0b62, 0x0b63, 1}, + {0x0b82, 0x0bbe, 60}, + {0x0bbf, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcd, 1}, + {0x0bd7, 0x0c00, 41}, + {0x0c01, 0x0c04, 1}, + {0x0c3e, 0x0c44, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4d, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c62, 0x0c63, 1}, + {0x0c81, 0x0c83, 1}, + {0x0cbc, 0x0cbe, 2}, + {0x0cbf, 0x0cc4, 1}, + {0x0cc6, 0x0cc8, 1}, + {0x0cca, 0x0ccd, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0ce2, 0x0ce3, 1}, + {0x0d00, 0x0d03, 1}, + {0x0d3b, 0x0d3c, 1}, + {0x0d3e, 0x0d44, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4d, 1}, + {0x0d57, 0x0d62, 11}, + {0x0d63, 0x0d81, 30}, + {0x0d82, 0x0d83, 1}, + {0x0dca, 0x0dcf, 5}, + {0x0dd0, 0x0dd4, 1}, + {0x0dd6, 0x0dd8, 2}, + {0x0dd9, 0x0ddf, 1}, + {0x0df2, 0x0df3, 1}, + {0x0e31, 0x0e34, 3}, + {0x0e35, 0x0e3a, 1}, + {0x0e47, 0x0e4e, 1}, + {0x0eb1, 0x0eb4, 3}, + {0x0eb5, 0x0ebc, 1}, + {0x0ec8, 0x0ecd, 1}, + {0x0f18, 0x0f19, 1}, + {0x0f35, 0x0f39, 2}, + {0x0f3e, 0x0f3f, 1}, + {0x0f71, 0x0f84, 1}, + {0x0f86, 0x0f87, 1}, + {0x0f8d, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x0fc6, 0x102b, 101}, + {0x102c, 0x103e, 1}, + {0x1056, 0x1059, 1}, + {0x105e, 0x1060, 1}, + {0x1062, 0x1064, 1}, + {0x1067, 0x106d, 1}, + {0x1071, 0x1074, 1}, + {0x1082, 0x108d, 1}, + {0x108f, 0x109a, 11}, + {0x109b, 0x109d, 1}, + {0x135d, 0x135f, 1}, + {0x1712, 0x1714, 1}, + {0x1732, 0x1734, 1}, + {0x1752, 0x1753, 1}, + {0x1772, 0x1773, 1}, + {0x17b4, 0x17d3, 1}, + {0x17dd, 0x180b, 46}, + {0x180c, 0x180d, 1}, + {0x1885, 0x1886, 1}, + {0x18a9, 0x1920, 119}, + {0x1921, 0x192b, 1}, + {0x1930, 0x193b, 1}, + {0x1a17, 0x1a1b, 1}, + {0x1a55, 0x1a5e, 1}, + {0x1a60, 0x1a7c, 1}, + {0x1a7f, 0x1ab0, 49}, + {0x1ab1, 0x1ac0, 1}, + {0x1b00, 0x1b04, 1}, + {0x1b34, 0x1b44, 1}, + {0x1b6b, 0x1b73, 1}, + {0x1b80, 0x1b82, 1}, + {0x1ba1, 0x1bad, 1}, + {0x1be6, 0x1bf3, 1}, + {0x1c24, 0x1c37, 1}, + {0x1cd0, 0x1cd2, 1}, + {0x1cd4, 0x1ce8, 1}, + {0x1ced, 0x1cf4, 7}, + {0x1cf7, 0x1cf9, 1}, + {0x1dc0, 0x1df9, 1}, + {0x1dfb, 0x1dff, 1}, + {0x20d0, 0x20f0, 1}, + {0x2cef, 0x2cf1, 1}, + {0x2d7f, 0x2de0, 97}, + {0x2de1, 0x2dff, 1}, + {0x302a, 0x302f, 1}, + {0x3099, 0x309a, 1}, + {0xa66f, 0xa672, 1}, + {0xa674, 0xa67d, 1}, + {0xa69e, 0xa69f, 1}, + {0xa6f0, 0xa6f1, 1}, + {0xa802, 0xa806, 4}, + {0xa80b, 0xa823, 24}, + {0xa824, 0xa827, 1}, + {0xa82c, 0xa880, 84}, + {0xa881, 0xa8b4, 51}, + {0xa8b5, 0xa8c5, 1}, + {0xa8e0, 0xa8f1, 1}, + {0xa8ff, 0xa926, 39}, + {0xa927, 0xa92d, 1}, + {0xa947, 0xa953, 1}, + {0xa980, 0xa983, 1}, + {0xa9b3, 0xa9c0, 1}, + {0xa9e5, 0xaa29, 68}, + {0xaa2a, 0xaa36, 1}, + {0xaa43, 0xaa4c, 9}, + {0xaa4d, 0xaa7b, 46}, + {0xaa7c, 0xaa7d, 1}, + {0xaab0, 0xaab2, 2}, + {0xaab3, 0xaab4, 1}, + {0xaab7, 0xaab8, 1}, + {0xaabe, 0xaabf, 1}, + {0xaac1, 0xaaeb, 42}, + {0xaaec, 0xaaef, 1}, + {0xaaf5, 0xaaf6, 1}, + {0xabe3, 0xabea, 1}, + {0xabec, 0xabed, 1}, + {0xfb1e, 0xfe00, 738}, + {0xfe01, 0xfe0f, 1}, + {0xfe20, 0xfe2f, 1}, + }, + R32: []Range32{ + {0x101fd, 0x102e0, 227}, + {0x10376, 0x1037a, 1}, + {0x10a01, 0x10a03, 1}, + {0x10a05, 0x10a06, 1}, + {0x10a0c, 0x10a0f, 1}, + {0x10a38, 0x10a3a, 1}, + {0x10a3f, 0x10ae5, 166}, + {0x10ae6, 0x10d24, 574}, + {0x10d25, 0x10d27, 1}, + {0x10eab, 0x10eac, 1}, + {0x10f46, 0x10f50, 1}, + {0x11000, 0x11002, 1}, + {0x11038, 0x11046, 1}, + {0x1107f, 0x11082, 1}, + {0x110b0, 0x110ba, 1}, + {0x11100, 0x11102, 1}, + {0x11127, 0x11134, 1}, + {0x11145, 0x11146, 1}, + {0x11173, 0x11180, 13}, + {0x11181, 0x11182, 1}, + {0x111b3, 0x111c0, 1}, + {0x111c9, 0x111cc, 1}, + {0x111ce, 0x111cf, 1}, + {0x1122c, 0x11237, 1}, + {0x1123e, 0x112df, 161}, + {0x112e0, 0x112ea, 1}, + {0x11300, 0x11303, 1}, + {0x1133b, 0x1133c, 1}, + {0x1133e, 0x11344, 1}, + {0x11347, 0x11348, 1}, + {0x1134b, 0x1134d, 1}, + {0x11357, 0x11362, 11}, + {0x11363, 0x11366, 3}, + {0x11367, 0x1136c, 1}, + {0x11370, 0x11374, 1}, + {0x11435, 0x11446, 1}, + {0x1145e, 0x114b0, 82}, + {0x114b1, 0x114c3, 1}, + {0x115af, 0x115b5, 1}, + {0x115b8, 0x115c0, 1}, + {0x115dc, 0x115dd, 1}, + {0x11630, 0x11640, 1}, + {0x116ab, 0x116b7, 1}, + {0x1171d, 0x1172b, 1}, + {0x1182c, 0x1183a, 1}, + {0x11930, 0x11935, 1}, + {0x11937, 0x11938, 1}, + {0x1193b, 0x1193e, 1}, + {0x11940, 0x11942, 2}, + {0x11943, 0x119d1, 142}, + {0x119d2, 0x119d7, 1}, + {0x119da, 0x119e0, 1}, + {0x119e4, 0x11a01, 29}, + {0x11a02, 0x11a0a, 1}, + {0x11a33, 0x11a39, 1}, + {0x11a3b, 0x11a3e, 1}, + {0x11a47, 0x11a51, 10}, + {0x11a52, 0x11a5b, 1}, + {0x11a8a, 0x11a99, 1}, + {0x11c2f, 0x11c36, 1}, + {0x11c38, 0x11c3f, 1}, + {0x11c92, 0x11ca7, 1}, + {0x11ca9, 0x11cb6, 1}, + {0x11d31, 0x11d36, 1}, + {0x11d3a, 0x11d3c, 2}, + {0x11d3d, 0x11d3f, 2}, + {0x11d40, 0x11d45, 1}, + {0x11d47, 0x11d8a, 67}, + {0x11d8b, 0x11d8e, 1}, + {0x11d90, 0x11d91, 1}, + {0x11d93, 0x11d97, 1}, + {0x11ef3, 0x11ef6, 1}, + {0x16af0, 0x16af4, 1}, + {0x16b30, 0x16b36, 1}, + {0x16f4f, 0x16f51, 2}, + {0x16f52, 0x16f87, 1}, + {0x16f8f, 0x16f92, 1}, + {0x16fe4, 0x16ff0, 12}, + {0x16ff1, 0x1bc9d, 19628}, + {0x1bc9e, 0x1d165, 5319}, + {0x1d166, 0x1d169, 1}, + {0x1d16d, 0x1d172, 1}, + {0x1d17b, 0x1d182, 1}, + {0x1d185, 0x1d18b, 1}, + {0x1d1aa, 0x1d1ad, 1}, + {0x1d242, 0x1d244, 1}, + {0x1da00, 0x1da36, 1}, + {0x1da3b, 0x1da6c, 1}, + {0x1da75, 0x1da84, 15}, + {0x1da9b, 0x1da9f, 1}, + {0x1daa1, 0x1daaf, 1}, + {0x1e000, 0x1e006, 1}, + {0x1e008, 0x1e018, 1}, + {0x1e01b, 0x1e021, 1}, + {0x1e023, 0x1e024, 1}, + {0x1e026, 0x1e02a, 1}, + {0x1e130, 0x1e136, 1}, + {0x1e2ec, 0x1e2ef, 1}, + {0x1e8d0, 0x1e8d6, 1}, + {0x1e944, 0x1e94a, 1}, + {0xe0100, 0xe01ef, 1}, + }, +} + +var _Mc = &RangeTable{ + R16: []Range16{ + {0x0903, 0x093b, 56}, + {0x093e, 0x0940, 1}, + {0x0949, 0x094c, 1}, + {0x094e, 0x094f, 1}, + {0x0982, 0x0983, 1}, + {0x09be, 0x09c0, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09cc, 1}, + {0x09d7, 0x0a03, 44}, + {0x0a3e, 0x0a40, 1}, + {0x0a83, 0x0abe, 59}, + {0x0abf, 0x0ac0, 1}, + {0x0ac9, 0x0acb, 2}, + {0x0acc, 0x0b02, 54}, + {0x0b03, 0x0b3e, 59}, + {0x0b40, 0x0b47, 7}, + {0x0b48, 0x0b4b, 3}, + {0x0b4c, 0x0b57, 11}, + {0x0bbe, 0x0bbf, 1}, + {0x0bc1, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcc, 1}, + {0x0bd7, 0x0c01, 42}, + {0x0c02, 0x0c03, 1}, + {0x0c41, 0x0c44, 1}, + {0x0c82, 0x0c83, 1}, + {0x0cbe, 0x0cc0, 2}, + {0x0cc1, 0x0cc4, 1}, + {0x0cc7, 0x0cc8, 1}, + {0x0cca, 0x0ccb, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0d02, 0x0d03, 1}, + {0x0d3e, 0x0d40, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4c, 1}, + {0x0d57, 0x0d82, 43}, + {0x0d83, 0x0dcf, 76}, + {0x0dd0, 0x0dd1, 1}, + {0x0dd8, 0x0ddf, 1}, + {0x0df2, 0x0df3, 1}, + {0x0f3e, 0x0f3f, 1}, + {0x0f7f, 0x102b, 172}, + {0x102c, 0x1031, 5}, + {0x1038, 0x103b, 3}, + {0x103c, 0x1056, 26}, + {0x1057, 0x1062, 11}, + {0x1063, 0x1064, 1}, + {0x1067, 0x106d, 1}, + {0x1083, 0x1084, 1}, + {0x1087, 0x108c, 1}, + {0x108f, 0x109a, 11}, + {0x109b, 0x109c, 1}, + {0x17b6, 0x17be, 8}, + {0x17bf, 0x17c5, 1}, + {0x17c7, 0x17c8, 1}, + {0x1923, 0x1926, 1}, + {0x1929, 0x192b, 1}, + {0x1930, 0x1931, 1}, + {0x1933, 0x1938, 1}, + {0x1a19, 0x1a1a, 1}, + {0x1a55, 0x1a57, 2}, + {0x1a61, 0x1a63, 2}, + {0x1a64, 0x1a6d, 9}, + {0x1a6e, 0x1a72, 1}, + {0x1b04, 0x1b35, 49}, + {0x1b3b, 0x1b3d, 2}, + {0x1b3e, 0x1b41, 1}, + {0x1b43, 0x1b44, 1}, + {0x1b82, 0x1ba1, 31}, + {0x1ba6, 0x1ba7, 1}, + {0x1baa, 0x1be7, 61}, + {0x1bea, 0x1bec, 1}, + {0x1bee, 0x1bf2, 4}, + {0x1bf3, 0x1c24, 49}, + {0x1c25, 0x1c2b, 1}, + {0x1c34, 0x1c35, 1}, + {0x1ce1, 0x1cf7, 22}, + {0x302e, 0x302f, 1}, + {0xa823, 0xa824, 1}, + {0xa827, 0xa880, 89}, + {0xa881, 0xa8b4, 51}, + {0xa8b5, 0xa8c3, 1}, + {0xa952, 0xa953, 1}, + {0xa983, 0xa9b4, 49}, + {0xa9b5, 0xa9ba, 5}, + {0xa9bb, 0xa9be, 3}, + {0xa9bf, 0xa9c0, 1}, + {0xaa2f, 0xaa30, 1}, + {0xaa33, 0xaa34, 1}, + {0xaa4d, 0xaa7b, 46}, + {0xaa7d, 0xaaeb, 110}, + {0xaaee, 0xaaef, 1}, + {0xaaf5, 0xabe3, 238}, + {0xabe4, 0xabe6, 2}, + {0xabe7, 0xabe9, 2}, + {0xabea, 0xabec, 2}, + }, + R32: []Range32{ + {0x11000, 0x11002, 2}, + {0x11082, 0x110b0, 46}, + {0x110b1, 0x110b2, 1}, + {0x110b7, 0x110b8, 1}, + {0x1112c, 0x11145, 25}, + {0x11146, 0x11182, 60}, + {0x111b3, 0x111b5, 1}, + {0x111bf, 0x111c0, 1}, + {0x111ce, 0x1122c, 94}, + {0x1122d, 0x1122e, 1}, + {0x11232, 0x11233, 1}, + {0x11235, 0x112e0, 171}, + {0x112e1, 0x112e2, 1}, + {0x11302, 0x11303, 1}, + {0x1133e, 0x1133f, 1}, + {0x11341, 0x11344, 1}, + {0x11347, 0x11348, 1}, + {0x1134b, 0x1134d, 1}, + {0x11357, 0x11362, 11}, + {0x11363, 0x11435, 210}, + {0x11436, 0x11437, 1}, + {0x11440, 0x11441, 1}, + {0x11445, 0x114b0, 107}, + {0x114b1, 0x114b2, 1}, + {0x114b9, 0x114bb, 2}, + {0x114bc, 0x114be, 1}, + {0x114c1, 0x115af, 238}, + {0x115b0, 0x115b1, 1}, + {0x115b8, 0x115bb, 1}, + {0x115be, 0x11630, 114}, + {0x11631, 0x11632, 1}, + {0x1163b, 0x1163c, 1}, + {0x1163e, 0x116ac, 110}, + {0x116ae, 0x116af, 1}, + {0x116b6, 0x11720, 106}, + {0x11721, 0x11726, 5}, + {0x1182c, 0x1182e, 1}, + {0x11838, 0x11930, 248}, + {0x11931, 0x11935, 1}, + {0x11937, 0x11938, 1}, + {0x1193d, 0x11940, 3}, + {0x11942, 0x119d1, 143}, + {0x119d2, 0x119d3, 1}, + {0x119dc, 0x119df, 1}, + {0x119e4, 0x11a39, 85}, + {0x11a57, 0x11a58, 1}, + {0x11a97, 0x11c2f, 408}, + {0x11c3e, 0x11ca9, 107}, + {0x11cb1, 0x11cb4, 3}, + {0x11d8a, 0x11d8e, 1}, + {0x11d93, 0x11d94, 1}, + {0x11d96, 0x11ef5, 351}, + {0x11ef6, 0x16f51, 20571}, + {0x16f52, 0x16f87, 1}, + {0x16ff0, 0x16ff1, 1}, + {0x1d165, 0x1d166, 1}, + {0x1d16d, 0x1d172, 1}, + }, +} + +var _Me = &RangeTable{ + R16: []Range16{ + {0x0488, 0x0489, 1}, + {0x1abe, 0x20dd, 1567}, + {0x20de, 0x20e0, 1}, + {0x20e2, 0x20e4, 1}, + {0xa670, 0xa672, 1}, + }, +} + +var _Mn = &RangeTable{ + R16: []Range16{ + {0x0300, 0x036f, 1}, + {0x0483, 0x0487, 1}, + {0x0591, 0x05bd, 1}, + {0x05bf, 0x05c1, 2}, + {0x05c2, 0x05c4, 2}, + {0x05c5, 0x05c7, 2}, + {0x0610, 0x061a, 1}, + {0x064b, 0x065f, 1}, + {0x0670, 0x06d6, 102}, + {0x06d7, 0x06dc, 1}, + {0x06df, 0x06e4, 1}, + {0x06e7, 0x06e8, 1}, + {0x06ea, 0x06ed, 1}, + {0x0711, 0x0730, 31}, + {0x0731, 0x074a, 1}, + {0x07a6, 0x07b0, 1}, + {0x07eb, 0x07f3, 1}, + {0x07fd, 0x0816, 25}, + {0x0817, 0x0819, 1}, + {0x081b, 0x0823, 1}, + {0x0825, 0x0827, 1}, + {0x0829, 0x082d, 1}, + {0x0859, 0x085b, 1}, + {0x08d3, 0x08e1, 1}, + {0x08e3, 0x0902, 1}, + {0x093a, 0x093c, 2}, + {0x0941, 0x0948, 1}, + {0x094d, 0x0951, 4}, + {0x0952, 0x0957, 1}, + {0x0962, 0x0963, 1}, + {0x0981, 0x09bc, 59}, + {0x09c1, 0x09c4, 1}, + {0x09cd, 0x09e2, 21}, + {0x09e3, 0x09fe, 27}, + {0x0a01, 0x0a02, 1}, + {0x0a3c, 0x0a41, 5}, + {0x0a42, 0x0a47, 5}, + {0x0a48, 0x0a4b, 3}, + {0x0a4c, 0x0a4d, 1}, + {0x0a51, 0x0a70, 31}, + {0x0a71, 0x0a75, 4}, + {0x0a81, 0x0a82, 1}, + {0x0abc, 0x0ac1, 5}, + {0x0ac2, 0x0ac5, 1}, + {0x0ac7, 0x0ac8, 1}, + {0x0acd, 0x0ae2, 21}, + {0x0ae3, 0x0afa, 23}, + {0x0afb, 0x0aff, 1}, + {0x0b01, 0x0b3c, 59}, + {0x0b3f, 0x0b41, 2}, + {0x0b42, 0x0b44, 1}, + {0x0b4d, 0x0b55, 8}, + {0x0b56, 0x0b62, 12}, + {0x0b63, 0x0b82, 31}, + {0x0bc0, 0x0bcd, 13}, + {0x0c00, 0x0c04, 4}, + {0x0c3e, 0x0c40, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4d, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c62, 0x0c63, 1}, + {0x0c81, 0x0cbc, 59}, + {0x0cbf, 0x0cc6, 7}, + {0x0ccc, 0x0ccd, 1}, + {0x0ce2, 0x0ce3, 1}, + {0x0d00, 0x0d01, 1}, + {0x0d3b, 0x0d3c, 1}, + {0x0d41, 0x0d44, 1}, + {0x0d4d, 0x0d62, 21}, + {0x0d63, 0x0d81, 30}, + {0x0dca, 0x0dd2, 8}, + {0x0dd3, 0x0dd4, 1}, + {0x0dd6, 0x0e31, 91}, + {0x0e34, 0x0e3a, 1}, + {0x0e47, 0x0e4e, 1}, + {0x0eb1, 0x0eb4, 3}, + {0x0eb5, 0x0ebc, 1}, + {0x0ec8, 0x0ecd, 1}, + {0x0f18, 0x0f19, 1}, + {0x0f35, 0x0f39, 2}, + {0x0f71, 0x0f7e, 1}, + {0x0f80, 0x0f84, 1}, + {0x0f86, 0x0f87, 1}, + {0x0f8d, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x0fc6, 0x102d, 103}, + {0x102e, 0x1030, 1}, + {0x1032, 0x1037, 1}, + {0x1039, 0x103a, 1}, + {0x103d, 0x103e, 1}, + {0x1058, 0x1059, 1}, + {0x105e, 0x1060, 1}, + {0x1071, 0x1074, 1}, + {0x1082, 0x1085, 3}, + {0x1086, 0x108d, 7}, + {0x109d, 0x135d, 704}, + {0x135e, 0x135f, 1}, + {0x1712, 0x1714, 1}, + {0x1732, 0x1734, 1}, + {0x1752, 0x1753, 1}, + {0x1772, 0x1773, 1}, + {0x17b4, 0x17b5, 1}, + {0x17b7, 0x17bd, 1}, + {0x17c6, 0x17c9, 3}, + {0x17ca, 0x17d3, 1}, + {0x17dd, 0x180b, 46}, + {0x180c, 0x180d, 1}, + {0x1885, 0x1886, 1}, + {0x18a9, 0x1920, 119}, + {0x1921, 0x1922, 1}, + {0x1927, 0x1928, 1}, + {0x1932, 0x1939, 7}, + {0x193a, 0x193b, 1}, + {0x1a17, 0x1a18, 1}, + {0x1a1b, 0x1a56, 59}, + {0x1a58, 0x1a5e, 1}, + {0x1a60, 0x1a62, 2}, + {0x1a65, 0x1a6c, 1}, + {0x1a73, 0x1a7c, 1}, + {0x1a7f, 0x1ab0, 49}, + {0x1ab1, 0x1abd, 1}, + {0x1abf, 0x1ac0, 1}, + {0x1b00, 0x1b03, 1}, + {0x1b34, 0x1b36, 2}, + {0x1b37, 0x1b3a, 1}, + {0x1b3c, 0x1b42, 6}, + {0x1b6b, 0x1b73, 1}, + {0x1b80, 0x1b81, 1}, + {0x1ba2, 0x1ba5, 1}, + {0x1ba8, 0x1ba9, 1}, + {0x1bab, 0x1bad, 1}, + {0x1be6, 0x1be8, 2}, + {0x1be9, 0x1bed, 4}, + {0x1bef, 0x1bf1, 1}, + {0x1c2c, 0x1c33, 1}, + {0x1c36, 0x1c37, 1}, + {0x1cd0, 0x1cd2, 1}, + {0x1cd4, 0x1ce0, 1}, + {0x1ce2, 0x1ce8, 1}, + {0x1ced, 0x1cf4, 7}, + {0x1cf8, 0x1cf9, 1}, + {0x1dc0, 0x1df9, 1}, + {0x1dfb, 0x1dff, 1}, + {0x20d0, 0x20dc, 1}, + {0x20e1, 0x20e5, 4}, + {0x20e6, 0x20f0, 1}, + {0x2cef, 0x2cf1, 1}, + {0x2d7f, 0x2de0, 97}, + {0x2de1, 0x2dff, 1}, + {0x302a, 0x302d, 1}, + {0x3099, 0x309a, 1}, + {0xa66f, 0xa674, 5}, + {0xa675, 0xa67d, 1}, + {0xa69e, 0xa69f, 1}, + {0xa6f0, 0xa6f1, 1}, + {0xa802, 0xa806, 4}, + {0xa80b, 0xa825, 26}, + {0xa826, 0xa82c, 6}, + {0xa8c4, 0xa8c5, 1}, + {0xa8e0, 0xa8f1, 1}, + {0xa8ff, 0xa926, 39}, + {0xa927, 0xa92d, 1}, + {0xa947, 0xa951, 1}, + {0xa980, 0xa982, 1}, + {0xa9b3, 0xa9b6, 3}, + {0xa9b7, 0xa9b9, 1}, + {0xa9bc, 0xa9bd, 1}, + {0xa9e5, 0xaa29, 68}, + {0xaa2a, 0xaa2e, 1}, + {0xaa31, 0xaa32, 1}, + {0xaa35, 0xaa36, 1}, + {0xaa43, 0xaa4c, 9}, + {0xaa7c, 0xaab0, 52}, + {0xaab2, 0xaab4, 1}, + {0xaab7, 0xaab8, 1}, + {0xaabe, 0xaabf, 1}, + {0xaac1, 0xaaec, 43}, + {0xaaed, 0xaaf6, 9}, + {0xabe5, 0xabe8, 3}, + {0xabed, 0xfb1e, 20273}, + {0xfe00, 0xfe0f, 1}, + {0xfe20, 0xfe2f, 1}, + }, + R32: []Range32{ + {0x101fd, 0x102e0, 227}, + {0x10376, 0x1037a, 1}, + {0x10a01, 0x10a03, 1}, + {0x10a05, 0x10a06, 1}, + {0x10a0c, 0x10a0f, 1}, + {0x10a38, 0x10a3a, 1}, + {0x10a3f, 0x10ae5, 166}, + {0x10ae6, 0x10d24, 574}, + {0x10d25, 0x10d27, 1}, + {0x10eab, 0x10eac, 1}, + {0x10f46, 0x10f50, 1}, + {0x11001, 0x11038, 55}, + {0x11039, 0x11046, 1}, + {0x1107f, 0x11081, 1}, + {0x110b3, 0x110b6, 1}, + {0x110b9, 0x110ba, 1}, + {0x11100, 0x11102, 1}, + {0x11127, 0x1112b, 1}, + {0x1112d, 0x11134, 1}, + {0x11173, 0x11180, 13}, + {0x11181, 0x111b6, 53}, + {0x111b7, 0x111be, 1}, + {0x111c9, 0x111cc, 1}, + {0x111cf, 0x1122f, 96}, + {0x11230, 0x11231, 1}, + {0x11234, 0x11236, 2}, + {0x11237, 0x1123e, 7}, + {0x112df, 0x112e3, 4}, + {0x112e4, 0x112ea, 1}, + {0x11300, 0x11301, 1}, + {0x1133b, 0x1133c, 1}, + {0x11340, 0x11366, 38}, + {0x11367, 0x1136c, 1}, + {0x11370, 0x11374, 1}, + {0x11438, 0x1143f, 1}, + {0x11442, 0x11444, 1}, + {0x11446, 0x1145e, 24}, + {0x114b3, 0x114b8, 1}, + {0x114ba, 0x114bf, 5}, + {0x114c0, 0x114c2, 2}, + {0x114c3, 0x115b2, 239}, + {0x115b3, 0x115b5, 1}, + {0x115bc, 0x115bd, 1}, + {0x115bf, 0x115c0, 1}, + {0x115dc, 0x115dd, 1}, + {0x11633, 0x1163a, 1}, + {0x1163d, 0x1163f, 2}, + {0x11640, 0x116ab, 107}, + {0x116ad, 0x116b0, 3}, + {0x116b1, 0x116b5, 1}, + {0x116b7, 0x1171d, 102}, + {0x1171e, 0x1171f, 1}, + {0x11722, 0x11725, 1}, + {0x11727, 0x1172b, 1}, + {0x1182f, 0x11837, 1}, + {0x11839, 0x1183a, 1}, + {0x1193b, 0x1193c, 1}, + {0x1193e, 0x11943, 5}, + {0x119d4, 0x119d7, 1}, + {0x119da, 0x119db, 1}, + {0x119e0, 0x11a01, 33}, + {0x11a02, 0x11a0a, 1}, + {0x11a33, 0x11a38, 1}, + {0x11a3b, 0x11a3e, 1}, + {0x11a47, 0x11a51, 10}, + {0x11a52, 0x11a56, 1}, + {0x11a59, 0x11a5b, 1}, + {0x11a8a, 0x11a96, 1}, + {0x11a98, 0x11a99, 1}, + {0x11c30, 0x11c36, 1}, + {0x11c38, 0x11c3d, 1}, + {0x11c3f, 0x11c92, 83}, + {0x11c93, 0x11ca7, 1}, + {0x11caa, 0x11cb0, 1}, + {0x11cb2, 0x11cb3, 1}, + {0x11cb5, 0x11cb6, 1}, + {0x11d31, 0x11d36, 1}, + {0x11d3a, 0x11d3c, 2}, + {0x11d3d, 0x11d3f, 2}, + {0x11d40, 0x11d45, 1}, + {0x11d47, 0x11d90, 73}, + {0x11d91, 0x11d95, 4}, + {0x11d97, 0x11ef3, 348}, + {0x11ef4, 0x16af0, 19452}, + {0x16af1, 0x16af4, 1}, + {0x16b30, 0x16b36, 1}, + {0x16f4f, 0x16f8f, 64}, + {0x16f90, 0x16f92, 1}, + {0x16fe4, 0x1bc9d, 19641}, + {0x1bc9e, 0x1d167, 5321}, + {0x1d168, 0x1d169, 1}, + {0x1d17b, 0x1d182, 1}, + {0x1d185, 0x1d18b, 1}, + {0x1d1aa, 0x1d1ad, 1}, + {0x1d242, 0x1d244, 1}, + {0x1da00, 0x1da36, 1}, + {0x1da3b, 0x1da6c, 1}, + {0x1da75, 0x1da84, 15}, + {0x1da9b, 0x1da9f, 1}, + {0x1daa1, 0x1daaf, 1}, + {0x1e000, 0x1e006, 1}, + {0x1e008, 0x1e018, 1}, + {0x1e01b, 0x1e021, 1}, + {0x1e023, 0x1e024, 1}, + {0x1e026, 0x1e02a, 1}, + {0x1e130, 0x1e136, 1}, + {0x1e2ec, 0x1e2ef, 1}, + {0x1e8d0, 0x1e8d6, 1}, + {0x1e944, 0x1e94a, 1}, + {0xe0100, 0xe01ef, 1}, + }, +} + +var _N = &RangeTable{ + R16: []Range16{ + {0x0030, 0x0039, 1}, + {0x00b2, 0x00b3, 1}, + {0x00b9, 0x00bc, 3}, + {0x00bd, 0x00be, 1}, + {0x0660, 0x0669, 1}, + {0x06f0, 0x06f9, 1}, + {0x07c0, 0x07c9, 1}, + {0x0966, 0x096f, 1}, + {0x09e6, 0x09ef, 1}, + {0x09f4, 0x09f9, 1}, + {0x0a66, 0x0a6f, 1}, + {0x0ae6, 0x0aef, 1}, + {0x0b66, 0x0b6f, 1}, + {0x0b72, 0x0b77, 1}, + {0x0be6, 0x0bf2, 1}, + {0x0c66, 0x0c6f, 1}, + {0x0c78, 0x0c7e, 1}, + {0x0ce6, 0x0cef, 1}, + {0x0d58, 0x0d5e, 1}, + {0x0d66, 0x0d78, 1}, + {0x0de6, 0x0def, 1}, + {0x0e50, 0x0e59, 1}, + {0x0ed0, 0x0ed9, 1}, + {0x0f20, 0x0f33, 1}, + {0x1040, 0x1049, 1}, + {0x1090, 0x1099, 1}, + {0x1369, 0x137c, 1}, + {0x16ee, 0x16f0, 1}, + {0x17e0, 0x17e9, 1}, + {0x17f0, 0x17f9, 1}, + {0x1810, 0x1819, 1}, + {0x1946, 0x194f, 1}, + {0x19d0, 0x19da, 1}, + {0x1a80, 0x1a89, 1}, + {0x1a90, 0x1a99, 1}, + {0x1b50, 0x1b59, 1}, + {0x1bb0, 0x1bb9, 1}, + {0x1c40, 0x1c49, 1}, + {0x1c50, 0x1c59, 1}, + {0x2070, 0x2074, 4}, + {0x2075, 0x2079, 1}, + {0x2080, 0x2089, 1}, + {0x2150, 0x2182, 1}, + {0x2185, 0x2189, 1}, + {0x2460, 0x249b, 1}, + {0x24ea, 0x24ff, 1}, + {0x2776, 0x2793, 1}, + {0x2cfd, 0x3007, 778}, + {0x3021, 0x3029, 1}, + {0x3038, 0x303a, 1}, + {0x3192, 0x3195, 1}, + {0x3220, 0x3229, 1}, + {0x3248, 0x324f, 1}, + {0x3251, 0x325f, 1}, + {0x3280, 0x3289, 1}, + {0x32b1, 0x32bf, 1}, + {0xa620, 0xa629, 1}, + {0xa6e6, 0xa6ef, 1}, + {0xa830, 0xa835, 1}, + {0xa8d0, 0xa8d9, 1}, + {0xa900, 0xa909, 1}, + {0xa9d0, 0xa9d9, 1}, + {0xa9f0, 0xa9f9, 1}, + {0xaa50, 0xaa59, 1}, + {0xabf0, 0xabf9, 1}, + {0xff10, 0xff19, 1}, + }, + R32: []Range32{ + {0x10107, 0x10133, 1}, + {0x10140, 0x10178, 1}, + {0x1018a, 0x1018b, 1}, + {0x102e1, 0x102fb, 1}, + {0x10320, 0x10323, 1}, + {0x10341, 0x1034a, 9}, + {0x103d1, 0x103d5, 1}, + {0x104a0, 0x104a9, 1}, + {0x10858, 0x1085f, 1}, + {0x10879, 0x1087f, 1}, + {0x108a7, 0x108af, 1}, + {0x108fb, 0x108ff, 1}, + {0x10916, 0x1091b, 1}, + {0x109bc, 0x109bd, 1}, + {0x109c0, 0x109cf, 1}, + {0x109d2, 0x109ff, 1}, + {0x10a40, 0x10a48, 1}, + {0x10a7d, 0x10a7e, 1}, + {0x10a9d, 0x10a9f, 1}, + {0x10aeb, 0x10aef, 1}, + {0x10b58, 0x10b5f, 1}, + {0x10b78, 0x10b7f, 1}, + {0x10ba9, 0x10baf, 1}, + {0x10cfa, 0x10cff, 1}, + {0x10d30, 0x10d39, 1}, + {0x10e60, 0x10e7e, 1}, + {0x10f1d, 0x10f26, 1}, + {0x10f51, 0x10f54, 1}, + {0x10fc5, 0x10fcb, 1}, + {0x11052, 0x1106f, 1}, + {0x110f0, 0x110f9, 1}, + {0x11136, 0x1113f, 1}, + {0x111d0, 0x111d9, 1}, + {0x111e1, 0x111f4, 1}, + {0x112f0, 0x112f9, 1}, + {0x11450, 0x11459, 1}, + {0x114d0, 0x114d9, 1}, + {0x11650, 0x11659, 1}, + {0x116c0, 0x116c9, 1}, + {0x11730, 0x1173b, 1}, + {0x118e0, 0x118f2, 1}, + {0x11950, 0x11959, 1}, + {0x11c50, 0x11c6c, 1}, + {0x11d50, 0x11d59, 1}, + {0x11da0, 0x11da9, 1}, + {0x11fc0, 0x11fd4, 1}, + {0x12400, 0x1246e, 1}, + {0x16a60, 0x16a69, 1}, + {0x16b50, 0x16b59, 1}, + {0x16b5b, 0x16b61, 1}, + {0x16e80, 0x16e96, 1}, + {0x1d2e0, 0x1d2f3, 1}, + {0x1d360, 0x1d378, 1}, + {0x1d7ce, 0x1d7ff, 1}, + {0x1e140, 0x1e149, 1}, + {0x1e2f0, 0x1e2f9, 1}, + {0x1e8c7, 0x1e8cf, 1}, + {0x1e950, 0x1e959, 1}, + {0x1ec71, 0x1ecab, 1}, + {0x1ecad, 0x1ecaf, 1}, + {0x1ecb1, 0x1ecb4, 1}, + {0x1ed01, 0x1ed2d, 1}, + {0x1ed2f, 0x1ed3d, 1}, + {0x1f100, 0x1f10c, 1}, + {0x1fbf0, 0x1fbf9, 1}, + }, + LatinOffset: 4, +} + +var _Nd = &RangeTable{ + R16: []Range16{ + {0x0030, 0x0039, 1}, + {0x0660, 0x0669, 1}, + {0x06f0, 0x06f9, 1}, + {0x07c0, 0x07c9, 1}, + {0x0966, 0x096f, 1}, + {0x09e6, 0x09ef, 1}, + {0x0a66, 0x0a6f, 1}, + {0x0ae6, 0x0aef, 1}, + {0x0b66, 0x0b6f, 1}, + {0x0be6, 0x0bef, 1}, + {0x0c66, 0x0c6f, 1}, + {0x0ce6, 0x0cef, 1}, + {0x0d66, 0x0d6f, 1}, + {0x0de6, 0x0def, 1}, + {0x0e50, 0x0e59, 1}, + {0x0ed0, 0x0ed9, 1}, + {0x0f20, 0x0f29, 1}, + {0x1040, 0x1049, 1}, + {0x1090, 0x1099, 1}, + {0x17e0, 0x17e9, 1}, + {0x1810, 0x1819, 1}, + {0x1946, 0x194f, 1}, + {0x19d0, 0x19d9, 1}, + {0x1a80, 0x1a89, 1}, + {0x1a90, 0x1a99, 1}, + {0x1b50, 0x1b59, 1}, + {0x1bb0, 0x1bb9, 1}, + {0x1c40, 0x1c49, 1}, + {0x1c50, 0x1c59, 1}, + {0xa620, 0xa629, 1}, + {0xa8d0, 0xa8d9, 1}, + {0xa900, 0xa909, 1}, + {0xa9d0, 0xa9d9, 1}, + {0xa9f0, 0xa9f9, 1}, + {0xaa50, 0xaa59, 1}, + {0xabf0, 0xabf9, 1}, + {0xff10, 0xff19, 1}, + }, + R32: []Range32{ + {0x104a0, 0x104a9, 1}, + {0x10d30, 0x10d39, 1}, + {0x11066, 0x1106f, 1}, + {0x110f0, 0x110f9, 1}, + {0x11136, 0x1113f, 1}, + {0x111d0, 0x111d9, 1}, + {0x112f0, 0x112f9, 1}, + {0x11450, 0x11459, 1}, + {0x114d0, 0x114d9, 1}, + {0x11650, 0x11659, 1}, + {0x116c0, 0x116c9, 1}, + {0x11730, 0x11739, 1}, + {0x118e0, 0x118e9, 1}, + {0x11950, 0x11959, 1}, + {0x11c50, 0x11c59, 1}, + {0x11d50, 0x11d59, 1}, + {0x11da0, 0x11da9, 1}, + {0x16a60, 0x16a69, 1}, + {0x16b50, 0x16b59, 1}, + {0x1d7ce, 0x1d7ff, 1}, + {0x1e140, 0x1e149, 1}, + {0x1e2f0, 0x1e2f9, 1}, + {0x1e950, 0x1e959, 1}, + {0x1fbf0, 0x1fbf9, 1}, + }, + LatinOffset: 1, +} + +var _Nl = &RangeTable{ + R16: []Range16{ + {0x16ee, 0x16f0, 1}, + {0x2160, 0x2182, 1}, + {0x2185, 0x2188, 1}, + {0x3007, 0x3021, 26}, + {0x3022, 0x3029, 1}, + {0x3038, 0x303a, 1}, + {0xa6e6, 0xa6ef, 1}, + }, + R32: []Range32{ + {0x10140, 0x10174, 1}, + {0x10341, 0x1034a, 9}, + {0x103d1, 0x103d5, 1}, + {0x12400, 0x1246e, 1}, + }, +} + +var _No = &RangeTable{ + R16: []Range16{ + {0x00b2, 0x00b3, 1}, + {0x00b9, 0x00bc, 3}, + {0x00bd, 0x00be, 1}, + {0x09f4, 0x09f9, 1}, + {0x0b72, 0x0b77, 1}, + {0x0bf0, 0x0bf2, 1}, + {0x0c78, 0x0c7e, 1}, + {0x0d58, 0x0d5e, 1}, + {0x0d70, 0x0d78, 1}, + {0x0f2a, 0x0f33, 1}, + {0x1369, 0x137c, 1}, + {0x17f0, 0x17f9, 1}, + {0x19da, 0x2070, 1686}, + {0x2074, 0x2079, 1}, + {0x2080, 0x2089, 1}, + {0x2150, 0x215f, 1}, + {0x2189, 0x2460, 727}, + {0x2461, 0x249b, 1}, + {0x24ea, 0x24ff, 1}, + {0x2776, 0x2793, 1}, + {0x2cfd, 0x3192, 1173}, + {0x3193, 0x3195, 1}, + {0x3220, 0x3229, 1}, + {0x3248, 0x324f, 1}, + {0x3251, 0x325f, 1}, + {0x3280, 0x3289, 1}, + {0x32b1, 0x32bf, 1}, + {0xa830, 0xa835, 1}, + }, + R32: []Range32{ + {0x10107, 0x10133, 1}, + {0x10175, 0x10178, 1}, + {0x1018a, 0x1018b, 1}, + {0x102e1, 0x102fb, 1}, + {0x10320, 0x10323, 1}, + {0x10858, 0x1085f, 1}, + {0x10879, 0x1087f, 1}, + {0x108a7, 0x108af, 1}, + {0x108fb, 0x108ff, 1}, + {0x10916, 0x1091b, 1}, + {0x109bc, 0x109bd, 1}, + {0x109c0, 0x109cf, 1}, + {0x109d2, 0x109ff, 1}, + {0x10a40, 0x10a48, 1}, + {0x10a7d, 0x10a7e, 1}, + {0x10a9d, 0x10a9f, 1}, + {0x10aeb, 0x10aef, 1}, + {0x10b58, 0x10b5f, 1}, + {0x10b78, 0x10b7f, 1}, + {0x10ba9, 0x10baf, 1}, + {0x10cfa, 0x10cff, 1}, + {0x10e60, 0x10e7e, 1}, + {0x10f1d, 0x10f26, 1}, + {0x10f51, 0x10f54, 1}, + {0x10fc5, 0x10fcb, 1}, + {0x11052, 0x11065, 1}, + {0x111e1, 0x111f4, 1}, + {0x1173a, 0x1173b, 1}, + {0x118ea, 0x118f2, 1}, + {0x11c5a, 0x11c6c, 1}, + {0x11fc0, 0x11fd4, 1}, + {0x16b5b, 0x16b61, 1}, + {0x16e80, 0x16e96, 1}, + {0x1d2e0, 0x1d2f3, 1}, + {0x1d360, 0x1d378, 1}, + {0x1e8c7, 0x1e8cf, 1}, + {0x1ec71, 0x1ecab, 1}, + {0x1ecad, 0x1ecaf, 1}, + {0x1ecb1, 0x1ecb4, 1}, + {0x1ed01, 0x1ed2d, 1}, + {0x1ed2f, 0x1ed3d, 1}, + {0x1f100, 0x1f10c, 1}, + }, + LatinOffset: 3, +} + +var _P = &RangeTable{ + R16: []Range16{ + {0x0021, 0x0023, 1}, + {0x0025, 0x002a, 1}, + {0x002c, 0x002f, 1}, + {0x003a, 0x003b, 1}, + {0x003f, 0x0040, 1}, + {0x005b, 0x005d, 1}, + {0x005f, 0x007b, 28}, + {0x007d, 0x00a1, 36}, + {0x00a7, 0x00ab, 4}, + {0x00b6, 0x00b7, 1}, + {0x00bb, 0x00bf, 4}, + {0x037e, 0x0387, 9}, + {0x055a, 0x055f, 1}, + {0x0589, 0x058a, 1}, + {0x05be, 0x05c0, 2}, + {0x05c3, 0x05c6, 3}, + {0x05f3, 0x05f4, 1}, + {0x0609, 0x060a, 1}, + {0x060c, 0x060d, 1}, + {0x061b, 0x061e, 3}, + {0x061f, 0x066a, 75}, + {0x066b, 0x066d, 1}, + {0x06d4, 0x0700, 44}, + {0x0701, 0x070d, 1}, + {0x07f7, 0x07f9, 1}, + {0x0830, 0x083e, 1}, + {0x085e, 0x0964, 262}, + {0x0965, 0x0970, 11}, + {0x09fd, 0x0a76, 121}, + {0x0af0, 0x0c77, 391}, + {0x0c84, 0x0df4, 368}, + {0x0e4f, 0x0e5a, 11}, + {0x0e5b, 0x0f04, 169}, + {0x0f05, 0x0f12, 1}, + {0x0f14, 0x0f3a, 38}, + {0x0f3b, 0x0f3d, 1}, + {0x0f85, 0x0fd0, 75}, + {0x0fd1, 0x0fd4, 1}, + {0x0fd9, 0x0fda, 1}, + {0x104a, 0x104f, 1}, + {0x10fb, 0x1360, 613}, + {0x1361, 0x1368, 1}, + {0x1400, 0x166e, 622}, + {0x169b, 0x169c, 1}, + {0x16eb, 0x16ed, 1}, + {0x1735, 0x1736, 1}, + {0x17d4, 0x17d6, 1}, + {0x17d8, 0x17da, 1}, + {0x1800, 0x180a, 1}, + {0x1944, 0x1945, 1}, + {0x1a1e, 0x1a1f, 1}, + {0x1aa0, 0x1aa6, 1}, + {0x1aa8, 0x1aad, 1}, + {0x1b5a, 0x1b60, 1}, + {0x1bfc, 0x1bff, 1}, + {0x1c3b, 0x1c3f, 1}, + {0x1c7e, 0x1c7f, 1}, + {0x1cc0, 0x1cc7, 1}, + {0x1cd3, 0x2010, 829}, + {0x2011, 0x2027, 1}, + {0x2030, 0x2043, 1}, + {0x2045, 0x2051, 1}, + {0x2053, 0x205e, 1}, + {0x207d, 0x207e, 1}, + {0x208d, 0x208e, 1}, + {0x2308, 0x230b, 1}, + {0x2329, 0x232a, 1}, + {0x2768, 0x2775, 1}, + {0x27c5, 0x27c6, 1}, + {0x27e6, 0x27ef, 1}, + {0x2983, 0x2998, 1}, + {0x29d8, 0x29db, 1}, + {0x29fc, 0x29fd, 1}, + {0x2cf9, 0x2cfc, 1}, + {0x2cfe, 0x2cff, 1}, + {0x2d70, 0x2e00, 144}, + {0x2e01, 0x2e2e, 1}, + {0x2e30, 0x2e4f, 1}, + {0x2e52, 0x3001, 431}, + {0x3002, 0x3003, 1}, + {0x3008, 0x3011, 1}, + {0x3014, 0x301f, 1}, + {0x3030, 0x303d, 13}, + {0x30a0, 0x30fb, 91}, + {0xa4fe, 0xa4ff, 1}, + {0xa60d, 0xa60f, 1}, + {0xa673, 0xa67e, 11}, + {0xa6f2, 0xa6f7, 1}, + {0xa874, 0xa877, 1}, + {0xa8ce, 0xa8cf, 1}, + {0xa8f8, 0xa8fa, 1}, + {0xa8fc, 0xa92e, 50}, + {0xa92f, 0xa95f, 48}, + {0xa9c1, 0xa9cd, 1}, + {0xa9de, 0xa9df, 1}, + {0xaa5c, 0xaa5f, 1}, + {0xaade, 0xaadf, 1}, + {0xaaf0, 0xaaf1, 1}, + {0xabeb, 0xfd3e, 20819}, + {0xfd3f, 0xfe10, 209}, + {0xfe11, 0xfe19, 1}, + {0xfe30, 0xfe52, 1}, + {0xfe54, 0xfe61, 1}, + {0xfe63, 0xfe68, 5}, + {0xfe6a, 0xfe6b, 1}, + {0xff01, 0xff03, 1}, + {0xff05, 0xff0a, 1}, + {0xff0c, 0xff0f, 1}, + {0xff1a, 0xff1b, 1}, + {0xff1f, 0xff20, 1}, + {0xff3b, 0xff3d, 1}, + {0xff3f, 0xff5b, 28}, + {0xff5d, 0xff5f, 2}, + {0xff60, 0xff65, 1}, + }, + R32: []Range32{ + {0x10100, 0x10102, 1}, + {0x1039f, 0x103d0, 49}, + {0x1056f, 0x10857, 744}, + {0x1091f, 0x1093f, 32}, + {0x10a50, 0x10a58, 1}, + {0x10a7f, 0x10af0, 113}, + {0x10af1, 0x10af6, 1}, + {0x10b39, 0x10b3f, 1}, + {0x10b99, 0x10b9c, 1}, + {0x10ead, 0x10f55, 168}, + {0x10f56, 0x10f59, 1}, + {0x11047, 0x1104d, 1}, + {0x110bb, 0x110bc, 1}, + {0x110be, 0x110c1, 1}, + {0x11140, 0x11143, 1}, + {0x11174, 0x11175, 1}, + {0x111c5, 0x111c8, 1}, + {0x111cd, 0x111db, 14}, + {0x111dd, 0x111df, 1}, + {0x11238, 0x1123d, 1}, + {0x112a9, 0x1144b, 418}, + {0x1144c, 0x1144f, 1}, + {0x1145a, 0x1145b, 1}, + {0x1145d, 0x114c6, 105}, + {0x115c1, 0x115d7, 1}, + {0x11641, 0x11643, 1}, + {0x11660, 0x1166c, 1}, + {0x1173c, 0x1173e, 1}, + {0x1183b, 0x11944, 265}, + {0x11945, 0x11946, 1}, + {0x119e2, 0x11a3f, 93}, + {0x11a40, 0x11a46, 1}, + {0x11a9a, 0x11a9c, 1}, + {0x11a9e, 0x11aa2, 1}, + {0x11c41, 0x11c45, 1}, + {0x11c70, 0x11c71, 1}, + {0x11ef7, 0x11ef8, 1}, + {0x11fff, 0x12470, 1137}, + {0x12471, 0x12474, 1}, + {0x16a6e, 0x16a6f, 1}, + {0x16af5, 0x16b37, 66}, + {0x16b38, 0x16b3b, 1}, + {0x16b44, 0x16e97, 851}, + {0x16e98, 0x16e9a, 1}, + {0x16fe2, 0x1bc9f, 19645}, + {0x1da87, 0x1da8b, 1}, + {0x1e95e, 0x1e95f, 1}, + }, + LatinOffset: 11, +} + +var _Pc = &RangeTable{ + R16: []Range16{ + {0x005f, 0x203f, 8160}, + {0x2040, 0x2054, 20}, + {0xfe33, 0xfe34, 1}, + {0xfe4d, 0xfe4f, 1}, + {0xff3f, 0xff3f, 1}, + }, +} + +var _Pd = &RangeTable{ + R16: []Range16{ + {0x002d, 0x058a, 1373}, + {0x05be, 0x1400, 3650}, + {0x1806, 0x2010, 2058}, + {0x2011, 0x2015, 1}, + {0x2e17, 0x2e1a, 3}, + {0x2e3a, 0x2e3b, 1}, + {0x2e40, 0x301c, 476}, + {0x3030, 0x30a0, 112}, + {0xfe31, 0xfe32, 1}, + {0xfe58, 0xfe63, 11}, + {0xff0d, 0xff0d, 1}, + }, + R32: []Range32{ + {0x10ead, 0x10ead, 1}, + }, +} + +var _Pe = &RangeTable{ + R16: []Range16{ + {0x0029, 0x005d, 52}, + {0x007d, 0x0f3b, 3774}, + {0x0f3d, 0x169c, 1887}, + {0x2046, 0x207e, 56}, + {0x208e, 0x2309, 635}, + {0x230b, 0x232a, 31}, + {0x2769, 0x2775, 2}, + {0x27c6, 0x27e7, 33}, + {0x27e9, 0x27ef, 2}, + {0x2984, 0x2998, 2}, + {0x29d9, 0x29db, 2}, + {0x29fd, 0x2e23, 1062}, + {0x2e25, 0x2e29, 2}, + {0x3009, 0x3011, 2}, + {0x3015, 0x301b, 2}, + {0x301e, 0x301f, 1}, + {0xfd3e, 0xfe18, 218}, + {0xfe36, 0xfe44, 2}, + {0xfe48, 0xfe5a, 18}, + {0xfe5c, 0xfe5e, 2}, + {0xff09, 0xff3d, 52}, + {0xff5d, 0xff63, 3}, + }, + LatinOffset: 1, +} + +var _Pf = &RangeTable{ + R16: []Range16{ + {0x00bb, 0x2019, 8030}, + {0x201d, 0x203a, 29}, + {0x2e03, 0x2e05, 2}, + {0x2e0a, 0x2e0d, 3}, + {0x2e1d, 0x2e21, 4}, + }, +} + +var _Pi = &RangeTable{ + R16: []Range16{ + {0x00ab, 0x2018, 8045}, + {0x201b, 0x201c, 1}, + {0x201f, 0x2039, 26}, + {0x2e02, 0x2e04, 2}, + {0x2e09, 0x2e0c, 3}, + {0x2e1c, 0x2e20, 4}, + }, +} + +var _Po = &RangeTable{ + R16: []Range16{ + {0x0021, 0x0023, 1}, + {0x0025, 0x0027, 1}, + {0x002a, 0x002e, 2}, + {0x002f, 0x003a, 11}, + {0x003b, 0x003f, 4}, + {0x0040, 0x005c, 28}, + {0x00a1, 0x00a7, 6}, + {0x00b6, 0x00b7, 1}, + {0x00bf, 0x037e, 703}, + {0x0387, 0x055a, 467}, + {0x055b, 0x055f, 1}, + {0x0589, 0x05c0, 55}, + {0x05c3, 0x05c6, 3}, + {0x05f3, 0x05f4, 1}, + {0x0609, 0x060a, 1}, + {0x060c, 0x060d, 1}, + {0x061b, 0x061e, 3}, + {0x061f, 0x066a, 75}, + {0x066b, 0x066d, 1}, + {0x06d4, 0x0700, 44}, + {0x0701, 0x070d, 1}, + {0x07f7, 0x07f9, 1}, + {0x0830, 0x083e, 1}, + {0x085e, 0x0964, 262}, + {0x0965, 0x0970, 11}, + {0x09fd, 0x0a76, 121}, + {0x0af0, 0x0c77, 391}, + {0x0c84, 0x0df4, 368}, + {0x0e4f, 0x0e5a, 11}, + {0x0e5b, 0x0f04, 169}, + {0x0f05, 0x0f12, 1}, + {0x0f14, 0x0f85, 113}, + {0x0fd0, 0x0fd4, 1}, + {0x0fd9, 0x0fda, 1}, + {0x104a, 0x104f, 1}, + {0x10fb, 0x1360, 613}, + {0x1361, 0x1368, 1}, + {0x166e, 0x16eb, 125}, + {0x16ec, 0x16ed, 1}, + {0x1735, 0x1736, 1}, + {0x17d4, 0x17d6, 1}, + {0x17d8, 0x17da, 1}, + {0x1800, 0x1805, 1}, + {0x1807, 0x180a, 1}, + {0x1944, 0x1945, 1}, + {0x1a1e, 0x1a1f, 1}, + {0x1aa0, 0x1aa6, 1}, + {0x1aa8, 0x1aad, 1}, + {0x1b5a, 0x1b60, 1}, + {0x1bfc, 0x1bff, 1}, + {0x1c3b, 0x1c3f, 1}, + {0x1c7e, 0x1c7f, 1}, + {0x1cc0, 0x1cc7, 1}, + {0x1cd3, 0x2016, 835}, + {0x2017, 0x2020, 9}, + {0x2021, 0x2027, 1}, + {0x2030, 0x2038, 1}, + {0x203b, 0x203e, 1}, + {0x2041, 0x2043, 1}, + {0x2047, 0x2051, 1}, + {0x2053, 0x2055, 2}, + {0x2056, 0x205e, 1}, + {0x2cf9, 0x2cfc, 1}, + {0x2cfe, 0x2cff, 1}, + {0x2d70, 0x2e00, 144}, + {0x2e01, 0x2e06, 5}, + {0x2e07, 0x2e08, 1}, + {0x2e0b, 0x2e0e, 3}, + {0x2e0f, 0x2e16, 1}, + {0x2e18, 0x2e19, 1}, + {0x2e1b, 0x2e1e, 3}, + {0x2e1f, 0x2e2a, 11}, + {0x2e2b, 0x2e2e, 1}, + {0x2e30, 0x2e39, 1}, + {0x2e3c, 0x2e3f, 1}, + {0x2e41, 0x2e43, 2}, + {0x2e44, 0x2e4f, 1}, + {0x2e52, 0x3001, 431}, + {0x3002, 0x3003, 1}, + {0x303d, 0x30fb, 190}, + {0xa4fe, 0xa4ff, 1}, + {0xa60d, 0xa60f, 1}, + {0xa673, 0xa67e, 11}, + {0xa6f2, 0xa6f7, 1}, + {0xa874, 0xa877, 1}, + {0xa8ce, 0xa8cf, 1}, + {0xa8f8, 0xa8fa, 1}, + {0xa8fc, 0xa92e, 50}, + {0xa92f, 0xa95f, 48}, + {0xa9c1, 0xa9cd, 1}, + {0xa9de, 0xa9df, 1}, + {0xaa5c, 0xaa5f, 1}, + {0xaade, 0xaadf, 1}, + {0xaaf0, 0xaaf1, 1}, + {0xabeb, 0xfe10, 21029}, + {0xfe11, 0xfe16, 1}, + {0xfe19, 0xfe30, 23}, + {0xfe45, 0xfe46, 1}, + {0xfe49, 0xfe4c, 1}, + {0xfe50, 0xfe52, 1}, + {0xfe54, 0xfe57, 1}, + {0xfe5f, 0xfe61, 1}, + {0xfe68, 0xfe6a, 2}, + {0xfe6b, 0xff01, 150}, + {0xff02, 0xff03, 1}, + {0xff05, 0xff07, 1}, + {0xff0a, 0xff0e, 2}, + {0xff0f, 0xff1a, 11}, + {0xff1b, 0xff1f, 4}, + {0xff20, 0xff3c, 28}, + {0xff61, 0xff64, 3}, + {0xff65, 0xff65, 1}, + }, + R32: []Range32{ + {0x10100, 0x10102, 1}, + {0x1039f, 0x103d0, 49}, + {0x1056f, 0x10857, 744}, + {0x1091f, 0x1093f, 32}, + {0x10a50, 0x10a58, 1}, + {0x10a7f, 0x10af0, 113}, + {0x10af1, 0x10af6, 1}, + {0x10b39, 0x10b3f, 1}, + {0x10b99, 0x10b9c, 1}, + {0x10f55, 0x10f59, 1}, + {0x11047, 0x1104d, 1}, + {0x110bb, 0x110bc, 1}, + {0x110be, 0x110c1, 1}, + {0x11140, 0x11143, 1}, + {0x11174, 0x11175, 1}, + {0x111c5, 0x111c8, 1}, + {0x111cd, 0x111db, 14}, + {0x111dd, 0x111df, 1}, + {0x11238, 0x1123d, 1}, + {0x112a9, 0x1144b, 418}, + {0x1144c, 0x1144f, 1}, + {0x1145a, 0x1145b, 1}, + {0x1145d, 0x114c6, 105}, + {0x115c1, 0x115d7, 1}, + {0x11641, 0x11643, 1}, + {0x11660, 0x1166c, 1}, + {0x1173c, 0x1173e, 1}, + {0x1183b, 0x11944, 265}, + {0x11945, 0x11946, 1}, + {0x119e2, 0x11a3f, 93}, + {0x11a40, 0x11a46, 1}, + {0x11a9a, 0x11a9c, 1}, + {0x11a9e, 0x11aa2, 1}, + {0x11c41, 0x11c45, 1}, + {0x11c70, 0x11c71, 1}, + {0x11ef7, 0x11ef8, 1}, + {0x11fff, 0x12470, 1137}, + {0x12471, 0x12474, 1}, + {0x16a6e, 0x16a6f, 1}, + {0x16af5, 0x16b37, 66}, + {0x16b38, 0x16b3b, 1}, + {0x16b44, 0x16e97, 851}, + {0x16e98, 0x16e9a, 1}, + {0x16fe2, 0x1bc9f, 19645}, + {0x1da87, 0x1da8b, 1}, + {0x1e95e, 0x1e95f, 1}, + }, + LatinOffset: 8, +} + +var _Ps = &RangeTable{ + R16: []Range16{ + {0x0028, 0x005b, 51}, + {0x007b, 0x0f3a, 3775}, + {0x0f3c, 0x169b, 1887}, + {0x201a, 0x201e, 4}, + {0x2045, 0x207d, 56}, + {0x208d, 0x2308, 635}, + {0x230a, 0x2329, 31}, + {0x2768, 0x2774, 2}, + {0x27c5, 0x27e6, 33}, + {0x27e8, 0x27ee, 2}, + {0x2983, 0x2997, 2}, + {0x29d8, 0x29da, 2}, + {0x29fc, 0x2e22, 1062}, + {0x2e24, 0x2e28, 2}, + {0x2e42, 0x3008, 454}, + {0x300a, 0x3010, 2}, + {0x3014, 0x301a, 2}, + {0x301d, 0xfd3f, 52514}, + {0xfe17, 0xfe35, 30}, + {0xfe37, 0xfe43, 2}, + {0xfe47, 0xfe59, 18}, + {0xfe5b, 0xfe5d, 2}, + {0xff08, 0xff3b, 51}, + {0xff5b, 0xff5f, 4}, + {0xff62, 0xff62, 1}, + }, + LatinOffset: 1, +} + +var _S = &RangeTable{ + R16: []Range16{ + {0x0024, 0x002b, 7}, + {0x003c, 0x003e, 1}, + {0x005e, 0x0060, 2}, + {0x007c, 0x007e, 2}, + {0x00a2, 0x00a6, 1}, + {0x00a8, 0x00a9, 1}, + {0x00ac, 0x00ae, 2}, + {0x00af, 0x00b1, 1}, + {0x00b4, 0x00b8, 4}, + {0x00d7, 0x00f7, 32}, + {0x02c2, 0x02c5, 1}, + {0x02d2, 0x02df, 1}, + {0x02e5, 0x02eb, 1}, + {0x02ed, 0x02ef, 2}, + {0x02f0, 0x02ff, 1}, + {0x0375, 0x0384, 15}, + {0x0385, 0x03f6, 113}, + {0x0482, 0x058d, 267}, + {0x058e, 0x058f, 1}, + {0x0606, 0x0608, 1}, + {0x060b, 0x060e, 3}, + {0x060f, 0x06de, 207}, + {0x06e9, 0x06fd, 20}, + {0x06fe, 0x07f6, 248}, + {0x07fe, 0x07ff, 1}, + {0x09f2, 0x09f3, 1}, + {0x09fa, 0x09fb, 1}, + {0x0af1, 0x0b70, 127}, + {0x0bf3, 0x0bfa, 1}, + {0x0c7f, 0x0d4f, 208}, + {0x0d79, 0x0e3f, 198}, + {0x0f01, 0x0f03, 1}, + {0x0f13, 0x0f15, 2}, + {0x0f16, 0x0f17, 1}, + {0x0f1a, 0x0f1f, 1}, + {0x0f34, 0x0f38, 2}, + {0x0fbe, 0x0fc5, 1}, + {0x0fc7, 0x0fcc, 1}, + {0x0fce, 0x0fcf, 1}, + {0x0fd5, 0x0fd8, 1}, + {0x109e, 0x109f, 1}, + {0x1390, 0x1399, 1}, + {0x166d, 0x17db, 366}, + {0x1940, 0x19de, 158}, + {0x19df, 0x19ff, 1}, + {0x1b61, 0x1b6a, 1}, + {0x1b74, 0x1b7c, 1}, + {0x1fbd, 0x1fbf, 2}, + {0x1fc0, 0x1fc1, 1}, + {0x1fcd, 0x1fcf, 1}, + {0x1fdd, 0x1fdf, 1}, + {0x1fed, 0x1fef, 1}, + {0x1ffd, 0x1ffe, 1}, + {0x2044, 0x2052, 14}, + {0x207a, 0x207c, 1}, + {0x208a, 0x208c, 1}, + {0x20a0, 0x20bf, 1}, + {0x2100, 0x2101, 1}, + {0x2103, 0x2106, 1}, + {0x2108, 0x2109, 1}, + {0x2114, 0x2116, 2}, + {0x2117, 0x2118, 1}, + {0x211e, 0x2123, 1}, + {0x2125, 0x2129, 2}, + {0x212e, 0x213a, 12}, + {0x213b, 0x2140, 5}, + {0x2141, 0x2144, 1}, + {0x214a, 0x214d, 1}, + {0x214f, 0x218a, 59}, + {0x218b, 0x2190, 5}, + {0x2191, 0x2307, 1}, + {0x230c, 0x2328, 1}, + {0x232b, 0x2426, 1}, + {0x2440, 0x244a, 1}, + {0x249c, 0x24e9, 1}, + {0x2500, 0x2767, 1}, + {0x2794, 0x27c4, 1}, + {0x27c7, 0x27e5, 1}, + {0x27f0, 0x2982, 1}, + {0x2999, 0x29d7, 1}, + {0x29dc, 0x29fb, 1}, + {0x29fe, 0x2b73, 1}, + {0x2b76, 0x2b95, 1}, + {0x2b97, 0x2bff, 1}, + {0x2ce5, 0x2cea, 1}, + {0x2e50, 0x2e51, 1}, + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + {0x2ff0, 0x2ffb, 1}, + {0x3004, 0x3012, 14}, + {0x3013, 0x3020, 13}, + {0x3036, 0x3037, 1}, + {0x303e, 0x303f, 1}, + {0x309b, 0x309c, 1}, + {0x3190, 0x3191, 1}, + {0x3196, 0x319f, 1}, + {0x31c0, 0x31e3, 1}, + {0x3200, 0x321e, 1}, + {0x322a, 0x3247, 1}, + {0x3250, 0x3260, 16}, + {0x3261, 0x327f, 1}, + {0x328a, 0x32b0, 1}, + {0x32c0, 0x33ff, 1}, + {0x4dc0, 0x4dff, 1}, + {0xa490, 0xa4c6, 1}, + {0xa700, 0xa716, 1}, + {0xa720, 0xa721, 1}, + {0xa789, 0xa78a, 1}, + {0xa828, 0xa82b, 1}, + {0xa836, 0xa839, 1}, + {0xaa77, 0xaa79, 1}, + {0xab5b, 0xab6a, 15}, + {0xab6b, 0xfb29, 20414}, + {0xfbb2, 0xfbc1, 1}, + {0xfdfc, 0xfdfd, 1}, + {0xfe62, 0xfe64, 2}, + {0xfe65, 0xfe66, 1}, + {0xfe69, 0xff04, 155}, + {0xff0b, 0xff1c, 17}, + {0xff1d, 0xff1e, 1}, + {0xff3e, 0xff40, 2}, + {0xff5c, 0xff5e, 2}, + {0xffe0, 0xffe6, 1}, + {0xffe8, 0xffee, 1}, + {0xfffc, 0xfffd, 1}, + }, + R32: []Range32{ + {0x10137, 0x1013f, 1}, + {0x10179, 0x10189, 1}, + {0x1018c, 0x1018e, 1}, + {0x10190, 0x1019c, 1}, + {0x101a0, 0x101d0, 48}, + {0x101d1, 0x101fc, 1}, + {0x10877, 0x10878, 1}, + {0x10ac8, 0x1173f, 3191}, + {0x11fd5, 0x11ff1, 1}, + {0x16b3c, 0x16b3f, 1}, + {0x16b45, 0x1bc9c, 20823}, + {0x1d000, 0x1d0f5, 1}, + {0x1d100, 0x1d126, 1}, + {0x1d129, 0x1d164, 1}, + {0x1d16a, 0x1d16c, 1}, + {0x1d183, 0x1d184, 1}, + {0x1d18c, 0x1d1a9, 1}, + {0x1d1ae, 0x1d1e8, 1}, + {0x1d200, 0x1d241, 1}, + {0x1d245, 0x1d300, 187}, + {0x1d301, 0x1d356, 1}, + {0x1d6c1, 0x1d6db, 26}, + {0x1d6fb, 0x1d715, 26}, + {0x1d735, 0x1d74f, 26}, + {0x1d76f, 0x1d789, 26}, + {0x1d7a9, 0x1d7c3, 26}, + {0x1d800, 0x1d9ff, 1}, + {0x1da37, 0x1da3a, 1}, + {0x1da6d, 0x1da74, 1}, + {0x1da76, 0x1da83, 1}, + {0x1da85, 0x1da86, 1}, + {0x1e14f, 0x1e2ff, 432}, + {0x1ecac, 0x1ecb0, 4}, + {0x1ed2e, 0x1eef0, 450}, + {0x1eef1, 0x1f000, 271}, + {0x1f001, 0x1f02b, 1}, + {0x1f030, 0x1f093, 1}, + {0x1f0a0, 0x1f0ae, 1}, + {0x1f0b1, 0x1f0bf, 1}, + {0x1f0c1, 0x1f0cf, 1}, + {0x1f0d1, 0x1f0f5, 1}, + {0x1f10d, 0x1f1ad, 1}, + {0x1f1e6, 0x1f202, 1}, + {0x1f210, 0x1f23b, 1}, + {0x1f240, 0x1f248, 1}, + {0x1f250, 0x1f251, 1}, + {0x1f260, 0x1f265, 1}, + {0x1f300, 0x1f6d7, 1}, + {0x1f6e0, 0x1f6ec, 1}, + {0x1f6f0, 0x1f6fc, 1}, + {0x1f700, 0x1f773, 1}, + {0x1f780, 0x1f7d8, 1}, + {0x1f7e0, 0x1f7eb, 1}, + {0x1f800, 0x1f80b, 1}, + {0x1f810, 0x1f847, 1}, + {0x1f850, 0x1f859, 1}, + {0x1f860, 0x1f887, 1}, + {0x1f890, 0x1f8ad, 1}, + {0x1f8b0, 0x1f8b1, 1}, + {0x1f900, 0x1f978, 1}, + {0x1f97a, 0x1f9cb, 1}, + {0x1f9cd, 0x1fa53, 1}, + {0x1fa60, 0x1fa6d, 1}, + {0x1fa70, 0x1fa74, 1}, + {0x1fa78, 0x1fa7a, 1}, + {0x1fa80, 0x1fa86, 1}, + {0x1fa90, 0x1faa8, 1}, + {0x1fab0, 0x1fab6, 1}, + {0x1fac0, 0x1fac2, 1}, + {0x1fad0, 0x1fad6, 1}, + {0x1fb00, 0x1fb92, 1}, + {0x1fb94, 0x1fbca, 1}, + }, + LatinOffset: 10, +} + +var _Sc = &RangeTable{ + R16: []Range16{ + {0x0024, 0x00a2, 126}, + {0x00a3, 0x00a5, 1}, + {0x058f, 0x060b, 124}, + {0x07fe, 0x07ff, 1}, + {0x09f2, 0x09f3, 1}, + {0x09fb, 0x0af1, 246}, + {0x0bf9, 0x0e3f, 582}, + {0x17db, 0x20a0, 2245}, + {0x20a1, 0x20bf, 1}, + {0xa838, 0xfdfc, 21956}, + {0xfe69, 0xff04, 155}, + {0xffe0, 0xffe1, 1}, + {0xffe5, 0xffe6, 1}, + }, + R32: []Range32{ + {0x11fdd, 0x11fe0, 1}, + {0x1e2ff, 0x1ecb0, 2481}, + }, + LatinOffset: 2, +} + +var _Sk = &RangeTable{ + R16: []Range16{ + {0x005e, 0x0060, 2}, + {0x00a8, 0x00af, 7}, + {0x00b4, 0x00b8, 4}, + {0x02c2, 0x02c5, 1}, + {0x02d2, 0x02df, 1}, + {0x02e5, 0x02eb, 1}, + {0x02ed, 0x02ef, 2}, + {0x02f0, 0x02ff, 1}, + {0x0375, 0x0384, 15}, + {0x0385, 0x1fbd, 7224}, + {0x1fbf, 0x1fc1, 1}, + {0x1fcd, 0x1fcf, 1}, + {0x1fdd, 0x1fdf, 1}, + {0x1fed, 0x1fef, 1}, + {0x1ffd, 0x1ffe, 1}, + {0x309b, 0x309c, 1}, + {0xa700, 0xa716, 1}, + {0xa720, 0xa721, 1}, + {0xa789, 0xa78a, 1}, + {0xab5b, 0xab6a, 15}, + {0xab6b, 0xfbb2, 20551}, + {0xfbb3, 0xfbc1, 1}, + {0xff3e, 0xff40, 2}, + {0xffe3, 0xffe3, 1}, + }, + R32: []Range32{ + {0x1f3fb, 0x1f3ff, 1}, + }, + LatinOffset: 3, +} + +var _Sm = &RangeTable{ + R16: []Range16{ + {0x002b, 0x003c, 17}, + {0x003d, 0x003e, 1}, + {0x007c, 0x007e, 2}, + {0x00ac, 0x00b1, 5}, + {0x00d7, 0x00f7, 32}, + {0x03f6, 0x0606, 528}, + {0x0607, 0x0608, 1}, + {0x2044, 0x2052, 14}, + {0x207a, 0x207c, 1}, + {0x208a, 0x208c, 1}, + {0x2118, 0x2140, 40}, + {0x2141, 0x2144, 1}, + {0x214b, 0x2190, 69}, + {0x2191, 0x2194, 1}, + {0x219a, 0x219b, 1}, + {0x21a0, 0x21a6, 3}, + {0x21ae, 0x21ce, 32}, + {0x21cf, 0x21d2, 3}, + {0x21d4, 0x21f4, 32}, + {0x21f5, 0x22ff, 1}, + {0x2320, 0x2321, 1}, + {0x237c, 0x239b, 31}, + {0x239c, 0x23b3, 1}, + {0x23dc, 0x23e1, 1}, + {0x25b7, 0x25c1, 10}, + {0x25f8, 0x25ff, 1}, + {0x266f, 0x27c0, 337}, + {0x27c1, 0x27c4, 1}, + {0x27c7, 0x27e5, 1}, + {0x27f0, 0x27ff, 1}, + {0x2900, 0x2982, 1}, + {0x2999, 0x29d7, 1}, + {0x29dc, 0x29fb, 1}, + {0x29fe, 0x2aff, 1}, + {0x2b30, 0x2b44, 1}, + {0x2b47, 0x2b4c, 1}, + {0xfb29, 0xfe62, 825}, + {0xfe64, 0xfe66, 1}, + {0xff0b, 0xff1c, 17}, + {0xff1d, 0xff1e, 1}, + {0xff5c, 0xff5e, 2}, + {0xffe2, 0xffe9, 7}, + {0xffea, 0xffec, 1}, + }, + R32: []Range32{ + {0x1d6c1, 0x1d6db, 26}, + {0x1d6fb, 0x1d715, 26}, + {0x1d735, 0x1d74f, 26}, + {0x1d76f, 0x1d789, 26}, + {0x1d7a9, 0x1d7c3, 26}, + {0x1eef0, 0x1eef1, 1}, + }, + LatinOffset: 5, +} + +var _So = &RangeTable{ + R16: []Range16{ + {0x00a6, 0x00a9, 3}, + {0x00ae, 0x00b0, 2}, + {0x0482, 0x058d, 267}, + {0x058e, 0x060e, 128}, + {0x060f, 0x06de, 207}, + {0x06e9, 0x06fd, 20}, + {0x06fe, 0x07f6, 248}, + {0x09fa, 0x0b70, 374}, + {0x0bf3, 0x0bf8, 1}, + {0x0bfa, 0x0c7f, 133}, + {0x0d4f, 0x0d79, 42}, + {0x0f01, 0x0f03, 1}, + {0x0f13, 0x0f15, 2}, + {0x0f16, 0x0f17, 1}, + {0x0f1a, 0x0f1f, 1}, + {0x0f34, 0x0f38, 2}, + {0x0fbe, 0x0fc5, 1}, + {0x0fc7, 0x0fcc, 1}, + {0x0fce, 0x0fcf, 1}, + {0x0fd5, 0x0fd8, 1}, + {0x109e, 0x109f, 1}, + {0x1390, 0x1399, 1}, + {0x166d, 0x1940, 723}, + {0x19de, 0x19ff, 1}, + {0x1b61, 0x1b6a, 1}, + {0x1b74, 0x1b7c, 1}, + {0x2100, 0x2101, 1}, + {0x2103, 0x2106, 1}, + {0x2108, 0x2109, 1}, + {0x2114, 0x2116, 2}, + {0x2117, 0x211e, 7}, + {0x211f, 0x2123, 1}, + {0x2125, 0x2129, 2}, + {0x212e, 0x213a, 12}, + {0x213b, 0x214a, 15}, + {0x214c, 0x214d, 1}, + {0x214f, 0x218a, 59}, + {0x218b, 0x2195, 10}, + {0x2196, 0x2199, 1}, + {0x219c, 0x219f, 1}, + {0x21a1, 0x21a2, 1}, + {0x21a4, 0x21a5, 1}, + {0x21a7, 0x21ad, 1}, + {0x21af, 0x21cd, 1}, + {0x21d0, 0x21d1, 1}, + {0x21d3, 0x21d5, 2}, + {0x21d6, 0x21f3, 1}, + {0x2300, 0x2307, 1}, + {0x230c, 0x231f, 1}, + {0x2322, 0x2328, 1}, + {0x232b, 0x237b, 1}, + {0x237d, 0x239a, 1}, + {0x23b4, 0x23db, 1}, + {0x23e2, 0x2426, 1}, + {0x2440, 0x244a, 1}, + {0x249c, 0x24e9, 1}, + {0x2500, 0x25b6, 1}, + {0x25b8, 0x25c0, 1}, + {0x25c2, 0x25f7, 1}, + {0x2600, 0x266e, 1}, + {0x2670, 0x2767, 1}, + {0x2794, 0x27bf, 1}, + {0x2800, 0x28ff, 1}, + {0x2b00, 0x2b2f, 1}, + {0x2b45, 0x2b46, 1}, + {0x2b4d, 0x2b73, 1}, + {0x2b76, 0x2b95, 1}, + {0x2b97, 0x2bff, 1}, + {0x2ce5, 0x2cea, 1}, + {0x2e50, 0x2e51, 1}, + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + {0x2ff0, 0x2ffb, 1}, + {0x3004, 0x3012, 14}, + {0x3013, 0x3020, 13}, + {0x3036, 0x3037, 1}, + {0x303e, 0x303f, 1}, + {0x3190, 0x3191, 1}, + {0x3196, 0x319f, 1}, + {0x31c0, 0x31e3, 1}, + {0x3200, 0x321e, 1}, + {0x322a, 0x3247, 1}, + {0x3250, 0x3260, 16}, + {0x3261, 0x327f, 1}, + {0x328a, 0x32b0, 1}, + {0x32c0, 0x33ff, 1}, + {0x4dc0, 0x4dff, 1}, + {0xa490, 0xa4c6, 1}, + {0xa828, 0xa82b, 1}, + {0xa836, 0xa837, 1}, + {0xa839, 0xaa77, 574}, + {0xaa78, 0xaa79, 1}, + {0xfdfd, 0xffe4, 487}, + {0xffe8, 0xffed, 5}, + {0xffee, 0xfffc, 14}, + {0xfffd, 0xfffd, 1}, + }, + R32: []Range32{ + {0x10137, 0x1013f, 1}, + {0x10179, 0x10189, 1}, + {0x1018c, 0x1018e, 1}, + {0x10190, 0x1019c, 1}, + {0x101a0, 0x101d0, 48}, + {0x101d1, 0x101fc, 1}, + {0x10877, 0x10878, 1}, + {0x10ac8, 0x1173f, 3191}, + {0x11fd5, 0x11fdc, 1}, + {0x11fe1, 0x11ff1, 1}, + {0x16b3c, 0x16b3f, 1}, + {0x16b45, 0x1bc9c, 20823}, + {0x1d000, 0x1d0f5, 1}, + {0x1d100, 0x1d126, 1}, + {0x1d129, 0x1d164, 1}, + {0x1d16a, 0x1d16c, 1}, + {0x1d183, 0x1d184, 1}, + {0x1d18c, 0x1d1a9, 1}, + {0x1d1ae, 0x1d1e8, 1}, + {0x1d200, 0x1d241, 1}, + {0x1d245, 0x1d300, 187}, + {0x1d301, 0x1d356, 1}, + {0x1d800, 0x1d9ff, 1}, + {0x1da37, 0x1da3a, 1}, + {0x1da6d, 0x1da74, 1}, + {0x1da76, 0x1da83, 1}, + {0x1da85, 0x1da86, 1}, + {0x1e14f, 0x1ecac, 2909}, + {0x1ed2e, 0x1f000, 722}, + {0x1f001, 0x1f02b, 1}, + {0x1f030, 0x1f093, 1}, + {0x1f0a0, 0x1f0ae, 1}, + {0x1f0b1, 0x1f0bf, 1}, + {0x1f0c1, 0x1f0cf, 1}, + {0x1f0d1, 0x1f0f5, 1}, + {0x1f10d, 0x1f1ad, 1}, + {0x1f1e6, 0x1f202, 1}, + {0x1f210, 0x1f23b, 1}, + {0x1f240, 0x1f248, 1}, + {0x1f250, 0x1f251, 1}, + {0x1f260, 0x1f265, 1}, + {0x1f300, 0x1f3fa, 1}, + {0x1f400, 0x1f6d7, 1}, + {0x1f6e0, 0x1f6ec, 1}, + {0x1f6f0, 0x1f6fc, 1}, + {0x1f700, 0x1f773, 1}, + {0x1f780, 0x1f7d8, 1}, + {0x1f7e0, 0x1f7eb, 1}, + {0x1f800, 0x1f80b, 1}, + {0x1f810, 0x1f847, 1}, + {0x1f850, 0x1f859, 1}, + {0x1f860, 0x1f887, 1}, + {0x1f890, 0x1f8ad, 1}, + {0x1f8b0, 0x1f8b1, 1}, + {0x1f900, 0x1f978, 1}, + {0x1f97a, 0x1f9cb, 1}, + {0x1f9cd, 0x1fa53, 1}, + {0x1fa60, 0x1fa6d, 1}, + {0x1fa70, 0x1fa74, 1}, + {0x1fa78, 0x1fa7a, 1}, + {0x1fa80, 0x1fa86, 1}, + {0x1fa90, 0x1faa8, 1}, + {0x1fab0, 0x1fab6, 1}, + {0x1fac0, 0x1fac2, 1}, + {0x1fad0, 0x1fad6, 1}, + {0x1fb00, 0x1fb92, 1}, + {0x1fb94, 0x1fbca, 1}, + }, + LatinOffset: 2, +} + +var _Z = &RangeTable{ + R16: []Range16{ + {0x0020, 0x00a0, 128}, + {0x1680, 0x2000, 2432}, + {0x2001, 0x200a, 1}, + {0x2028, 0x2029, 1}, + {0x202f, 0x205f, 48}, + {0x3000, 0x3000, 1}, + }, + LatinOffset: 1, +} + +var _Zl = &RangeTable{ + R16: []Range16{ + {0x2028, 0x2028, 1}, + }, +} + +var _Zp = &RangeTable{ + R16: []Range16{ + {0x2029, 0x2029, 1}, + }, +} + +var _Zs = &RangeTable{ + R16: []Range16{ + {0x0020, 0x00a0, 128}, + {0x1680, 0x2000, 2432}, + {0x2001, 0x200a, 1}, + {0x202f, 0x205f, 48}, + {0x3000, 0x3000, 1}, + }, + LatinOffset: 1, +} + +// These variables have type *RangeTable. +var ( + Cc = _Cc // Cc is the set of Unicode characters in category Cc (Other, control). + Cf = _Cf // Cf is the set of Unicode characters in category Cf (Other, format). + Co = _Co // Co is the set of Unicode characters in category Co (Other, private use). + Cs = _Cs // Cs is the set of Unicode characters in category Cs (Other, surrogate). + Digit = _Nd // Digit is the set of Unicode characters with the "decimal digit" property. + Nd = _Nd // Nd is the set of Unicode characters in category Nd (Number, decimal digit). + Letter = _L // Letter/L is the set of Unicode letters, category L. + L = _L + Lm = _Lm // Lm is the set of Unicode characters in category Lm (Letter, modifier). + Lo = _Lo // Lo is the set of Unicode characters in category Lo (Letter, other). + Lower = _Ll // Lower is the set of Unicode lower case letters. + Ll = _Ll // Ll is the set of Unicode characters in category Ll (Letter, lowercase). + Mark = _M // Mark/M is the set of Unicode mark characters, category M. + M = _M + Mc = _Mc // Mc is the set of Unicode characters in category Mc (Mark, spacing combining). + Me = _Me // Me is the set of Unicode characters in category Me (Mark, enclosing). + Mn = _Mn // Mn is the set of Unicode characters in category Mn (Mark, nonspacing). + Nl = _Nl // Nl is the set of Unicode characters in category Nl (Number, letter). + No = _No // No is the set of Unicode characters in category No (Number, other). + Number = _N // Number/N is the set of Unicode number characters, category N. + N = _N + Other = _C // Other/C is the set of Unicode control and special characters, category C. + C = _C + Pc = _Pc // Pc is the set of Unicode characters in category Pc (Punctuation, connector). + Pd = _Pd // Pd is the set of Unicode characters in category Pd (Punctuation, dash). + Pe = _Pe // Pe is the set of Unicode characters in category Pe (Punctuation, close). + Pf = _Pf // Pf is the set of Unicode characters in category Pf (Punctuation, final quote). + Pi = _Pi // Pi is the set of Unicode characters in category Pi (Punctuation, initial quote). + Po = _Po // Po is the set of Unicode characters in category Po (Punctuation, other). + Ps = _Ps // Ps is the set of Unicode characters in category Ps (Punctuation, open). + Punct = _P // Punct/P is the set of Unicode punctuation characters, category P. + P = _P + Sc = _Sc // Sc is the set of Unicode characters in category Sc (Symbol, currency). + Sk = _Sk // Sk is the set of Unicode characters in category Sk (Symbol, modifier). + Sm = _Sm // Sm is the set of Unicode characters in category Sm (Symbol, math). + So = _So // So is the set of Unicode characters in category So (Symbol, other). + Space = _Z // Space/Z is the set of Unicode space characters, category Z. + Z = _Z + Symbol = _S // Symbol/S is the set of Unicode symbol characters, category S. + S = _S + Title = _Lt // Title is the set of Unicode title case letters. + Lt = _Lt // Lt is the set of Unicode characters in category Lt (Letter, titlecase). + Upper = _Lu // Upper is the set of Unicode upper case letters. + Lu = _Lu // Lu is the set of Unicode characters in category Lu (Letter, uppercase). + Zl = _Zl // Zl is the set of Unicode characters in category Zl (Separator, line). + Zp = _Zp // Zp is the set of Unicode characters in category Zp (Separator, paragraph). + Zs = _Zs // Zs is the set of Unicode characters in category Zs (Separator, space). +) + +// Scripts is the set of Unicode script tables. +var Scripts = map[string]*RangeTable{ + "Adlam": Adlam, + "Ahom": Ahom, + "Anatolian_Hieroglyphs": Anatolian_Hieroglyphs, + "Arabic": Arabic, + "Armenian": Armenian, + "Avestan": Avestan, + "Balinese": Balinese, + "Bamum": Bamum, + "Bassa_Vah": Bassa_Vah, + "Batak": Batak, + "Bengali": Bengali, + "Bhaiksuki": Bhaiksuki, + "Bopomofo": Bopomofo, + "Brahmi": Brahmi, + "Braille": Braille, + "Buginese": Buginese, + "Buhid": Buhid, + "Canadian_Aboriginal": Canadian_Aboriginal, + "Carian": Carian, + "Caucasian_Albanian": Caucasian_Albanian, + "Chakma": Chakma, + "Cham": Cham, + "Cherokee": Cherokee, + "Chorasmian": Chorasmian, + "Common": Common, + "Coptic": Coptic, + "Cuneiform": Cuneiform, + "Cypriot": Cypriot, + "Cyrillic": Cyrillic, + "Deseret": Deseret, + "Devanagari": Devanagari, + "Dives_Akuru": Dives_Akuru, + "Dogra": Dogra, + "Duployan": Duployan, + "Egyptian_Hieroglyphs": Egyptian_Hieroglyphs, + "Elbasan": Elbasan, + "Elymaic": Elymaic, + "Ethiopic": Ethiopic, + "Georgian": Georgian, + "Glagolitic": Glagolitic, + "Gothic": Gothic, + "Grantha": Grantha, + "Greek": Greek, + "Gujarati": Gujarati, + "Gunjala_Gondi": Gunjala_Gondi, + "Gurmukhi": Gurmukhi, + "Han": Han, + "Hangul": Hangul, + "Hanifi_Rohingya": Hanifi_Rohingya, + "Hanunoo": Hanunoo, + "Hatran": Hatran, + "Hebrew": Hebrew, + "Hiragana": Hiragana, + "Imperial_Aramaic": Imperial_Aramaic, + "Inherited": Inherited, + "Inscriptional_Pahlavi": Inscriptional_Pahlavi, + "Inscriptional_Parthian": Inscriptional_Parthian, + "Javanese": Javanese, + "Kaithi": Kaithi, + "Kannada": Kannada, + "Katakana": Katakana, + "Kayah_Li": Kayah_Li, + "Kharoshthi": Kharoshthi, + "Khitan_Small_Script": Khitan_Small_Script, + "Khmer": Khmer, + "Khojki": Khojki, + "Khudawadi": Khudawadi, + "Lao": Lao, + "Latin": Latin, + "Lepcha": Lepcha, + "Limbu": Limbu, + "Linear_A": Linear_A, + "Linear_B": Linear_B, + "Lisu": Lisu, + "Lycian": Lycian, + "Lydian": Lydian, + "Mahajani": Mahajani, + "Makasar": Makasar, + "Malayalam": Malayalam, + "Mandaic": Mandaic, + "Manichaean": Manichaean, + "Marchen": Marchen, + "Masaram_Gondi": Masaram_Gondi, + "Medefaidrin": Medefaidrin, + "Meetei_Mayek": Meetei_Mayek, + "Mende_Kikakui": Mende_Kikakui, + "Meroitic_Cursive": Meroitic_Cursive, + "Meroitic_Hieroglyphs": Meroitic_Hieroglyphs, + "Miao": Miao, + "Modi": Modi, + "Mongolian": Mongolian, + "Mro": Mro, + "Multani": Multani, + "Myanmar": Myanmar, + "Nabataean": Nabataean, + "Nandinagari": Nandinagari, + "New_Tai_Lue": New_Tai_Lue, + "Newa": Newa, + "Nko": Nko, + "Nushu": Nushu, + "Nyiakeng_Puachue_Hmong": Nyiakeng_Puachue_Hmong, + "Ogham": Ogham, + "Ol_Chiki": Ol_Chiki, + "Old_Hungarian": Old_Hungarian, + "Old_Italic": Old_Italic, + "Old_North_Arabian": Old_North_Arabian, + "Old_Permic": Old_Permic, + "Old_Persian": Old_Persian, + "Old_Sogdian": Old_Sogdian, + "Old_South_Arabian": Old_South_Arabian, + "Old_Turkic": Old_Turkic, + "Oriya": Oriya, + "Osage": Osage, + "Osmanya": Osmanya, + "Pahawh_Hmong": Pahawh_Hmong, + "Palmyrene": Palmyrene, + "Pau_Cin_Hau": Pau_Cin_Hau, + "Phags_Pa": Phags_Pa, + "Phoenician": Phoenician, + "Psalter_Pahlavi": Psalter_Pahlavi, + "Rejang": Rejang, + "Runic": Runic, + "Samaritan": Samaritan, + "Saurashtra": Saurashtra, + "Sharada": Sharada, + "Shavian": Shavian, + "Siddham": Siddham, + "SignWriting": SignWriting, + "Sinhala": Sinhala, + "Sogdian": Sogdian, + "Sora_Sompeng": Sora_Sompeng, + "Soyombo": Soyombo, + "Sundanese": Sundanese, + "Syloti_Nagri": Syloti_Nagri, + "Syriac": Syriac, + "Tagalog": Tagalog, + "Tagbanwa": Tagbanwa, + "Tai_Le": Tai_Le, + "Tai_Tham": Tai_Tham, + "Tai_Viet": Tai_Viet, + "Takri": Takri, + "Tamil": Tamil, + "Tangut": Tangut, + "Telugu": Telugu, + "Thaana": Thaana, + "Thai": Thai, + "Tibetan": Tibetan, + "Tifinagh": Tifinagh, + "Tirhuta": Tirhuta, + "Ugaritic": Ugaritic, + "Vai": Vai, + "Wancho": Wancho, + "Warang_Citi": Warang_Citi, + "Yezidi": Yezidi, + "Yi": Yi, + "Zanabazar_Square": Zanabazar_Square, +} + +var _Adlam = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x1e900, 0x1e94b, 1}, + {0x1e950, 0x1e959, 1}, + {0x1e95e, 0x1e95f, 1}, + }, +} + +var _Ahom = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11700, 0x1171a, 1}, + {0x1171d, 0x1172b, 1}, + {0x11730, 0x1173f, 1}, + }, +} + +var _Anatolian_Hieroglyphs = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x14400, 0x14646, 1}, + }, +} + +var _Arabic = &RangeTable{ + R16: []Range16{ + {0x0600, 0x0604, 1}, + {0x0606, 0x060b, 1}, + {0x060d, 0x061a, 1}, + {0x061c, 0x0620, 2}, + {0x0621, 0x063f, 1}, + {0x0641, 0x064a, 1}, + {0x0656, 0x066f, 1}, + {0x0671, 0x06dc, 1}, + {0x06de, 0x06ff, 1}, + {0x0750, 0x077f, 1}, + {0x08a0, 0x08b4, 1}, + {0x08b6, 0x08c7, 1}, + {0x08d3, 0x08e1, 1}, + {0x08e3, 0x08ff, 1}, + {0xfb50, 0xfbc1, 1}, + {0xfbd3, 0xfd3d, 1}, + {0xfd50, 0xfd8f, 1}, + {0xfd92, 0xfdc7, 1}, + {0xfdf0, 0xfdfd, 1}, + {0xfe70, 0xfe74, 1}, + {0xfe76, 0xfefc, 1}, + }, + R32: []Range32{ + {0x10e60, 0x10e7e, 1}, + {0x1ee00, 0x1ee03, 1}, + {0x1ee05, 0x1ee1f, 1}, + {0x1ee21, 0x1ee22, 1}, + {0x1ee24, 0x1ee27, 3}, + {0x1ee29, 0x1ee32, 1}, + {0x1ee34, 0x1ee37, 1}, + {0x1ee39, 0x1ee3b, 2}, + {0x1ee42, 0x1ee47, 5}, + {0x1ee49, 0x1ee4d, 2}, + {0x1ee4e, 0x1ee4f, 1}, + {0x1ee51, 0x1ee52, 1}, + {0x1ee54, 0x1ee57, 3}, + {0x1ee59, 0x1ee61, 2}, + {0x1ee62, 0x1ee64, 2}, + {0x1ee67, 0x1ee6a, 1}, + {0x1ee6c, 0x1ee72, 1}, + {0x1ee74, 0x1ee77, 1}, + {0x1ee79, 0x1ee7c, 1}, + {0x1ee7e, 0x1ee80, 2}, + {0x1ee81, 0x1ee89, 1}, + {0x1ee8b, 0x1ee9b, 1}, + {0x1eea1, 0x1eea3, 1}, + {0x1eea5, 0x1eea9, 1}, + {0x1eeab, 0x1eebb, 1}, + {0x1eef0, 0x1eef1, 1}, + }, +} + +var _Armenian = &RangeTable{ + R16: []Range16{ + {0x0531, 0x0556, 1}, + {0x0559, 0x058a, 1}, + {0x058d, 0x058f, 1}, + {0xfb13, 0xfb17, 1}, + }, +} + +var _Avestan = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10b00, 0x10b35, 1}, + {0x10b39, 0x10b3f, 1}, + }, +} + +var _Balinese = &RangeTable{ + R16: []Range16{ + {0x1b00, 0x1b4b, 1}, + {0x1b50, 0x1b7c, 1}, + }, +} + +var _Bamum = &RangeTable{ + R16: []Range16{ + {0xa6a0, 0xa6f7, 1}, + }, + R32: []Range32{ + {0x16800, 0x16a38, 1}, + }, +} + +var _Bassa_Vah = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x16ad0, 0x16aed, 1}, + {0x16af0, 0x16af5, 1}, + }, +} + +var _Batak = &RangeTable{ + R16: []Range16{ + {0x1bc0, 0x1bf3, 1}, + {0x1bfc, 0x1bff, 1}, + }, +} + +var _Bengali = &RangeTable{ + R16: []Range16{ + {0x0980, 0x0983, 1}, + {0x0985, 0x098c, 1}, + {0x098f, 0x0990, 1}, + {0x0993, 0x09a8, 1}, + {0x09aa, 0x09b0, 1}, + {0x09b2, 0x09b6, 4}, + {0x09b7, 0x09b9, 1}, + {0x09bc, 0x09c4, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09ce, 1}, + {0x09d7, 0x09dc, 5}, + {0x09dd, 0x09df, 2}, + {0x09e0, 0x09e3, 1}, + {0x09e6, 0x09fe, 1}, + }, +} + +var _Bhaiksuki = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11c00, 0x11c08, 1}, + {0x11c0a, 0x11c36, 1}, + {0x11c38, 0x11c45, 1}, + {0x11c50, 0x11c6c, 1}, + }, +} + +var _Bopomofo = &RangeTable{ + R16: []Range16{ + {0x02ea, 0x02eb, 1}, + {0x3105, 0x312f, 1}, + {0x31a0, 0x31bf, 1}, + }, +} + +var _Brahmi = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11000, 0x1104d, 1}, + {0x11052, 0x1106f, 1}, + {0x1107f, 0x1107f, 1}, + }, +} + +var _Braille = &RangeTable{ + R16: []Range16{ + {0x2800, 0x28ff, 1}, + }, +} + +var _Buginese = &RangeTable{ + R16: []Range16{ + {0x1a00, 0x1a1b, 1}, + {0x1a1e, 0x1a1f, 1}, + }, +} + +var _Buhid = &RangeTable{ + R16: []Range16{ + {0x1740, 0x1753, 1}, + }, +} + +var _Canadian_Aboriginal = &RangeTable{ + R16: []Range16{ + {0x1400, 0x167f, 1}, + {0x18b0, 0x18f5, 1}, + }, +} + +var _Carian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x102a0, 0x102d0, 1}, + }, +} + +var _Caucasian_Albanian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10530, 0x10563, 1}, + {0x1056f, 0x1056f, 1}, + }, +} + +var _Chakma = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11100, 0x11134, 1}, + {0x11136, 0x11147, 1}, + }, +} + +var _Cham = &RangeTable{ + R16: []Range16{ + {0xaa00, 0xaa36, 1}, + {0xaa40, 0xaa4d, 1}, + {0xaa50, 0xaa59, 1}, + {0xaa5c, 0xaa5f, 1}, + }, +} + +var _Cherokee = &RangeTable{ + R16: []Range16{ + {0x13a0, 0x13f5, 1}, + {0x13f8, 0x13fd, 1}, + {0xab70, 0xabbf, 1}, + }, +} + +var _Chorasmian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10fb0, 0x10fcb, 1}, + }, +} + +var _Common = &RangeTable{ + R16: []Range16{ + {0x0000, 0x0040, 1}, + {0x005b, 0x0060, 1}, + {0x007b, 0x00a9, 1}, + {0x00ab, 0x00b9, 1}, + {0x00bb, 0x00bf, 1}, + {0x00d7, 0x00f7, 32}, + {0x02b9, 0x02df, 1}, + {0x02e5, 0x02e9, 1}, + {0x02ec, 0x02ff, 1}, + {0x0374, 0x037e, 10}, + {0x0385, 0x0387, 2}, + {0x0605, 0x060c, 7}, + {0x061b, 0x061f, 4}, + {0x0640, 0x06dd, 157}, + {0x08e2, 0x0964, 130}, + {0x0965, 0x0e3f, 1242}, + {0x0fd5, 0x0fd8, 1}, + {0x10fb, 0x16eb, 1520}, + {0x16ec, 0x16ed, 1}, + {0x1735, 0x1736, 1}, + {0x1802, 0x1803, 1}, + {0x1805, 0x1cd3, 1230}, + {0x1ce1, 0x1ce9, 8}, + {0x1cea, 0x1cec, 1}, + {0x1cee, 0x1cf3, 1}, + {0x1cf5, 0x1cf7, 1}, + {0x1cfa, 0x2000, 774}, + {0x2001, 0x200b, 1}, + {0x200e, 0x2064, 1}, + {0x2066, 0x2070, 1}, + {0x2074, 0x207e, 1}, + {0x2080, 0x208e, 1}, + {0x20a0, 0x20bf, 1}, + {0x2100, 0x2125, 1}, + {0x2127, 0x2129, 1}, + {0x212c, 0x2131, 1}, + {0x2133, 0x214d, 1}, + {0x214f, 0x215f, 1}, + {0x2189, 0x218b, 1}, + {0x2190, 0x2426, 1}, + {0x2440, 0x244a, 1}, + {0x2460, 0x27ff, 1}, + {0x2900, 0x2b73, 1}, + {0x2b76, 0x2b95, 1}, + {0x2b97, 0x2bff, 1}, + {0x2e00, 0x2e52, 1}, + {0x2ff0, 0x2ffb, 1}, + {0x3000, 0x3004, 1}, + {0x3006, 0x3008, 2}, + {0x3009, 0x3020, 1}, + {0x3030, 0x3037, 1}, + {0x303c, 0x303f, 1}, + {0x309b, 0x309c, 1}, + {0x30a0, 0x30fb, 91}, + {0x30fc, 0x3190, 148}, + {0x3191, 0x319f, 1}, + {0x31c0, 0x31e3, 1}, + {0x3220, 0x325f, 1}, + {0x327f, 0x32cf, 1}, + {0x32ff, 0x3358, 89}, + {0x3359, 0x33ff, 1}, + {0x4dc0, 0x4dff, 1}, + {0xa700, 0xa721, 1}, + {0xa788, 0xa78a, 1}, + {0xa830, 0xa839, 1}, + {0xa92e, 0xa9cf, 161}, + {0xab5b, 0xab6a, 15}, + {0xab6b, 0xfd3e, 20947}, + {0xfd3f, 0xfe10, 209}, + {0xfe11, 0xfe19, 1}, + {0xfe30, 0xfe52, 1}, + {0xfe54, 0xfe66, 1}, + {0xfe68, 0xfe6b, 1}, + {0xfeff, 0xff01, 2}, + {0xff02, 0xff20, 1}, + {0xff3b, 0xff40, 1}, + {0xff5b, 0xff65, 1}, + {0xff70, 0xff9e, 46}, + {0xff9f, 0xffe0, 65}, + {0xffe1, 0xffe6, 1}, + {0xffe8, 0xffee, 1}, + {0xfff9, 0xfffd, 1}, + }, + R32: []Range32{ + {0x10100, 0x10102, 1}, + {0x10107, 0x10133, 1}, + {0x10137, 0x1013f, 1}, + {0x10190, 0x1019c, 1}, + {0x101d0, 0x101fc, 1}, + {0x102e1, 0x102fb, 1}, + {0x16fe2, 0x16fe3, 1}, + {0x1bca0, 0x1bca3, 1}, + {0x1d000, 0x1d0f5, 1}, + {0x1d100, 0x1d126, 1}, + {0x1d129, 0x1d166, 1}, + {0x1d16a, 0x1d17a, 1}, + {0x1d183, 0x1d184, 1}, + {0x1d18c, 0x1d1a9, 1}, + {0x1d1ae, 0x1d1e8, 1}, + {0x1d2e0, 0x1d2f3, 1}, + {0x1d300, 0x1d356, 1}, + {0x1d360, 0x1d378, 1}, + {0x1d400, 0x1d454, 1}, + {0x1d456, 0x1d49c, 1}, + {0x1d49e, 0x1d49f, 1}, + {0x1d4a2, 0x1d4a5, 3}, + {0x1d4a6, 0x1d4a9, 3}, + {0x1d4aa, 0x1d4ac, 1}, + {0x1d4ae, 0x1d4b9, 1}, + {0x1d4bb, 0x1d4bd, 2}, + {0x1d4be, 0x1d4c3, 1}, + {0x1d4c5, 0x1d505, 1}, + {0x1d507, 0x1d50a, 1}, + {0x1d50d, 0x1d514, 1}, + {0x1d516, 0x1d51c, 1}, + {0x1d51e, 0x1d539, 1}, + {0x1d53b, 0x1d53e, 1}, + {0x1d540, 0x1d544, 1}, + {0x1d546, 0x1d54a, 4}, + {0x1d54b, 0x1d550, 1}, + {0x1d552, 0x1d6a5, 1}, + {0x1d6a8, 0x1d7cb, 1}, + {0x1d7ce, 0x1d7ff, 1}, + {0x1ec71, 0x1ecb4, 1}, + {0x1ed01, 0x1ed3d, 1}, + {0x1f000, 0x1f02b, 1}, + {0x1f030, 0x1f093, 1}, + {0x1f0a0, 0x1f0ae, 1}, + {0x1f0b1, 0x1f0bf, 1}, + {0x1f0c1, 0x1f0cf, 1}, + {0x1f0d1, 0x1f0f5, 1}, + {0x1f100, 0x1f1ad, 1}, + {0x1f1e6, 0x1f1ff, 1}, + {0x1f201, 0x1f202, 1}, + {0x1f210, 0x1f23b, 1}, + {0x1f240, 0x1f248, 1}, + {0x1f250, 0x1f251, 1}, + {0x1f260, 0x1f265, 1}, + {0x1f300, 0x1f6d7, 1}, + {0x1f6e0, 0x1f6ec, 1}, + {0x1f6f0, 0x1f6fc, 1}, + {0x1f700, 0x1f773, 1}, + {0x1f780, 0x1f7d8, 1}, + {0x1f7e0, 0x1f7eb, 1}, + {0x1f800, 0x1f80b, 1}, + {0x1f810, 0x1f847, 1}, + {0x1f850, 0x1f859, 1}, + {0x1f860, 0x1f887, 1}, + {0x1f890, 0x1f8ad, 1}, + {0x1f8b0, 0x1f8b1, 1}, + {0x1f900, 0x1f978, 1}, + {0x1f97a, 0x1f9cb, 1}, + {0x1f9cd, 0x1fa53, 1}, + {0x1fa60, 0x1fa6d, 1}, + {0x1fa70, 0x1fa74, 1}, + {0x1fa78, 0x1fa7a, 1}, + {0x1fa80, 0x1fa86, 1}, + {0x1fa90, 0x1faa8, 1}, + {0x1fab0, 0x1fab6, 1}, + {0x1fac0, 0x1fac2, 1}, + {0x1fad0, 0x1fad6, 1}, + {0x1fb00, 0x1fb92, 1}, + {0x1fb94, 0x1fbca, 1}, + {0x1fbf0, 0x1fbf9, 1}, + {0xe0001, 0xe0020, 31}, + {0xe0021, 0xe007f, 1}, + }, + LatinOffset: 6, +} + +var _Coptic = &RangeTable{ + R16: []Range16{ + {0x03e2, 0x03ef, 1}, + {0x2c80, 0x2cf3, 1}, + {0x2cf9, 0x2cff, 1}, + }, +} + +var _Cuneiform = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x12000, 0x12399, 1}, + {0x12400, 0x1246e, 1}, + {0x12470, 0x12474, 1}, + {0x12480, 0x12543, 1}, + }, +} + +var _Cypriot = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10800, 0x10805, 1}, + {0x10808, 0x1080a, 2}, + {0x1080b, 0x10835, 1}, + {0x10837, 0x10838, 1}, + {0x1083c, 0x1083f, 3}, + }, +} + +var _Cyrillic = &RangeTable{ + R16: []Range16{ + {0x0400, 0x0484, 1}, + {0x0487, 0x052f, 1}, + {0x1c80, 0x1c88, 1}, + {0x1d2b, 0x1d78, 77}, + {0x2de0, 0x2dff, 1}, + {0xa640, 0xa69f, 1}, + {0xfe2e, 0xfe2f, 1}, + }, +} + +var _Deseret = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10400, 0x1044f, 1}, + }, +} + +var _Devanagari = &RangeTable{ + R16: []Range16{ + {0x0900, 0x0950, 1}, + {0x0955, 0x0963, 1}, + {0x0966, 0x097f, 1}, + {0xa8e0, 0xa8ff, 1}, + }, +} + +var _Dives_Akuru = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11900, 0x11906, 1}, + {0x11909, 0x1190c, 3}, + {0x1190d, 0x11913, 1}, + {0x11915, 0x11916, 1}, + {0x11918, 0x11935, 1}, + {0x11937, 0x11938, 1}, + {0x1193b, 0x11946, 1}, + {0x11950, 0x11959, 1}, + }, +} + +var _Dogra = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11800, 0x1183b, 1}, + }, +} + +var _Duployan = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x1bc00, 0x1bc6a, 1}, + {0x1bc70, 0x1bc7c, 1}, + {0x1bc80, 0x1bc88, 1}, + {0x1bc90, 0x1bc99, 1}, + {0x1bc9c, 0x1bc9f, 1}, + }, +} + +var _Egyptian_Hieroglyphs = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x13000, 0x1342e, 1}, + {0x13430, 0x13438, 1}, + }, +} + +var _Elbasan = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10500, 0x10527, 1}, + }, +} + +var _Elymaic = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10fe0, 0x10ff6, 1}, + }, +} + +var _Ethiopic = &RangeTable{ + R16: []Range16{ + {0x1200, 0x1248, 1}, + {0x124a, 0x124d, 1}, + {0x1250, 0x1256, 1}, + {0x1258, 0x125a, 2}, + {0x125b, 0x125d, 1}, + {0x1260, 0x1288, 1}, + {0x128a, 0x128d, 1}, + {0x1290, 0x12b0, 1}, + {0x12b2, 0x12b5, 1}, + {0x12b8, 0x12be, 1}, + {0x12c0, 0x12c2, 2}, + {0x12c3, 0x12c5, 1}, + {0x12c8, 0x12d6, 1}, + {0x12d8, 0x1310, 1}, + {0x1312, 0x1315, 1}, + {0x1318, 0x135a, 1}, + {0x135d, 0x137c, 1}, + {0x1380, 0x1399, 1}, + {0x2d80, 0x2d96, 1}, + {0x2da0, 0x2da6, 1}, + {0x2da8, 0x2dae, 1}, + {0x2db0, 0x2db6, 1}, + {0x2db8, 0x2dbe, 1}, + {0x2dc0, 0x2dc6, 1}, + {0x2dc8, 0x2dce, 1}, + {0x2dd0, 0x2dd6, 1}, + {0x2dd8, 0x2dde, 1}, + {0xab01, 0xab06, 1}, + {0xab09, 0xab0e, 1}, + {0xab11, 0xab16, 1}, + {0xab20, 0xab26, 1}, + {0xab28, 0xab2e, 1}, + }, +} + +var _Georgian = &RangeTable{ + R16: []Range16{ + {0x10a0, 0x10c5, 1}, + {0x10c7, 0x10cd, 6}, + {0x10d0, 0x10fa, 1}, + {0x10fc, 0x10ff, 1}, + {0x1c90, 0x1cba, 1}, + {0x1cbd, 0x1cbf, 1}, + {0x2d00, 0x2d25, 1}, + {0x2d27, 0x2d2d, 6}, + }, +} + +var _Glagolitic = &RangeTable{ + R16: []Range16{ + {0x2c00, 0x2c2e, 1}, + {0x2c30, 0x2c5e, 1}, + }, + R32: []Range32{ + {0x1e000, 0x1e006, 1}, + {0x1e008, 0x1e018, 1}, + {0x1e01b, 0x1e021, 1}, + {0x1e023, 0x1e024, 1}, + {0x1e026, 0x1e02a, 1}, + }, +} + +var _Gothic = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10330, 0x1034a, 1}, + }, +} + +var _Grantha = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11300, 0x11303, 1}, + {0x11305, 0x1130c, 1}, + {0x1130f, 0x11310, 1}, + {0x11313, 0x11328, 1}, + {0x1132a, 0x11330, 1}, + {0x11332, 0x11333, 1}, + {0x11335, 0x11339, 1}, + {0x1133c, 0x11344, 1}, + {0x11347, 0x11348, 1}, + {0x1134b, 0x1134d, 1}, + {0x11350, 0x11357, 7}, + {0x1135d, 0x11363, 1}, + {0x11366, 0x1136c, 1}, + {0x11370, 0x11374, 1}, + }, +} + +var _Greek = &RangeTable{ + R16: []Range16{ + {0x0370, 0x0373, 1}, + {0x0375, 0x0377, 1}, + {0x037a, 0x037d, 1}, + {0x037f, 0x0384, 5}, + {0x0386, 0x0388, 2}, + {0x0389, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x03a1, 1}, + {0x03a3, 0x03e1, 1}, + {0x03f0, 0x03ff, 1}, + {0x1d26, 0x1d2a, 1}, + {0x1d5d, 0x1d61, 1}, + {0x1d66, 0x1d6a, 1}, + {0x1dbf, 0x1f00, 321}, + {0x1f01, 0x1f15, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f20, 0x1f45, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f50, 0x1f57, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f60, 0x1f7d, 1}, + {0x1f80, 0x1fb4, 1}, + {0x1fb6, 0x1fc4, 1}, + {0x1fc6, 0x1fd3, 1}, + {0x1fd6, 0x1fdb, 1}, + {0x1fdd, 0x1fef, 1}, + {0x1ff2, 0x1ff4, 1}, + {0x1ff6, 0x1ffe, 1}, + {0x2126, 0xab65, 35391}, + }, + R32: []Range32{ + {0x10140, 0x1018e, 1}, + {0x101a0, 0x1d200, 53344}, + {0x1d201, 0x1d245, 1}, + }, +} + +var _Gujarati = &RangeTable{ + R16: []Range16{ + {0x0a81, 0x0a83, 1}, + {0x0a85, 0x0a8d, 1}, + {0x0a8f, 0x0a91, 1}, + {0x0a93, 0x0aa8, 1}, + {0x0aaa, 0x0ab0, 1}, + {0x0ab2, 0x0ab3, 1}, + {0x0ab5, 0x0ab9, 1}, + {0x0abc, 0x0ac5, 1}, + {0x0ac7, 0x0ac9, 1}, + {0x0acb, 0x0acd, 1}, + {0x0ad0, 0x0ae0, 16}, + {0x0ae1, 0x0ae3, 1}, + {0x0ae6, 0x0af1, 1}, + {0x0af9, 0x0aff, 1}, + }, +} + +var _Gunjala_Gondi = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11d60, 0x11d65, 1}, + {0x11d67, 0x11d68, 1}, + {0x11d6a, 0x11d8e, 1}, + {0x11d90, 0x11d91, 1}, + {0x11d93, 0x11d98, 1}, + {0x11da0, 0x11da9, 1}, + }, +} + +var _Gurmukhi = &RangeTable{ + R16: []Range16{ + {0x0a01, 0x0a03, 1}, + {0x0a05, 0x0a0a, 1}, + {0x0a0f, 0x0a10, 1}, + {0x0a13, 0x0a28, 1}, + {0x0a2a, 0x0a30, 1}, + {0x0a32, 0x0a33, 1}, + {0x0a35, 0x0a36, 1}, + {0x0a38, 0x0a39, 1}, + {0x0a3c, 0x0a3e, 2}, + {0x0a3f, 0x0a42, 1}, + {0x0a47, 0x0a48, 1}, + {0x0a4b, 0x0a4d, 1}, + {0x0a51, 0x0a59, 8}, + {0x0a5a, 0x0a5c, 1}, + {0x0a5e, 0x0a66, 8}, + {0x0a67, 0x0a76, 1}, + }, +} + +var _Han = &RangeTable{ + R16: []Range16{ + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + {0x3005, 0x3007, 2}, + {0x3021, 0x3029, 1}, + {0x3038, 0x303b, 1}, + {0x3400, 0x4dbf, 1}, + {0x4e00, 0x9ffc, 1}, + {0xf900, 0xfa6d, 1}, + {0xfa70, 0xfad9, 1}, + }, + R32: []Range32{ + {0x16ff0, 0x16ff1, 1}, + {0x20000, 0x2a6dd, 1}, + {0x2a700, 0x2b734, 1}, + {0x2b740, 0x2b81d, 1}, + {0x2b820, 0x2cea1, 1}, + {0x2ceb0, 0x2ebe0, 1}, + {0x2f800, 0x2fa1d, 1}, + {0x30000, 0x3134a, 1}, + }, +} + +var _Hangul = &RangeTable{ + R16: []Range16{ + {0x1100, 0x11ff, 1}, + {0x302e, 0x302f, 1}, + {0x3131, 0x318e, 1}, + {0x3200, 0x321e, 1}, + {0x3260, 0x327e, 1}, + {0xa960, 0xa97c, 1}, + {0xac00, 0xd7a3, 1}, + {0xd7b0, 0xd7c6, 1}, + {0xd7cb, 0xd7fb, 1}, + {0xffa0, 0xffbe, 1}, + {0xffc2, 0xffc7, 1}, + {0xffca, 0xffcf, 1}, + {0xffd2, 0xffd7, 1}, + {0xffda, 0xffdc, 1}, + }, +} + +var _Hanifi_Rohingya = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10d00, 0x10d27, 1}, + {0x10d30, 0x10d39, 1}, + }, +} + +var _Hanunoo = &RangeTable{ + R16: []Range16{ + {0x1720, 0x1734, 1}, + }, +} + +var _Hatran = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x108e0, 0x108f2, 1}, + {0x108f4, 0x108f5, 1}, + {0x108fb, 0x108ff, 1}, + }, +} + +var _Hebrew = &RangeTable{ + R16: []Range16{ + {0x0591, 0x05c7, 1}, + {0x05d0, 0x05ea, 1}, + {0x05ef, 0x05f4, 1}, + {0xfb1d, 0xfb36, 1}, + {0xfb38, 0xfb3c, 1}, + {0xfb3e, 0xfb40, 2}, + {0xfb41, 0xfb43, 2}, + {0xfb44, 0xfb46, 2}, + {0xfb47, 0xfb4f, 1}, + }, +} + +var _Hiragana = &RangeTable{ + R16: []Range16{ + {0x3041, 0x3096, 1}, + {0x309d, 0x309f, 1}, + }, + R32: []Range32{ + {0x1b001, 0x1b11e, 1}, + {0x1b150, 0x1b152, 1}, + {0x1f200, 0x1f200, 1}, + }, +} + +var _Imperial_Aramaic = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10840, 0x10855, 1}, + {0x10857, 0x1085f, 1}, + }, +} + +var _Inherited = &RangeTable{ + R16: []Range16{ + {0x0300, 0x036f, 1}, + {0x0485, 0x0486, 1}, + {0x064b, 0x0655, 1}, + {0x0670, 0x0951, 737}, + {0x0952, 0x0954, 1}, + {0x1ab0, 0x1ac0, 1}, + {0x1cd0, 0x1cd2, 1}, + {0x1cd4, 0x1ce0, 1}, + {0x1ce2, 0x1ce8, 1}, + {0x1ced, 0x1cf4, 7}, + {0x1cf8, 0x1cf9, 1}, + {0x1dc0, 0x1df9, 1}, + {0x1dfb, 0x1dff, 1}, + {0x200c, 0x200d, 1}, + {0x20d0, 0x20f0, 1}, + {0x302a, 0x302d, 1}, + {0x3099, 0x309a, 1}, + {0xfe00, 0xfe0f, 1}, + {0xfe20, 0xfe2d, 1}, + }, + R32: []Range32{ + {0x101fd, 0x102e0, 227}, + {0x1133b, 0x1d167, 48684}, + {0x1d168, 0x1d169, 1}, + {0x1d17b, 0x1d182, 1}, + {0x1d185, 0x1d18b, 1}, + {0x1d1aa, 0x1d1ad, 1}, + {0xe0100, 0xe01ef, 1}, + }, +} + +var _Inscriptional_Pahlavi = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10b60, 0x10b72, 1}, + {0x10b78, 0x10b7f, 1}, + }, +} + +var _Inscriptional_Parthian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10b40, 0x10b55, 1}, + {0x10b58, 0x10b5f, 1}, + }, +} + +var _Javanese = &RangeTable{ + R16: []Range16{ + {0xa980, 0xa9cd, 1}, + {0xa9d0, 0xa9d9, 1}, + {0xa9de, 0xa9df, 1}, + }, +} + +var _Kaithi = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11080, 0x110c1, 1}, + {0x110cd, 0x110cd, 1}, + }, +} + +var _Kannada = &RangeTable{ + R16: []Range16{ + {0x0c80, 0x0c8c, 1}, + {0x0c8e, 0x0c90, 1}, + {0x0c92, 0x0ca8, 1}, + {0x0caa, 0x0cb3, 1}, + {0x0cb5, 0x0cb9, 1}, + {0x0cbc, 0x0cc4, 1}, + {0x0cc6, 0x0cc8, 1}, + {0x0cca, 0x0ccd, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0cde, 0x0ce0, 2}, + {0x0ce1, 0x0ce3, 1}, + {0x0ce6, 0x0cef, 1}, + {0x0cf1, 0x0cf2, 1}, + }, +} + +var _Katakana = &RangeTable{ + R16: []Range16{ + {0x30a1, 0x30fa, 1}, + {0x30fd, 0x30ff, 1}, + {0x31f0, 0x31ff, 1}, + {0x32d0, 0x32fe, 1}, + {0x3300, 0x3357, 1}, + {0xff66, 0xff6f, 1}, + {0xff71, 0xff9d, 1}, + }, + R32: []Range32{ + {0x1b000, 0x1b164, 356}, + {0x1b165, 0x1b167, 1}, + }, +} + +var _Kayah_Li = &RangeTable{ + R16: []Range16{ + {0xa900, 0xa92d, 1}, + {0xa92f, 0xa92f, 1}, + }, +} + +var _Kharoshthi = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10a00, 0x10a03, 1}, + {0x10a05, 0x10a06, 1}, + {0x10a0c, 0x10a13, 1}, + {0x10a15, 0x10a17, 1}, + {0x10a19, 0x10a35, 1}, + {0x10a38, 0x10a3a, 1}, + {0x10a3f, 0x10a48, 1}, + {0x10a50, 0x10a58, 1}, + }, +} + +var _Khitan_Small_Script = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x16fe4, 0x18b00, 6940}, + {0x18b01, 0x18cd5, 1}, + }, +} + +var _Khmer = &RangeTable{ + R16: []Range16{ + {0x1780, 0x17dd, 1}, + {0x17e0, 0x17e9, 1}, + {0x17f0, 0x17f9, 1}, + {0x19e0, 0x19ff, 1}, + }, +} + +var _Khojki = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11200, 0x11211, 1}, + {0x11213, 0x1123e, 1}, + }, +} + +var _Khudawadi = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x112b0, 0x112ea, 1}, + {0x112f0, 0x112f9, 1}, + }, +} + +var _Lao = &RangeTable{ + R16: []Range16{ + {0x0e81, 0x0e82, 1}, + {0x0e84, 0x0e86, 2}, + {0x0e87, 0x0e8a, 1}, + {0x0e8c, 0x0ea3, 1}, + {0x0ea5, 0x0ea7, 2}, + {0x0ea8, 0x0ebd, 1}, + {0x0ec0, 0x0ec4, 1}, + {0x0ec6, 0x0ec8, 2}, + {0x0ec9, 0x0ecd, 1}, + {0x0ed0, 0x0ed9, 1}, + {0x0edc, 0x0edf, 1}, + }, +} + +var _Latin = &RangeTable{ + R16: []Range16{ + {0x0041, 0x005a, 1}, + {0x0061, 0x007a, 1}, + {0x00aa, 0x00ba, 16}, + {0x00c0, 0x00d6, 1}, + {0x00d8, 0x00f6, 1}, + {0x00f8, 0x02b8, 1}, + {0x02e0, 0x02e4, 1}, + {0x1d00, 0x1d25, 1}, + {0x1d2c, 0x1d5c, 1}, + {0x1d62, 0x1d65, 1}, + {0x1d6b, 0x1d77, 1}, + {0x1d79, 0x1dbe, 1}, + {0x1e00, 0x1eff, 1}, + {0x2071, 0x207f, 14}, + {0x2090, 0x209c, 1}, + {0x212a, 0x212b, 1}, + {0x2132, 0x214e, 28}, + {0x2160, 0x2188, 1}, + {0x2c60, 0x2c7f, 1}, + {0xa722, 0xa787, 1}, + {0xa78b, 0xa7bf, 1}, + {0xa7c2, 0xa7ca, 1}, + {0xa7f5, 0xa7ff, 1}, + {0xab30, 0xab5a, 1}, + {0xab5c, 0xab64, 1}, + {0xab66, 0xab69, 1}, + {0xfb00, 0xfb06, 1}, + {0xff21, 0xff3a, 1}, + {0xff41, 0xff5a, 1}, + }, + LatinOffset: 5, +} + +var _Lepcha = &RangeTable{ + R16: []Range16{ + {0x1c00, 0x1c37, 1}, + {0x1c3b, 0x1c49, 1}, + {0x1c4d, 0x1c4f, 1}, + }, +} + +var _Limbu = &RangeTable{ + R16: []Range16{ + {0x1900, 0x191e, 1}, + {0x1920, 0x192b, 1}, + {0x1930, 0x193b, 1}, + {0x1940, 0x1944, 4}, + {0x1945, 0x194f, 1}, + }, +} + +var _Linear_A = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10600, 0x10736, 1}, + {0x10740, 0x10755, 1}, + {0x10760, 0x10767, 1}, + }, +} + +var _Linear_B = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10000, 0x1000b, 1}, + {0x1000d, 0x10026, 1}, + {0x10028, 0x1003a, 1}, + {0x1003c, 0x1003d, 1}, + {0x1003f, 0x1004d, 1}, + {0x10050, 0x1005d, 1}, + {0x10080, 0x100fa, 1}, + }, +} + +var _Lisu = &RangeTable{ + R16: []Range16{ + {0xa4d0, 0xa4ff, 1}, + }, + R32: []Range32{ + {0x11fb0, 0x11fb0, 1}, + }, +} + +var _Lycian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10280, 0x1029c, 1}, + }, +} + +var _Lydian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10920, 0x10939, 1}, + {0x1093f, 0x1093f, 1}, + }, +} + +var _Mahajani = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11150, 0x11176, 1}, + }, +} + +var _Makasar = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11ee0, 0x11ef8, 1}, + }, +} + +var _Malayalam = &RangeTable{ + R16: []Range16{ + {0x0d00, 0x0d0c, 1}, + {0x0d0e, 0x0d10, 1}, + {0x0d12, 0x0d44, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4f, 1}, + {0x0d54, 0x0d63, 1}, + {0x0d66, 0x0d7f, 1}, + }, +} + +var _Mandaic = &RangeTable{ + R16: []Range16{ + {0x0840, 0x085b, 1}, + {0x085e, 0x085e, 1}, + }, +} + +var _Manichaean = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10ac0, 0x10ae6, 1}, + {0x10aeb, 0x10af6, 1}, + }, +} + +var _Marchen = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11c70, 0x11c8f, 1}, + {0x11c92, 0x11ca7, 1}, + {0x11ca9, 0x11cb6, 1}, + }, +} + +var _Masaram_Gondi = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11d00, 0x11d06, 1}, + {0x11d08, 0x11d09, 1}, + {0x11d0b, 0x11d36, 1}, + {0x11d3a, 0x11d3c, 2}, + {0x11d3d, 0x11d3f, 2}, + {0x11d40, 0x11d47, 1}, + {0x11d50, 0x11d59, 1}, + }, +} + +var _Medefaidrin = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x16e40, 0x16e9a, 1}, + }, +} + +var _Meetei_Mayek = &RangeTable{ + R16: []Range16{ + {0xaae0, 0xaaf6, 1}, + {0xabc0, 0xabed, 1}, + {0xabf0, 0xabf9, 1}, + }, +} + +var _Mende_Kikakui = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x1e800, 0x1e8c4, 1}, + {0x1e8c7, 0x1e8d6, 1}, + }, +} + +var _Meroitic_Cursive = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x109a0, 0x109b7, 1}, + {0x109bc, 0x109cf, 1}, + {0x109d2, 0x109ff, 1}, + }, +} + +var _Meroitic_Hieroglyphs = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10980, 0x1099f, 1}, + }, +} + +var _Miao = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x16f00, 0x16f4a, 1}, + {0x16f4f, 0x16f87, 1}, + {0x16f8f, 0x16f9f, 1}, + }, +} + +var _Modi = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11600, 0x11644, 1}, + {0x11650, 0x11659, 1}, + }, +} + +var _Mongolian = &RangeTable{ + R16: []Range16{ + {0x1800, 0x1801, 1}, + {0x1804, 0x1806, 2}, + {0x1807, 0x180e, 1}, + {0x1810, 0x1819, 1}, + {0x1820, 0x1878, 1}, + {0x1880, 0x18aa, 1}, + }, + R32: []Range32{ + {0x11660, 0x1166c, 1}, + }, +} + +var _Mro = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x16a40, 0x16a5e, 1}, + {0x16a60, 0x16a69, 1}, + {0x16a6e, 0x16a6f, 1}, + }, +} + +var _Multani = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11280, 0x11286, 1}, + {0x11288, 0x1128a, 2}, + {0x1128b, 0x1128d, 1}, + {0x1128f, 0x1129d, 1}, + {0x1129f, 0x112a9, 1}, + }, +} + +var _Myanmar = &RangeTable{ + R16: []Range16{ + {0x1000, 0x109f, 1}, + {0xa9e0, 0xa9fe, 1}, + {0xaa60, 0xaa7f, 1}, + }, +} + +var _Nabataean = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10880, 0x1089e, 1}, + {0x108a7, 0x108af, 1}, + }, +} + +var _Nandinagari = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x119a0, 0x119a7, 1}, + {0x119aa, 0x119d7, 1}, + {0x119da, 0x119e4, 1}, + }, +} + +var _New_Tai_Lue = &RangeTable{ + R16: []Range16{ + {0x1980, 0x19ab, 1}, + {0x19b0, 0x19c9, 1}, + {0x19d0, 0x19da, 1}, + {0x19de, 0x19df, 1}, + }, +} + +var _Newa = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11400, 0x1145b, 1}, + {0x1145d, 0x11461, 1}, + }, +} + +var _Nko = &RangeTable{ + R16: []Range16{ + {0x07c0, 0x07fa, 1}, + {0x07fd, 0x07ff, 1}, + }, +} + +var _Nushu = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x16fe1, 0x1b170, 16783}, + {0x1b171, 0x1b2fb, 1}, + }, +} + +var _Nyiakeng_Puachue_Hmong = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x1e100, 0x1e12c, 1}, + {0x1e130, 0x1e13d, 1}, + {0x1e140, 0x1e149, 1}, + {0x1e14e, 0x1e14f, 1}, + }, +} + +var _Ogham = &RangeTable{ + R16: []Range16{ + {0x1680, 0x169c, 1}, + }, +} + +var _Ol_Chiki = &RangeTable{ + R16: []Range16{ + {0x1c50, 0x1c7f, 1}, + }, +} + +var _Old_Hungarian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10c80, 0x10cb2, 1}, + {0x10cc0, 0x10cf2, 1}, + {0x10cfa, 0x10cff, 1}, + }, +} + +var _Old_Italic = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10300, 0x10323, 1}, + {0x1032d, 0x1032f, 1}, + }, +} + +var _Old_North_Arabian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10a80, 0x10a9f, 1}, + }, +} + +var _Old_Permic = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10350, 0x1037a, 1}, + }, +} + +var _Old_Persian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x103a0, 0x103c3, 1}, + {0x103c8, 0x103d5, 1}, + }, +} + +var _Old_Sogdian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10f00, 0x10f27, 1}, + }, +} + +var _Old_South_Arabian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10a60, 0x10a7f, 1}, + }, +} + +var _Old_Turkic = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10c00, 0x10c48, 1}, + }, +} + +var _Oriya = &RangeTable{ + R16: []Range16{ + {0x0b01, 0x0b03, 1}, + {0x0b05, 0x0b0c, 1}, + {0x0b0f, 0x0b10, 1}, + {0x0b13, 0x0b28, 1}, + {0x0b2a, 0x0b30, 1}, + {0x0b32, 0x0b33, 1}, + {0x0b35, 0x0b39, 1}, + {0x0b3c, 0x0b44, 1}, + {0x0b47, 0x0b48, 1}, + {0x0b4b, 0x0b4d, 1}, + {0x0b55, 0x0b57, 1}, + {0x0b5c, 0x0b5d, 1}, + {0x0b5f, 0x0b63, 1}, + {0x0b66, 0x0b77, 1}, + }, +} + +var _Osage = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x104b0, 0x104d3, 1}, + {0x104d8, 0x104fb, 1}, + }, +} + +var _Osmanya = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10480, 0x1049d, 1}, + {0x104a0, 0x104a9, 1}, + }, +} + +var _Pahawh_Hmong = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x16b00, 0x16b45, 1}, + {0x16b50, 0x16b59, 1}, + {0x16b5b, 0x16b61, 1}, + {0x16b63, 0x16b77, 1}, + {0x16b7d, 0x16b8f, 1}, + }, +} + +var _Palmyrene = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10860, 0x1087f, 1}, + }, +} + +var _Pau_Cin_Hau = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11ac0, 0x11af8, 1}, + }, +} + +var _Phags_Pa = &RangeTable{ + R16: []Range16{ + {0xa840, 0xa877, 1}, + }, +} + +var _Phoenician = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10900, 0x1091b, 1}, + {0x1091f, 0x1091f, 1}, + }, +} + +var _Psalter_Pahlavi = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10b80, 0x10b91, 1}, + {0x10b99, 0x10b9c, 1}, + {0x10ba9, 0x10baf, 1}, + }, +} + +var _Rejang = &RangeTable{ + R16: []Range16{ + {0xa930, 0xa953, 1}, + {0xa95f, 0xa95f, 1}, + }, +} + +var _Runic = &RangeTable{ + R16: []Range16{ + {0x16a0, 0x16ea, 1}, + {0x16ee, 0x16f8, 1}, + }, +} + +var _Samaritan = &RangeTable{ + R16: []Range16{ + {0x0800, 0x082d, 1}, + {0x0830, 0x083e, 1}, + }, +} + +var _Saurashtra = &RangeTable{ + R16: []Range16{ + {0xa880, 0xa8c5, 1}, + {0xa8ce, 0xa8d9, 1}, + }, +} + +var _Sharada = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11180, 0x111df, 1}, + }, +} + +var _Shavian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10450, 0x1047f, 1}, + }, +} + +var _Siddham = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11580, 0x115b5, 1}, + {0x115b8, 0x115dd, 1}, + }, +} + +var _SignWriting = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x1d800, 0x1da8b, 1}, + {0x1da9b, 0x1da9f, 1}, + {0x1daa1, 0x1daaf, 1}, + }, +} + +var _Sinhala = &RangeTable{ + R16: []Range16{ + {0x0d81, 0x0d83, 1}, + {0x0d85, 0x0d96, 1}, + {0x0d9a, 0x0db1, 1}, + {0x0db3, 0x0dbb, 1}, + {0x0dbd, 0x0dc0, 3}, + {0x0dc1, 0x0dc6, 1}, + {0x0dca, 0x0dcf, 5}, + {0x0dd0, 0x0dd4, 1}, + {0x0dd6, 0x0dd8, 2}, + {0x0dd9, 0x0ddf, 1}, + {0x0de6, 0x0def, 1}, + {0x0df2, 0x0df4, 1}, + }, + R32: []Range32{ + {0x111e1, 0x111f4, 1}, + }, +} + +var _Sogdian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10f30, 0x10f59, 1}, + }, +} + +var _Sora_Sompeng = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x110d0, 0x110e8, 1}, + {0x110f0, 0x110f9, 1}, + }, +} + +var _Soyombo = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11a50, 0x11aa2, 1}, + }, +} + +var _Sundanese = &RangeTable{ + R16: []Range16{ + {0x1b80, 0x1bbf, 1}, + {0x1cc0, 0x1cc7, 1}, + }, +} + +var _Syloti_Nagri = &RangeTable{ + R16: []Range16{ + {0xa800, 0xa82c, 1}, + }, +} + +var _Syriac = &RangeTable{ + R16: []Range16{ + {0x0700, 0x070d, 1}, + {0x070f, 0x074a, 1}, + {0x074d, 0x074f, 1}, + {0x0860, 0x086a, 1}, + }, +} + +var _Tagalog = &RangeTable{ + R16: []Range16{ + {0x1700, 0x170c, 1}, + {0x170e, 0x1714, 1}, + }, +} + +var _Tagbanwa = &RangeTable{ + R16: []Range16{ + {0x1760, 0x176c, 1}, + {0x176e, 0x1770, 1}, + {0x1772, 0x1773, 1}, + }, +} + +var _Tai_Le = &RangeTable{ + R16: []Range16{ + {0x1950, 0x196d, 1}, + {0x1970, 0x1974, 1}, + }, +} + +var _Tai_Tham = &RangeTable{ + R16: []Range16{ + {0x1a20, 0x1a5e, 1}, + {0x1a60, 0x1a7c, 1}, + {0x1a7f, 0x1a89, 1}, + {0x1a90, 0x1a99, 1}, + {0x1aa0, 0x1aad, 1}, + }, +} + +var _Tai_Viet = &RangeTable{ + R16: []Range16{ + {0xaa80, 0xaac2, 1}, + {0xaadb, 0xaadf, 1}, + }, +} + +var _Takri = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11680, 0x116b8, 1}, + {0x116c0, 0x116c9, 1}, + }, +} + +var _Tamil = &RangeTable{ + R16: []Range16{ + {0x0b82, 0x0b83, 1}, + {0x0b85, 0x0b8a, 1}, + {0x0b8e, 0x0b90, 1}, + {0x0b92, 0x0b95, 1}, + {0x0b99, 0x0b9a, 1}, + {0x0b9c, 0x0b9e, 2}, + {0x0b9f, 0x0ba3, 4}, + {0x0ba4, 0x0ba8, 4}, + {0x0ba9, 0x0baa, 1}, + {0x0bae, 0x0bb9, 1}, + {0x0bbe, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcd, 1}, + {0x0bd0, 0x0bd7, 7}, + {0x0be6, 0x0bfa, 1}, + }, + R32: []Range32{ + {0x11fc0, 0x11ff1, 1}, + {0x11fff, 0x11fff, 1}, + }, +} + +var _Tangut = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x16fe0, 0x17000, 32}, + {0x17001, 0x187f7, 1}, + {0x18800, 0x18aff, 1}, + {0x18d00, 0x18d08, 1}, + }, +} + +var _Telugu = &RangeTable{ + R16: []Range16{ + {0x0c00, 0x0c0c, 1}, + {0x0c0e, 0x0c10, 1}, + {0x0c12, 0x0c28, 1}, + {0x0c2a, 0x0c39, 1}, + {0x0c3d, 0x0c44, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4d, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c58, 0x0c5a, 1}, + {0x0c60, 0x0c63, 1}, + {0x0c66, 0x0c6f, 1}, + {0x0c77, 0x0c7f, 1}, + }, +} + +var _Thaana = &RangeTable{ + R16: []Range16{ + {0x0780, 0x07b1, 1}, + }, +} + +var _Thai = &RangeTable{ + R16: []Range16{ + {0x0e01, 0x0e3a, 1}, + {0x0e40, 0x0e5b, 1}, + }, +} + +var _Tibetan = &RangeTable{ + R16: []Range16{ + {0x0f00, 0x0f47, 1}, + {0x0f49, 0x0f6c, 1}, + {0x0f71, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x0fbe, 0x0fcc, 1}, + {0x0fce, 0x0fd4, 1}, + {0x0fd9, 0x0fda, 1}, + }, +} + +var _Tifinagh = &RangeTable{ + R16: []Range16{ + {0x2d30, 0x2d67, 1}, + {0x2d6f, 0x2d70, 1}, + {0x2d7f, 0x2d7f, 1}, + }, +} + +var _Tirhuta = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11480, 0x114c7, 1}, + {0x114d0, 0x114d9, 1}, + }, +} + +var _Ugaritic = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10380, 0x1039d, 1}, + {0x1039f, 0x1039f, 1}, + }, +} + +var _Vai = &RangeTable{ + R16: []Range16{ + {0xa500, 0xa62b, 1}, + }, +} + +var _Wancho = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x1e2c0, 0x1e2f9, 1}, + {0x1e2ff, 0x1e2ff, 1}, + }, +} + +var _Warang_Citi = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x118a0, 0x118f2, 1}, + {0x118ff, 0x118ff, 1}, + }, +} + +var _Yezidi = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10e80, 0x10ea9, 1}, + {0x10eab, 0x10ead, 1}, + {0x10eb0, 0x10eb1, 1}, + }, +} + +var _Yi = &RangeTable{ + R16: []Range16{ + {0xa000, 0xa48c, 1}, + {0xa490, 0xa4c6, 1}, + }, +} + +var _Zanabazar_Square = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11a00, 0x11a47, 1}, + }, +} + +// These variables have type *RangeTable. +var ( + Adlam = _Adlam // Adlam is the set of Unicode characters in script Adlam. + Ahom = _Ahom // Ahom is the set of Unicode characters in script Ahom. + Anatolian_Hieroglyphs = _Anatolian_Hieroglyphs // Anatolian_Hieroglyphs is the set of Unicode characters in script Anatolian_Hieroglyphs. + Arabic = _Arabic // Arabic is the set of Unicode characters in script Arabic. + Armenian = _Armenian // Armenian is the set of Unicode characters in script Armenian. + Avestan = _Avestan // Avestan is the set of Unicode characters in script Avestan. + Balinese = _Balinese // Balinese is the set of Unicode characters in script Balinese. + Bamum = _Bamum // Bamum is the set of Unicode characters in script Bamum. + Bassa_Vah = _Bassa_Vah // Bassa_Vah is the set of Unicode characters in script Bassa_Vah. + Batak = _Batak // Batak is the set of Unicode characters in script Batak. + Bengali = _Bengali // Bengali is the set of Unicode characters in script Bengali. + Bhaiksuki = _Bhaiksuki // Bhaiksuki is the set of Unicode characters in script Bhaiksuki. + Bopomofo = _Bopomofo // Bopomofo is the set of Unicode characters in script Bopomofo. + Brahmi = _Brahmi // Brahmi is the set of Unicode characters in script Brahmi. + Braille = _Braille // Braille is the set of Unicode characters in script Braille. + Buginese = _Buginese // Buginese is the set of Unicode characters in script Buginese. + Buhid = _Buhid // Buhid is the set of Unicode characters in script Buhid. + Canadian_Aboriginal = _Canadian_Aboriginal // Canadian_Aboriginal is the set of Unicode characters in script Canadian_Aboriginal. + Carian = _Carian // Carian is the set of Unicode characters in script Carian. + Caucasian_Albanian = _Caucasian_Albanian // Caucasian_Albanian is the set of Unicode characters in script Caucasian_Albanian. + Chakma = _Chakma // Chakma is the set of Unicode characters in script Chakma. + Cham = _Cham // Cham is the set of Unicode characters in script Cham. + Cherokee = _Cherokee // Cherokee is the set of Unicode characters in script Cherokee. + Chorasmian = _Chorasmian // Chorasmian is the set of Unicode characters in script Chorasmian. + Common = _Common // Common is the set of Unicode characters in script Common. + Coptic = _Coptic // Coptic is the set of Unicode characters in script Coptic. + Cuneiform = _Cuneiform // Cuneiform is the set of Unicode characters in script Cuneiform. + Cypriot = _Cypriot // Cypriot is the set of Unicode characters in script Cypriot. + Cyrillic = _Cyrillic // Cyrillic is the set of Unicode characters in script Cyrillic. + Deseret = _Deseret // Deseret is the set of Unicode characters in script Deseret. + Devanagari = _Devanagari // Devanagari is the set of Unicode characters in script Devanagari. + Dives_Akuru = _Dives_Akuru // Dives_Akuru is the set of Unicode characters in script Dives_Akuru. + Dogra = _Dogra // Dogra is the set of Unicode characters in script Dogra. + Duployan = _Duployan // Duployan is the set of Unicode characters in script Duployan. + Egyptian_Hieroglyphs = _Egyptian_Hieroglyphs // Egyptian_Hieroglyphs is the set of Unicode characters in script Egyptian_Hieroglyphs. + Elbasan = _Elbasan // Elbasan is the set of Unicode characters in script Elbasan. + Elymaic = _Elymaic // Elymaic is the set of Unicode characters in script Elymaic. + Ethiopic = _Ethiopic // Ethiopic is the set of Unicode characters in script Ethiopic. + Georgian = _Georgian // Georgian is the set of Unicode characters in script Georgian. + Glagolitic = _Glagolitic // Glagolitic is the set of Unicode characters in script Glagolitic. + Gothic = _Gothic // Gothic is the set of Unicode characters in script Gothic. + Grantha = _Grantha // Grantha is the set of Unicode characters in script Grantha. + Greek = _Greek // Greek is the set of Unicode characters in script Greek. + Gujarati = _Gujarati // Gujarati is the set of Unicode characters in script Gujarati. + Gunjala_Gondi = _Gunjala_Gondi // Gunjala_Gondi is the set of Unicode characters in script Gunjala_Gondi. + Gurmukhi = _Gurmukhi // Gurmukhi is the set of Unicode characters in script Gurmukhi. + Han = _Han // Han is the set of Unicode characters in script Han. + Hangul = _Hangul // Hangul is the set of Unicode characters in script Hangul. + Hanifi_Rohingya = _Hanifi_Rohingya // Hanifi_Rohingya is the set of Unicode characters in script Hanifi_Rohingya. + Hanunoo = _Hanunoo // Hanunoo is the set of Unicode characters in script Hanunoo. + Hatran = _Hatran // Hatran is the set of Unicode characters in script Hatran. + Hebrew = _Hebrew // Hebrew is the set of Unicode characters in script Hebrew. + Hiragana = _Hiragana // Hiragana is the set of Unicode characters in script Hiragana. + Imperial_Aramaic = _Imperial_Aramaic // Imperial_Aramaic is the set of Unicode characters in script Imperial_Aramaic. + Inherited = _Inherited // Inherited is the set of Unicode characters in script Inherited. + Inscriptional_Pahlavi = _Inscriptional_Pahlavi // Inscriptional_Pahlavi is the set of Unicode characters in script Inscriptional_Pahlavi. + Inscriptional_Parthian = _Inscriptional_Parthian // Inscriptional_Parthian is the set of Unicode characters in script Inscriptional_Parthian. + Javanese = _Javanese // Javanese is the set of Unicode characters in script Javanese. + Kaithi = _Kaithi // Kaithi is the set of Unicode characters in script Kaithi. + Kannada = _Kannada // Kannada is the set of Unicode characters in script Kannada. + Katakana = _Katakana // Katakana is the set of Unicode characters in script Katakana. + Kayah_Li = _Kayah_Li // Kayah_Li is the set of Unicode characters in script Kayah_Li. + Kharoshthi = _Kharoshthi // Kharoshthi is the set of Unicode characters in script Kharoshthi. + Khitan_Small_Script = _Khitan_Small_Script // Khitan_Small_Script is the set of Unicode characters in script Khitan_Small_Script. + Khmer = _Khmer // Khmer is the set of Unicode characters in script Khmer. + Khojki = _Khojki // Khojki is the set of Unicode characters in script Khojki. + Khudawadi = _Khudawadi // Khudawadi is the set of Unicode characters in script Khudawadi. + Lao = _Lao // Lao is the set of Unicode characters in script Lao. + Latin = _Latin // Latin is the set of Unicode characters in script Latin. + Lepcha = _Lepcha // Lepcha is the set of Unicode characters in script Lepcha. + Limbu = _Limbu // Limbu is the set of Unicode characters in script Limbu. + Linear_A = _Linear_A // Linear_A is the set of Unicode characters in script Linear_A. + Linear_B = _Linear_B // Linear_B is the set of Unicode characters in script Linear_B. + Lisu = _Lisu // Lisu is the set of Unicode characters in script Lisu. + Lycian = _Lycian // Lycian is the set of Unicode characters in script Lycian. + Lydian = _Lydian // Lydian is the set of Unicode characters in script Lydian. + Mahajani = _Mahajani // Mahajani is the set of Unicode characters in script Mahajani. + Makasar = _Makasar // Makasar is the set of Unicode characters in script Makasar. + Malayalam = _Malayalam // Malayalam is the set of Unicode characters in script Malayalam. + Mandaic = _Mandaic // Mandaic is the set of Unicode characters in script Mandaic. + Manichaean = _Manichaean // Manichaean is the set of Unicode characters in script Manichaean. + Marchen = _Marchen // Marchen is the set of Unicode characters in script Marchen. + Masaram_Gondi = _Masaram_Gondi // Masaram_Gondi is the set of Unicode characters in script Masaram_Gondi. + Medefaidrin = _Medefaidrin // Medefaidrin is the set of Unicode characters in script Medefaidrin. + Meetei_Mayek = _Meetei_Mayek // Meetei_Mayek is the set of Unicode characters in script Meetei_Mayek. + Mende_Kikakui = _Mende_Kikakui // Mende_Kikakui is the set of Unicode characters in script Mende_Kikakui. + Meroitic_Cursive = _Meroitic_Cursive // Meroitic_Cursive is the set of Unicode characters in script Meroitic_Cursive. + Meroitic_Hieroglyphs = _Meroitic_Hieroglyphs // Meroitic_Hieroglyphs is the set of Unicode characters in script Meroitic_Hieroglyphs. + Miao = _Miao // Miao is the set of Unicode characters in script Miao. + Modi = _Modi // Modi is the set of Unicode characters in script Modi. + Mongolian = _Mongolian // Mongolian is the set of Unicode characters in script Mongolian. + Mro = _Mro // Mro is the set of Unicode characters in script Mro. + Multani = _Multani // Multani is the set of Unicode characters in script Multani. + Myanmar = _Myanmar // Myanmar is the set of Unicode characters in script Myanmar. + Nabataean = _Nabataean // Nabataean is the set of Unicode characters in script Nabataean. + Nandinagari = _Nandinagari // Nandinagari is the set of Unicode characters in script Nandinagari. + New_Tai_Lue = _New_Tai_Lue // New_Tai_Lue is the set of Unicode characters in script New_Tai_Lue. + Newa = _Newa // Newa is the set of Unicode characters in script Newa. + Nko = _Nko // Nko is the set of Unicode characters in script Nko. + Nushu = _Nushu // Nushu is the set of Unicode characters in script Nushu. + Nyiakeng_Puachue_Hmong = _Nyiakeng_Puachue_Hmong // Nyiakeng_Puachue_Hmong is the set of Unicode characters in script Nyiakeng_Puachue_Hmong. + Ogham = _Ogham // Ogham is the set of Unicode characters in script Ogham. + Ol_Chiki = _Ol_Chiki // Ol_Chiki is the set of Unicode characters in script Ol_Chiki. + Old_Hungarian = _Old_Hungarian // Old_Hungarian is the set of Unicode characters in script Old_Hungarian. + Old_Italic = _Old_Italic // Old_Italic is the set of Unicode characters in script Old_Italic. + Old_North_Arabian = _Old_North_Arabian // Old_North_Arabian is the set of Unicode characters in script Old_North_Arabian. + Old_Permic = _Old_Permic // Old_Permic is the set of Unicode characters in script Old_Permic. + Old_Persian = _Old_Persian // Old_Persian is the set of Unicode characters in script Old_Persian. + Old_Sogdian = _Old_Sogdian // Old_Sogdian is the set of Unicode characters in script Old_Sogdian. + Old_South_Arabian = _Old_South_Arabian // Old_South_Arabian is the set of Unicode characters in script Old_South_Arabian. + Old_Turkic = _Old_Turkic // Old_Turkic is the set of Unicode characters in script Old_Turkic. + Oriya = _Oriya // Oriya is the set of Unicode characters in script Oriya. + Osage = _Osage // Osage is the set of Unicode characters in script Osage. + Osmanya = _Osmanya // Osmanya is the set of Unicode characters in script Osmanya. + Pahawh_Hmong = _Pahawh_Hmong // Pahawh_Hmong is the set of Unicode characters in script Pahawh_Hmong. + Palmyrene = _Palmyrene // Palmyrene is the set of Unicode characters in script Palmyrene. + Pau_Cin_Hau = _Pau_Cin_Hau // Pau_Cin_Hau is the set of Unicode characters in script Pau_Cin_Hau. + Phags_Pa = _Phags_Pa // Phags_Pa is the set of Unicode characters in script Phags_Pa. + Phoenician = _Phoenician // Phoenician is the set of Unicode characters in script Phoenician. + Psalter_Pahlavi = _Psalter_Pahlavi // Psalter_Pahlavi is the set of Unicode characters in script Psalter_Pahlavi. + Rejang = _Rejang // Rejang is the set of Unicode characters in script Rejang. + Runic = _Runic // Runic is the set of Unicode characters in script Runic. + Samaritan = _Samaritan // Samaritan is the set of Unicode characters in script Samaritan. + Saurashtra = _Saurashtra // Saurashtra is the set of Unicode characters in script Saurashtra. + Sharada = _Sharada // Sharada is the set of Unicode characters in script Sharada. + Shavian = _Shavian // Shavian is the set of Unicode characters in script Shavian. + Siddham = _Siddham // Siddham is the set of Unicode characters in script Siddham. + SignWriting = _SignWriting // SignWriting is the set of Unicode characters in script SignWriting. + Sinhala = _Sinhala // Sinhala is the set of Unicode characters in script Sinhala. + Sogdian = _Sogdian // Sogdian is the set of Unicode characters in script Sogdian. + Sora_Sompeng = _Sora_Sompeng // Sora_Sompeng is the set of Unicode characters in script Sora_Sompeng. + Soyombo = _Soyombo // Soyombo is the set of Unicode characters in script Soyombo. + Sundanese = _Sundanese // Sundanese is the set of Unicode characters in script Sundanese. + Syloti_Nagri = _Syloti_Nagri // Syloti_Nagri is the set of Unicode characters in script Syloti_Nagri. + Syriac = _Syriac // Syriac is the set of Unicode characters in script Syriac. + Tagalog = _Tagalog // Tagalog is the set of Unicode characters in script Tagalog. + Tagbanwa = _Tagbanwa // Tagbanwa is the set of Unicode characters in script Tagbanwa. + Tai_Le = _Tai_Le // Tai_Le is the set of Unicode characters in script Tai_Le. + Tai_Tham = _Tai_Tham // Tai_Tham is the set of Unicode characters in script Tai_Tham. + Tai_Viet = _Tai_Viet // Tai_Viet is the set of Unicode characters in script Tai_Viet. + Takri = _Takri // Takri is the set of Unicode characters in script Takri. + Tamil = _Tamil // Tamil is the set of Unicode characters in script Tamil. + Tangut = _Tangut // Tangut is the set of Unicode characters in script Tangut. + Telugu = _Telugu // Telugu is the set of Unicode characters in script Telugu. + Thaana = _Thaana // Thaana is the set of Unicode characters in script Thaana. + Thai = _Thai // Thai is the set of Unicode characters in script Thai. + Tibetan = _Tibetan // Tibetan is the set of Unicode characters in script Tibetan. + Tifinagh = _Tifinagh // Tifinagh is the set of Unicode characters in script Tifinagh. + Tirhuta = _Tirhuta // Tirhuta is the set of Unicode characters in script Tirhuta. + Ugaritic = _Ugaritic // Ugaritic is the set of Unicode characters in script Ugaritic. + Vai = _Vai // Vai is the set of Unicode characters in script Vai. + Wancho = _Wancho // Wancho is the set of Unicode characters in script Wancho. + Warang_Citi = _Warang_Citi // Warang_Citi is the set of Unicode characters in script Warang_Citi. + Yezidi = _Yezidi // Yezidi is the set of Unicode characters in script Yezidi. + Yi = _Yi // Yi is the set of Unicode characters in script Yi. + Zanabazar_Square = _Zanabazar_Square // Zanabazar_Square is the set of Unicode characters in script Zanabazar_Square. +) + +// Properties is the set of Unicode property tables. +var Properties = map[string]*RangeTable{ + "ASCII_Hex_Digit": ASCII_Hex_Digit, + "Bidi_Control": Bidi_Control, + "Dash": Dash, + "Deprecated": Deprecated, + "Diacritic": Diacritic, + "Extender": Extender, + "Hex_Digit": Hex_Digit, + "Hyphen": Hyphen, + "IDS_Binary_Operator": IDS_Binary_Operator, + "IDS_Trinary_Operator": IDS_Trinary_Operator, + "Ideographic": Ideographic, + "Join_Control": Join_Control, + "Logical_Order_Exception": Logical_Order_Exception, + "Noncharacter_Code_Point": Noncharacter_Code_Point, + "Other_Alphabetic": Other_Alphabetic, + "Other_Default_Ignorable_Code_Point": Other_Default_Ignorable_Code_Point, + "Other_Grapheme_Extend": Other_Grapheme_Extend, + "Other_ID_Continue": Other_ID_Continue, + "Other_ID_Start": Other_ID_Start, + "Other_Lowercase": Other_Lowercase, + "Other_Math": Other_Math, + "Other_Uppercase": Other_Uppercase, + "Pattern_Syntax": Pattern_Syntax, + "Pattern_White_Space": Pattern_White_Space, + "Prepended_Concatenation_Mark": Prepended_Concatenation_Mark, + "Quotation_Mark": Quotation_Mark, + "Radical": Radical, + "Regional_Indicator": Regional_Indicator, + "Sentence_Terminal": Sentence_Terminal, + "STerm": Sentence_Terminal, + "Soft_Dotted": Soft_Dotted, + "Terminal_Punctuation": Terminal_Punctuation, + "Unified_Ideograph": Unified_Ideograph, + "Variation_Selector": Variation_Selector, + "White_Space": White_Space, +} + +var _ASCII_Hex_Digit = &RangeTable{ + R16: []Range16{ + {0x0030, 0x0039, 1}, + {0x0041, 0x0046, 1}, + {0x0061, 0x0066, 1}, + }, + LatinOffset: 3, +} + +var _Bidi_Control = &RangeTable{ + R16: []Range16{ + {0x061c, 0x200e, 6642}, + {0x200f, 0x202a, 27}, + {0x202b, 0x202e, 1}, + {0x2066, 0x2069, 1}, + }, +} + +var _Dash = &RangeTable{ + R16: []Range16{ + {0x002d, 0x058a, 1373}, + {0x05be, 0x1400, 3650}, + {0x1806, 0x2010, 2058}, + {0x2011, 0x2015, 1}, + {0x2053, 0x207b, 40}, + {0x208b, 0x2212, 391}, + {0x2e17, 0x2e1a, 3}, + {0x2e3a, 0x2e3b, 1}, + {0x2e40, 0x301c, 476}, + {0x3030, 0x30a0, 112}, + {0xfe31, 0xfe32, 1}, + {0xfe58, 0xfe63, 11}, + {0xff0d, 0xff0d, 1}, + }, + R32: []Range32{ + {0x10ead, 0x10ead, 1}, + }, +} + +var _Deprecated = &RangeTable{ + R16: []Range16{ + {0x0149, 0x0673, 1322}, + {0x0f77, 0x0f79, 2}, + {0x17a3, 0x17a4, 1}, + {0x206a, 0x206f, 1}, + {0x2329, 0x232a, 1}, + }, + R32: []Range32{ + {0xe0001, 0xe0001, 1}, + }, +} + +var _Diacritic = &RangeTable{ + R16: []Range16{ + {0x005e, 0x0060, 2}, + {0x00a8, 0x00af, 7}, + {0x00b4, 0x00b7, 3}, + {0x00b8, 0x02b0, 504}, + {0x02b1, 0x034e, 1}, + {0x0350, 0x0357, 1}, + {0x035d, 0x0362, 1}, + {0x0374, 0x0375, 1}, + {0x037a, 0x0384, 10}, + {0x0385, 0x0483, 254}, + {0x0484, 0x0487, 1}, + {0x0559, 0x0591, 56}, + {0x0592, 0x05a1, 1}, + {0x05a3, 0x05bd, 1}, + {0x05bf, 0x05c1, 2}, + {0x05c2, 0x05c4, 2}, + {0x064b, 0x0652, 1}, + {0x0657, 0x0658, 1}, + {0x06df, 0x06e0, 1}, + {0x06e5, 0x06e6, 1}, + {0x06ea, 0x06ec, 1}, + {0x0730, 0x074a, 1}, + {0x07a6, 0x07b0, 1}, + {0x07eb, 0x07f5, 1}, + {0x0818, 0x0819, 1}, + {0x08e3, 0x08fe, 1}, + {0x093c, 0x094d, 17}, + {0x0951, 0x0954, 1}, + {0x0971, 0x09bc, 75}, + {0x09cd, 0x0a3c, 111}, + {0x0a4d, 0x0abc, 111}, + {0x0acd, 0x0afd, 48}, + {0x0afe, 0x0aff, 1}, + {0x0b3c, 0x0b4d, 17}, + {0x0b55, 0x0bcd, 120}, + {0x0c4d, 0x0cbc, 111}, + {0x0ccd, 0x0d3b, 110}, + {0x0d3c, 0x0d4d, 17}, + {0x0dca, 0x0e47, 125}, + {0x0e48, 0x0e4c, 1}, + {0x0e4e, 0x0eba, 108}, + {0x0ec8, 0x0ecc, 1}, + {0x0f18, 0x0f19, 1}, + {0x0f35, 0x0f39, 2}, + {0x0f3e, 0x0f3f, 1}, + {0x0f82, 0x0f84, 1}, + {0x0f86, 0x0f87, 1}, + {0x0fc6, 0x1037, 113}, + {0x1039, 0x103a, 1}, + {0x1063, 0x1064, 1}, + {0x1069, 0x106d, 1}, + {0x1087, 0x108d, 1}, + {0x108f, 0x109a, 11}, + {0x109b, 0x135d, 706}, + {0x135e, 0x135f, 1}, + {0x17c9, 0x17d3, 1}, + {0x17dd, 0x1939, 348}, + {0x193a, 0x193b, 1}, + {0x1a75, 0x1a7c, 1}, + {0x1a7f, 0x1ab0, 49}, + {0x1ab1, 0x1abd, 1}, + {0x1b34, 0x1b44, 16}, + {0x1b6b, 0x1b73, 1}, + {0x1baa, 0x1bab, 1}, + {0x1c36, 0x1c37, 1}, + {0x1c78, 0x1c7d, 1}, + {0x1cd0, 0x1ce8, 1}, + {0x1ced, 0x1cf4, 7}, + {0x1cf7, 0x1cf9, 1}, + {0x1d2c, 0x1d6a, 1}, + {0x1dc4, 0x1dcf, 1}, + {0x1df5, 0x1df9, 1}, + {0x1dfd, 0x1dff, 1}, + {0x1fbd, 0x1fbf, 2}, + {0x1fc0, 0x1fc1, 1}, + {0x1fcd, 0x1fcf, 1}, + {0x1fdd, 0x1fdf, 1}, + {0x1fed, 0x1fef, 1}, + {0x1ffd, 0x1ffe, 1}, + {0x2cef, 0x2cf1, 1}, + {0x2e2f, 0x302a, 507}, + {0x302b, 0x302f, 1}, + {0x3099, 0x309c, 1}, + {0x30fc, 0xa66f, 30067}, + {0xa67c, 0xa67d, 1}, + {0xa67f, 0xa69c, 29}, + {0xa69d, 0xa6f0, 83}, + {0xa6f1, 0xa700, 15}, + {0xa701, 0xa721, 1}, + {0xa788, 0xa78a, 1}, + {0xa7f8, 0xa7f9, 1}, + {0xa8c4, 0xa8e0, 28}, + {0xa8e1, 0xa8f1, 1}, + {0xa92b, 0xa92e, 1}, + {0xa953, 0xa9b3, 96}, + {0xa9c0, 0xa9e5, 37}, + {0xaa7b, 0xaa7d, 1}, + {0xaabf, 0xaac2, 1}, + {0xaaf6, 0xab5b, 101}, + {0xab5c, 0xab5f, 1}, + {0xab69, 0xab6b, 1}, + {0xabec, 0xabed, 1}, + {0xfb1e, 0xfe20, 770}, + {0xfe21, 0xfe2f, 1}, + {0xff3e, 0xff40, 2}, + {0xff70, 0xff9e, 46}, + {0xff9f, 0xffe3, 68}, + }, + R32: []Range32{ + {0x102e0, 0x10ae5, 2053}, + {0x10ae6, 0x10d22, 572}, + {0x10d23, 0x10d27, 1}, + {0x10f46, 0x10f50, 1}, + {0x110b9, 0x110ba, 1}, + {0x11133, 0x11134, 1}, + {0x11173, 0x111c0, 77}, + {0x111ca, 0x111cc, 1}, + {0x11235, 0x11236, 1}, + {0x112e9, 0x112ea, 1}, + {0x1133c, 0x1134d, 17}, + {0x11366, 0x1136c, 1}, + {0x11370, 0x11374, 1}, + {0x11442, 0x11446, 4}, + {0x114c2, 0x114c3, 1}, + {0x115bf, 0x115c0, 1}, + {0x1163f, 0x116b6, 119}, + {0x116b7, 0x1172b, 116}, + {0x11839, 0x1183a, 1}, + {0x1193d, 0x1193e, 1}, + {0x11943, 0x119e0, 157}, + {0x11a34, 0x11a47, 19}, + {0x11a99, 0x11c3f, 422}, + {0x11d42, 0x11d44, 2}, + {0x11d45, 0x11d97, 82}, + {0x16af0, 0x16af4, 1}, + {0x16b30, 0x16b36, 1}, + {0x16f8f, 0x16f9f, 1}, + {0x16ff0, 0x16ff1, 1}, + {0x1d167, 0x1d169, 1}, + {0x1d16d, 0x1d172, 1}, + {0x1d17b, 0x1d182, 1}, + {0x1d185, 0x1d18b, 1}, + {0x1d1aa, 0x1d1ad, 1}, + {0x1e130, 0x1e136, 1}, + {0x1e2ec, 0x1e2ef, 1}, + {0x1e8d0, 0x1e8d6, 1}, + {0x1e944, 0x1e946, 1}, + {0x1e948, 0x1e94a, 1}, + }, + LatinOffset: 3, +} + +var _Extender = &RangeTable{ + R16: []Range16{ + {0x00b7, 0x02d0, 537}, + {0x02d1, 0x0640, 879}, + {0x07fa, 0x0b55, 859}, + {0x0e46, 0x0ec6, 128}, + {0x180a, 0x1843, 57}, + {0x1aa7, 0x1c36, 399}, + {0x1c7b, 0x3005, 5002}, + {0x3031, 0x3035, 1}, + {0x309d, 0x309e, 1}, + {0x30fc, 0x30fe, 1}, + {0xa015, 0xa60c, 1527}, + {0xa9cf, 0xa9e6, 23}, + {0xaa70, 0xaadd, 109}, + {0xaaf3, 0xaaf4, 1}, + {0xff70, 0xff70, 1}, + }, + R32: []Range32{ + {0x1135d, 0x115c6, 617}, + {0x115c7, 0x115c8, 1}, + {0x11a98, 0x16b42, 20650}, + {0x16b43, 0x16fe0, 1181}, + {0x16fe1, 0x16fe3, 2}, + {0x1e13c, 0x1e13d, 1}, + {0x1e944, 0x1e946, 1}, + }, +} + +var _Hex_Digit = &RangeTable{ + R16: []Range16{ + {0x0030, 0x0039, 1}, + {0x0041, 0x0046, 1}, + {0x0061, 0x0066, 1}, + {0xff10, 0xff19, 1}, + {0xff21, 0xff26, 1}, + {0xff41, 0xff46, 1}, + }, + LatinOffset: 3, +} + +var _Hyphen = &RangeTable{ + R16: []Range16{ + {0x002d, 0x00ad, 128}, + {0x058a, 0x1806, 4732}, + {0x2010, 0x2011, 1}, + {0x2e17, 0x30fb, 740}, + {0xfe63, 0xff0d, 170}, + {0xff65, 0xff65, 1}, + }, + LatinOffset: 1, +} + +var _IDS_Binary_Operator = &RangeTable{ + R16: []Range16{ + {0x2ff0, 0x2ff1, 1}, + {0x2ff4, 0x2ffb, 1}, + }, +} + +var _IDS_Trinary_Operator = &RangeTable{ + R16: []Range16{ + {0x2ff2, 0x2ff3, 1}, + }, +} + +var _Ideographic = &RangeTable{ + R16: []Range16{ + {0x3006, 0x3007, 1}, + {0x3021, 0x3029, 1}, + {0x3038, 0x303a, 1}, + {0x3400, 0x4dbf, 1}, + {0x4e00, 0x9ffc, 1}, + {0xf900, 0xfa6d, 1}, + {0xfa70, 0xfad9, 1}, + }, + R32: []Range32{ + {0x16fe4, 0x17000, 28}, + {0x17001, 0x187f7, 1}, + {0x18800, 0x18cd5, 1}, + {0x18d00, 0x18d08, 1}, + {0x1b170, 0x1b2fb, 1}, + {0x20000, 0x2a6dd, 1}, + {0x2a700, 0x2b734, 1}, + {0x2b740, 0x2b81d, 1}, + {0x2b820, 0x2cea1, 1}, + {0x2ceb0, 0x2ebe0, 1}, + {0x2f800, 0x2fa1d, 1}, + {0x30000, 0x3134a, 1}, + }, +} + +var _Join_Control = &RangeTable{ + R16: []Range16{ + {0x200c, 0x200d, 1}, + }, +} + +var _Logical_Order_Exception = &RangeTable{ + R16: []Range16{ + {0x0e40, 0x0e44, 1}, + {0x0ec0, 0x0ec4, 1}, + {0x19b5, 0x19b7, 1}, + {0x19ba, 0xaab5, 37115}, + {0xaab6, 0xaab9, 3}, + {0xaabb, 0xaabc, 1}, + }, +} + +var _Noncharacter_Code_Point = &RangeTable{ + R16: []Range16{ + {0xfdd0, 0xfdef, 1}, + {0xfffe, 0xffff, 1}, + }, + R32: []Range32{ + {0x1fffe, 0x1ffff, 1}, + {0x2fffe, 0x2ffff, 1}, + {0x3fffe, 0x3ffff, 1}, + {0x4fffe, 0x4ffff, 1}, + {0x5fffe, 0x5ffff, 1}, + {0x6fffe, 0x6ffff, 1}, + {0x7fffe, 0x7ffff, 1}, + {0x8fffe, 0x8ffff, 1}, + {0x9fffe, 0x9ffff, 1}, + {0xafffe, 0xaffff, 1}, + {0xbfffe, 0xbffff, 1}, + {0xcfffe, 0xcffff, 1}, + {0xdfffe, 0xdffff, 1}, + {0xefffe, 0xeffff, 1}, + {0xffffe, 0xfffff, 1}, + {0x10fffe, 0x10ffff, 1}, + }, +} + +var _Other_Alphabetic = &RangeTable{ + R16: []Range16{ + {0x0345, 0x05b0, 619}, + {0x05b1, 0x05bd, 1}, + {0x05bf, 0x05c1, 2}, + {0x05c2, 0x05c4, 2}, + {0x05c5, 0x05c7, 2}, + {0x0610, 0x061a, 1}, + {0x064b, 0x0657, 1}, + {0x0659, 0x065f, 1}, + {0x0670, 0x06d6, 102}, + {0x06d7, 0x06dc, 1}, + {0x06e1, 0x06e4, 1}, + {0x06e7, 0x06e8, 1}, + {0x06ed, 0x0711, 36}, + {0x0730, 0x073f, 1}, + {0x07a6, 0x07b0, 1}, + {0x0816, 0x0817, 1}, + {0x081b, 0x0823, 1}, + {0x0825, 0x0827, 1}, + {0x0829, 0x082c, 1}, + {0x08d4, 0x08df, 1}, + {0x08e3, 0x08e9, 1}, + {0x08f0, 0x0903, 1}, + {0x093a, 0x093b, 1}, + {0x093e, 0x094c, 1}, + {0x094e, 0x094f, 1}, + {0x0955, 0x0957, 1}, + {0x0962, 0x0963, 1}, + {0x0981, 0x0983, 1}, + {0x09be, 0x09c4, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09cc, 1}, + {0x09d7, 0x09e2, 11}, + {0x09e3, 0x0a01, 30}, + {0x0a02, 0x0a03, 1}, + {0x0a3e, 0x0a42, 1}, + {0x0a47, 0x0a48, 1}, + {0x0a4b, 0x0a4c, 1}, + {0x0a51, 0x0a70, 31}, + {0x0a71, 0x0a75, 4}, + {0x0a81, 0x0a83, 1}, + {0x0abe, 0x0ac5, 1}, + {0x0ac7, 0x0ac9, 1}, + {0x0acb, 0x0acc, 1}, + {0x0ae2, 0x0ae3, 1}, + {0x0afa, 0x0afc, 1}, + {0x0b01, 0x0b03, 1}, + {0x0b3e, 0x0b44, 1}, + {0x0b47, 0x0b48, 1}, + {0x0b4b, 0x0b4c, 1}, + {0x0b56, 0x0b57, 1}, + {0x0b62, 0x0b63, 1}, + {0x0b82, 0x0bbe, 60}, + {0x0bbf, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcc, 1}, + {0x0bd7, 0x0c00, 41}, + {0x0c01, 0x0c03, 1}, + {0x0c3e, 0x0c44, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4c, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c62, 0x0c63, 1}, + {0x0c81, 0x0c83, 1}, + {0x0cbe, 0x0cc4, 1}, + {0x0cc6, 0x0cc8, 1}, + {0x0cca, 0x0ccc, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0ce2, 0x0ce3, 1}, + {0x0d00, 0x0d03, 1}, + {0x0d3e, 0x0d44, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4c, 1}, + {0x0d57, 0x0d62, 11}, + {0x0d63, 0x0d81, 30}, + {0x0d82, 0x0d83, 1}, + {0x0dcf, 0x0dd4, 1}, + {0x0dd6, 0x0dd8, 2}, + {0x0dd9, 0x0ddf, 1}, + {0x0df2, 0x0df3, 1}, + {0x0e31, 0x0e34, 3}, + {0x0e35, 0x0e3a, 1}, + {0x0e4d, 0x0eb1, 100}, + {0x0eb4, 0x0eb9, 1}, + {0x0ebb, 0x0ebc, 1}, + {0x0ecd, 0x0f71, 164}, + {0x0f72, 0x0f81, 1}, + {0x0f8d, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x102b, 0x1036, 1}, + {0x1038, 0x103b, 3}, + {0x103c, 0x103e, 1}, + {0x1056, 0x1059, 1}, + {0x105e, 0x1060, 1}, + {0x1062, 0x1064, 1}, + {0x1067, 0x106d, 1}, + {0x1071, 0x1074, 1}, + {0x1082, 0x108d, 1}, + {0x108f, 0x109a, 11}, + {0x109b, 0x109d, 1}, + {0x1712, 0x1713, 1}, + {0x1732, 0x1733, 1}, + {0x1752, 0x1753, 1}, + {0x1772, 0x1773, 1}, + {0x17b6, 0x17c8, 1}, + {0x1885, 0x1886, 1}, + {0x18a9, 0x1920, 119}, + {0x1921, 0x192b, 1}, + {0x1930, 0x1938, 1}, + {0x1a17, 0x1a1b, 1}, + {0x1a55, 0x1a5e, 1}, + {0x1a61, 0x1a74, 1}, + {0x1abf, 0x1ac0, 1}, + {0x1b00, 0x1b04, 1}, + {0x1b35, 0x1b43, 1}, + {0x1b80, 0x1b82, 1}, + {0x1ba1, 0x1ba9, 1}, + {0x1bac, 0x1bad, 1}, + {0x1be7, 0x1bf1, 1}, + {0x1c24, 0x1c36, 1}, + {0x1de7, 0x1df4, 1}, + {0x24b6, 0x24e9, 1}, + {0x2de0, 0x2dff, 1}, + {0xa674, 0xa67b, 1}, + {0xa69e, 0xa69f, 1}, + {0xa802, 0xa80b, 9}, + {0xa823, 0xa827, 1}, + {0xa880, 0xa881, 1}, + {0xa8b4, 0xa8c3, 1}, + {0xa8c5, 0xa8ff, 58}, + {0xa926, 0xa92a, 1}, + {0xa947, 0xa952, 1}, + {0xa980, 0xa983, 1}, + {0xa9b4, 0xa9bf, 1}, + {0xa9e5, 0xaa29, 68}, + {0xaa2a, 0xaa36, 1}, + {0xaa43, 0xaa4c, 9}, + {0xaa4d, 0xaa7b, 46}, + {0xaa7c, 0xaa7d, 1}, + {0xaab0, 0xaab2, 2}, + {0xaab3, 0xaab4, 1}, + {0xaab7, 0xaab8, 1}, + {0xaabe, 0xaaeb, 45}, + {0xaaec, 0xaaef, 1}, + {0xaaf5, 0xabe3, 238}, + {0xabe4, 0xabea, 1}, + {0xfb1e, 0xfb1e, 1}, + }, + R32: []Range32{ + {0x10376, 0x1037a, 1}, + {0x10a01, 0x10a03, 1}, + {0x10a05, 0x10a06, 1}, + {0x10a0c, 0x10a0f, 1}, + {0x10d24, 0x10d27, 1}, + {0x10eab, 0x10eac, 1}, + {0x11000, 0x11002, 1}, + {0x11038, 0x11045, 1}, + {0x11082, 0x110b0, 46}, + {0x110b1, 0x110b8, 1}, + {0x11100, 0x11102, 1}, + {0x11127, 0x11132, 1}, + {0x11145, 0x11146, 1}, + {0x11180, 0x11182, 1}, + {0x111b3, 0x111bf, 1}, + {0x111ce, 0x111cf, 1}, + {0x1122c, 0x11234, 1}, + {0x11237, 0x1123e, 7}, + {0x112df, 0x112e8, 1}, + {0x11300, 0x11303, 1}, + {0x1133e, 0x11344, 1}, + {0x11347, 0x11348, 1}, + {0x1134b, 0x1134c, 1}, + {0x11357, 0x11362, 11}, + {0x11363, 0x11435, 210}, + {0x11436, 0x11441, 1}, + {0x11443, 0x11445, 1}, + {0x114b0, 0x114c1, 1}, + {0x115af, 0x115b5, 1}, + {0x115b8, 0x115be, 1}, + {0x115dc, 0x115dd, 1}, + {0x11630, 0x1163e, 1}, + {0x11640, 0x116ab, 107}, + {0x116ac, 0x116b5, 1}, + {0x1171d, 0x1172a, 1}, + {0x1182c, 0x11838, 1}, + {0x11930, 0x11935, 1}, + {0x11937, 0x11938, 1}, + {0x1193b, 0x1193c, 1}, + {0x11940, 0x11942, 2}, + {0x119d1, 0x119d7, 1}, + {0x119da, 0x119df, 1}, + {0x119e4, 0x11a01, 29}, + {0x11a02, 0x11a0a, 1}, + {0x11a35, 0x11a39, 1}, + {0x11a3b, 0x11a3e, 1}, + {0x11a51, 0x11a5b, 1}, + {0x11a8a, 0x11a97, 1}, + {0x11c2f, 0x11c36, 1}, + {0x11c38, 0x11c3e, 1}, + {0x11c92, 0x11ca7, 1}, + {0x11ca9, 0x11cb6, 1}, + {0x11d31, 0x11d36, 1}, + {0x11d3a, 0x11d3c, 2}, + {0x11d3d, 0x11d3f, 2}, + {0x11d40, 0x11d41, 1}, + {0x11d43, 0x11d47, 4}, + {0x11d8a, 0x11d8e, 1}, + {0x11d90, 0x11d91, 1}, + {0x11d93, 0x11d96, 1}, + {0x11ef3, 0x11ef6, 1}, + {0x16f4f, 0x16f51, 2}, + {0x16f52, 0x16f87, 1}, + {0x16f8f, 0x16f92, 1}, + {0x16ff0, 0x16ff1, 1}, + {0x1bc9e, 0x1e000, 9058}, + {0x1e001, 0x1e006, 1}, + {0x1e008, 0x1e018, 1}, + {0x1e01b, 0x1e021, 1}, + {0x1e023, 0x1e024, 1}, + {0x1e026, 0x1e02a, 1}, + {0x1e947, 0x1f130, 2025}, + {0x1f131, 0x1f149, 1}, + {0x1f150, 0x1f169, 1}, + {0x1f170, 0x1f189, 1}, + }, +} + +var _Other_Default_Ignorable_Code_Point = &RangeTable{ + R16: []Range16{ + {0x034f, 0x115f, 3600}, + {0x1160, 0x17b4, 1620}, + {0x17b5, 0x2065, 2224}, + {0x3164, 0xffa0, 52796}, + {0xfff0, 0xfff8, 1}, + }, + R32: []Range32{ + {0xe0000, 0xe0002, 2}, + {0xe0003, 0xe001f, 1}, + {0xe0080, 0xe00ff, 1}, + {0xe01f0, 0xe0fff, 1}, + }, +} + +var _Other_Grapheme_Extend = &RangeTable{ + R16: []Range16{ + {0x09be, 0x09d7, 25}, + {0x0b3e, 0x0b57, 25}, + {0x0bbe, 0x0bd7, 25}, + {0x0cc2, 0x0cd5, 19}, + {0x0cd6, 0x0d3e, 104}, + {0x0d57, 0x0dcf, 120}, + {0x0ddf, 0x1b35, 3414}, + {0x200c, 0x302e, 4130}, + {0x302f, 0xff9e, 53103}, + {0xff9f, 0xff9f, 1}, + }, + R32: []Range32{ + {0x1133e, 0x11357, 25}, + {0x114b0, 0x114bd, 13}, + {0x115af, 0x11930, 897}, + {0x1d165, 0x1d16e, 9}, + {0x1d16f, 0x1d172, 1}, + {0xe0020, 0xe007f, 1}, + }, +} + +var _Other_ID_Continue = &RangeTable{ + R16: []Range16{ + {0x00b7, 0x0387, 720}, + {0x1369, 0x1371, 1}, + {0x19da, 0x19da, 1}, + }, +} + +var _Other_ID_Start = &RangeTable{ + R16: []Range16{ + {0x1885, 0x1886, 1}, + {0x2118, 0x212e, 22}, + {0x309b, 0x309c, 1}, + }, +} + +var _Other_Lowercase = &RangeTable{ + R16: []Range16{ + {0x00aa, 0x00ba, 16}, + {0x02b0, 0x02b8, 1}, + {0x02c0, 0x02c1, 1}, + {0x02e0, 0x02e4, 1}, + {0x0345, 0x037a, 53}, + {0x1d2c, 0x1d6a, 1}, + {0x1d78, 0x1d9b, 35}, + {0x1d9c, 0x1dbf, 1}, + {0x2071, 0x207f, 14}, + {0x2090, 0x209c, 1}, + {0x2170, 0x217f, 1}, + {0x24d0, 0x24e9, 1}, + {0x2c7c, 0x2c7d, 1}, + {0xa69c, 0xa69d, 1}, + {0xa770, 0xa7f8, 136}, + {0xa7f9, 0xab5c, 867}, + {0xab5d, 0xab5f, 1}, + }, + LatinOffset: 1, +} + +var _Other_Math = &RangeTable{ + R16: []Range16{ + {0x005e, 0x03d0, 882}, + {0x03d1, 0x03d2, 1}, + {0x03d5, 0x03f0, 27}, + {0x03f1, 0x03f4, 3}, + {0x03f5, 0x2016, 7201}, + {0x2032, 0x2034, 1}, + {0x2040, 0x2061, 33}, + {0x2062, 0x2064, 1}, + {0x207d, 0x207e, 1}, + {0x208d, 0x208e, 1}, + {0x20d0, 0x20dc, 1}, + {0x20e1, 0x20e5, 4}, + {0x20e6, 0x20eb, 5}, + {0x20ec, 0x20ef, 1}, + {0x2102, 0x2107, 5}, + {0x210a, 0x2113, 1}, + {0x2115, 0x2119, 4}, + {0x211a, 0x211d, 1}, + {0x2124, 0x2128, 4}, + {0x2129, 0x212c, 3}, + {0x212d, 0x212f, 2}, + {0x2130, 0x2131, 1}, + {0x2133, 0x2138, 1}, + {0x213c, 0x213f, 1}, + {0x2145, 0x2149, 1}, + {0x2195, 0x2199, 1}, + {0x219c, 0x219f, 1}, + {0x21a1, 0x21a2, 1}, + {0x21a4, 0x21a5, 1}, + {0x21a7, 0x21a9, 2}, + {0x21aa, 0x21ad, 1}, + {0x21b0, 0x21b1, 1}, + {0x21b6, 0x21b7, 1}, + {0x21bc, 0x21cd, 1}, + {0x21d0, 0x21d1, 1}, + {0x21d3, 0x21d5, 2}, + {0x21d6, 0x21db, 1}, + {0x21dd, 0x21e4, 7}, + {0x21e5, 0x2308, 291}, + {0x2309, 0x230b, 1}, + {0x23b4, 0x23b5, 1}, + {0x23b7, 0x23d0, 25}, + {0x23e2, 0x25a0, 446}, + {0x25a1, 0x25ae, 13}, + {0x25af, 0x25b6, 1}, + {0x25bc, 0x25c0, 1}, + {0x25c6, 0x25c7, 1}, + {0x25ca, 0x25cb, 1}, + {0x25cf, 0x25d3, 1}, + {0x25e2, 0x25e4, 2}, + {0x25e7, 0x25ec, 1}, + {0x2605, 0x2606, 1}, + {0x2640, 0x2642, 2}, + {0x2660, 0x2663, 1}, + {0x266d, 0x266e, 1}, + {0x27c5, 0x27c6, 1}, + {0x27e6, 0x27ef, 1}, + {0x2983, 0x2998, 1}, + {0x29d8, 0x29db, 1}, + {0x29fc, 0x29fd, 1}, + {0xfe61, 0xfe63, 2}, + {0xfe68, 0xff3c, 212}, + {0xff3e, 0xff3e, 1}, + }, + R32: []Range32{ + {0x1d400, 0x1d454, 1}, + {0x1d456, 0x1d49c, 1}, + {0x1d49e, 0x1d49f, 1}, + {0x1d4a2, 0x1d4a5, 3}, + {0x1d4a6, 0x1d4a9, 3}, + {0x1d4aa, 0x1d4ac, 1}, + {0x1d4ae, 0x1d4b9, 1}, + {0x1d4bb, 0x1d4bd, 2}, + {0x1d4be, 0x1d4c3, 1}, + {0x1d4c5, 0x1d505, 1}, + {0x1d507, 0x1d50a, 1}, + {0x1d50d, 0x1d514, 1}, + {0x1d516, 0x1d51c, 1}, + {0x1d51e, 0x1d539, 1}, + {0x1d53b, 0x1d53e, 1}, + {0x1d540, 0x1d544, 1}, + {0x1d546, 0x1d54a, 4}, + {0x1d54b, 0x1d550, 1}, + {0x1d552, 0x1d6a5, 1}, + {0x1d6a8, 0x1d6c0, 1}, + {0x1d6c2, 0x1d6da, 1}, + {0x1d6dc, 0x1d6fa, 1}, + {0x1d6fc, 0x1d714, 1}, + {0x1d716, 0x1d734, 1}, + {0x1d736, 0x1d74e, 1}, + {0x1d750, 0x1d76e, 1}, + {0x1d770, 0x1d788, 1}, + {0x1d78a, 0x1d7a8, 1}, + {0x1d7aa, 0x1d7c2, 1}, + {0x1d7c4, 0x1d7cb, 1}, + {0x1d7ce, 0x1d7ff, 1}, + {0x1ee00, 0x1ee03, 1}, + {0x1ee05, 0x1ee1f, 1}, + {0x1ee21, 0x1ee22, 1}, + {0x1ee24, 0x1ee27, 3}, + {0x1ee29, 0x1ee32, 1}, + {0x1ee34, 0x1ee37, 1}, + {0x1ee39, 0x1ee3b, 2}, + {0x1ee42, 0x1ee47, 5}, + {0x1ee49, 0x1ee4d, 2}, + {0x1ee4e, 0x1ee4f, 1}, + {0x1ee51, 0x1ee52, 1}, + {0x1ee54, 0x1ee57, 3}, + {0x1ee59, 0x1ee61, 2}, + {0x1ee62, 0x1ee64, 2}, + {0x1ee67, 0x1ee6a, 1}, + {0x1ee6c, 0x1ee72, 1}, + {0x1ee74, 0x1ee77, 1}, + {0x1ee79, 0x1ee7c, 1}, + {0x1ee7e, 0x1ee80, 2}, + {0x1ee81, 0x1ee89, 1}, + {0x1ee8b, 0x1ee9b, 1}, + {0x1eea1, 0x1eea3, 1}, + {0x1eea5, 0x1eea9, 1}, + {0x1eeab, 0x1eebb, 1}, + }, +} + +var _Other_Uppercase = &RangeTable{ + R16: []Range16{ + {0x2160, 0x216f, 1}, + {0x24b6, 0x24cf, 1}, + }, + R32: []Range32{ + {0x1f130, 0x1f149, 1}, + {0x1f150, 0x1f169, 1}, + {0x1f170, 0x1f189, 1}, + }, +} + +var _Pattern_Syntax = &RangeTable{ + R16: []Range16{ + {0x0021, 0x002f, 1}, + {0x003a, 0x0040, 1}, + {0x005b, 0x005e, 1}, + {0x0060, 0x007b, 27}, + {0x007c, 0x007e, 1}, + {0x00a1, 0x00a7, 1}, + {0x00a9, 0x00ab, 2}, + {0x00ac, 0x00b0, 2}, + {0x00b1, 0x00bb, 5}, + {0x00bf, 0x00d7, 24}, + {0x00f7, 0x2010, 7961}, + {0x2011, 0x2027, 1}, + {0x2030, 0x203e, 1}, + {0x2041, 0x2053, 1}, + {0x2055, 0x205e, 1}, + {0x2190, 0x245f, 1}, + {0x2500, 0x2775, 1}, + {0x2794, 0x2bff, 1}, + {0x2e00, 0x2e7f, 1}, + {0x3001, 0x3003, 1}, + {0x3008, 0x3020, 1}, + {0x3030, 0xfd3e, 52494}, + {0xfd3f, 0xfe45, 262}, + {0xfe46, 0xfe46, 1}, + }, + LatinOffset: 10, +} + +var _Pattern_White_Space = &RangeTable{ + R16: []Range16{ + {0x0009, 0x000d, 1}, + {0x0020, 0x0085, 101}, + {0x200e, 0x200f, 1}, + {0x2028, 0x2029, 1}, + }, + LatinOffset: 2, +} + +var _Prepended_Concatenation_Mark = &RangeTable{ + R16: []Range16{ + {0x0600, 0x0605, 1}, + {0x06dd, 0x070f, 50}, + {0x08e2, 0x08e2, 1}, + }, + R32: []Range32{ + {0x110bd, 0x110cd, 16}, + }, +} + +var _Quotation_Mark = &RangeTable{ + R16: []Range16{ + {0x0022, 0x0027, 5}, + {0x00ab, 0x00bb, 16}, + {0x2018, 0x201f, 1}, + {0x2039, 0x203a, 1}, + {0x2e42, 0x300c, 458}, + {0x300d, 0x300f, 1}, + {0x301d, 0x301f, 1}, + {0xfe41, 0xfe44, 1}, + {0xff02, 0xff07, 5}, + {0xff62, 0xff63, 1}, + }, + LatinOffset: 2, +} + +var _Radical = &RangeTable{ + R16: []Range16{ + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + }, +} + +var _Regional_Indicator = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x1f1e6, 0x1f1ff, 1}, + }, +} + +var _Sentence_Terminal = &RangeTable{ + R16: []Range16{ + {0x0021, 0x002e, 13}, + {0x003f, 0x0589, 1354}, + {0x061e, 0x061f, 1}, + {0x06d4, 0x0700, 44}, + {0x0701, 0x0702, 1}, + {0x07f9, 0x0837, 62}, + {0x0839, 0x083d, 4}, + {0x083e, 0x0964, 294}, + {0x0965, 0x104a, 1765}, + {0x104b, 0x1362, 791}, + {0x1367, 0x1368, 1}, + {0x166e, 0x1735, 199}, + {0x1736, 0x1803, 205}, + {0x1809, 0x1944, 315}, + {0x1945, 0x1aa8, 355}, + {0x1aa9, 0x1aab, 1}, + {0x1b5a, 0x1b5b, 1}, + {0x1b5e, 0x1b5f, 1}, + {0x1c3b, 0x1c3c, 1}, + {0x1c7e, 0x1c7f, 1}, + {0x203c, 0x203d, 1}, + {0x2047, 0x2049, 1}, + {0x2e2e, 0x2e3c, 14}, + {0x3002, 0xa4ff, 29949}, + {0xa60e, 0xa60f, 1}, + {0xa6f3, 0xa6f7, 4}, + {0xa876, 0xa877, 1}, + {0xa8ce, 0xa8cf, 1}, + {0xa92f, 0xa9c8, 153}, + {0xa9c9, 0xaa5d, 148}, + {0xaa5e, 0xaa5f, 1}, + {0xaaf0, 0xaaf1, 1}, + {0xabeb, 0xfe52, 21095}, + {0xfe56, 0xfe57, 1}, + {0xff01, 0xff0e, 13}, + {0xff1f, 0xff61, 66}, + }, + R32: []Range32{ + {0x10a56, 0x10a57, 1}, + {0x10f55, 0x10f59, 1}, + {0x11047, 0x11048, 1}, + {0x110be, 0x110c1, 1}, + {0x11141, 0x11143, 1}, + {0x111c5, 0x111c6, 1}, + {0x111cd, 0x111de, 17}, + {0x111df, 0x11238, 89}, + {0x11239, 0x1123b, 2}, + {0x1123c, 0x112a9, 109}, + {0x1144b, 0x1144c, 1}, + {0x115c2, 0x115c3, 1}, + {0x115c9, 0x115d7, 1}, + {0x11641, 0x11642, 1}, + {0x1173c, 0x1173e, 1}, + {0x11944, 0x11946, 2}, + {0x11a42, 0x11a43, 1}, + {0x11a9b, 0x11a9c, 1}, + {0x11c41, 0x11c42, 1}, + {0x11ef7, 0x11ef8, 1}, + {0x16a6e, 0x16a6f, 1}, + {0x16af5, 0x16b37, 66}, + {0x16b38, 0x16b44, 12}, + {0x16e98, 0x1bc9f, 19975}, + {0x1da88, 0x1da88, 1}, + }, + LatinOffset: 1, +} + +var _Soft_Dotted = &RangeTable{ + R16: []Range16{ + {0x0069, 0x006a, 1}, + {0x012f, 0x0249, 282}, + {0x0268, 0x029d, 53}, + {0x02b2, 0x03f3, 321}, + {0x0456, 0x0458, 2}, + {0x1d62, 0x1d96, 52}, + {0x1da4, 0x1da8, 4}, + {0x1e2d, 0x1ecb, 158}, + {0x2071, 0x2148, 215}, + {0x2149, 0x2c7c, 2867}, + }, + R32: []Range32{ + {0x1d422, 0x1d423, 1}, + {0x1d456, 0x1d457, 1}, + {0x1d48a, 0x1d48b, 1}, + {0x1d4be, 0x1d4bf, 1}, + {0x1d4f2, 0x1d4f3, 1}, + {0x1d526, 0x1d527, 1}, + {0x1d55a, 0x1d55b, 1}, + {0x1d58e, 0x1d58f, 1}, + {0x1d5c2, 0x1d5c3, 1}, + {0x1d5f6, 0x1d5f7, 1}, + {0x1d62a, 0x1d62b, 1}, + {0x1d65e, 0x1d65f, 1}, + {0x1d692, 0x1d693, 1}, + }, + LatinOffset: 1, +} + +var _Terminal_Punctuation = &RangeTable{ + R16: []Range16{ + {0x0021, 0x002c, 11}, + {0x002e, 0x003a, 12}, + {0x003b, 0x003f, 4}, + {0x037e, 0x0387, 9}, + {0x0589, 0x05c3, 58}, + {0x060c, 0x061b, 15}, + {0x061e, 0x061f, 1}, + {0x06d4, 0x0700, 44}, + {0x0701, 0x070a, 1}, + {0x070c, 0x07f8, 236}, + {0x07f9, 0x0830, 55}, + {0x0831, 0x083e, 1}, + {0x085e, 0x0964, 262}, + {0x0965, 0x0e5a, 1269}, + {0x0e5b, 0x0f08, 173}, + {0x0f0d, 0x0f12, 1}, + {0x104a, 0x104b, 1}, + {0x1361, 0x1368, 1}, + {0x166e, 0x16eb, 125}, + {0x16ec, 0x16ed, 1}, + {0x1735, 0x1736, 1}, + {0x17d4, 0x17d6, 1}, + {0x17da, 0x1802, 40}, + {0x1803, 0x1805, 1}, + {0x1808, 0x1809, 1}, + {0x1944, 0x1945, 1}, + {0x1aa8, 0x1aab, 1}, + {0x1b5a, 0x1b5b, 1}, + {0x1b5d, 0x1b5f, 1}, + {0x1c3b, 0x1c3f, 1}, + {0x1c7e, 0x1c7f, 1}, + {0x203c, 0x203d, 1}, + {0x2047, 0x2049, 1}, + {0x2e2e, 0x2e3c, 14}, + {0x2e41, 0x2e4c, 11}, + {0x2e4e, 0x2e4f, 1}, + {0x3001, 0x3002, 1}, + {0xa4fe, 0xa4ff, 1}, + {0xa60d, 0xa60f, 1}, + {0xa6f3, 0xa6f7, 1}, + {0xa876, 0xa877, 1}, + {0xa8ce, 0xa8cf, 1}, + {0xa92f, 0xa9c7, 152}, + {0xa9c8, 0xa9c9, 1}, + {0xaa5d, 0xaa5f, 1}, + {0xaadf, 0xaaf0, 17}, + {0xaaf1, 0xabeb, 250}, + {0xfe50, 0xfe52, 1}, + {0xfe54, 0xfe57, 1}, + {0xff01, 0xff0c, 11}, + {0xff0e, 0xff1a, 12}, + {0xff1b, 0xff1f, 4}, + {0xff61, 0xff64, 3}, + }, + R32: []Range32{ + {0x1039f, 0x103d0, 49}, + {0x10857, 0x1091f, 200}, + {0x10a56, 0x10a57, 1}, + {0x10af0, 0x10af5, 1}, + {0x10b3a, 0x10b3f, 1}, + {0x10b99, 0x10b9c, 1}, + {0x10f55, 0x10f59, 1}, + {0x11047, 0x1104d, 1}, + {0x110be, 0x110c1, 1}, + {0x11141, 0x11143, 1}, + {0x111c5, 0x111c6, 1}, + {0x111cd, 0x111de, 17}, + {0x111df, 0x11238, 89}, + {0x11239, 0x1123c, 1}, + {0x112a9, 0x1144b, 418}, + {0x1144c, 0x1144d, 1}, + {0x1145a, 0x1145b, 1}, + {0x115c2, 0x115c5, 1}, + {0x115c9, 0x115d7, 1}, + {0x11641, 0x11642, 1}, + {0x1173c, 0x1173e, 1}, + {0x11944, 0x11946, 2}, + {0x11a42, 0x11a43, 1}, + {0x11a9b, 0x11a9c, 1}, + {0x11aa1, 0x11aa2, 1}, + {0x11c41, 0x11c43, 1}, + {0x11c71, 0x11ef7, 646}, + {0x11ef8, 0x12470, 1400}, + {0x12471, 0x12474, 1}, + {0x16a6e, 0x16a6f, 1}, + {0x16af5, 0x16b37, 66}, + {0x16b38, 0x16b39, 1}, + {0x16b44, 0x16e97, 851}, + {0x16e98, 0x1bc9f, 19975}, + {0x1da87, 0x1da8a, 1}, + }, + LatinOffset: 3, +} + +var _Unified_Ideograph = &RangeTable{ + R16: []Range16{ + {0x3400, 0x4dbf, 1}, + {0x4e00, 0x9ffc, 1}, + {0xfa0e, 0xfa0f, 1}, + {0xfa11, 0xfa13, 2}, + {0xfa14, 0xfa1f, 11}, + {0xfa21, 0xfa23, 2}, + {0xfa24, 0xfa27, 3}, + {0xfa28, 0xfa29, 1}, + }, + R32: []Range32{ + {0x20000, 0x2a6dd, 1}, + {0x2a700, 0x2b734, 1}, + {0x2b740, 0x2b81d, 1}, + {0x2b820, 0x2cea1, 1}, + {0x2ceb0, 0x2ebe0, 1}, + {0x30000, 0x3134a, 1}, + }, +} + +var _Variation_Selector = &RangeTable{ + R16: []Range16{ + {0x180b, 0x180d, 1}, + {0xfe00, 0xfe0f, 1}, + }, + R32: []Range32{ + {0xe0100, 0xe01ef, 1}, + }, +} + +var _White_Space = &RangeTable{ + R16: []Range16{ + {0x0009, 0x000d, 1}, + {0x0020, 0x0085, 101}, + {0x00a0, 0x1680, 5600}, + {0x2000, 0x200a, 1}, + {0x2028, 0x2029, 1}, + {0x202f, 0x205f, 48}, + {0x3000, 0x3000, 1}, + }, + LatinOffset: 2, +} + +// These variables have type *RangeTable. +var ( + ASCII_Hex_Digit = _ASCII_Hex_Digit // ASCII_Hex_Digit is the set of Unicode characters with property ASCII_Hex_Digit. + Bidi_Control = _Bidi_Control // Bidi_Control is the set of Unicode characters with property Bidi_Control. + Dash = _Dash // Dash is the set of Unicode characters with property Dash. + Deprecated = _Deprecated // Deprecated is the set of Unicode characters with property Deprecated. + Diacritic = _Diacritic // Diacritic is the set of Unicode characters with property Diacritic. + Extender = _Extender // Extender is the set of Unicode characters with property Extender. + Hex_Digit = _Hex_Digit // Hex_Digit is the set of Unicode characters with property Hex_Digit. + Hyphen = _Hyphen // Hyphen is the set of Unicode characters with property Hyphen. + IDS_Binary_Operator = _IDS_Binary_Operator // IDS_Binary_Operator is the set of Unicode characters with property IDS_Binary_Operator. + IDS_Trinary_Operator = _IDS_Trinary_Operator // IDS_Trinary_Operator is the set of Unicode characters with property IDS_Trinary_Operator. + Ideographic = _Ideographic // Ideographic is the set of Unicode characters with property Ideographic. + Join_Control = _Join_Control // Join_Control is the set of Unicode characters with property Join_Control. + Logical_Order_Exception = _Logical_Order_Exception // Logical_Order_Exception is the set of Unicode characters with property Logical_Order_Exception. + Noncharacter_Code_Point = _Noncharacter_Code_Point // Noncharacter_Code_Point is the set of Unicode characters with property Noncharacter_Code_Point. + Other_Alphabetic = _Other_Alphabetic // Other_Alphabetic is the set of Unicode characters with property Other_Alphabetic. + Other_Default_Ignorable_Code_Point = _Other_Default_Ignorable_Code_Point // Other_Default_Ignorable_Code_Point is the set of Unicode characters with property Other_Default_Ignorable_Code_Point. + Other_Grapheme_Extend = _Other_Grapheme_Extend // Other_Grapheme_Extend is the set of Unicode characters with property Other_Grapheme_Extend. + Other_ID_Continue = _Other_ID_Continue // Other_ID_Continue is the set of Unicode characters with property Other_ID_Continue. + Other_ID_Start = _Other_ID_Start // Other_ID_Start is the set of Unicode characters with property Other_ID_Start. + Other_Lowercase = _Other_Lowercase // Other_Lowercase is the set of Unicode characters with property Other_Lowercase. + Other_Math = _Other_Math // Other_Math is the set of Unicode characters with property Other_Math. + Other_Uppercase = _Other_Uppercase // Other_Uppercase is the set of Unicode characters with property Other_Uppercase. + Pattern_Syntax = _Pattern_Syntax // Pattern_Syntax is the set of Unicode characters with property Pattern_Syntax. + Pattern_White_Space = _Pattern_White_Space // Pattern_White_Space is the set of Unicode characters with property Pattern_White_Space. + Prepended_Concatenation_Mark = _Prepended_Concatenation_Mark // Prepended_Concatenation_Mark is the set of Unicode characters with property Prepended_Concatenation_Mark. + Quotation_Mark = _Quotation_Mark // Quotation_Mark is the set of Unicode characters with property Quotation_Mark. + Radical = _Radical // Radical is the set of Unicode characters with property Radical. + Regional_Indicator = _Regional_Indicator // Regional_Indicator is the set of Unicode characters with property Regional_Indicator. + STerm = _Sentence_Terminal // STerm is an alias for Sentence_Terminal. + Sentence_Terminal = _Sentence_Terminal // Sentence_Terminal is the set of Unicode characters with property Sentence_Terminal. + Soft_Dotted = _Soft_Dotted // Soft_Dotted is the set of Unicode characters with property Soft_Dotted. + Terminal_Punctuation = _Terminal_Punctuation // Terminal_Punctuation is the set of Unicode characters with property Terminal_Punctuation. + Unified_Ideograph = _Unified_Ideograph // Unified_Ideograph is the set of Unicode characters with property Unified_Ideograph. + Variation_Selector = _Variation_Selector // Variation_Selector is the set of Unicode characters with property Variation_Selector. + White_Space = _White_Space // White_Space is the set of Unicode characters with property White_Space. +) + +// CaseRanges is the table describing case mappings for all letters with +// non-self mappings. +var CaseRanges = _CaseRanges +var _CaseRanges = []CaseRange{ + {0x0041, 0x005A, d{0, 32, 0}}, + {0x0061, 0x007A, d{-32, 0, -32}}, + {0x00B5, 0x00B5, d{743, 0, 743}}, + {0x00C0, 0x00D6, d{0, 32, 0}}, + {0x00D8, 0x00DE, d{0, 32, 0}}, + {0x00E0, 0x00F6, d{-32, 0, -32}}, + {0x00F8, 0x00FE, d{-32, 0, -32}}, + {0x00FF, 0x00FF, d{121, 0, 121}}, + {0x0100, 0x012F, d{UpperLower, UpperLower, UpperLower}}, + {0x0130, 0x0130, d{0, -199, 0}}, + {0x0131, 0x0131, d{-232, 0, -232}}, + {0x0132, 0x0137, d{UpperLower, UpperLower, UpperLower}}, + {0x0139, 0x0148, d{UpperLower, UpperLower, UpperLower}}, + {0x014A, 0x0177, d{UpperLower, UpperLower, UpperLower}}, + {0x0178, 0x0178, d{0, -121, 0}}, + {0x0179, 0x017E, d{UpperLower, UpperLower, UpperLower}}, + {0x017F, 0x017F, d{-300, 0, -300}}, + {0x0180, 0x0180, d{195, 0, 195}}, + {0x0181, 0x0181, d{0, 210, 0}}, + {0x0182, 0x0185, d{UpperLower, UpperLower, UpperLower}}, + {0x0186, 0x0186, d{0, 206, 0}}, + {0x0187, 0x0188, d{UpperLower, UpperLower, UpperLower}}, + {0x0189, 0x018A, d{0, 205, 0}}, + {0x018B, 0x018C, d{UpperLower, UpperLower, UpperLower}}, + {0x018E, 0x018E, d{0, 79, 0}}, + {0x018F, 0x018F, d{0, 202, 0}}, + {0x0190, 0x0190, d{0, 203, 0}}, + {0x0191, 0x0192, d{UpperLower, UpperLower, UpperLower}}, + {0x0193, 0x0193, d{0, 205, 0}}, + {0x0194, 0x0194, d{0, 207, 0}}, + {0x0195, 0x0195, d{97, 0, 97}}, + {0x0196, 0x0196, d{0, 211, 0}}, + {0x0197, 0x0197, d{0, 209, 0}}, + {0x0198, 0x0199, d{UpperLower, UpperLower, UpperLower}}, + {0x019A, 0x019A, d{163, 0, 163}}, + {0x019C, 0x019C, d{0, 211, 0}}, + {0x019D, 0x019D, d{0, 213, 0}}, + {0x019E, 0x019E, d{130, 0, 130}}, + {0x019F, 0x019F, d{0, 214, 0}}, + {0x01A0, 0x01A5, d{UpperLower, UpperLower, UpperLower}}, + {0x01A6, 0x01A6, d{0, 218, 0}}, + {0x01A7, 0x01A8, d{UpperLower, UpperLower, UpperLower}}, + {0x01A9, 0x01A9, d{0, 218, 0}}, + {0x01AC, 0x01AD, d{UpperLower, UpperLower, UpperLower}}, + {0x01AE, 0x01AE, d{0, 218, 0}}, + {0x01AF, 0x01B0, d{UpperLower, UpperLower, UpperLower}}, + {0x01B1, 0x01B2, d{0, 217, 0}}, + {0x01B3, 0x01B6, d{UpperLower, UpperLower, UpperLower}}, + {0x01B7, 0x01B7, d{0, 219, 0}}, + {0x01B8, 0x01B9, d{UpperLower, UpperLower, UpperLower}}, + {0x01BC, 0x01BD, d{UpperLower, UpperLower, UpperLower}}, + {0x01BF, 0x01BF, d{56, 0, 56}}, + {0x01C4, 0x01C4, d{0, 2, 1}}, + {0x01C5, 0x01C5, d{-1, 1, 0}}, + {0x01C6, 0x01C6, d{-2, 0, -1}}, + {0x01C7, 0x01C7, d{0, 2, 1}}, + {0x01C8, 0x01C8, d{-1, 1, 0}}, + {0x01C9, 0x01C9, d{-2, 0, -1}}, + {0x01CA, 0x01CA, d{0, 2, 1}}, + {0x01CB, 0x01CB, d{-1, 1, 0}}, + {0x01CC, 0x01CC, d{-2, 0, -1}}, + {0x01CD, 0x01DC, d{UpperLower, UpperLower, UpperLower}}, + {0x01DD, 0x01DD, d{-79, 0, -79}}, + {0x01DE, 0x01EF, d{UpperLower, UpperLower, UpperLower}}, + {0x01F1, 0x01F1, d{0, 2, 1}}, + {0x01F2, 0x01F2, d{-1, 1, 0}}, + {0x01F3, 0x01F3, d{-2, 0, -1}}, + {0x01F4, 0x01F5, d{UpperLower, UpperLower, UpperLower}}, + {0x01F6, 0x01F6, d{0, -97, 0}}, + {0x01F7, 0x01F7, d{0, -56, 0}}, + {0x01F8, 0x021F, d{UpperLower, UpperLower, UpperLower}}, + {0x0220, 0x0220, d{0, -130, 0}}, + {0x0222, 0x0233, d{UpperLower, UpperLower, UpperLower}}, + {0x023A, 0x023A, d{0, 10795, 0}}, + {0x023B, 0x023C, d{UpperLower, UpperLower, UpperLower}}, + {0x023D, 0x023D, d{0, -163, 0}}, + {0x023E, 0x023E, d{0, 10792, 0}}, + {0x023F, 0x0240, d{10815, 0, 10815}}, + {0x0241, 0x0242, d{UpperLower, UpperLower, UpperLower}}, + {0x0243, 0x0243, d{0, -195, 0}}, + {0x0244, 0x0244, d{0, 69, 0}}, + {0x0245, 0x0245, d{0, 71, 0}}, + {0x0246, 0x024F, d{UpperLower, UpperLower, UpperLower}}, + {0x0250, 0x0250, d{10783, 0, 10783}}, + {0x0251, 0x0251, d{10780, 0, 10780}}, + {0x0252, 0x0252, d{10782, 0, 10782}}, + {0x0253, 0x0253, d{-210, 0, -210}}, + {0x0254, 0x0254, d{-206, 0, -206}}, + {0x0256, 0x0257, d{-205, 0, -205}}, + {0x0259, 0x0259, d{-202, 0, -202}}, + {0x025B, 0x025B, d{-203, 0, -203}}, + {0x025C, 0x025C, d{42319, 0, 42319}}, + {0x0260, 0x0260, d{-205, 0, -205}}, + {0x0261, 0x0261, d{42315, 0, 42315}}, + {0x0263, 0x0263, d{-207, 0, -207}}, + {0x0265, 0x0265, d{42280, 0, 42280}}, + {0x0266, 0x0266, d{42308, 0, 42308}}, + {0x0268, 0x0268, d{-209, 0, -209}}, + {0x0269, 0x0269, d{-211, 0, -211}}, + {0x026A, 0x026A, d{42308, 0, 42308}}, + {0x026B, 0x026B, d{10743, 0, 10743}}, + {0x026C, 0x026C, d{42305, 0, 42305}}, + {0x026F, 0x026F, d{-211, 0, -211}}, + {0x0271, 0x0271, d{10749, 0, 10749}}, + {0x0272, 0x0272, d{-213, 0, -213}}, + {0x0275, 0x0275, d{-214, 0, -214}}, + {0x027D, 0x027D, d{10727, 0, 10727}}, + {0x0280, 0x0280, d{-218, 0, -218}}, + {0x0282, 0x0282, d{42307, 0, 42307}}, + {0x0283, 0x0283, d{-218, 0, -218}}, + {0x0287, 0x0287, d{42282, 0, 42282}}, + {0x0288, 0x0288, d{-218, 0, -218}}, + {0x0289, 0x0289, d{-69, 0, -69}}, + {0x028A, 0x028B, d{-217, 0, -217}}, + {0x028C, 0x028C, d{-71, 0, -71}}, + {0x0292, 0x0292, d{-219, 0, -219}}, + {0x029D, 0x029D, d{42261, 0, 42261}}, + {0x029E, 0x029E, d{42258, 0, 42258}}, + {0x0345, 0x0345, d{84, 0, 84}}, + {0x0370, 0x0373, d{UpperLower, UpperLower, UpperLower}}, + {0x0376, 0x0377, d{UpperLower, UpperLower, UpperLower}}, + {0x037B, 0x037D, d{130, 0, 130}}, + {0x037F, 0x037F, d{0, 116, 0}}, + {0x0386, 0x0386, d{0, 38, 0}}, + {0x0388, 0x038A, d{0, 37, 0}}, + {0x038C, 0x038C, d{0, 64, 0}}, + {0x038E, 0x038F, d{0, 63, 0}}, + {0x0391, 0x03A1, d{0, 32, 0}}, + {0x03A3, 0x03AB, d{0, 32, 0}}, + {0x03AC, 0x03AC, d{-38, 0, -38}}, + {0x03AD, 0x03AF, d{-37, 0, -37}}, + {0x03B1, 0x03C1, d{-32, 0, -32}}, + {0x03C2, 0x03C2, d{-31, 0, -31}}, + {0x03C3, 0x03CB, d{-32, 0, -32}}, + {0x03CC, 0x03CC, d{-64, 0, -64}}, + {0x03CD, 0x03CE, d{-63, 0, -63}}, + {0x03CF, 0x03CF, d{0, 8, 0}}, + {0x03D0, 0x03D0, d{-62, 0, -62}}, + {0x03D1, 0x03D1, d{-57, 0, -57}}, + {0x03D5, 0x03D5, d{-47, 0, -47}}, + {0x03D6, 0x03D6, d{-54, 0, -54}}, + {0x03D7, 0x03D7, d{-8, 0, -8}}, + {0x03D8, 0x03EF, d{UpperLower, UpperLower, UpperLower}}, + {0x03F0, 0x03F0, d{-86, 0, -86}}, + {0x03F1, 0x03F1, d{-80, 0, -80}}, + {0x03F2, 0x03F2, d{7, 0, 7}}, + {0x03F3, 0x03F3, d{-116, 0, -116}}, + {0x03F4, 0x03F4, d{0, -60, 0}}, + {0x03F5, 0x03F5, d{-96, 0, -96}}, + {0x03F7, 0x03F8, d{UpperLower, UpperLower, UpperLower}}, + {0x03F9, 0x03F9, d{0, -7, 0}}, + {0x03FA, 0x03FB, d{UpperLower, UpperLower, UpperLower}}, + {0x03FD, 0x03FF, d{0, -130, 0}}, + {0x0400, 0x040F, d{0, 80, 0}}, + {0x0410, 0x042F, d{0, 32, 0}}, + {0x0430, 0x044F, d{-32, 0, -32}}, + {0x0450, 0x045F, d{-80, 0, -80}}, + {0x0460, 0x0481, d{UpperLower, UpperLower, UpperLower}}, + {0x048A, 0x04BF, d{UpperLower, UpperLower, UpperLower}}, + {0x04C0, 0x04C0, d{0, 15, 0}}, + {0x04C1, 0x04CE, d{UpperLower, UpperLower, UpperLower}}, + {0x04CF, 0x04CF, d{-15, 0, -15}}, + {0x04D0, 0x052F, d{UpperLower, UpperLower, UpperLower}}, + {0x0531, 0x0556, d{0, 48, 0}}, + {0x0561, 0x0586, d{-48, 0, -48}}, + {0x10A0, 0x10C5, d{0, 7264, 0}}, + {0x10C7, 0x10C7, d{0, 7264, 0}}, + {0x10CD, 0x10CD, d{0, 7264, 0}}, + {0x10D0, 0x10FA, d{3008, 0, 0}}, + {0x10FD, 0x10FF, d{3008, 0, 0}}, + {0x13A0, 0x13EF, d{0, 38864, 0}}, + {0x13F0, 0x13F5, d{0, 8, 0}}, + {0x13F8, 0x13FD, d{-8, 0, -8}}, + {0x1C80, 0x1C80, d{-6254, 0, -6254}}, + {0x1C81, 0x1C81, d{-6253, 0, -6253}}, + {0x1C82, 0x1C82, d{-6244, 0, -6244}}, + {0x1C83, 0x1C84, d{-6242, 0, -6242}}, + {0x1C85, 0x1C85, d{-6243, 0, -6243}}, + {0x1C86, 0x1C86, d{-6236, 0, -6236}}, + {0x1C87, 0x1C87, d{-6181, 0, -6181}}, + {0x1C88, 0x1C88, d{35266, 0, 35266}}, + {0x1C90, 0x1CBA, d{0, -3008, 0}}, + {0x1CBD, 0x1CBF, d{0, -3008, 0}}, + {0x1D79, 0x1D79, d{35332, 0, 35332}}, + {0x1D7D, 0x1D7D, d{3814, 0, 3814}}, + {0x1D8E, 0x1D8E, d{35384, 0, 35384}}, + {0x1E00, 0x1E95, d{UpperLower, UpperLower, UpperLower}}, + {0x1E9B, 0x1E9B, d{-59, 0, -59}}, + {0x1E9E, 0x1E9E, d{0, -7615, 0}}, + {0x1EA0, 0x1EFF, d{UpperLower, UpperLower, UpperLower}}, + {0x1F00, 0x1F07, d{8, 0, 8}}, + {0x1F08, 0x1F0F, d{0, -8, 0}}, + {0x1F10, 0x1F15, d{8, 0, 8}}, + {0x1F18, 0x1F1D, d{0, -8, 0}}, + {0x1F20, 0x1F27, d{8, 0, 8}}, + {0x1F28, 0x1F2F, d{0, -8, 0}}, + {0x1F30, 0x1F37, d{8, 0, 8}}, + {0x1F38, 0x1F3F, d{0, -8, 0}}, + {0x1F40, 0x1F45, d{8, 0, 8}}, + {0x1F48, 0x1F4D, d{0, -8, 0}}, + {0x1F51, 0x1F51, d{8, 0, 8}}, + {0x1F53, 0x1F53, d{8, 0, 8}}, + {0x1F55, 0x1F55, d{8, 0, 8}}, + {0x1F57, 0x1F57, d{8, 0, 8}}, + {0x1F59, 0x1F59, d{0, -8, 0}}, + {0x1F5B, 0x1F5B, d{0, -8, 0}}, + {0x1F5D, 0x1F5D, d{0, -8, 0}}, + {0x1F5F, 0x1F5F, d{0, -8, 0}}, + {0x1F60, 0x1F67, d{8, 0, 8}}, + {0x1F68, 0x1F6F, d{0, -8, 0}}, + {0x1F70, 0x1F71, d{74, 0, 74}}, + {0x1F72, 0x1F75, d{86, 0, 86}}, + {0x1F76, 0x1F77, d{100, 0, 100}}, + {0x1F78, 0x1F79, d{128, 0, 128}}, + {0x1F7A, 0x1F7B, d{112, 0, 112}}, + {0x1F7C, 0x1F7D, d{126, 0, 126}}, + {0x1F80, 0x1F87, d{8, 0, 8}}, + {0x1F88, 0x1F8F, d{0, -8, 0}}, + {0x1F90, 0x1F97, d{8, 0, 8}}, + {0x1F98, 0x1F9F, d{0, -8, 0}}, + {0x1FA0, 0x1FA7, d{8, 0, 8}}, + {0x1FA8, 0x1FAF, d{0, -8, 0}}, + {0x1FB0, 0x1FB1, d{8, 0, 8}}, + {0x1FB3, 0x1FB3, d{9, 0, 9}}, + {0x1FB8, 0x1FB9, d{0, -8, 0}}, + {0x1FBA, 0x1FBB, d{0, -74, 0}}, + {0x1FBC, 0x1FBC, d{0, -9, 0}}, + {0x1FBE, 0x1FBE, d{-7205, 0, -7205}}, + {0x1FC3, 0x1FC3, d{9, 0, 9}}, + {0x1FC8, 0x1FCB, d{0, -86, 0}}, + {0x1FCC, 0x1FCC, d{0, -9, 0}}, + {0x1FD0, 0x1FD1, d{8, 0, 8}}, + {0x1FD8, 0x1FD9, d{0, -8, 0}}, + {0x1FDA, 0x1FDB, d{0, -100, 0}}, + {0x1FE0, 0x1FE1, d{8, 0, 8}}, + {0x1FE5, 0x1FE5, d{7, 0, 7}}, + {0x1FE8, 0x1FE9, d{0, -8, 0}}, + {0x1FEA, 0x1FEB, d{0, -112, 0}}, + {0x1FEC, 0x1FEC, d{0, -7, 0}}, + {0x1FF3, 0x1FF3, d{9, 0, 9}}, + {0x1FF8, 0x1FF9, d{0, -128, 0}}, + {0x1FFA, 0x1FFB, d{0, -126, 0}}, + {0x1FFC, 0x1FFC, d{0, -9, 0}}, + {0x2126, 0x2126, d{0, -7517, 0}}, + {0x212A, 0x212A, d{0, -8383, 0}}, + {0x212B, 0x212B, d{0, -8262, 0}}, + {0x2132, 0x2132, d{0, 28, 0}}, + {0x214E, 0x214E, d{-28, 0, -28}}, + {0x2160, 0x216F, d{0, 16, 0}}, + {0x2170, 0x217F, d{-16, 0, -16}}, + {0x2183, 0x2184, d{UpperLower, UpperLower, UpperLower}}, + {0x24B6, 0x24CF, d{0, 26, 0}}, + {0x24D0, 0x24E9, d{-26, 0, -26}}, + {0x2C00, 0x2C2E, d{0, 48, 0}}, + {0x2C30, 0x2C5E, d{-48, 0, -48}}, + {0x2C60, 0x2C61, d{UpperLower, UpperLower, UpperLower}}, + {0x2C62, 0x2C62, d{0, -10743, 0}}, + {0x2C63, 0x2C63, d{0, -3814, 0}}, + {0x2C64, 0x2C64, d{0, -10727, 0}}, + {0x2C65, 0x2C65, d{-10795, 0, -10795}}, + {0x2C66, 0x2C66, d{-10792, 0, -10792}}, + {0x2C67, 0x2C6C, d{UpperLower, UpperLower, UpperLower}}, + {0x2C6D, 0x2C6D, d{0, -10780, 0}}, + {0x2C6E, 0x2C6E, d{0, -10749, 0}}, + {0x2C6F, 0x2C6F, d{0, -10783, 0}}, + {0x2C70, 0x2C70, d{0, -10782, 0}}, + {0x2C72, 0x2C73, d{UpperLower, UpperLower, UpperLower}}, + {0x2C75, 0x2C76, d{UpperLower, UpperLower, UpperLower}}, + {0x2C7E, 0x2C7F, d{0, -10815, 0}}, + {0x2C80, 0x2CE3, d{UpperLower, UpperLower, UpperLower}}, + {0x2CEB, 0x2CEE, d{UpperLower, UpperLower, UpperLower}}, + {0x2CF2, 0x2CF3, d{UpperLower, UpperLower, UpperLower}}, + {0x2D00, 0x2D25, d{-7264, 0, -7264}}, + {0x2D27, 0x2D27, d{-7264, 0, -7264}}, + {0x2D2D, 0x2D2D, d{-7264, 0, -7264}}, + {0xA640, 0xA66D, d{UpperLower, UpperLower, UpperLower}}, + {0xA680, 0xA69B, d{UpperLower, UpperLower, UpperLower}}, + {0xA722, 0xA72F, d{UpperLower, UpperLower, UpperLower}}, + {0xA732, 0xA76F, d{UpperLower, UpperLower, UpperLower}}, + {0xA779, 0xA77C, d{UpperLower, UpperLower, UpperLower}}, + {0xA77D, 0xA77D, d{0, -35332, 0}}, + {0xA77E, 0xA787, d{UpperLower, UpperLower, UpperLower}}, + {0xA78B, 0xA78C, d{UpperLower, UpperLower, UpperLower}}, + {0xA78D, 0xA78D, d{0, -42280, 0}}, + {0xA790, 0xA793, d{UpperLower, UpperLower, UpperLower}}, + {0xA794, 0xA794, d{48, 0, 48}}, + {0xA796, 0xA7A9, d{UpperLower, UpperLower, UpperLower}}, + {0xA7AA, 0xA7AA, d{0, -42308, 0}}, + {0xA7AB, 0xA7AB, d{0, -42319, 0}}, + {0xA7AC, 0xA7AC, d{0, -42315, 0}}, + {0xA7AD, 0xA7AD, d{0, -42305, 0}}, + {0xA7AE, 0xA7AE, d{0, -42308, 0}}, + {0xA7B0, 0xA7B0, d{0, -42258, 0}}, + {0xA7B1, 0xA7B1, d{0, -42282, 0}}, + {0xA7B2, 0xA7B2, d{0, -42261, 0}}, + {0xA7B3, 0xA7B3, d{0, 928, 0}}, + {0xA7B4, 0xA7BF, d{UpperLower, UpperLower, UpperLower}}, + {0xA7C2, 0xA7C3, d{UpperLower, UpperLower, UpperLower}}, + {0xA7C4, 0xA7C4, d{0, -48, 0}}, + {0xA7C5, 0xA7C5, d{0, -42307, 0}}, + {0xA7C6, 0xA7C6, d{0, -35384, 0}}, + {0xA7C7, 0xA7CA, d{UpperLower, UpperLower, UpperLower}}, + {0xA7F5, 0xA7F6, d{UpperLower, UpperLower, UpperLower}}, + {0xAB53, 0xAB53, d{-928, 0, -928}}, + {0xAB70, 0xABBF, d{-38864, 0, -38864}}, + {0xFF21, 0xFF3A, d{0, 32, 0}}, + {0xFF41, 0xFF5A, d{-32, 0, -32}}, + {0x10400, 0x10427, d{0, 40, 0}}, + {0x10428, 0x1044F, d{-40, 0, -40}}, + {0x104B0, 0x104D3, d{0, 40, 0}}, + {0x104D8, 0x104FB, d{-40, 0, -40}}, + {0x10C80, 0x10CB2, d{0, 64, 0}}, + {0x10CC0, 0x10CF2, d{-64, 0, -64}}, + {0x118A0, 0x118BF, d{0, 32, 0}}, + {0x118C0, 0x118DF, d{-32, 0, -32}}, + {0x16E40, 0x16E5F, d{0, 32, 0}}, + {0x16E60, 0x16E7F, d{-32, 0, -32}}, + {0x1E900, 0x1E921, d{0, 34, 0}}, + {0x1E922, 0x1E943, d{-34, 0, -34}}, +} +var properties = [MaxLatin1 + 1]uint8{ + 0x00: pC, // '\x00' + 0x01: pC, // '\x01' + 0x02: pC, // '\x02' + 0x03: pC, // '\x03' + 0x04: pC, // '\x04' + 0x05: pC, // '\x05' + 0x06: pC, // '\x06' + 0x07: pC, // '\a' + 0x08: pC, // '\b' + 0x09: pC, // '\t' + 0x0A: pC, // '\n' + 0x0B: pC, // '\v' + 0x0C: pC, // '\f' + 0x0D: pC, // '\r' + 0x0E: pC, // '\x0e' + 0x0F: pC, // '\x0f' + 0x10: pC, // '\x10' + 0x11: pC, // '\x11' + 0x12: pC, // '\x12' + 0x13: pC, // '\x13' + 0x14: pC, // '\x14' + 0x15: pC, // '\x15' + 0x16: pC, // '\x16' + 0x17: pC, // '\x17' + 0x18: pC, // '\x18' + 0x19: pC, // '\x19' + 0x1A: pC, // '\x1a' + 0x1B: pC, // '\x1b' + 0x1C: pC, // '\x1c' + 0x1D: pC, // '\x1d' + 0x1E: pC, // '\x1e' + 0x1F: pC, // '\x1f' + 0x20: pZ | pp, // ' ' + 0x21: pP | pp, // '!' + 0x22: pP | pp, // '"' + 0x23: pP | pp, // '#' + 0x24: pS | pp, // '$' + 0x25: pP | pp, // '%' + 0x26: pP | pp, // '&' + 0x27: pP | pp, // '\'' + 0x28: pP | pp, // '(' + 0x29: pP | pp, // ')' + 0x2A: pP | pp, // '*' + 0x2B: pS | pp, // '+' + 0x2C: pP | pp, // ',' + 0x2D: pP | pp, // '-' + 0x2E: pP | pp, // '.' + 0x2F: pP | pp, // '/' + 0x30: pN | pp, // '0' + 0x31: pN | pp, // '1' + 0x32: pN | pp, // '2' + 0x33: pN | pp, // '3' + 0x34: pN | pp, // '4' + 0x35: pN | pp, // '5' + 0x36: pN | pp, // '6' + 0x37: pN | pp, // '7' + 0x38: pN | pp, // '8' + 0x39: pN | pp, // '9' + 0x3A: pP | pp, // ':' + 0x3B: pP | pp, // ';' + 0x3C: pS | pp, // '<' + 0x3D: pS | pp, // '=' + 0x3E: pS | pp, // '>' + 0x3F: pP | pp, // '?' + 0x40: pP | pp, // '@' + 0x41: pLu | pp, // 'A' + 0x42: pLu | pp, // 'B' + 0x43: pLu | pp, // 'C' + 0x44: pLu | pp, // 'D' + 0x45: pLu | pp, // 'E' + 0x46: pLu | pp, // 'F' + 0x47: pLu | pp, // 'G' + 0x48: pLu | pp, // 'H' + 0x49: pLu | pp, // 'I' + 0x4A: pLu | pp, // 'J' + 0x4B: pLu | pp, // 'K' + 0x4C: pLu | pp, // 'L' + 0x4D: pLu | pp, // 'M' + 0x4E: pLu | pp, // 'N' + 0x4F: pLu | pp, // 'O' + 0x50: pLu | pp, // 'P' + 0x51: pLu | pp, // 'Q' + 0x52: pLu | pp, // 'R' + 0x53: pLu | pp, // 'S' + 0x54: pLu | pp, // 'T' + 0x55: pLu | pp, // 'U' + 0x56: pLu | pp, // 'V' + 0x57: pLu | pp, // 'W' + 0x58: pLu | pp, // 'X' + 0x59: pLu | pp, // 'Y' + 0x5A: pLu | pp, // 'Z' + 0x5B: pP | pp, // '[' + 0x5C: pP | pp, // '\\' + 0x5D: pP | pp, // ']' + 0x5E: pS | pp, // '^' + 0x5F: pP | pp, // '_' + 0x60: pS | pp, // '`' + 0x61: pLl | pp, // 'a' + 0x62: pLl | pp, // 'b' + 0x63: pLl | pp, // 'c' + 0x64: pLl | pp, // 'd' + 0x65: pLl | pp, // 'e' + 0x66: pLl | pp, // 'f' + 0x67: pLl | pp, // 'g' + 0x68: pLl | pp, // 'h' + 0x69: pLl | pp, // 'i' + 0x6A: pLl | pp, // 'j' + 0x6B: pLl | pp, // 'k' + 0x6C: pLl | pp, // 'l' + 0x6D: pLl | pp, // 'm' + 0x6E: pLl | pp, // 'n' + 0x6F: pLl | pp, // 'o' + 0x70: pLl | pp, // 'p' + 0x71: pLl | pp, // 'q' + 0x72: pLl | pp, // 'r' + 0x73: pLl | pp, // 's' + 0x74: pLl | pp, // 't' + 0x75: pLl | pp, // 'u' + 0x76: pLl | pp, // 'v' + 0x77: pLl | pp, // 'w' + 0x78: pLl | pp, // 'x' + 0x79: pLl | pp, // 'y' + 0x7A: pLl | pp, // 'z' + 0x7B: pP | pp, // '{' + 0x7C: pS | pp, // '|' + 0x7D: pP | pp, // '}' + 0x7E: pS | pp, // '~' + 0x7F: pC, // '\u007f' + 0x80: pC, // '\u0080' + 0x81: pC, // '\u0081' + 0x82: pC, // '\u0082' + 0x83: pC, // '\u0083' + 0x84: pC, // '\u0084' + 0x85: pC, // '\u0085' + 0x86: pC, // '\u0086' + 0x87: pC, // '\u0087' + 0x88: pC, // '\u0088' + 0x89: pC, // '\u0089' + 0x8A: pC, // '\u008a' + 0x8B: pC, // '\u008b' + 0x8C: pC, // '\u008c' + 0x8D: pC, // '\u008d' + 0x8E: pC, // '\u008e' + 0x8F: pC, // '\u008f' + 0x90: pC, // '\u0090' + 0x91: pC, // '\u0091' + 0x92: pC, // '\u0092' + 0x93: pC, // '\u0093' + 0x94: pC, // '\u0094' + 0x95: pC, // '\u0095' + 0x96: pC, // '\u0096' + 0x97: pC, // '\u0097' + 0x98: pC, // '\u0098' + 0x99: pC, // '\u0099' + 0x9A: pC, // '\u009a' + 0x9B: pC, // '\u009b' + 0x9C: pC, // '\u009c' + 0x9D: pC, // '\u009d' + 0x9E: pC, // '\u009e' + 0x9F: pC, // '\u009f' + 0xA0: pZ, // '\u00a0' + 0xA1: pP | pp, // '¡' + 0xA2: pS | pp, // '¢' + 0xA3: pS | pp, // '£' + 0xA4: pS | pp, // '¤' + 0xA5: pS | pp, // '¥' + 0xA6: pS | pp, // '¦' + 0xA7: pP | pp, // '§' + 0xA8: pS | pp, // '¨' + 0xA9: pS | pp, // '©' + 0xAA: pLo | pp, // 'ª' + 0xAB: pP | pp, // '«' + 0xAC: pS | pp, // '¬' + 0xAD: 0, // '\u00ad' + 0xAE: pS | pp, // '®' + 0xAF: pS | pp, // '¯' + 0xB0: pS | pp, // '°' + 0xB1: pS | pp, // '±' + 0xB2: pN | pp, // '²' + 0xB3: pN | pp, // '³' + 0xB4: pS | pp, // '´' + 0xB5: pLl | pp, // 'µ' + 0xB6: pP | pp, // '¶' + 0xB7: pP | pp, // '·' + 0xB8: pS | pp, // '¸' + 0xB9: pN | pp, // '¹' + 0xBA: pLo | pp, // 'º' + 0xBB: pP | pp, // '»' + 0xBC: pN | pp, // '¼' + 0xBD: pN | pp, // '½' + 0xBE: pN | pp, // '¾' + 0xBF: pP | pp, // '¿' + 0xC0: pLu | pp, // 'À' + 0xC1: pLu | pp, // 'Á' + 0xC2: pLu | pp, // 'Â' + 0xC3: pLu | pp, // 'Ã' + 0xC4: pLu | pp, // 'Ä' + 0xC5: pLu | pp, // 'Å' + 0xC6: pLu | pp, // 'Æ' + 0xC7: pLu | pp, // 'Ç' + 0xC8: pLu | pp, // 'È' + 0xC9: pLu | pp, // 'É' + 0xCA: pLu | pp, // 'Ê' + 0xCB: pLu | pp, // 'Ë' + 0xCC: pLu | pp, // 'Ì' + 0xCD: pLu | pp, // 'Í' + 0xCE: pLu | pp, // 'Î' + 0xCF: pLu | pp, // 'Ï' + 0xD0: pLu | pp, // 'Ð' + 0xD1: pLu | pp, // 'Ñ' + 0xD2: pLu | pp, // 'Ò' + 0xD3: pLu | pp, // 'Ó' + 0xD4: pLu | pp, // 'Ô' + 0xD5: pLu | pp, // 'Õ' + 0xD6: pLu | pp, // 'Ö' + 0xD7: pS | pp, // '×' + 0xD8: pLu | pp, // 'Ø' + 0xD9: pLu | pp, // 'Ù' + 0xDA: pLu | pp, // 'Ú' + 0xDB: pLu | pp, // 'Û' + 0xDC: pLu | pp, // 'Ü' + 0xDD: pLu | pp, // 'Ý' + 0xDE: pLu | pp, // 'Þ' + 0xDF: pLl | pp, // 'ß' + 0xE0: pLl | pp, // 'à' + 0xE1: pLl | pp, // 'á' + 0xE2: pLl | pp, // 'â' + 0xE3: pLl | pp, // 'ã' + 0xE4: pLl | pp, // 'ä' + 0xE5: pLl | pp, // 'å' + 0xE6: pLl | pp, // 'æ' + 0xE7: pLl | pp, // 'ç' + 0xE8: pLl | pp, // 'è' + 0xE9: pLl | pp, // 'é' + 0xEA: pLl | pp, // 'ê' + 0xEB: pLl | pp, // 'ë' + 0xEC: pLl | pp, // 'ì' + 0xED: pLl | pp, // 'í' + 0xEE: pLl | pp, // 'î' + 0xEF: pLl | pp, // 'ï' + 0xF0: pLl | pp, // 'ð' + 0xF1: pLl | pp, // 'ñ' + 0xF2: pLl | pp, // 'ò' + 0xF3: pLl | pp, // 'ó' + 0xF4: pLl | pp, // 'ô' + 0xF5: pLl | pp, // 'õ' + 0xF6: pLl | pp, // 'ö' + 0xF7: pS | pp, // '÷' + 0xF8: pLl | pp, // 'ø' + 0xF9: pLl | pp, // 'ù' + 0xFA: pLl | pp, // 'ú' + 0xFB: pLl | pp, // 'û' + 0xFC: pLl | pp, // 'ü' + 0xFD: pLl | pp, // 'ý' + 0xFE: pLl | pp, // 'þ' + 0xFF: pLl | pp, // 'ÿ' +} + +var asciiFold = [MaxASCII + 1]uint16{ + 0x0000, + 0x0001, + 0x0002, + 0x0003, + 0x0004, + 0x0005, + 0x0006, + 0x0007, + 0x0008, + 0x0009, + 0x000A, + 0x000B, + 0x000C, + 0x000D, + 0x000E, + 0x000F, + 0x0010, + 0x0011, + 0x0012, + 0x0013, + 0x0014, + 0x0015, + 0x0016, + 0x0017, + 0x0018, + 0x0019, + 0x001A, + 0x001B, + 0x001C, + 0x001D, + 0x001E, + 0x001F, + 0x0020, + 0x0021, + 0x0022, + 0x0023, + 0x0024, + 0x0025, + 0x0026, + 0x0027, + 0x0028, + 0x0029, + 0x002A, + 0x002B, + 0x002C, + 0x002D, + 0x002E, + 0x002F, + 0x0030, + 0x0031, + 0x0032, + 0x0033, + 0x0034, + 0x0035, + 0x0036, + 0x0037, + 0x0038, + 0x0039, + 0x003A, + 0x003B, + 0x003C, + 0x003D, + 0x003E, + 0x003F, + 0x0040, + 0x0061, + 0x0062, + 0x0063, + 0x0064, + 0x0065, + 0x0066, + 0x0067, + 0x0068, + 0x0069, + 0x006A, + 0x006B, + 0x006C, + 0x006D, + 0x006E, + 0x006F, + 0x0070, + 0x0071, + 0x0072, + 0x0073, + 0x0074, + 0x0075, + 0x0076, + 0x0077, + 0x0078, + 0x0079, + 0x007A, + 0x005B, + 0x005C, + 0x005D, + 0x005E, + 0x005F, + 0x0060, + 0x0041, + 0x0042, + 0x0043, + 0x0044, + 0x0045, + 0x0046, + 0x0047, + 0x0048, + 0x0049, + 0x004A, + 0x212A, + 0x004C, + 0x004D, + 0x004E, + 0x004F, + 0x0050, + 0x0051, + 0x0052, + 0x017F, + 0x0054, + 0x0055, + 0x0056, + 0x0057, + 0x0058, + 0x0059, + 0x005A, + 0x007B, + 0x007C, + 0x007D, + 0x007E, + 0x007F, +} + +var caseOrbit = []foldPair{ + {0x004B, 0x006B}, + {0x0053, 0x0073}, + {0x006B, 0x212A}, + {0x0073, 0x017F}, + {0x00B5, 0x039C}, + {0x00C5, 0x00E5}, + {0x00DF, 0x1E9E}, + {0x00E5, 0x212B}, + {0x0130, 0x0130}, + {0x0131, 0x0131}, + {0x017F, 0x0053}, + {0x01C4, 0x01C5}, + {0x01C5, 0x01C6}, + {0x01C6, 0x01C4}, + {0x01C7, 0x01C8}, + {0x01C8, 0x01C9}, + {0x01C9, 0x01C7}, + {0x01CA, 0x01CB}, + {0x01CB, 0x01CC}, + {0x01CC, 0x01CA}, + {0x01F1, 0x01F2}, + {0x01F2, 0x01F3}, + {0x01F3, 0x01F1}, + {0x0345, 0x0399}, + {0x0392, 0x03B2}, + {0x0395, 0x03B5}, + {0x0398, 0x03B8}, + {0x0399, 0x03B9}, + {0x039A, 0x03BA}, + {0x039C, 0x03BC}, + {0x03A0, 0x03C0}, + {0x03A1, 0x03C1}, + {0x03A3, 0x03C2}, + {0x03A6, 0x03C6}, + {0x03A9, 0x03C9}, + {0x03B2, 0x03D0}, + {0x03B5, 0x03F5}, + {0x03B8, 0x03D1}, + {0x03B9, 0x1FBE}, + {0x03BA, 0x03F0}, + {0x03BC, 0x00B5}, + {0x03C0, 0x03D6}, + {0x03C1, 0x03F1}, + {0x03C2, 0x03C3}, + {0x03C3, 0x03A3}, + {0x03C6, 0x03D5}, + {0x03C9, 0x2126}, + {0x03D0, 0x0392}, + {0x03D1, 0x03F4}, + {0x03D5, 0x03A6}, + {0x03D6, 0x03A0}, + {0x03F0, 0x039A}, + {0x03F1, 0x03A1}, + {0x03F4, 0x0398}, + {0x03F5, 0x0395}, + {0x0412, 0x0432}, + {0x0414, 0x0434}, + {0x041E, 0x043E}, + {0x0421, 0x0441}, + {0x0422, 0x0442}, + {0x042A, 0x044A}, + {0x0432, 0x1C80}, + {0x0434, 0x1C81}, + {0x043E, 0x1C82}, + {0x0441, 0x1C83}, + {0x0442, 0x1C84}, + {0x044A, 0x1C86}, + {0x0462, 0x0463}, + {0x0463, 0x1C87}, + {0x1C80, 0x0412}, + {0x1C81, 0x0414}, + {0x1C82, 0x041E}, + {0x1C83, 0x0421}, + {0x1C84, 0x1C85}, + {0x1C85, 0x0422}, + {0x1C86, 0x042A}, + {0x1C87, 0x0462}, + {0x1C88, 0xA64A}, + {0x1E60, 0x1E61}, + {0x1E61, 0x1E9B}, + {0x1E9B, 0x1E60}, + {0x1E9E, 0x00DF}, + {0x1FBE, 0x0345}, + {0x2126, 0x03A9}, + {0x212A, 0x004B}, + {0x212B, 0x00C5}, + {0xA64A, 0xA64B}, + {0xA64B, 0x1C88}, +} + +// FoldCategory maps a category name to a table of +// code points outside the category that are equivalent under +// simple case folding to code points inside the category. +// If there is no entry for a category name, there are no such points. +var FoldCategory = map[string]*RangeTable{ + "L": foldL, + "Ll": foldLl, + "Lt": foldLt, + "Lu": foldLu, + "M": foldM, + "Mn": foldMn, +} + +var foldL = &RangeTable{ + R16: []Range16{ + {0x0345, 0x0345, 1}, + }, +} + +var foldLl = &RangeTable{ + R16: []Range16{ + {0x0041, 0x005a, 1}, + {0x00c0, 0x00d6, 1}, + {0x00d8, 0x00de, 1}, + {0x0100, 0x012e, 2}, + {0x0132, 0x0136, 2}, + {0x0139, 0x0147, 2}, + {0x014a, 0x0178, 2}, + {0x0179, 0x017d, 2}, + {0x0181, 0x0182, 1}, + {0x0184, 0x0186, 2}, + {0x0187, 0x0189, 2}, + {0x018a, 0x018b, 1}, + {0x018e, 0x0191, 1}, + {0x0193, 0x0194, 1}, + {0x0196, 0x0198, 1}, + {0x019c, 0x019d, 1}, + {0x019f, 0x01a0, 1}, + {0x01a2, 0x01a6, 2}, + {0x01a7, 0x01a9, 2}, + {0x01ac, 0x01ae, 2}, + {0x01af, 0x01b1, 2}, + {0x01b2, 0x01b3, 1}, + {0x01b5, 0x01b7, 2}, + {0x01b8, 0x01bc, 4}, + {0x01c4, 0x01c5, 1}, + {0x01c7, 0x01c8, 1}, + {0x01ca, 0x01cb, 1}, + {0x01cd, 0x01db, 2}, + {0x01de, 0x01ee, 2}, + {0x01f1, 0x01f2, 1}, + {0x01f4, 0x01f6, 2}, + {0x01f7, 0x01f8, 1}, + {0x01fa, 0x0232, 2}, + {0x023a, 0x023b, 1}, + {0x023d, 0x023e, 1}, + {0x0241, 0x0243, 2}, + {0x0244, 0x0246, 1}, + {0x0248, 0x024e, 2}, + {0x0345, 0x0370, 43}, + {0x0372, 0x0376, 4}, + {0x037f, 0x0386, 7}, + {0x0388, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x0391, 2}, + {0x0392, 0x03a1, 1}, + {0x03a3, 0x03ab, 1}, + {0x03cf, 0x03d8, 9}, + {0x03da, 0x03ee, 2}, + {0x03f4, 0x03f7, 3}, + {0x03f9, 0x03fa, 1}, + {0x03fd, 0x042f, 1}, + {0x0460, 0x0480, 2}, + {0x048a, 0x04c0, 2}, + {0x04c1, 0x04cd, 2}, + {0x04d0, 0x052e, 2}, + {0x0531, 0x0556, 1}, + {0x10a0, 0x10c5, 1}, + {0x10c7, 0x10cd, 6}, + {0x13a0, 0x13f5, 1}, + {0x1c90, 0x1cba, 1}, + {0x1cbd, 0x1cbf, 1}, + {0x1e00, 0x1e94, 2}, + {0x1e9e, 0x1efe, 2}, + {0x1f08, 0x1f0f, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f28, 0x1f2f, 1}, + {0x1f38, 0x1f3f, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f68, 0x1f6f, 1}, + {0x1f88, 0x1f8f, 1}, + {0x1f98, 0x1f9f, 1}, + {0x1fa8, 0x1faf, 1}, + {0x1fb8, 0x1fbc, 1}, + {0x1fc8, 0x1fcc, 1}, + {0x1fd8, 0x1fdb, 1}, + {0x1fe8, 0x1fec, 1}, + {0x1ff8, 0x1ffc, 1}, + {0x2126, 0x212a, 4}, + {0x212b, 0x2132, 7}, + {0x2183, 0x2c00, 2685}, + {0x2c01, 0x2c2e, 1}, + {0x2c60, 0x2c62, 2}, + {0x2c63, 0x2c64, 1}, + {0x2c67, 0x2c6d, 2}, + {0x2c6e, 0x2c70, 1}, + {0x2c72, 0x2c75, 3}, + {0x2c7e, 0x2c80, 1}, + {0x2c82, 0x2ce2, 2}, + {0x2ceb, 0x2ced, 2}, + {0x2cf2, 0xa640, 31054}, + {0xa642, 0xa66c, 2}, + {0xa680, 0xa69a, 2}, + {0xa722, 0xa72e, 2}, + {0xa732, 0xa76e, 2}, + {0xa779, 0xa77d, 2}, + {0xa77e, 0xa786, 2}, + {0xa78b, 0xa78d, 2}, + {0xa790, 0xa792, 2}, + {0xa796, 0xa7aa, 2}, + {0xa7ab, 0xa7ae, 1}, + {0xa7b0, 0xa7b4, 1}, + {0xa7b6, 0xa7be, 2}, + {0xa7c2, 0xa7c4, 2}, + {0xa7c5, 0xa7c7, 1}, + {0xa7c9, 0xa7f5, 44}, + {0xff21, 0xff3a, 1}, + }, + R32: []Range32{ + {0x10400, 0x10427, 1}, + {0x104b0, 0x104d3, 1}, + {0x10c80, 0x10cb2, 1}, + {0x118a0, 0x118bf, 1}, + {0x16e40, 0x16e5f, 1}, + {0x1e900, 0x1e921, 1}, + }, + LatinOffset: 3, +} + +var foldLt = &RangeTable{ + R16: []Range16{ + {0x01c4, 0x01c6, 2}, + {0x01c7, 0x01c9, 2}, + {0x01ca, 0x01cc, 2}, + {0x01f1, 0x01f3, 2}, + {0x1f80, 0x1f87, 1}, + {0x1f90, 0x1f97, 1}, + {0x1fa0, 0x1fa7, 1}, + {0x1fb3, 0x1fc3, 16}, + {0x1ff3, 0x1ff3, 1}, + }, +} + +var foldLu = &RangeTable{ + R16: []Range16{ + {0x0061, 0x007a, 1}, + {0x00b5, 0x00df, 42}, + {0x00e0, 0x00f6, 1}, + {0x00f8, 0x00ff, 1}, + {0x0101, 0x012f, 2}, + {0x0133, 0x0137, 2}, + {0x013a, 0x0148, 2}, + {0x014b, 0x0177, 2}, + {0x017a, 0x017e, 2}, + {0x017f, 0x0180, 1}, + {0x0183, 0x0185, 2}, + {0x0188, 0x018c, 4}, + {0x0192, 0x0195, 3}, + {0x0199, 0x019a, 1}, + {0x019e, 0x01a1, 3}, + {0x01a3, 0x01a5, 2}, + {0x01a8, 0x01ad, 5}, + {0x01b0, 0x01b4, 4}, + {0x01b6, 0x01b9, 3}, + {0x01bd, 0x01bf, 2}, + {0x01c5, 0x01c6, 1}, + {0x01c8, 0x01c9, 1}, + {0x01cb, 0x01cc, 1}, + {0x01ce, 0x01dc, 2}, + {0x01dd, 0x01ef, 2}, + {0x01f2, 0x01f3, 1}, + {0x01f5, 0x01f9, 4}, + {0x01fb, 0x021f, 2}, + {0x0223, 0x0233, 2}, + {0x023c, 0x023f, 3}, + {0x0240, 0x0242, 2}, + {0x0247, 0x024f, 2}, + {0x0250, 0x0254, 1}, + {0x0256, 0x0257, 1}, + {0x0259, 0x025b, 2}, + {0x025c, 0x0260, 4}, + {0x0261, 0x0265, 2}, + {0x0266, 0x0268, 2}, + {0x0269, 0x026c, 1}, + {0x026f, 0x0271, 2}, + {0x0272, 0x0275, 3}, + {0x027d, 0x0280, 3}, + {0x0282, 0x0283, 1}, + {0x0287, 0x028c, 1}, + {0x0292, 0x029d, 11}, + {0x029e, 0x0345, 167}, + {0x0371, 0x0373, 2}, + {0x0377, 0x037b, 4}, + {0x037c, 0x037d, 1}, + {0x03ac, 0x03af, 1}, + {0x03b1, 0x03ce, 1}, + {0x03d0, 0x03d1, 1}, + {0x03d5, 0x03d7, 1}, + {0x03d9, 0x03ef, 2}, + {0x03f0, 0x03f3, 1}, + {0x03f5, 0x03fb, 3}, + {0x0430, 0x045f, 1}, + {0x0461, 0x0481, 2}, + {0x048b, 0x04bf, 2}, + {0x04c2, 0x04ce, 2}, + {0x04cf, 0x052f, 2}, + {0x0561, 0x0586, 1}, + {0x10d0, 0x10fa, 1}, + {0x10fd, 0x10ff, 1}, + {0x13f8, 0x13fd, 1}, + {0x1c80, 0x1c88, 1}, + {0x1d79, 0x1d7d, 4}, + {0x1d8e, 0x1e01, 115}, + {0x1e03, 0x1e95, 2}, + {0x1e9b, 0x1ea1, 6}, + {0x1ea3, 0x1eff, 2}, + {0x1f00, 0x1f07, 1}, + {0x1f10, 0x1f15, 1}, + {0x1f20, 0x1f27, 1}, + {0x1f30, 0x1f37, 1}, + {0x1f40, 0x1f45, 1}, + {0x1f51, 0x1f57, 2}, + {0x1f60, 0x1f67, 1}, + {0x1f70, 0x1f7d, 1}, + {0x1fb0, 0x1fb1, 1}, + {0x1fbe, 0x1fd0, 18}, + {0x1fd1, 0x1fe0, 15}, + {0x1fe1, 0x1fe5, 4}, + {0x214e, 0x2184, 54}, + {0x2c30, 0x2c5e, 1}, + {0x2c61, 0x2c65, 4}, + {0x2c66, 0x2c6c, 2}, + {0x2c73, 0x2c76, 3}, + {0x2c81, 0x2ce3, 2}, + {0x2cec, 0x2cee, 2}, + {0x2cf3, 0x2d00, 13}, + {0x2d01, 0x2d25, 1}, + {0x2d27, 0x2d2d, 6}, + {0xa641, 0xa66d, 2}, + {0xa681, 0xa69b, 2}, + {0xa723, 0xa72f, 2}, + {0xa733, 0xa76f, 2}, + {0xa77a, 0xa77c, 2}, + {0xa77f, 0xa787, 2}, + {0xa78c, 0xa791, 5}, + {0xa793, 0xa794, 1}, + {0xa797, 0xa7a9, 2}, + {0xa7b5, 0xa7bf, 2}, + {0xa7c3, 0xa7c8, 5}, + {0xa7ca, 0xa7f6, 44}, + {0xab53, 0xab70, 29}, + {0xab71, 0xabbf, 1}, + {0xff41, 0xff5a, 1}, + }, + R32: []Range32{ + {0x10428, 0x1044f, 1}, + {0x104d8, 0x104fb, 1}, + {0x10cc0, 0x10cf2, 1}, + {0x118c0, 0x118df, 1}, + {0x16e60, 0x16e7f, 1}, + {0x1e922, 0x1e943, 1}, + }, + LatinOffset: 4, +} + +var foldM = &RangeTable{ + R16: []Range16{ + {0x0399, 0x03b9, 32}, + {0x1fbe, 0x1fbe, 1}, + }, +} + +var foldMn = &RangeTable{ + R16: []Range16{ + {0x0399, 0x03b9, 32}, + {0x1fbe, 0x1fbe, 1}, + }, +} + +// FoldScript maps a script name to a table of +// code points outside the script that are equivalent under +// simple case folding to code points inside the script. +// If there is no entry for a script name, there are no such points. +var FoldScript = map[string]*RangeTable{ + "Common": foldCommon, + "Greek": foldGreek, + "Inherited": foldInherited, +} + +var foldCommon = &RangeTable{ + R16: []Range16{ + {0x039c, 0x03bc, 32}, + }, +} + +var foldGreek = &RangeTable{ + R16: []Range16{ + {0x00b5, 0x0345, 656}, + }, +} + +var foldInherited = &RangeTable{ + R16: []Range16{ + {0x0399, 0x03b9, 32}, + {0x1fbe, 0x1fbe, 1}, + }, +} + +// Range entries: 3499 16-bit, 1820 32-bit, 5319 total. +// Range bytes: 20994 16-bit, 21840 32-bit, 42834 total. + +// Fold orbit bytes: 88 pairs, 352 bytes diff --git a/src/unicode/utf16/export_test.go b/src/unicode/utf16/export_test.go new file mode 100644 index 0000000..e0c57f5 --- /dev/null +++ b/src/unicode/utf16/export_test.go @@ -0,0 +1,11 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package utf16 + +// Extra names for constants so we can validate them during testing. +const ( + MaxRune = maxRune + ReplacementChar = replacementChar +) diff --git a/src/unicode/utf16/utf16.go b/src/unicode/utf16/utf16.go new file mode 100644 index 0000000..38d8be6 --- /dev/null +++ b/src/unicode/utf16/utf16.go @@ -0,0 +1,125 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package utf16 implements encoding and decoding of UTF-16 sequences. +package utf16 + +// The conditions replacementChar==unicode.ReplacementChar and +// maxRune==unicode.MaxRune are verified in the tests. +// Defining them locally avoids this package depending on package unicode. + +const ( + replacementChar = '\uFFFD' // Unicode replacement character + maxRune = '\U0010FFFF' // Maximum valid Unicode code point. +) + +const ( + // 0xd800-0xdc00 encodes the high 10 bits of a pair. + // 0xdc00-0xe000 encodes the low 10 bits of a pair. + // the value is those 20 bits plus 0x10000. + surr1 = 0xd800 + surr2 = 0xdc00 + surr3 = 0xe000 + + surrSelf = 0x10000 +) + +// IsSurrogate reports whether the specified Unicode code point +// can appear in a surrogate pair. +func IsSurrogate(r rune) bool { + return surr1 <= r && r < surr3 +} + +// DecodeRune returns the UTF-16 decoding of a surrogate pair. +// If the pair is not a valid UTF-16 surrogate pair, DecodeRune returns +// the Unicode replacement code point U+FFFD. +func DecodeRune(r1, r2 rune) rune { + if surr1 <= r1 && r1 < surr2 && surr2 <= r2 && r2 < surr3 { + return (r1-surr1)<<10 | (r2 - surr2) + surrSelf + } + return replacementChar +} + +// EncodeRune returns the UTF-16 surrogate pair r1, r2 for the given rune. +// If the rune is not a valid Unicode code point or does not need encoding, +// EncodeRune returns U+FFFD, U+FFFD. +func EncodeRune(r rune) (r1, r2 rune) { + if r < surrSelf || r > maxRune { + return replacementChar, replacementChar + } + r -= surrSelf + return surr1 + (r>>10)&0x3ff, surr2 + r&0x3ff +} + +// Encode returns the UTF-16 encoding of the Unicode code point sequence s. +func Encode(s []rune) []uint16 { + n := len(s) + for _, v := range s { + if v >= surrSelf { + n++ + } + } + + a := make([]uint16, n) + n = 0 + for _, v := range s { + switch { + case 0 <= v && v < surr1, surr3 <= v && v < surrSelf: + // normal rune + a[n] = uint16(v) + n++ + case surrSelf <= v && v <= maxRune: + // needs surrogate sequence + r1, r2 := EncodeRune(v) + a[n] = uint16(r1) + a[n+1] = uint16(r2) + n += 2 + default: + a[n] = uint16(replacementChar) + n++ + } + } + return a[:n] +} + +// AppendRune appends the UTF-16 encoding of the Unicode code point r +// to the end of p and returns the extended buffer. If the rune is not +// a valid Unicode code point, it appends the encoding of U+FFFD. +func AppendRune(a []uint16, r rune) []uint16 { + // This function is inlineable for fast handling of ASCII. + switch { + case 0 <= r && r < surr1, surr3 <= r && r < surrSelf: + // normal rune + return append(a, uint16(r)) + case surrSelf <= r && r <= maxRune: + // needs surrogate sequence + r1, r2 := EncodeRune(r) + return append(a, uint16(r1), uint16(r2)) + } + return append(a, replacementChar) +} + +// Decode returns the Unicode code point sequence represented +// by the UTF-16 encoding s. +func Decode(s []uint16) []rune { + a := make([]rune, len(s)) + n := 0 + for i := 0; i < len(s); i++ { + switch r := s[i]; { + case r < surr1, surr3 <= r: + // normal rune + a[n] = rune(r) + case surr1 <= r && r < surr2 && i+1 < len(s) && + surr2 <= s[i+1] && s[i+1] < surr3: + // valid surrogate sequence + a[n] = DecodeRune(rune(r), rune(s[i+1])) + i++ + default: + // invalid surrogate sequence + a[n] = replacementChar + } + n++ + } + return a[:n] +} diff --git a/src/unicode/utf16/utf16_test.go b/src/unicode/utf16/utf16_test.go new file mode 100644 index 0000000..be339b1 --- /dev/null +++ b/src/unicode/utf16/utf16_test.go @@ -0,0 +1,236 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package utf16_test + +import ( + "reflect" + "testing" + "unicode" + . "unicode/utf16" +) + +// Validate the constants redefined from unicode. +func TestConstants(t *testing.T) { + if MaxRune != unicode.MaxRune { + t.Errorf("utf16.maxRune is wrong: %x should be %x", MaxRune, unicode.MaxRune) + } + if ReplacementChar != unicode.ReplacementChar { + t.Errorf("utf16.replacementChar is wrong: %x should be %x", ReplacementChar, unicode.ReplacementChar) + } +} + +type encodeTest struct { + in []rune + out []uint16 +} + +var encodeTests = []encodeTest{ + {[]rune{1, 2, 3, 4}, []uint16{1, 2, 3, 4}}, + {[]rune{0xffff, 0x10000, 0x10001, 0x12345, 0x10ffff}, + []uint16{0xffff, 0xd800, 0xdc00, 0xd800, 0xdc01, 0xd808, 0xdf45, 0xdbff, 0xdfff}}, + {[]rune{'a', 'b', 0xd7ff, 0xd800, 0xdfff, 0xe000, 0x110000, -1}, + []uint16{'a', 'b', 0xd7ff, 0xfffd, 0xfffd, 0xe000, 0xfffd, 0xfffd}}, +} + +func TestEncode(t *testing.T) { + for _, tt := range encodeTests { + out := Encode(tt.in) + if !reflect.DeepEqual(out, tt.out) { + t.Errorf("Encode(%x) = %x; want %x", tt.in, out, tt.out) + } + } +} + +func TestAppendRune(t *testing.T) { + for _, tt := range encodeTests { + var out []uint16 + for _, u := range tt.in { + out = AppendRune(out, u) + } + if !reflect.DeepEqual(out, tt.out) { + t.Errorf("AppendRune(%x) = %x; want %x", tt.in, out, tt.out) + } + } +} + +func TestEncodeRune(t *testing.T) { + for i, tt := range encodeTests { + j := 0 + for _, r := range tt.in { + r1, r2 := EncodeRune(r) + if r < 0x10000 || r > unicode.MaxRune { + if j >= len(tt.out) { + t.Errorf("#%d: ran out of tt.out", i) + break + } + if r1 != unicode.ReplacementChar || r2 != unicode.ReplacementChar { + t.Errorf("EncodeRune(%#x) = %#x, %#x; want 0xfffd, 0xfffd", r, r1, r2) + } + j++ + } else { + if j+1 >= len(tt.out) { + t.Errorf("#%d: ran out of tt.out", i) + break + } + if r1 != rune(tt.out[j]) || r2 != rune(tt.out[j+1]) { + t.Errorf("EncodeRune(%#x) = %#x, %#x; want %#x, %#x", r, r1, r2, tt.out[j], tt.out[j+1]) + } + j += 2 + dec := DecodeRune(r1, r2) + if dec != r { + t.Errorf("DecodeRune(%#x, %#x) = %#x; want %#x", r1, r2, dec, r) + } + } + } + if j != len(tt.out) { + t.Errorf("#%d: EncodeRune didn't generate enough output", i) + } + } +} + +type decodeTest struct { + in []uint16 + out []rune +} + +var decodeTests = []decodeTest{ + {[]uint16{1, 2, 3, 4}, []rune{1, 2, 3, 4}}, + {[]uint16{0xffff, 0xd800, 0xdc00, 0xd800, 0xdc01, 0xd808, 0xdf45, 0xdbff, 0xdfff}, + []rune{0xffff, 0x10000, 0x10001, 0x12345, 0x10ffff}}, + {[]uint16{0xd800, 'a'}, []rune{0xfffd, 'a'}}, + {[]uint16{0xdfff}, []rune{0xfffd}}, +} + +func TestDecode(t *testing.T) { + for _, tt := range decodeTests { + out := Decode(tt.in) + if !reflect.DeepEqual(out, tt.out) { + t.Errorf("Decode(%x) = %x; want %x", tt.in, out, tt.out) + } + } +} + +var decodeRuneTests = []struct { + r1, r2 rune + want rune +}{ + {0xd800, 0xdc00, 0x10000}, + {0xd800, 0xdc01, 0x10001}, + {0xd808, 0xdf45, 0x12345}, + {0xdbff, 0xdfff, 0x10ffff}, + {0xd800, 'a', 0xfffd}, // illegal, replacement rune substituted +} + +func TestDecodeRune(t *testing.T) { + for i, tt := range decodeRuneTests { + got := DecodeRune(tt.r1, tt.r2) + if got != tt.want { + t.Errorf("%d: DecodeRune(%q, %q) = %v; want %v", i, tt.r1, tt.r2, got, tt.want) + } + } +} + +var surrogateTests = []struct { + r rune + want bool +}{ + // from https://en.wikipedia.org/wiki/UTF-16 + {'\u007A', false}, // LATIN SMALL LETTER Z + {'\u6C34', false}, // CJK UNIFIED IDEOGRAPH-6C34 (water) + {'\uFEFF', false}, // Byte Order Mark + {'\U00010000', false}, // LINEAR B SYLLABLE B008 A (first non-BMP code point) + {'\U0001D11E', false}, // MUSICAL SYMBOL G CLEF + {'\U0010FFFD', false}, // PRIVATE USE CHARACTER-10FFFD (last Unicode code point) + + {rune(0xd7ff), false}, // surr1-1 + {rune(0xd800), true}, // surr1 + {rune(0xdc00), true}, // surr2 + {rune(0xe000), false}, // surr3 + {rune(0xdfff), true}, // surr3-1 +} + +func TestIsSurrogate(t *testing.T) { + for i, tt := range surrogateTests { + got := IsSurrogate(tt.r) + if got != tt.want { + t.Errorf("%d: IsSurrogate(%q) = %v; want %v", i, tt.r, got, tt.want) + } + } +} + +func BenchmarkDecodeValidASCII(b *testing.B) { + // "hello world" + data := []uint16{104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100} + for i := 0; i < b.N; i++ { + Decode(data) + } +} + +func BenchmarkDecodeValidJapaneseChars(b *testing.B) { + // "日本語日本語日本語" + data := []uint16{26085, 26412, 35486, 26085, 26412, 35486, 26085, 26412, 35486} + for i := 0; i < b.N; i++ { + Decode(data) + } +} + +func BenchmarkDecodeRune(b *testing.B) { + rs := make([]rune, 10) + // U+1D4D0 to U+1D4D4: MATHEMATICAL BOLD SCRIPT CAPITAL LETTERS + for i, u := range []rune{'𝓐', '𝓑', '𝓒', '𝓓', '𝓔'} { + rs[2*i], rs[2*i+1] = EncodeRune(u) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + for j := 0; j < 5; j++ { + DecodeRune(rs[2*j], rs[2*j+1]) + } + } +} + +func BenchmarkEncodeValidASCII(b *testing.B) { + data := []rune{'h', 'e', 'l', 'l', 'o'} + for i := 0; i < b.N; i++ { + Encode(data) + } +} + +func BenchmarkEncodeValidJapaneseChars(b *testing.B) { + data := []rune{'日', '本', '語'} + for i := 0; i < b.N; i++ { + Encode(data) + } +} + +func BenchmarkAppendRuneValidASCII(b *testing.B) { + data := []rune{'h', 'e', 'l', 'l', 'o'} + a := make([]uint16, 0, len(data)*2) + for i := 0; i < b.N; i++ { + for _, u := range data { + a = AppendRune(a, u) + } + a = a[:0] + } +} + +func BenchmarkAppendRuneValidJapaneseChars(b *testing.B) { + data := []rune{'日', '本', '語'} + a := make([]uint16, 0, len(data)*2) + for i := 0; i < b.N; i++ { + for _, u := range data { + a = AppendRune(a, u) + } + a = a[:0] + } +} + +func BenchmarkEncodeRune(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, u := range []rune{'𝓐', '𝓑', '𝓒', '𝓓', '𝓔'} { + EncodeRune(u) + } + } +} diff --git a/src/unicode/utf8/example_test.go b/src/unicode/utf8/example_test.go new file mode 100644 index 0000000..fe434c9 --- /dev/null +++ b/src/unicode/utf8/example_test.go @@ -0,0 +1,226 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package utf8_test + +import ( + "fmt" + "unicode/utf8" +) + +func ExampleDecodeLastRune() { + b := []byte("Hello, 世界") + + for len(b) > 0 { + r, size := utf8.DecodeLastRune(b) + fmt.Printf("%c %v\n", r, size) + + b = b[:len(b)-size] + } + // Output: + // 界 3 + // 世 3 + // 1 + // , 1 + // o 1 + // l 1 + // l 1 + // e 1 + // H 1 +} + +func ExampleDecodeLastRuneInString() { + str := "Hello, 世界" + + for len(str) > 0 { + r, size := utf8.DecodeLastRuneInString(str) + fmt.Printf("%c %v\n", r, size) + + str = str[:len(str)-size] + } + // Output: + // 界 3 + // 世 3 + // 1 + // , 1 + // o 1 + // l 1 + // l 1 + // e 1 + // H 1 + +} + +func ExampleDecodeRune() { + b := []byte("Hello, 世界") + + for len(b) > 0 { + r, size := utf8.DecodeRune(b) + fmt.Printf("%c %v\n", r, size) + + b = b[size:] + } + // Output: + // H 1 + // e 1 + // l 1 + // l 1 + // o 1 + // , 1 + // 1 + // 世 3 + // 界 3 +} + +func ExampleDecodeRuneInString() { + str := "Hello, 世界" + + for len(str) > 0 { + r, size := utf8.DecodeRuneInString(str) + fmt.Printf("%c %v\n", r, size) + + str = str[size:] + } + // Output: + // H 1 + // e 1 + // l 1 + // l 1 + // o 1 + // , 1 + // 1 + // 世 3 + // 界 3 +} + +func ExampleEncodeRune() { + r := '世' + buf := make([]byte, 3) + + n := utf8.EncodeRune(buf, r) + + fmt.Println(buf) + fmt.Println(n) + // Output: + // [228 184 150] + // 3 +} + +func ExampleEncodeRune_outOfRange() { + runes := []rune{ + // Less than 0, out of range. + -1, + // Greater than 0x10FFFF, out of range. + 0x110000, + // The Unicode replacement character. + utf8.RuneError, + } + for i, c := range runes { + buf := make([]byte, 3) + size := utf8.EncodeRune(buf, c) + fmt.Printf("%d: %d %[2]s %d\n", i, buf, size) + } + // Output: + // 0: [239 191 189] � 3 + // 1: [239 191 189] � 3 + // 2: [239 191 189] � 3 +} + +func ExampleFullRune() { + buf := []byte{228, 184, 150} // 世 + fmt.Println(utf8.FullRune(buf)) + fmt.Println(utf8.FullRune(buf[:2])) + // Output: + // true + // false +} + +func ExampleFullRuneInString() { + str := "世" + fmt.Println(utf8.FullRuneInString(str)) + fmt.Println(utf8.FullRuneInString(str[:2])) + // Output: + // true + // false +} + +func ExampleRuneCount() { + buf := []byte("Hello, 世界") + fmt.Println("bytes =", len(buf)) + fmt.Println("runes =", utf8.RuneCount(buf)) + // Output: + // bytes = 13 + // runes = 9 +} + +func ExampleRuneCountInString() { + str := "Hello, 世界" + fmt.Println("bytes =", len(str)) + fmt.Println("runes =", utf8.RuneCountInString(str)) + // Output: + // bytes = 13 + // runes = 9 +} + +func ExampleRuneLen() { + fmt.Println(utf8.RuneLen('a')) + fmt.Println(utf8.RuneLen('界')) + // Output: + // 1 + // 3 +} + +func ExampleRuneStart() { + buf := []byte("a界") + fmt.Println(utf8.RuneStart(buf[0])) + fmt.Println(utf8.RuneStart(buf[1])) + fmt.Println(utf8.RuneStart(buf[2])) + // Output: + // true + // true + // false +} + +func ExampleValid() { + valid := []byte("Hello, 世界") + invalid := []byte{0xff, 0xfe, 0xfd} + + fmt.Println(utf8.Valid(valid)) + fmt.Println(utf8.Valid(invalid)) + // Output: + // true + // false +} + +func ExampleValidRune() { + valid := 'a' + invalid := rune(0xfffffff) + + fmt.Println(utf8.ValidRune(valid)) + fmt.Println(utf8.ValidRune(invalid)) + // Output: + // true + // false +} + +func ExampleValidString() { + valid := "Hello, 世界" + invalid := string([]byte{0xff, 0xfe, 0xfd}) + + fmt.Println(utf8.ValidString(valid)) + fmt.Println(utf8.ValidString(invalid)) + // Output: + // true + // false +} + +func ExampleAppendRune() { + buf1 := utf8.AppendRune(nil, 0x10000) + buf2 := utf8.AppendRune([]byte("init"), 0x10000) + fmt.Println(string(buf1)) + fmt.Println(string(buf2)) + // Output: + // 𐀀 + // init𐀀 +} diff --git a/src/unicode/utf8/utf8.go b/src/unicode/utf8/utf8.go new file mode 100644 index 0000000..1e9f666 --- /dev/null +++ b/src/unicode/utf8/utf8.go @@ -0,0 +1,583 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package utf8 implements functions and constants to support text encoded in +// UTF-8. It includes functions to translate between runes and UTF-8 byte sequences. +// See https://en.wikipedia.org/wiki/UTF-8 +package utf8 + +// The conditions RuneError==unicode.ReplacementChar and +// MaxRune==unicode.MaxRune are verified in the tests. +// Defining them locally avoids this package depending on package unicode. + +// Numbers fundamental to the encoding. +const ( + RuneError = '\uFFFD' // the "error" Rune or "Unicode replacement character" + RuneSelf = 0x80 // characters below RuneSelf are represented as themselves in a single byte. + MaxRune = '\U0010FFFF' // Maximum valid Unicode code point. + UTFMax = 4 // maximum number of bytes of a UTF-8 encoded Unicode character. +) + +// Code points in the surrogate range are not valid for UTF-8. +const ( + surrogateMin = 0xD800 + surrogateMax = 0xDFFF +) + +const ( + t1 = 0b00000000 + tx = 0b10000000 + t2 = 0b11000000 + t3 = 0b11100000 + t4 = 0b11110000 + t5 = 0b11111000 + + maskx = 0b00111111 + mask2 = 0b00011111 + mask3 = 0b00001111 + mask4 = 0b00000111 + + rune1Max = 1<<7 - 1 + rune2Max = 1<<11 - 1 + rune3Max = 1<<16 - 1 + + // The default lowest and highest continuation byte. + locb = 0b10000000 + hicb = 0b10111111 + + // These names of these constants are chosen to give nice alignment in the + // table below. The first nibble is an index into acceptRanges or F for + // special one-byte cases. The second nibble is the Rune length or the + // Status for the special one-byte case. + xx = 0xF1 // invalid: size 1 + as = 0xF0 // ASCII: size 1 + s1 = 0x02 // accept 0, size 2 + s2 = 0x13 // accept 1, size 3 + s3 = 0x03 // accept 0, size 3 + s4 = 0x23 // accept 2, size 3 + s5 = 0x34 // accept 3, size 4 + s6 = 0x04 // accept 0, size 4 + s7 = 0x44 // accept 4, size 4 +) + +// first is information about the first byte in a UTF-8 sequence. +var first = [256]uint8{ + // 1 2 3 4 5 6 7 8 9 A B C D E F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x00-0x0F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x10-0x1F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x20-0x2F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x30-0x3F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x40-0x4F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x50-0x5F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x60-0x6F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x70-0x7F + // 1 2 3 4 5 6 7 8 9 A B C D E F + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x80-0x8F + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x90-0x9F + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xA0-0xAF + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xB0-0xBF + xx, xx, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xC0-0xCF + s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xD0-0xDF + s2, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s4, s3, s3, // 0xE0-0xEF + s5, s6, s6, s6, s7, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xF0-0xFF +} + +// acceptRange gives the range of valid values for the second byte in a UTF-8 +// sequence. +type acceptRange struct { + lo uint8 // lowest value for second byte. + hi uint8 // highest value for second byte. +} + +// acceptRanges has size 16 to avoid bounds checks in the code that uses it. +var acceptRanges = [16]acceptRange{ + 0: {locb, hicb}, + 1: {0xA0, hicb}, + 2: {locb, 0x9F}, + 3: {0x90, hicb}, + 4: {locb, 0x8F}, +} + +// FullRune reports whether the bytes in p begin with a full UTF-8 encoding of a rune. +// An invalid encoding is considered a full Rune since it will convert as a width-1 error rune. +func FullRune(p []byte) bool { + n := len(p) + if n == 0 { + return false + } + x := first[p[0]] + if n >= int(x&7) { + return true // ASCII, invalid or valid. + } + // Must be short or invalid. + accept := acceptRanges[x>>4] + if n > 1 && (p[1] < accept.lo || accept.hi < p[1]) { + return true + } else if n > 2 && (p[2] < locb || hicb < p[2]) { + return true + } + return false +} + +// FullRuneInString is like FullRune but its input is a string. +func FullRuneInString(s string) bool { + n := len(s) + if n == 0 { + return false + } + x := first[s[0]] + if n >= int(x&7) { + return true // ASCII, invalid, or valid. + } + // Must be short or invalid. + accept := acceptRanges[x>>4] + if n > 1 && (s[1] < accept.lo || accept.hi < s[1]) { + return true + } else if n > 2 && (s[2] < locb || hicb < s[2]) { + return true + } + return false +} + +// DecodeRune unpacks the first UTF-8 encoding in p and returns the rune and +// its width in bytes. If p is empty it returns (RuneError, 0). Otherwise, if +// the encoding is invalid, it returns (RuneError, 1). Both are impossible +// results for correct, non-empty UTF-8. +// +// An encoding is invalid if it is incorrect UTF-8, encodes a rune that is +// out of range, or is not the shortest possible UTF-8 encoding for the +// value. No other validation is performed. +func DecodeRune(p []byte) (r rune, size int) { + n := len(p) + if n < 1 { + return RuneError, 0 + } + p0 := p[0] + x := first[p0] + if x >= as { + // The following code simulates an additional check for x == xx and + // handling the ASCII and invalid cases accordingly. This mask-and-or + // approach prevents an additional branch. + mask := rune(x) << 31 >> 31 // Create 0x0000 or 0xFFFF. + return rune(p[0])&^mask | RuneError&mask, 1 + } + sz := int(x & 7) + accept := acceptRanges[x>>4] + if n < sz { + return RuneError, 1 + } + b1 := p[1] + if b1 < accept.lo || accept.hi < b1 { + return RuneError, 1 + } + if sz <= 2 { // <= instead of == to help the compiler eliminate some bounds checks + return rune(p0&mask2)<<6 | rune(b1&maskx), 2 + } + b2 := p[2] + if b2 < locb || hicb < b2 { + return RuneError, 1 + } + if sz <= 3 { + return rune(p0&mask3)<<12 | rune(b1&maskx)<<6 | rune(b2&maskx), 3 + } + b3 := p[3] + if b3 < locb || hicb < b3 { + return RuneError, 1 + } + return rune(p0&mask4)<<18 | rune(b1&maskx)<<12 | rune(b2&maskx)<<6 | rune(b3&maskx), 4 +} + +// DecodeRuneInString is like DecodeRune but its input is a string. If s is +// empty it returns (RuneError, 0). Otherwise, if the encoding is invalid, it +// returns (RuneError, 1). Both are impossible results for correct, non-empty +// UTF-8. +// +// An encoding is invalid if it is incorrect UTF-8, encodes a rune that is +// out of range, or is not the shortest possible UTF-8 encoding for the +// value. No other validation is performed. +func DecodeRuneInString(s string) (r rune, size int) { + n := len(s) + if n < 1 { + return RuneError, 0 + } + s0 := s[0] + x := first[s0] + if x >= as { + // The following code simulates an additional check for x == xx and + // handling the ASCII and invalid cases accordingly. This mask-and-or + // approach prevents an additional branch. + mask := rune(x) << 31 >> 31 // Create 0x0000 or 0xFFFF. + return rune(s[0])&^mask | RuneError&mask, 1 + } + sz := int(x & 7) + accept := acceptRanges[x>>4] + if n < sz { + return RuneError, 1 + } + s1 := s[1] + if s1 < accept.lo || accept.hi < s1 { + return RuneError, 1 + } + if sz <= 2 { // <= instead of == to help the compiler eliminate some bounds checks + return rune(s0&mask2)<<6 | rune(s1&maskx), 2 + } + s2 := s[2] + if s2 < locb || hicb < s2 { + return RuneError, 1 + } + if sz <= 3 { + return rune(s0&mask3)<<12 | rune(s1&maskx)<<6 | rune(s2&maskx), 3 + } + s3 := s[3] + if s3 < locb || hicb < s3 { + return RuneError, 1 + } + return rune(s0&mask4)<<18 | rune(s1&maskx)<<12 | rune(s2&maskx)<<6 | rune(s3&maskx), 4 +} + +// DecodeLastRune unpacks the last UTF-8 encoding in p and returns the rune and +// its width in bytes. If p is empty it returns (RuneError, 0). Otherwise, if +// the encoding is invalid, it returns (RuneError, 1). Both are impossible +// results for correct, non-empty UTF-8. +// +// An encoding is invalid if it is incorrect UTF-8, encodes a rune that is +// out of range, or is not the shortest possible UTF-8 encoding for the +// value. No other validation is performed. +func DecodeLastRune(p []byte) (r rune, size int) { + end := len(p) + if end == 0 { + return RuneError, 0 + } + start := end - 1 + r = rune(p[start]) + if r < RuneSelf { + return r, 1 + } + // guard against O(n^2) behavior when traversing + // backwards through strings with long sequences of + // invalid UTF-8. + lim := end - UTFMax + if lim < 0 { + lim = 0 + } + for start--; start >= lim; start-- { + if RuneStart(p[start]) { + break + } + } + if start < 0 { + start = 0 + } + r, size = DecodeRune(p[start:end]) + if start+size != end { + return RuneError, 1 + } + return r, size +} + +// DecodeLastRuneInString is like DecodeLastRune but its input is a string. If +// s is empty it returns (RuneError, 0). Otherwise, if the encoding is invalid, +// it returns (RuneError, 1). Both are impossible results for correct, +// non-empty UTF-8. +// +// An encoding is invalid if it is incorrect UTF-8, encodes a rune that is +// out of range, or is not the shortest possible UTF-8 encoding for the +// value. No other validation is performed. +func DecodeLastRuneInString(s string) (r rune, size int) { + end := len(s) + if end == 0 { + return RuneError, 0 + } + start := end - 1 + r = rune(s[start]) + if r < RuneSelf { + return r, 1 + } + // guard against O(n^2) behavior when traversing + // backwards through strings with long sequences of + // invalid UTF-8. + lim := end - UTFMax + if lim < 0 { + lim = 0 + } + for start--; start >= lim; start-- { + if RuneStart(s[start]) { + break + } + } + if start < 0 { + start = 0 + } + r, size = DecodeRuneInString(s[start:end]) + if start+size != end { + return RuneError, 1 + } + return r, size +} + +// RuneLen returns the number of bytes required to encode the rune. +// It returns -1 if the rune is not a valid value to encode in UTF-8. +func RuneLen(r rune) int { + switch { + case r < 0: + return -1 + case r <= rune1Max: + return 1 + case r <= rune2Max: + return 2 + case surrogateMin <= r && r <= surrogateMax: + return -1 + case r <= rune3Max: + return 3 + case r <= MaxRune: + return 4 + } + return -1 +} + +// EncodeRune writes into p (which must be large enough) the UTF-8 encoding of the rune. +// If the rune is out of range, it writes the encoding of RuneError. +// It returns the number of bytes written. +func EncodeRune(p []byte, r rune) int { + // Negative values are erroneous. Making it unsigned addresses the problem. + switch i := uint32(r); { + case i <= rune1Max: + p[0] = byte(r) + return 1 + case i <= rune2Max: + _ = p[1] // eliminate bounds checks + p[0] = t2 | byte(r>>6) + p[1] = tx | byte(r)&maskx + return 2 + case i > MaxRune, surrogateMin <= i && i <= surrogateMax: + r = RuneError + fallthrough + case i <= rune3Max: + _ = p[2] // eliminate bounds checks + p[0] = t3 | byte(r>>12) + p[1] = tx | byte(r>>6)&maskx + p[2] = tx | byte(r)&maskx + return 3 + default: + _ = p[3] // eliminate bounds checks + p[0] = t4 | byte(r>>18) + p[1] = tx | byte(r>>12)&maskx + p[2] = tx | byte(r>>6)&maskx + p[3] = tx | byte(r)&maskx + return 4 + } +} + +// AppendRune appends the UTF-8 encoding of r to the end of p and +// returns the extended buffer. If the rune is out of range, +// it appends the encoding of RuneError. +func AppendRune(p []byte, r rune) []byte { + // This function is inlineable for fast handling of ASCII. + if uint32(r) <= rune1Max { + return append(p, byte(r)) + } + return appendRuneNonASCII(p, r) +} + +func appendRuneNonASCII(p []byte, r rune) []byte { + // Negative values are erroneous. Making it unsigned addresses the problem. + switch i := uint32(r); { + case i <= rune2Max: + return append(p, t2|byte(r>>6), tx|byte(r)&maskx) + case i > MaxRune, surrogateMin <= i && i <= surrogateMax: + r = RuneError + fallthrough + case i <= rune3Max: + return append(p, t3|byte(r>>12), tx|byte(r>>6)&maskx, tx|byte(r)&maskx) + default: + return append(p, t4|byte(r>>18), tx|byte(r>>12)&maskx, tx|byte(r>>6)&maskx, tx|byte(r)&maskx) + } +} + +// RuneCount returns the number of runes in p. Erroneous and short +// encodings are treated as single runes of width 1 byte. +func RuneCount(p []byte) int { + np := len(p) + var n int + for i := 0; i < np; { + n++ + c := p[i] + if c < RuneSelf { + // ASCII fast path + i++ + continue + } + x := first[c] + if x == xx { + i++ // invalid. + continue + } + size := int(x & 7) + if i+size > np { + i++ // Short or invalid. + continue + } + accept := acceptRanges[x>>4] + if c := p[i+1]; c < accept.lo || accept.hi < c { + size = 1 + } else if size == 2 { + } else if c := p[i+2]; c < locb || hicb < c { + size = 1 + } else if size == 3 { + } else if c := p[i+3]; c < locb || hicb < c { + size = 1 + } + i += size + } + return n +} + +// RuneCountInString is like RuneCount but its input is a string. +func RuneCountInString(s string) (n int) { + ns := len(s) + for i := 0; i < ns; n++ { + c := s[i] + if c < RuneSelf { + // ASCII fast path + i++ + continue + } + x := first[c] + if x == xx { + i++ // invalid. + continue + } + size := int(x & 7) + if i+size > ns { + i++ // Short or invalid. + continue + } + accept := acceptRanges[x>>4] + if c := s[i+1]; c < accept.lo || accept.hi < c { + size = 1 + } else if size == 2 { + } else if c := s[i+2]; c < locb || hicb < c { + size = 1 + } else if size == 3 { + } else if c := s[i+3]; c < locb || hicb < c { + size = 1 + } + i += size + } + return n +} + +// RuneStart reports whether the byte could be the first byte of an encoded, +// possibly invalid rune. Second and subsequent bytes always have the top two +// bits set to 10. +func RuneStart(b byte) bool { return b&0xC0 != 0x80 } + +// Valid reports whether p consists entirely of valid UTF-8-encoded runes. +func Valid(p []byte) bool { + // This optimization avoids the need to recompute the capacity + // when generating code for p[8:], bringing it to parity with + // ValidString, which was 20% faster on long ASCII strings. + p = p[:len(p):len(p)] + + // Fast path. Check for and skip 8 bytes of ASCII characters per iteration. + for len(p) >= 8 { + // Combining two 32 bit loads allows the same code to be used + // for 32 and 64 bit platforms. + // The compiler can generate a 32bit load for first32 and second32 + // on many platforms. See test/codegen/memcombine.go. + first32 := uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24 + second32 := uint32(p[4]) | uint32(p[5])<<8 | uint32(p[6])<<16 | uint32(p[7])<<24 + if (first32|second32)&0x80808080 != 0 { + // Found a non ASCII byte (>= RuneSelf). + break + } + p = p[8:] + } + n := len(p) + for i := 0; i < n; { + pi := p[i] + if pi < RuneSelf { + i++ + continue + } + x := first[pi] + if x == xx { + return false // Illegal starter byte. + } + size := int(x & 7) + if i+size > n { + return false // Short or invalid. + } + accept := acceptRanges[x>>4] + if c := p[i+1]; c < accept.lo || accept.hi < c { + return false + } else if size == 2 { + } else if c := p[i+2]; c < locb || hicb < c { + return false + } else if size == 3 { + } else if c := p[i+3]; c < locb || hicb < c { + return false + } + i += size + } + return true +} + +// ValidString reports whether s consists entirely of valid UTF-8-encoded runes. +func ValidString(s string) bool { + // Fast path. Check for and skip 8 bytes of ASCII characters per iteration. + for len(s) >= 8 { + // Combining two 32 bit loads allows the same code to be used + // for 32 and 64 bit platforms. + // The compiler can generate a 32bit load for first32 and second32 + // on many platforms. See test/codegen/memcombine.go. + first32 := uint32(s[0]) | uint32(s[1])<<8 | uint32(s[2])<<16 | uint32(s[3])<<24 + second32 := uint32(s[4]) | uint32(s[5])<<8 | uint32(s[6])<<16 | uint32(s[7])<<24 + if (first32|second32)&0x80808080 != 0 { + // Found a non ASCII byte (>= RuneSelf). + break + } + s = s[8:] + } + n := len(s) + for i := 0; i < n; { + si := s[i] + if si < RuneSelf { + i++ + continue + } + x := first[si] + if x == xx { + return false // Illegal starter byte. + } + size := int(x & 7) + if i+size > n { + return false // Short or invalid. + } + accept := acceptRanges[x>>4] + if c := s[i+1]; c < accept.lo || accept.hi < c { + return false + } else if size == 2 { + } else if c := s[i+2]; c < locb || hicb < c { + return false + } else if size == 3 { + } else if c := s[i+3]; c < locb || hicb < c { + return false + } + i += size + } + return true +} + +// ValidRune reports whether r can be legally encoded as UTF-8. +// Code points that are out of range or a surrogate half are illegal. +func ValidRune(r rune) bool { + switch { + case 0 <= r && r < surrogateMin: + return true + case surrogateMax < r && r <= MaxRune: + return true + } + return false +} diff --git a/src/unicode/utf8/utf8_test.go b/src/unicode/utf8/utf8_test.go new file mode 100644 index 0000000..19a04dc --- /dev/null +++ b/src/unicode/utf8/utf8_test.go @@ -0,0 +1,703 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package utf8_test + +import ( + "bytes" + "strings" + "testing" + "unicode" + . "unicode/utf8" +) + +// Validate the constants redefined from unicode. +func init() { + if MaxRune != unicode.MaxRune { + panic("utf8.MaxRune is wrong") + } + if RuneError != unicode.ReplacementChar { + panic("utf8.RuneError is wrong") + } +} + +// Validate the constants redefined from unicode. +func TestConstants(t *testing.T) { + if MaxRune != unicode.MaxRune { + t.Errorf("utf8.MaxRune is wrong: %x should be %x", MaxRune, unicode.MaxRune) + } + if RuneError != unicode.ReplacementChar { + t.Errorf("utf8.RuneError is wrong: %x should be %x", RuneError, unicode.ReplacementChar) + } +} + +type Utf8Map struct { + r rune + str string +} + +var utf8map = []Utf8Map{ + {0x0000, "\x00"}, + {0x0001, "\x01"}, + {0x007e, "\x7e"}, + {0x007f, "\x7f"}, + {0x0080, "\xc2\x80"}, + {0x0081, "\xc2\x81"}, + {0x00bf, "\xc2\xbf"}, + {0x00c0, "\xc3\x80"}, + {0x00c1, "\xc3\x81"}, + {0x00c8, "\xc3\x88"}, + {0x00d0, "\xc3\x90"}, + {0x00e0, "\xc3\xa0"}, + {0x00f0, "\xc3\xb0"}, + {0x00f8, "\xc3\xb8"}, + {0x00ff, "\xc3\xbf"}, + {0x0100, "\xc4\x80"}, + {0x07ff, "\xdf\xbf"}, + {0x0400, "\xd0\x80"}, + {0x0800, "\xe0\xa0\x80"}, + {0x0801, "\xe0\xa0\x81"}, + {0x1000, "\xe1\x80\x80"}, + {0xd000, "\xed\x80\x80"}, + {0xd7ff, "\xed\x9f\xbf"}, // last code point before surrogate half. + {0xe000, "\xee\x80\x80"}, // first code point after surrogate half. + {0xfffe, "\xef\xbf\xbe"}, + {0xffff, "\xef\xbf\xbf"}, + {0x10000, "\xf0\x90\x80\x80"}, + {0x10001, "\xf0\x90\x80\x81"}, + {0x40000, "\xf1\x80\x80\x80"}, + {0x10fffe, "\xf4\x8f\xbf\xbe"}, + {0x10ffff, "\xf4\x8f\xbf\xbf"}, + {0xFFFD, "\xef\xbf\xbd"}, +} + +var surrogateMap = []Utf8Map{ + {0xd800, "\xed\xa0\x80"}, // surrogate min decodes to (RuneError, 1) + {0xdfff, "\xed\xbf\xbf"}, // surrogate max decodes to (RuneError, 1) +} + +var testStrings = []string{ + "", + "abcd", + "☺☻☹", + "日a本b語ç日ð本Ê語þ日¥本¼語i日©", + "日a本b語ç日ð本Ê語þ日¥本¼語i日©日a本b語ç日ð本Ê語þ日¥本¼語i日©日a本b語ç日ð本Ê語þ日¥本¼語i日©", + "\x80\x80\x80\x80", +} + +func TestFullRune(t *testing.T) { + for _, m := range utf8map { + b := []byte(m.str) + if !FullRune(b) { + t.Errorf("FullRune(%q) (%U) = false, want true", b, m.r) + } + s := m.str + if !FullRuneInString(s) { + t.Errorf("FullRuneInString(%q) (%U) = false, want true", s, m.r) + } + b1 := b[0 : len(b)-1] + if FullRune(b1) { + t.Errorf("FullRune(%q) = true, want false", b1) + } + s1 := string(b1) + if FullRuneInString(s1) { + t.Errorf("FullRune(%q) = true, want false", s1) + } + } + for _, s := range []string{"\xc0", "\xc1"} { + b := []byte(s) + if !FullRune(b) { + t.Errorf("FullRune(%q) = false, want true", s) + } + if !FullRuneInString(s) { + t.Errorf("FullRuneInString(%q) = false, want true", s) + } + } +} + +func TestEncodeRune(t *testing.T) { + for _, m := range utf8map { + b := []byte(m.str) + var buf [10]byte + n := EncodeRune(buf[0:], m.r) + b1 := buf[0:n] + if !bytes.Equal(b, b1) { + t.Errorf("EncodeRune(%#04x) = %q want %q", m.r, b1, b) + } + } +} + +func TestAppendRune(t *testing.T) { + for _, m := range utf8map { + if buf := AppendRune(nil, m.r); string(buf) != m.str { + t.Errorf("AppendRune(nil, %#04x) = %s, want %s", m.r, buf, m.str) + } + if buf := AppendRune([]byte("init"), m.r); string(buf) != "init"+m.str { + t.Errorf("AppendRune(init, %#04x) = %s, want %s", m.r, buf, "init"+m.str) + } + } +} + +func TestDecodeRune(t *testing.T) { + for _, m := range utf8map { + b := []byte(m.str) + r, size := DecodeRune(b) + if r != m.r || size != len(b) { + t.Errorf("DecodeRune(%q) = %#04x, %d want %#04x, %d", b, r, size, m.r, len(b)) + } + s := m.str + r, size = DecodeRuneInString(s) + if r != m.r || size != len(b) { + t.Errorf("DecodeRuneInString(%q) = %#04x, %d want %#04x, %d", s, r, size, m.r, len(b)) + } + + // there's an extra byte that bytes left behind - make sure trailing byte works + r, size = DecodeRune(b[0:cap(b)]) + if r != m.r || size != len(b) { + t.Errorf("DecodeRune(%q) = %#04x, %d want %#04x, %d", b, r, size, m.r, len(b)) + } + s = m.str + "\x00" + r, size = DecodeRuneInString(s) + if r != m.r || size != len(b) { + t.Errorf("DecodeRuneInString(%q) = %#04x, %d want %#04x, %d", s, r, size, m.r, len(b)) + } + + // make sure missing bytes fail + wantsize := 1 + if wantsize >= len(b) { + wantsize = 0 + } + r, size = DecodeRune(b[0 : len(b)-1]) + if r != RuneError || size != wantsize { + t.Errorf("DecodeRune(%q) = %#04x, %d want %#04x, %d", b[0:len(b)-1], r, size, RuneError, wantsize) + } + s = m.str[0 : len(m.str)-1] + r, size = DecodeRuneInString(s) + if r != RuneError || size != wantsize { + t.Errorf("DecodeRuneInString(%q) = %#04x, %d want %#04x, %d", s, r, size, RuneError, wantsize) + } + + // make sure bad sequences fail + if len(b) == 1 { + b[0] = 0x80 + } else { + b[len(b)-1] = 0x7F + } + r, size = DecodeRune(b) + if r != RuneError || size != 1 { + t.Errorf("DecodeRune(%q) = %#04x, %d want %#04x, %d", b, r, size, RuneError, 1) + } + s = string(b) + r, size = DecodeRuneInString(s) + if r != RuneError || size != 1 { + t.Errorf("DecodeRuneInString(%q) = %#04x, %d want %#04x, %d", s, r, size, RuneError, 1) + } + + } +} + +func TestDecodeSurrogateRune(t *testing.T) { + for _, m := range surrogateMap { + b := []byte(m.str) + r, size := DecodeRune(b) + if r != RuneError || size != 1 { + t.Errorf("DecodeRune(%q) = %x, %d want %x, %d", b, r, size, RuneError, 1) + } + s := m.str + r, size = DecodeRuneInString(s) + if r != RuneError || size != 1 { + t.Errorf("DecodeRuneInString(%q) = %x, %d want %x, %d", b, r, size, RuneError, 1) + } + } +} + +// Check that DecodeRune and DecodeLastRune correspond to +// the equivalent range loop. +func TestSequencing(t *testing.T) { + for _, ts := range testStrings { + for _, m := range utf8map { + for _, s := range []string{ts + m.str, m.str + ts, ts + m.str + ts} { + testSequence(t, s) + } + } + } +} + +func runtimeRuneCount(s string) int { + return len([]rune(s)) // Replaced by gc with call to runtime.countrunes(s). +} + +// Check that a range loop, len([]rune(string)) optimization and +// []rune conversions visit the same runes. +// Not really a test of this package, but the assumption is used here and +// it's good to verify. +func TestRuntimeConversion(t *testing.T) { + for _, ts := range testStrings { + count := RuneCountInString(ts) + if n := runtimeRuneCount(ts); n != count { + t.Errorf("%q: len([]rune()) counted %d runes; got %d from RuneCountInString", ts, n, count) + break + } + + runes := []rune(ts) + if n := len(runes); n != count { + t.Errorf("%q: []rune() has length %d; got %d from RuneCountInString", ts, n, count) + break + } + i := 0 + for _, r := range ts { + if r != runes[i] { + t.Errorf("%q[%d]: expected %c (%U); got %c (%U)", ts, i, runes[i], runes[i], r, r) + } + i++ + } + } +} + +var invalidSequenceTests = []string{ + "\xed\xa0\x80\x80", // surrogate min + "\xed\xbf\xbf\x80", // surrogate max + + // xx + "\x91\x80\x80\x80", + + // s1 + "\xC2\x7F\x80\x80", + "\xC2\xC0\x80\x80", + "\xDF\x7F\x80\x80", + "\xDF\xC0\x80\x80", + + // s2 + "\xE0\x9F\xBF\x80", + "\xE0\xA0\x7F\x80", + "\xE0\xBF\xC0\x80", + "\xE0\xC0\x80\x80", + + // s3 + "\xE1\x7F\xBF\x80", + "\xE1\x80\x7F\x80", + "\xE1\xBF\xC0\x80", + "\xE1\xC0\x80\x80", + + //s4 + "\xED\x7F\xBF\x80", + "\xED\x80\x7F\x80", + "\xED\x9F\xC0\x80", + "\xED\xA0\x80\x80", + + // s5 + "\xF0\x8F\xBF\xBF", + "\xF0\x90\x7F\xBF", + "\xF0\x90\x80\x7F", + "\xF0\xBF\xBF\xC0", + "\xF0\xBF\xC0\x80", + "\xF0\xC0\x80\x80", + + // s6 + "\xF1\x7F\xBF\xBF", + "\xF1\x80\x7F\xBF", + "\xF1\x80\x80\x7F", + "\xF1\xBF\xBF\xC0", + "\xF1\xBF\xC0\x80", + "\xF1\xC0\x80\x80", + + // s7 + "\xF4\x7F\xBF\xBF", + "\xF4\x80\x7F\xBF", + "\xF4\x80\x80\x7F", + "\xF4\x8F\xBF\xC0", + "\xF4\x8F\xC0\x80", + "\xF4\x90\x80\x80", +} + +func runtimeDecodeRune(s string) rune { + for _, r := range s { + return r + } + return -1 +} + +func TestDecodeInvalidSequence(t *testing.T) { + for _, s := range invalidSequenceTests { + r1, _ := DecodeRune([]byte(s)) + if want := RuneError; r1 != want { + t.Errorf("DecodeRune(%#x) = %#04x, want %#04x", s, r1, want) + return + } + r2, _ := DecodeRuneInString(s) + if want := RuneError; r2 != want { + t.Errorf("DecodeRuneInString(%q) = %#04x, want %#04x", s, r2, want) + return + } + if r1 != r2 { + t.Errorf("DecodeRune(%#x) = %#04x mismatch with DecodeRuneInString(%q) = %#04x", s, r1, s, r2) + return + } + r3 := runtimeDecodeRune(s) + if r2 != r3 { + t.Errorf("DecodeRuneInString(%q) = %#04x mismatch with runtime.decoderune(%q) = %#04x", s, r2, s, r3) + return + } + } +} + +func testSequence(t *testing.T, s string) { + type info struct { + index int + r rune + } + index := make([]info, len(s)) + b := []byte(s) + si := 0 + j := 0 + for i, r := range s { + if si != i { + t.Errorf("Sequence(%q) mismatched index %d, want %d", s, si, i) + return + } + index[j] = info{i, r} + j++ + r1, size1 := DecodeRune(b[i:]) + if r != r1 { + t.Errorf("DecodeRune(%q) = %#04x, want %#04x", s[i:], r1, r) + return + } + r2, size2 := DecodeRuneInString(s[i:]) + if r != r2 { + t.Errorf("DecodeRuneInString(%q) = %#04x, want %#04x", s[i:], r2, r) + return + } + if size1 != size2 { + t.Errorf("DecodeRune/DecodeRuneInString(%q) size mismatch %d/%d", s[i:], size1, size2) + return + } + si += size1 + } + j-- + for si = len(s); si > 0; { + r1, size1 := DecodeLastRune(b[0:si]) + r2, size2 := DecodeLastRuneInString(s[0:si]) + if size1 != size2 { + t.Errorf("DecodeLastRune/DecodeLastRuneInString(%q, %d) size mismatch %d/%d", s, si, size1, size2) + return + } + if r1 != index[j].r { + t.Errorf("DecodeLastRune(%q, %d) = %#04x, want %#04x", s, si, r1, index[j].r) + return + } + if r2 != index[j].r { + t.Errorf("DecodeLastRuneInString(%q, %d) = %#04x, want %#04x", s, si, r2, index[j].r) + return + } + si -= size1 + if si != index[j].index { + t.Errorf("DecodeLastRune(%q) index mismatch at %d, want %d", s, si, index[j].index) + return + } + j-- + } + if si != 0 { + t.Errorf("DecodeLastRune(%q) finished at %d, not 0", s, si) + } +} + +// Check that negative runes encode as U+FFFD. +func TestNegativeRune(t *testing.T) { + errorbuf := make([]byte, UTFMax) + errorbuf = errorbuf[0:EncodeRune(errorbuf, RuneError)] + buf := make([]byte, UTFMax) + buf = buf[0:EncodeRune(buf, -1)] + if !bytes.Equal(buf, errorbuf) { + t.Errorf("incorrect encoding [% x] for -1; expected [% x]", buf, errorbuf) + } +} + +type RuneCountTest struct { + in string + out int +} + +var runecounttests = []RuneCountTest{ + {"abcd", 4}, + {"☺☻☹", 3}, + {"1,2,3,4", 7}, + {"\xe2\x00", 2}, + {"\xe2\x80", 2}, + {"a\xe2\x80", 3}, +} + +func TestRuneCount(t *testing.T) { + for _, tt := range runecounttests { + if out := RuneCountInString(tt.in); out != tt.out { + t.Errorf("RuneCountInString(%q) = %d, want %d", tt.in, out, tt.out) + } + if out := RuneCount([]byte(tt.in)); out != tt.out { + t.Errorf("RuneCount(%q) = %d, want %d", tt.in, out, tt.out) + } + } +} + +type RuneLenTest struct { + r rune + size int +} + +var runelentests = []RuneLenTest{ + {0, 1}, + {'e', 1}, + {'é', 2}, + {'☺', 3}, + {RuneError, 3}, + {MaxRune, 4}, + {0xD800, -1}, + {0xDFFF, -1}, + {MaxRune + 1, -1}, + {-1, -1}, +} + +func TestRuneLen(t *testing.T) { + for _, tt := range runelentests { + if size := RuneLen(tt.r); size != tt.size { + t.Errorf("RuneLen(%#U) = %d, want %d", tt.r, size, tt.size) + } + } +} + +type ValidTest struct { + in string + out bool +} + +var validTests = []ValidTest{ + {"", true}, + {"a", true}, + {"abc", true}, + {"Ж", true}, + {"ЖЖ", true}, + {"брэд-ЛГТМ", true}, + {"☺☻☹", true}, + {"aa\xe2", false}, + {string([]byte{66, 250}), false}, + {string([]byte{66, 250, 67}), false}, + {"a\uFFFDb", true}, + {string("\xF4\x8F\xBF\xBF"), true}, // U+10FFFF + {string("\xF4\x90\x80\x80"), false}, // U+10FFFF+1; out of range + {string("\xF7\xBF\xBF\xBF"), false}, // 0x1FFFFF; out of range + {string("\xFB\xBF\xBF\xBF\xBF"), false}, // 0x3FFFFFF; out of range + {string("\xc0\x80"), false}, // U+0000 encoded in two bytes: incorrect + {string("\xed\xa0\x80"), false}, // U+D800 high surrogate (sic) + {string("\xed\xbf\xbf"), false}, // U+DFFF low surrogate (sic) +} + +func TestValid(t *testing.T) { + for _, tt := range validTests { + if Valid([]byte(tt.in)) != tt.out { + t.Errorf("Valid(%q) = %v; want %v", tt.in, !tt.out, tt.out) + } + if ValidString(tt.in) != tt.out { + t.Errorf("ValidString(%q) = %v; want %v", tt.in, !tt.out, tt.out) + } + } +} + +type ValidRuneTest struct { + r rune + ok bool +} + +var validrunetests = []ValidRuneTest{ + {0, true}, + {'e', true}, + {'é', true}, + {'☺', true}, + {RuneError, true}, + {MaxRune, true}, + {0xD7FF, true}, + {0xD800, false}, + {0xDFFF, false}, + {0xE000, true}, + {MaxRune + 1, false}, + {-1, false}, +} + +func TestValidRune(t *testing.T) { + for _, tt := range validrunetests { + if ok := ValidRune(tt.r); ok != tt.ok { + t.Errorf("ValidRune(%#U) = %t, want %t", tt.r, ok, tt.ok) + } + } +} + +func BenchmarkRuneCountTenASCIIChars(b *testing.B) { + s := []byte("0123456789") + for i := 0; i < b.N; i++ { + RuneCount(s) + } +} + +func BenchmarkRuneCountTenJapaneseChars(b *testing.B) { + s := []byte("日本語日本語日本語日") + for i := 0; i < b.N; i++ { + RuneCount(s) + } +} + +func BenchmarkRuneCountInStringTenASCIIChars(b *testing.B) { + for i := 0; i < b.N; i++ { + RuneCountInString("0123456789") + } +} + +func BenchmarkRuneCountInStringTenJapaneseChars(b *testing.B) { + for i := 0; i < b.N; i++ { + RuneCountInString("日本語日本語日本語日") + } +} + +var ascii100000 = strings.Repeat("0123456789", 10000) + +func BenchmarkValidTenASCIIChars(b *testing.B) { + s := []byte("0123456789") + for i := 0; i < b.N; i++ { + Valid(s) + } +} + +func BenchmarkValid100KASCIIChars(b *testing.B) { + s := []byte(ascii100000) + for i := 0; i < b.N; i++ { + Valid(s) + } +} + +func BenchmarkValidTenJapaneseChars(b *testing.B) { + s := []byte("日本語日本語日本語日") + for i := 0; i < b.N; i++ { + Valid(s) + } +} +func BenchmarkValidLongMostlyASCII(b *testing.B) { + longMostlyASCII := []byte(longStringMostlyASCII) + for i := 0; i < b.N; i++ { + Valid(longMostlyASCII) + } +} + +func BenchmarkValidLongJapanese(b *testing.B) { + longJapanese := []byte(longStringJapanese) + for i := 0; i < b.N; i++ { + Valid(longJapanese) + } +} + +func BenchmarkValidStringTenASCIIChars(b *testing.B) { + for i := 0; i < b.N; i++ { + ValidString("0123456789") + } +} + +func BenchmarkValidString100KASCIIChars(b *testing.B) { + for i := 0; i < b.N; i++ { + ValidString(ascii100000) + } +} + +func BenchmarkValidStringTenJapaneseChars(b *testing.B) { + for i := 0; i < b.N; i++ { + ValidString("日本語日本語日本語日") + } +} + +func BenchmarkValidStringLongMostlyASCII(b *testing.B) { + for i := 0; i < b.N; i++ { + ValidString(longStringMostlyASCII) + } +} + +func BenchmarkValidStringLongJapanese(b *testing.B) { + for i := 0; i < b.N; i++ { + ValidString(longStringJapanese) + } +} + +var longStringMostlyASCII string // ~100KB, ~97% ASCII +var longStringJapanese string // ~100KB, non-ASCII + +func init() { + const japanese = "日本語日本語日本語日" + var b strings.Builder + for i := 0; b.Len() < 100_000; i++ { + if i%100 == 0 { + b.WriteString(japanese) + } else { + b.WriteString("0123456789") + } + } + longStringMostlyASCII = b.String() + longStringJapanese = strings.Repeat(japanese, 100_000/len(japanese)) +} + +func BenchmarkEncodeASCIIRune(b *testing.B) { + buf := make([]byte, UTFMax) + for i := 0; i < b.N; i++ { + EncodeRune(buf, 'a') + } +} + +func BenchmarkEncodeJapaneseRune(b *testing.B) { + buf := make([]byte, UTFMax) + for i := 0; i < b.N; i++ { + EncodeRune(buf, '本') + } +} + +func BenchmarkAppendASCIIRune(b *testing.B) { + buf := make([]byte, UTFMax) + for i := 0; i < b.N; i++ { + AppendRune(buf[:0], 'a') + } +} + +func BenchmarkAppendJapaneseRune(b *testing.B) { + buf := make([]byte, UTFMax) + for i := 0; i < b.N; i++ { + AppendRune(buf[:0], '本') + } +} + +func BenchmarkDecodeASCIIRune(b *testing.B) { + a := []byte{'a'} + for i := 0; i < b.N; i++ { + DecodeRune(a) + } +} + +func BenchmarkDecodeJapaneseRune(b *testing.B) { + nihon := []byte("本") + for i := 0; i < b.N; i++ { + DecodeRune(nihon) + } +} + +// boolSink is used to reference the return value of benchmarked +// functions to avoid dead code elimination. +var boolSink bool + +func BenchmarkFullRune(b *testing.B) { + benchmarks := []struct { + name string + data []byte + }{ + {"ASCII", []byte("a")}, + {"Incomplete", []byte("\xf0\x90\x80")}, + {"Japanese", []byte("本")}, + } + for _, bm := range benchmarks { + b.Run(bm.name, func(b *testing.B) { + for i := 0; i < b.N; i++ { + boolSink = FullRune(bm.data) + } + }) + } +} |