re2js 2.0.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -30
- package/build/index.cjs.cjs +1866 -414
- package/build/index.cjs.cjs.map +1 -1
- package/build/index.esm.d.ts +71 -0
- package/build/index.esm.d.ts.map +1 -1
- package/build/index.esm.js +1865 -415
- package/build/index.esm.js.map +1 -1
- package/build/index.umd.js +1866 -414
- package/build/index.umd.js.map +1 -1
- package/package.json +4 -4
package/build/index.esm.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* re2js
|
|
3
3
|
* RE2JS is the JavaScript port of RE2, a regular expression engine that provides linear time matching
|
|
4
4
|
*
|
|
5
|
-
* @version v2.0
|
|
5
|
+
* @version v2.1.0
|
|
6
6
|
* @author Alexey Vasiliev
|
|
7
7
|
* @homepage https://github.com/le0pard/re2js#readme
|
|
8
8
|
* @repository github:le0pard/re2js
|
|
@@ -54,6 +54,23 @@ class RE2Flags {
|
|
|
54
54
|
/**
|
|
55
55
|
* Various constants and helper for unicode codepoints.
|
|
56
56
|
*/
|
|
57
|
+
const ASCII_SIZE = 128;
|
|
58
|
+
const ASCII_TO_UPPER = new Int32Array(ASCII_SIZE);
|
|
59
|
+
const ASCII_TO_LOWER = new Int32Array(ASCII_SIZE);
|
|
60
|
+
for (let i = 0; i < ASCII_SIZE; i++) {
|
|
61
|
+
if (i >= 97 && i <= 122) {
|
|
62
|
+
// a-z
|
|
63
|
+
ASCII_TO_UPPER[i] = i - 32;
|
|
64
|
+
} else {
|
|
65
|
+
ASCII_TO_UPPER[i] = i;
|
|
66
|
+
}
|
|
67
|
+
if (i >= 65 && i <= 90) {
|
|
68
|
+
// A-Z
|
|
69
|
+
ASCII_TO_LOWER[i] = i + 32;
|
|
70
|
+
} else {
|
|
71
|
+
ASCII_TO_LOWER[i] = i;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
57
74
|
class Codepoint {
|
|
58
75
|
// codePointAt(0)
|
|
59
76
|
static CODES = new Map([['\x07', 7], ['\b', 8], ['\t', 9], ['\n', 10], ['\v', 11], ['\f', 12], ['\r', 13], [' ', 32], ['"', 34], ['$', 36], ['&', 38], ['(', 40], [')', 41], ['*', 42], ['+', 43], ['-', 45], ['.', 46], ['0', 48], ['1', 49], ['2', 50], ['3', 51], ['4', 52], ['5', 53], ['6', 54], ['7', 55], ['8', 56], ['9', 57], [':', 58], ['<', 60], ['>', 62], ['?', 63], ['A', 65], ['B', 66], ['C', 67], ['F', 70], ['P', 80], ['Q', 81], ['U', 85], ['Z', 90], ['[', 91], ['\\', 92], [']', 93], ['^', 94], ['_', 95], ['a', 97], ['b', 98], ['f', 102], ['i', 105], ['m', 109], ['n', 110], ['r', 114], ['s', 115], ['t', 116], ['v', 118], ['x', 120], ['z', 122], ['{', 123], ['|', 124], ['}', 125]]);
|
|
@@ -61,6 +78,7 @@ class Codepoint {
|
|
|
61
78
|
// convert unicode codepoint to upper case codepoint
|
|
62
79
|
// return same codepoint, if cannot do it (or codepoint not have upper variation)
|
|
63
80
|
static toUpperCase(codepoint) {
|
|
81
|
+
if (codepoint < ASCII_SIZE) return ASCII_TO_UPPER[codepoint];
|
|
64
82
|
const s = String.fromCodePoint(codepoint).toUpperCase();
|
|
65
83
|
if (s.length > 1) {
|
|
66
84
|
return codepoint;
|
|
@@ -75,6 +93,7 @@ class Codepoint {
|
|
|
75
93
|
// convert unicode codepoint to lower case codepoint
|
|
76
94
|
// return same codepoint, if cannot do it (or codepoint not have lower variation)
|
|
77
95
|
static toLowerCase(codepoint) {
|
|
96
|
+
if (codepoint < ASCII_SIZE) return ASCII_TO_LOWER[codepoint];
|
|
78
97
|
const s = String.fromCodePoint(codepoint).toLowerCase();
|
|
79
98
|
if (s.length > 1) {
|
|
80
99
|
return codepoint;
|
|
@@ -88,9 +107,10 @@ class Codepoint {
|
|
|
88
107
|
}
|
|
89
108
|
|
|
90
109
|
class UnicodeRangeTable {
|
|
91
|
-
|
|
92
|
-
constructor(data) {
|
|
110
|
+
constructor(data, isStride1 = false) {
|
|
93
111
|
this.data = data; // A Uint32Array
|
|
112
|
+
this.isStride1 = isStride1;
|
|
113
|
+
this.SIZE = isStride1 ? 2 : 3;
|
|
94
114
|
}
|
|
95
115
|
|
|
96
116
|
// High-performance getters that do NOT allocate memory
|
|
@@ -101,14 +121,11 @@ class UnicodeRangeTable {
|
|
|
101
121
|
return this.data[index * this.SIZE + 1];
|
|
102
122
|
}
|
|
103
123
|
getStride(index) {
|
|
104
|
-
return this.data[index * this.SIZE + 2];
|
|
124
|
+
return this.isStride1 ? 1 : this.data[index * this.SIZE + 2];
|
|
105
125
|
}
|
|
106
|
-
|
|
107
|
-
// Convenience getter (slower, for debugging or non-critical paths)
|
|
108
126
|
get(index) {
|
|
109
127
|
const i = index * this.SIZE;
|
|
110
|
-
|
|
111
|
-
return [this.data[i], this.data[i + 1], this.data[i + 2]];
|
|
128
|
+
return [this.data[i], this.data[i + 1], this.getStride(index)];
|
|
112
129
|
}
|
|
113
130
|
get length() {
|
|
114
131
|
return this.data.length / this.SIZE;
|
|
@@ -118,229 +135,317 @@ class UnicodeRangeTable {
|
|
|
118
135
|
// GENERATED BY tools/scripts/genUnicodeTable.js; DO NOT EDIT.
|
|
119
136
|
// yarn node ./tools/scripts/genUnicodeTable.js > src/UnicodeTables.js
|
|
120
137
|
|
|
138
|
+
const B64_MAP = new Uint8Array(256);
|
|
139
|
+
for (let i = 0, b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-'; i < 64; i++) {
|
|
140
|
+
B64_MAP[b.charCodeAt(i)] = i;
|
|
141
|
+
}
|
|
142
|
+
const decodeVLQ = str => {
|
|
143
|
+
const res = [];
|
|
144
|
+
let value = 0,
|
|
145
|
+
shift = 0;
|
|
146
|
+
for (let i = 0; i < str.length; i++) {
|
|
147
|
+
let digit = B64_MAP[str.charCodeAt(i)];
|
|
148
|
+
value |= (digit & 0x1f) << shift;
|
|
149
|
+
if ((digit & 0x20) === 0) {
|
|
150
|
+
res.push(value);
|
|
151
|
+
value = 0;
|
|
152
|
+
shift = 0;
|
|
153
|
+
} else {
|
|
154
|
+
shift += 5;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return res;
|
|
158
|
+
};
|
|
159
|
+
const decodeRanges = (str, isStride1) => {
|
|
160
|
+
const res = decodeVLQ(str);
|
|
161
|
+
const numRanges = isStride1 ? res.length / 2 : res.length / 3;
|
|
162
|
+
const out = new Uint32Array(numRanges * 3);
|
|
163
|
+
let current = 0,
|
|
164
|
+
resIdx = 0;
|
|
165
|
+
for (let i = 0; i < numRanges; i++) {
|
|
166
|
+
current += res[resIdx++];
|
|
167
|
+
out[i * 3] = current;
|
|
168
|
+
current += res[resIdx++];
|
|
169
|
+
out[i * 3 + 1] = current;
|
|
170
|
+
out[i * 3 + 2] = isStride1 ? 1 : res[resIdx++];
|
|
171
|
+
}
|
|
172
|
+
return out;
|
|
173
|
+
};
|
|
174
|
+
const decodeOrbit = str => {
|
|
175
|
+
const res = decodeVLQ(str);
|
|
176
|
+
const map = new Map();
|
|
177
|
+
let currentKey = 0;
|
|
178
|
+
for (let i = 0; i < res.length; i += 2) {
|
|
179
|
+
currentKey += res[i];
|
|
180
|
+
map.set(currentKey, res[i + 1]);
|
|
181
|
+
}
|
|
182
|
+
return map;
|
|
183
|
+
};
|
|
184
|
+
class LazyMap {
|
|
185
|
+
constructor(initializer) {
|
|
186
|
+
this.initializer = initializer;
|
|
187
|
+
this.cache = new Map();
|
|
188
|
+
}
|
|
189
|
+
has(key) {
|
|
190
|
+
return key in this.initializer;
|
|
191
|
+
}
|
|
192
|
+
get(key) {
|
|
193
|
+
if (this.cache.has(key)) return this.cache.get(key);
|
|
194
|
+
const fn = this.initializer[key];
|
|
195
|
+
const val = fn ? fn() : null;
|
|
196
|
+
this.cache.set(key, val);
|
|
197
|
+
return val;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
121
200
|
class UnicodeTables {
|
|
122
|
-
static CASE_ORBIT = new Map([[75, 107], [107, 8490], [8490, 75], [83, 115], [115, 383], [383, 83], [181, 924], [924, 956], [956, 181], [197, 229], [229, 8491], [8491, 197], [452, 453], [453, 454], [454, 452], [455, 456], [456, 457], [457, 455], [458, 459], [459, 460], [460, 458], [497, 498], [498, 499], [499, 497], [837, 921], [921, 953], [953, 8126], [8126, 837], [914, 946], [946, 976], [976, 914], [917, 949], [949, 1013], [1013, 917], [920, 952], [952, 977], [977, 1012], [1012, 920], [922, 954], [954, 1008], [1008, 922], [928, 960], [960, 982], [982, 928], [929, 961], [961, 1009], [1009, 929], [931, 962], [962, 963], [963, 931], [934, 966], [966, 981], [981, 934], [937, 969], [969, 8486], [8486, 937], [1042, 1074], [1074, 7296], [7296, 1042], [1044, 1076], [1076, 7297], [7297, 1044], [1054, 1086], [1086, 7298], [7298, 1054], [1057, 1089], [1089, 7299], [7299, 1057], [1058, 1090], [1090, 7300], [7300, 7301], [7301, 1058], [1066, 1098], [1098, 7302], [7302, 1066], [1122, 1123], [1123, 7303], [7303, 1122], [7304, 42570], [42570, 42571], [42571, 7304], [7776, 7777], [7777, 7835], [7835, 7776], [223, 7838], [7838, 223], [8064, 8072], [8072, 8064], [8065, 8073], [8073, 8065], [8066, 8074], [8074, 8066], [8067, 8075], [8075, 8067], [8068, 8076], [8076, 8068], [8069, 8077], [8077, 8069], [8070, 8078], [8078, 8070], [8071, 8079], [8079, 8071], [8080, 8088], [8088, 8080], [8081, 8089], [8089, 8081], [8082, 8090], [8090, 8082], [8083, 8091], [8091, 8083], [8084, 8092], [8092, 8084], [8085, 8093], [8093, 8085], [8086, 8094], [8094, 8086], [8087, 8095], [8095, 8087], [8096, 8104], [8104, 8096], [8097, 8105], [8105, 8097], [8098, 8106], [8106, 8098], [8099, 8107], [8107, 8099], [8100, 8108], [8108, 8100], [8101, 8109], [8109, 8101], [8102, 8110], [8110, 8102], [8103, 8111], [8111, 8103], [8115, 8124], [8124, 8115], [8131, 8140], [8140, 8131], [912, 8147], [8147, 912], [944, 8163], [8163, 944], [8179, 8188], [8188, 8179], [64261, 64262], [64262, 64261], [66560, 66600], [66600, 66560], [66561, 66601], [66601, 66561], [66562, 66602], [66602, 66562], [66563, 66603], [66603, 66563], [66564, 66604], [66604, 66564], [66565, 66605], [66605, 66565], [66566, 66606], [66606, 66566], [66567, 66607], [66607, 66567], [66568, 66608], [66608, 66568], [66569, 66609], [66609, 66569], [66570, 66610], [66610, 66570], [66571, 66611], [66611, 66571], [66572, 66612], [66612, 66572], [66573, 66613], [66613, 66573], [66574, 66614], [66614, 66574], [66575, 66615], [66615, 66575], [66576, 66616], [66616, 66576], [66577, 66617], [66617, 66577], [66578, 66618], [66618, 66578], [66579, 66619], [66619, 66579], [66580, 66620], [66620, 66580], [66581, 66621], [66621, 66581], [66582, 66622], [66622, 66582], [66583, 66623], [66623, 66583], [66584, 66624], [66624, 66584], [66585, 66625], [66625, 66585], [66586, 66626], [66626, 66586], [66587, 66627], [66627, 66587], [66588, 66628], [66628, 66588], [66589, 66629], [66629, 66589], [66590, 66630], [66630, 66590], [66591, 66631], [66631, 66591], [66592, 66632], [66632, 66592], [66593, 66633], [66633, 66593], [66594, 66634], [66634, 66594], [66595, 66635], [66635, 66595], [66596, 66636], [66636, 66596], [66597, 66637], [66637, 66597], [66598, 66638], [66638, 66598], [66599, 66639], [66639, 66599], [66736, 66776], [66776, 66736], [66737, 66777], [66777, 66737], [66738, 66778], [66778, 66738], [66739, 66779], [66779, 66739], [66740, 66780], [66780, 66740], [66741, 66781], [66781, 66741], [66742, 66782], [66782, 66742], [66743, 66783], [66783, 66743], [66744, 66784], [66784, 66744], [66745, 66785], [66785, 66745], [66746, 66786], [66786, 66746], [66747, 66787], [66787, 66747], [66748, 66788], [66788, 66748], [66749, 66789], [66789, 66749], [66750, 66790], [66790, 66750], [66751, 66791], [66791, 66751], [66752, 66792], [66792, 66752], [66753, 66793], [66793, 66753], [66754, 66794], [66794, 66754], [66755, 66795], [66795, 66755], [66756, 66796], [66796, 66756], [66757, 66797], [66797, 66757], [66758, 66798], [66798, 66758], [66759, 66799], [66799, 66759], [66760, 66800], [66800, 66760], [66761, 66801], [66801, 66761], [66762, 66802], [66802, 66762], [66763, 66803], [66803, 66763], [66764, 66804], [66804, 66764], [66765, 66805], [66805, 66765], [66766, 66806], [66806, 66766], [66767, 66807], [66807, 66767], [66768, 66808], [66808, 66768], [66769, 66809], [66809, 66769], [66770, 66810], [66810, 66770], [66771, 66811], [66811, 66771], [66928, 66967], [66967, 66928], [66929, 66968], [66968, 66929], [66930, 66969], [66969, 66930], [66931, 66970], [66970, 66931], [66932, 66971], [66971, 66932], [66933, 66972], [66972, 66933], [66934, 66973], [66973, 66934], [66935, 66974], [66974, 66935], [66936, 66975], [66975, 66936], [66937, 66976], [66976, 66937], [66938, 66977], [66977, 66938], [66940, 66979], [66979, 66940], [66941, 66980], [66980, 66941], [66942, 66981], [66981, 66942], [66943, 66982], [66982, 66943], [66944, 66983], [66983, 66944], [66945, 66984], [66984, 66945], [66946, 66985], [66985, 66946], [66947, 66986], [66986, 66947], [66948, 66987], [66987, 66948], [66949, 66988], [66988, 66949], [66950, 66989], [66989, 66950], [66951, 66990], [66990, 66951], [66952, 66991], [66991, 66952], [66953, 66992], [66992, 66953], [66954, 66993], [66993, 66954], [66956, 66995], [66995, 66956], [66957, 66996], [66996, 66957], [66958, 66997], [66997, 66958], [66959, 66998], [66998, 66959], [66960, 66999], [66999, 66960], [66961, 67000], [67000, 66961], [66962, 67001], [67001, 66962], [66964, 67003], [67003, 66964], [66965, 67004], [67004, 66965], [68736, 68800], [68800, 68736], [68737, 68801], [68801, 68737], [68738, 68802], [68802, 68738], [68739, 68803], [68803, 68739], [68740, 68804], [68804, 68740], [68741, 68805], [68805, 68741], [68742, 68806], [68806, 68742], [68743, 68807], [68807, 68743], [68744, 68808], [68808, 68744], [68745, 68809], [68809, 68745], [68746, 68810], [68810, 68746], [68747, 68811], [68811, 68747], [68748, 68812], [68812, 68748], [68749, 68813], [68813, 68749], [68750, 68814], [68814, 68750], [68751, 68815], [68815, 68751], [68752, 68816], [68816, 68752], [68753, 68817], [68817, 68753], [68754, 68818], [68818, 68754], [68755, 68819], [68819, 68755], [68756, 68820], [68820, 68756], [68757, 68821], [68821, 68757], [68758, 68822], [68822, 68758], [68759, 68823], [68823, 68759], [68760, 68824], [68824, 68760], [68761, 68825], [68825, 68761], [68762, 68826], [68826, 68762], [68763, 68827], [68827, 68763], [68764, 68828], [68828, 68764], [68765, 68829], [68829, 68765], [68766, 68830], [68830, 68766], [68767, 68831], [68831, 68767], [68768, 68832], [68832, 68768], [68769, 68833], [68833, 68769], [68770, 68834], [68834, 68770], [68771, 68835], [68835, 68771], [68772, 68836], [68836, 68772], [68773, 68837], [68837, 68773], [68774, 68838], [68838, 68774], [68775, 68839], [68839, 68775], [68776, 68840], [68840, 68776], [68777, 68841], [68841, 68777], [68778, 68842], [68842, 68778], [68779, 68843], [68843, 68779], [68780, 68844], [68844, 68780], [68781, 68845], [68845, 68781], [68782, 68846], [68846, 68782], [68783, 68847], [68847, 68783], [68784, 68848], [68848, 68784], [68785, 68849], [68849, 68785], [68786, 68850], [68850, 68786], [68944, 68976], [68976, 68944], [68945, 68977], [68977, 68945], [68946, 68978], [68978, 68946], [68947, 68979], [68979, 68947], [68948, 68980], [68980, 68948], [68949, 68981], [68981, 68949], [68950, 68982], [68982, 68950], [68951, 68983], [68983, 68951], [68952, 68984], [68984, 68952], [68953, 68985], [68985, 68953], [68954, 68986], [68986, 68954], [68955, 68987], [68987, 68955], [68956, 68988], [68988, 68956], [68957, 68989], [68989, 68957], [68958, 68990], [68990, 68958], [68959, 68991], [68991, 68959], [68960, 68992], [68992, 68960], [68961, 68993], [68993, 68961], [68962, 68994], [68994, 68962], [68963, 68995], [68995, 68963], [68964, 68996], [68996, 68964], [68965, 68997], [68997, 68965], [71840, 71872], [71872, 71840], [71841, 71873], [71873, 71841], [71842, 71874], [71874, 71842], [71843, 71875], [71875, 71843], [71844, 71876], [71876, 71844], [71845, 71877], [71877, 71845], [71846, 71878], [71878, 71846], [71847, 71879], [71879, 71847], [71848, 71880], [71880, 71848], [71849, 71881], [71881, 71849], [71850, 71882], [71882, 71850], [71851, 71883], [71883, 71851], [71852, 71884], [71884, 71852], [71853, 71885], [71885, 71853], [71854, 71886], [71886, 71854], [71855, 71887], [71887, 71855], [71856, 71888], [71888, 71856], [71857, 71889], [71889, 71857], [71858, 71890], [71890, 71858], [71859, 71891], [71891, 71859], [71860, 71892], [71892, 71860], [71861, 71893], [71893, 71861], [71862, 71894], [71894, 71862], [71863, 71895], [71895, 71863], [71864, 71896], [71896, 71864], [71865, 71897], [71897, 71865], [71866, 71898], [71898, 71866], [71867, 71899], [71899, 71867], [71868, 71900], [71900, 71868], [71869, 71901], [71901, 71869], [71870, 71902], [71902, 71870], [71871, 71903], [71903, 71871], [93760, 93792], [93792, 93760], [93761, 93793], [93793, 93761], [93762, 93794], [93794, 93762], [93763, 93795], [93795, 93763], [93764, 93796], [93796, 93764], [93765, 93797], [93797, 93765], [93766, 93798], [93798, 93766], [93767, 93799], [93799, 93767], [93768, 93800], [93800, 93768], [93769, 93801], [93801, 93769], [93770, 93802], [93802, 93770], [93771, 93803], [93803, 93771], [93772, 93804], [93804, 93772], [93773, 93805], [93805, 93773], [93774, 93806], [93806, 93774], [93775, 93807], [93807, 93775], [93776, 93808], [93808, 93776], [93777, 93809], [93809, 93777], [93778, 93810], [93810, 93778], [93779, 93811], [93811, 93779], [93780, 93812], [93812, 93780], [93781, 93813], [93813, 93781], [93782, 93814], [93814, 93782], [93783, 93815], [93815, 93783], [93784, 93816], [93816, 93784], [93785, 93817], [93817, 93785], [93786, 93818], [93818, 93786], [93787, 93819], [93819, 93787], [93788, 93820], [93820, 93788], [93789, 93821], [93821, 93789], [93790, 93822], [93822, 93790], [93791, 93823], [93823, 93791], [125184, 125218], [125218, 125184], [125185, 125219], [125219, 125185], [125186, 125220], [125220, 125186], [125187, 125221], [125221, 125187], [125188, 125222], [125222, 125188], [125189, 125223], [125223, 125189], [125190, 125224], [125224, 125190], [125191, 125225], [125225, 125191], [125192, 125226], [125226, 125192], [125193, 125227], [125227, 125193], [125194, 125228], [125228, 125194], [125195, 125229], [125229, 125195], [125196, 125230], [125230, 125196], [125197, 125231], [125231, 125197], [125198, 125232], [125232, 125198], [125199, 125233], [125233, 125199], [125200, 125234], [125234, 125200], [125201, 125235], [125235, 125201], [125202, 125236], [125236, 125202], [125203, 125237], [125237, 125203], [125204, 125238], [125238, 125204], [125205, 125239], [125239, 125205], [125206, 125240], [125240, 125206], [125207, 125241], [125241, 125207], [125208, 125242], [125242, 125208], [125209, 125243], [125243, 125209], [125210, 125244], [125244, 125210], [125211, 125245], [125245, 125211], [125212, 125246], [125246, 125212], [125213, 125247], [125247, 125213], [125214, 125248], [125248, 125214], [125215, 125249], [125249, 125215], [125216, 125250], [125250, 125216], [125217, 125251], [125251, 125217]]);
|
|
123
|
-
static C = new UnicodeRangeTable(new Uint32Array([0, 31, 1, 127, 159, 1, 173, 888, 715, 889, 896, 7, 897, 899, 1, 907, 909, 2, 930, 1328, 398, 1367, 1368, 1, 1419, 1420, 1, 1424, 1480, 56, 1481, 1487, 1, 1515, 1518, 1, 1525, 1541, 1, 1564, 1757, 193, 1806, 1807, 1, 1867, 1868, 1, 1970, 1983, 1, 2043, 2044, 1, 2094, 2095, 1, 2111, 2140, 29, 2141, 2143, 2, 2155, 2159, 1, 2191, 2198, 1, 2274, 2436, 162, 2445, 2446, 1, 2449, 2450, 1, 2473, 2481, 8, 2483, 2485, 1, 2490, 2491, 1, 2501, 2502, 1, 2505, 2506, 1, 2511, 2518, 1, 2520, 2523, 1, 2526, 2532, 6, 2533, 2559, 26, 2560, 2564, 4, 2571, 2574, 1, 2577, 2578, 1, 2601, 2609, 8, 2612, 2618, 3, 2619, 2621, 2, 2627, 2630, 1, 2633, 2634, 1, 2638, 2640, 1, 2642, 2648, 1, 2653, 2655, 2, 2656, 2661, 1, 2679, 2688, 1, 2692, 2702, 10, 2706, 2729, 23, 2737, 2740, 3, 2746, 2747, 1, 2758, 2766, 4, 2767, 2769, 2, 2770, 2783, 1, 2788, 2789, 1, 2802, 2808, 1, 2816, 2820, 4, 2829, 2830, 1, 2833, 2834, 1, 2857, 2865, 8, 2868, 2874, 6, 2875, 2885, 10, 2886, 2889, 3, 2890, 2894, 4, 2895, 2900, 1, 2904, 2907, 1, 2910, 2916, 6, 2917, 2936, 19, 2937, 2945, 1, 2948, 2955, 7, 2956, 2957, 1, 2961, 2966, 5, 2967, 2968, 1, 2971, 2973, 2, 2976, 2978, 1, 2981, 2983, 1, 2987, 2989, 1, 3002, 3005, 1, 3011, 3013, 1, 3017, 3022, 5, 3023, 3025, 2, 3026, 3030, 1, 3032, 3045, 1, 3067, 3071, 1, 3085, 3089, 4, 3113, 3130, 17, 3131, 3141, 10, 3145, 3150, 5, 3151, 3156, 1, 3159, 3163, 4, 3164, 3166, 2, 3167, 3172, 5, 3173, 3184, 11, 3185, 3190, 1, 3213, 3217, 4, 3241, 3252, 11, 3258, 3259, 1, 3269, 3273, 4, 3278, 3284, 1, 3287, 3292, 1, 3295, 3300, 5, 3301, 3312, 11, 3316, 3327, 1, 3341, 3345, 4, 3397, 3401, 4, 3408, 3411, 1, 3428, 3429, 1, 3456, 3460, 4, 3479, 3481, 1, 3506, 3516, 10, 3518, 3519, 1, 3527, 3529, 1, 3531, 3534, 1, 3541, 3543, 2, 3552, 3557, 1, 3568, 3569, 1, 3573, 3584, 1, 3643, 3646, 1, 3676, 3712, 1, 3715, 3717, 2, 3723, 3748, 25, 3750, 3774, 24, 3775, 3781, 6, 3783, 3791, 8, 3802, 3803, 1, 3808, 3839, 1, 3912, 3949, 37, 3950, 3952, 1, 3992, 4029, 37, 4045, 4059, 14, 4060, 4095, 1, 4294, 4296, 2, 4297, 4300, 1, 4302, 4303, 1, 4681, 4686, 5, 4687, 4695, 8, 4697, 4702, 5, 4703, 4745, 42, 4750, 4751, 1, 4785, 4790, 5, 4791, 4799, 8, 4801, 4806, 5, 4807, 4823, 16, 4881, 4886, 5, 4887, 4955, 68, 4956, 4989, 33, 4990, 4991, 1, 5018, 5023, 1, 5110, 5111, 1, 5118, 5119, 1, 5789, 5791, 1, 5881, 5887, 1, 5910, 5918, 1, 5943, 5951, 1, 5972, 5983, 1, 5997, 6001, 4, 6004, 6015, 1, 6110, 6111, 1, 6122, 6127, 1, 6138, 6143, 1, 6158, 6170, 12, 6171, 6175, 1, 6265, 6271, 1, 6315, 6319, 1, 6390, 6399, 1, 6431, 6444, 13, 6445, 6447, 1, 6460, 6463, 1, 6465, 6467, 1, 6510, 6511, 1, 6517, 6527, 1, 6572, 6575, 1, 6602, 6607, 1, 6619, 6621, 1, 6684, 6685, 1, 6751, 6781, 30, 6782, 6794, 12, 6795, 6799, 1, 6810, 6815, 1, 6830, 6831, 1, 6863, 6911, 1, 6989, 7156, 167, 7157, 7163, 1, 7224, 7226, 1, 7242, 7244, 1, 7307, 7311, 1, 7355, 7356, 1, 7368, 7375, 1, 7419, 7423, 1, 7958, 7959, 1, 7966, 7967, 1, 8006, 8007, 1, 8014, 8015, 1, 8024, 8030, 2, 8062, 8063, 1, 8117, 8133, 16, 8148, 8149, 1, 8156, 8176, 20, 8177, 8181, 4, 8191, 8203, 12, 8204, 8207, 1, 8234, 8238, 1, 8288, 8303, 1, 8306, 8307, 1, 8335, 8349, 14, 8350, 8351, 1, 8385, 8399, 1, 8433, 8447, 1, 8588, 8591, 1, 9258, 9279, 1, 9291, 9311, 1, 11124, 11125, 1, 11158, 11508, 350, 11509, 11512, 1, 11558, 11560, 2, 11561, 11564, 1, 11566, 11567, 1, 11624, 11630, 1, 11633, 11646, 1, 11671, 11679, 1, 11687, 11743, 8, 11870, 11903, 1, 11930, 12020, 90, 12021, 12031, 1, 12246, 12271, 1, 12352, 12439, 87, 12440, 12544, 104, 12545, 12548, 1, 12592, 12687, 95, 12774, 12782, 1, 12831, 42125, 29294, 42126, 42127, 1, 42183, 42191, 1, 42540, 42559, 1, 42744, 42751, 1, 42958, 42959, 1, 42962, 42964, 2, 42973, 42993, 1, 43053, 43055, 1, 43066, 43071, 1, 43128, 43135, 1, 43206, 43213, 1, 43226, 43231, 1, 43348, 43358, 1, 43389, 43391, 1, 43470, 43482, 12, 43483, 43485, 1, 43519, 43575, 56, 43576, 43583, 1, 43598, 43599, 1, 43610, 43611, 1, 43715, 43738, 1, 43767, 43776, 1, 43783, 43784, 1, 43791, 43792, 1, 43799, 43807, 1, 43815, 43823, 8, 43884, 43887, 1, 44014, 44015, 1, 44026, 44031, 1, 55204, 55215, 1, 55239, 55242, 1, 55292, 63743, 1, 64110, 64111, 1, 64218, 64255, 1, 64263, 64274, 1, 64280, 64284, 1, 64311, 64317, 6, 64319, 64325, 3, 64451, 64466, 1, 64912, 64913, 1, 64968, 64974, 1, 64976, 65007, 1, 65050, 65055, 1, 65107, 65127, 20, 65132, 65135, 1, 65141, 65277, 136, 65278, 65280, 1, 65471, 65473, 1, 65480, 65481, 1, 65488, 65489, 1, 65496, 65497, 1, 65501, 65503, 1, 65511, 65519, 8, 65520, 65531, 1, 65534, 65535, 1, 65548, 65575, 27, 65595, 65598, 3, 65614, 65615, 1, 65630, 65663, 1, 65787, 65791, 1, 65795, 65798, 1, 65844, 65846, 1, 65935, 65949, 14, 65950, 65951, 1, 65953, 65999, 1, 66046, 66175, 1, 66205, 66207, 1, 66257, 66271, 1, 66300, 66303, 1, 66340, 66348, 1, 66379, 66383, 1, 66427, 66431, 1, 66462, 66500, 38, 66501, 66503, 1, 66518, 66559, 1, 66718, 66719, 1, 66730, 66735, 1, 66772, 66775, 1, 66812, 66815, 1, 66856, 66863, 1, 66916, 66926, 1, 66939, 66955, 16, 66963, 66966, 3, 66978, 66994, 16, 67002, 67005, 3, 67006, 67007, 1, 67060, 67071, 1, 67383, 67391, 1, 67414, 67423, 1, 67432, 67455, 1, 67462, 67505, 43, 67515, 67583, 1, 67590, 67591, 1, 67593, 67638, 45, 67641, 67643, 1, 67645, 67646, 1, 67670, 67743, 73, 67744, 67750, 1, 67760, 67807, 1, 67827, 67830, 3, 67831, 67834, 1, 67868, 67870, 1, 67898, 67902, 1, 67904, 67967, 1, 68024, 68027, 1, 68048, 68049, 1, 68100, 68103, 3, 68104, 68107, 1, 68116, 68120, 4, 68150, 68151, 1, 68155, 68158, 1, 68169, 68175, 1, 68185, 68191, 1, 68256, 68287, 1, 68327, 68330, 1, 68343, 68351, 1, 68406, 68408, 1, 68438, 68439, 1, 68467, 68471, 1, 68498, 68504, 1, 68509, 68520, 1, 68528, 68607, 1, 68681, 68735, 1, 68787, 68799, 1, 68851, 68857, 1, 68904, 68911, 1, 68922, 68927, 1, 68966, 68968, 1, 68998, 69005, 1, 69008, 69215, 1, 69247, 69290, 43, 69294, 69295, 1, 69298, 69313, 1, 69317, 69371, 1, 69416, 69423, 1, 69466, 69487, 1, 69514, 69551, 1, 69580, 69599, 1, 69623, 69631, 1, 69710, 69713, 1, 69750, 69758, 1, 69821, 69827, 6, 69828, 69839, 1, 69865, 69871, 1, 69882, 69887, 1, 69941, 69960, 19, 69961, 69967, 1, 70007, 70015, 1, 70112, 70133, 21, 70134, 70143, 1, 70162, 70210, 48, 70211, 70271, 1, 70279, 70281, 2, 70286, 70302, 16, 70314, 70319, 1, 70379, 70383, 1, 70394, 70399, 1, 70404, 70413, 9, 70414, 70417, 3, 70418, 70441, 23, 70449, 70452, 3, 70458, 70469, 11, 70470, 70473, 3, 70474, 70478, 4, 70479, 70481, 2, 70482, 70486, 1, 70488, 70492, 1, 70500, 70501, 1, 70509, 70511, 1, 70517, 70527, 1, 70538, 70540, 2, 70541, 70543, 2, 70582, 70593, 11, 70595, 70596, 1, 70598, 70603, 5, 70614, 70617, 3, 70618, 70624, 1, 70627, 70655, 1, 70748, 70754, 6, 70755, 70783, 1, 70856, 70863, 1, 70874, 71039, 1, 71094, 71095, 1, 71134, 71167, 1, 71237, 71247, 1, 71258, 71263, 1, 71277, 71295, 1, 71354, 71359, 1, 71370, 71375, 1, 71396, 71423, 1, 71451, 71452, 1, 71468, 71471, 1, 71495, 71679, 1, 71740, 71839, 1, 71923, 71934, 1, 71943, 71944, 1, 71946, 71947, 1, 71956, 71959, 3, 71990, 71993, 3, 71994, 72007, 13, 72008, 72015, 1, 72026, 72095, 1, 72104, 72105, 1, 72152, 72153, 1, 72165, 72191, 1, 72264, 72271, 1, 72355, 72367, 1, 72441, 72447, 1, 72458, 72639, 1, 72674, 72687, 1, 72698, 72703, 1, 72713, 72759, 46, 72774, 72783, 1, 72813, 72815, 1, 72848, 72849, 1, 72872, 72887, 15, 72888, 72959, 1, 72967, 72970, 3, 73015, 73017, 1, 73019, 73022, 3, 73032, 73039, 1, 73050, 73055, 1, 73062, 73065, 3, 73103, 73106, 3, 73113, 73119, 1, 73130, 73439, 1, 73465, 73471, 1, 73489, 73531, 42, 73532, 73533, 1, 73563, 73647, 1, 73649, 73663, 1, 73714, 73726, 1, 74650, 74751, 1, 74863, 74869, 6, 74870, 74879, 1, 75076, 77711, 1, 77811, 77823, 1, 78896, 78911, 1, 78934, 78943, 1, 82939, 82943, 1, 83527, 90367, 1, 90426, 92159, 1, 92729, 92735, 1, 92767, 92778, 11, 92779, 92781, 1, 92863, 92874, 11, 92875, 92879, 1, 92910, 92911, 1, 92918, 92927, 1, 92998, 93007, 1, 93018, 93026, 8, 93048, 93052, 1, 93072, 93503, 1, 93562, 93759, 1, 93851, 93951, 1, 94027, 94030, 1, 94088, 94094, 1, 94112, 94175, 1, 94181, 94191, 1, 94194, 94207, 1, 100344, 100351, 1, 101590, 101630, 1, 101641, 110575, 1, 110580, 110588, 8, 110591, 110883, 292, 110884, 110897, 1, 110899, 110927, 1, 110931, 110932, 1, 110934, 110947, 1, 110952, 110959, 1, 111356, 113663, 1, 113771, 113775, 1, 113789, 113791, 1, 113801, 113807, 1, 113818, 113819, 1, 113824, 117759, 1, 118010, 118015, 1, 118452, 118527, 1, 118574, 118575, 1, 118599, 118607, 1, 118724, 118783, 1, 119030, 119039, 1, 119079, 119080, 1, 119155, 119162, 1, 119275, 119295, 1, 119366, 119487, 1, 119508, 119519, 1, 119540, 119551, 1, 119639, 119647, 1, 119673, 119807, 1, 119893, 119965, 72, 119968, 119969, 1, 119971, 119972, 1, 119975, 119976, 1, 119981, 119994, 13, 119996, 120004, 8, 120070, 120075, 5, 120076, 120085, 9, 120093, 120122, 29, 120127, 120133, 6, 120135, 120137, 1, 120145, 120486, 341, 120487, 120780, 293, 120781, 121484, 703, 121485, 121498, 1, 121504, 121520, 16, 121521, 122623, 1, 122655, 122660, 1, 122667, 122879, 1, 122887, 122905, 18, 122906, 122914, 8, 122917, 122923, 6, 122924, 122927, 1, 122990, 123022, 1, 123024, 123135, 1, 123181, 123183, 1, 123198, 123199, 1, 123210, 123213, 1, 123216, 123535, 1, 123567, 123583, 1, 123642, 123646, 1, 123648, 124111, 1, 124154, 124367, 1, 124411, 124414, 1, 124416, 124895, 1, 124903, 124908, 5, 124911, 124927, 16, 125125, 125126, 1, 125143, 125183, 1, 125260, 125263, 1, 125274, 125277, 1, 125280, 126064, 1, 126133, 126208, 1, 126270, 126463, 1, 126468, 126496, 28, 126499, 126501, 2, 126502, 126504, 2, 126515, 126520, 5, 126522, 126524, 2, 126525, 126529, 1, 126531, 126534, 1, 126536, 126540, 2, 126544, 126547, 3, 126549, 126550, 1, 126552, 126560, 2, 126563, 126565, 2, 126566, 126571, 5, 126579, 126589, 5, 126591, 126602, 11, 126620, 126624, 1, 126628, 126634, 6, 126652, 126703, 1, 126706, 126975, 1, 127020, 127023, 1, 127124, 127135, 1, 127151, 127152, 1, 127168, 127184, 16, 127222, 127231, 1, 127406, 127461, 1, 127491, 127503, 1, 127548, 127551, 1, 127561, 127567, 1, 127570, 127583, 1, 127590, 127743, 1, 128728, 128731, 1, 128749, 128751, 1, 128765, 128767, 1, 128887, 128890, 1, 128986, 128991, 1, 129004, 129007, 1, 129009, 129023, 1, 129036, 129039, 1, 129096, 129103, 1, 129114, 129119, 1, 129160, 129167, 1, 129198, 129199, 1, 129212, 129215, 1, 129218, 129279, 1, 129620, 129631, 1, 129646, 129647, 1, 129661, 129663, 1, 129674, 129678, 1, 129735, 129741, 1, 129757, 129758, 1, 129770, 129775, 1, 129785, 129791, 1, 129939, 130042, 103, 130043, 131071, 1, 173792, 173823, 1, 177978, 177983, 1, 178206, 178207, 1, 183970, 183983, 1, 191457, 191471, 1, 192094, 194559, 1, 195102, 196607, 1, 201547, 201551, 1, 205744, 917759, 1, 918000, 1114111, 1]));
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
static L = new UnicodeRangeTable(new Uint32Array([65, 90, 1, 97, 122, 1, 170, 181, 11, 186, 192, 6, 193, 214, 1, 216, 246, 1, 248, 705, 1, 710, 721, 1, 736, 740, 1, 748, 750, 2, 880, 884, 1, 886, 887, 1, 890, 893, 1, 895, 902, 7, 904, 906, 1, 908, 910, 2, 911, 929, 1, 931, 1013, 1, 1015, 1153, 1, 1162, 1327, 1, 1329, 1366, 1, 1369, 1376, 7, 1377, 1416, 1, 1488, 1514, 1, 1519, 1522, 1, 1568, 1610, 1, 1646, 1647, 1, 1649, 1747, 1, 1749, 1765, 16, 1766, 1774, 8, 1775, 1786, 11, 1787, 1788, 1, 1791, 1808, 17, 1810, 1839, 1, 1869, 1957, 1, 1969, 1994, 25, 1995, 2026, 1, 2036, 2037, 1, 2042, 2048, 6, 2049, 2069, 1, 2074, 2084, 10, 2088, 2112, 24, 2113, 2136, 1, 2144, 2154, 1, 2160, 2183, 1, 2185, 2190, 1, 2208, 2249, 1, 2308, 2361, 1, 2365, 2384, 19, 2392, 2401, 1, 2417, 2432, 1, 2437, 2444, 1, 2447, 2448, 1, 2451, 2472, 1, 2474, 2480, 1, 2482, 2486, 4, 2487, 2489, 1, 2493, 2510, 17, 2524, 2525, 1, 2527, 2529, 1, 2544, 2545, 1, 2556, 2565, 9, 2566, 2570, 1, 2575, 2576, 1, 2579, 2600, 1, 2602, 2608, 1, 2610, 2611, 1, 2613, 2614, 1, 2616, 2617, 1, 2649, 2652, 1, 2654, 2674, 20, 2675, 2676, 1, 2693, 2701, 1, 2703, 2705, 1, 2707, 2728, 1, 2730, 2736, 1, 2738, 2739, 1, 2741, 2745, 1, 2749, 2768, 19, 2784, 2785, 1, 2809, 2821, 12, 2822, 2828, 1, 2831, 2832, 1, 2835, 2856, 1, 2858, 2864, 1, 2866, 2867, 1, 2869, 2873, 1, 2877, 2908, 31, 2909, 2911, 2, 2912, 2913, 1, 2929, 2947, 18, 2949, 2954, 1, 2958, 2960, 1, 2962, 2965, 1, 2969, 2970, 1, 2972, 2974, 2, 2975, 2979, 4, 2980, 2984, 4, 2985, 2986, 1, 2990, 3001, 1, 3024, 3077, 53, 3078, 3084, 1, 3086, 3088, 1, 3090, 3112, 1, 3114, 3129, 1, 3133, 3160, 27, 3161, 3162, 1, 3165, 3168, 3, 3169, 3200, 31, 3205, 3212, 1, 3214, 3216, 1, 3218, 3240, 1, 3242, 3251, 1, 3253, 3257, 1, 3261, 3293, 32, 3294, 3296, 2, 3297, 3313, 16, 3314, 3332, 18, 3333, 3340, 1, 3342, 3344, 1, 3346, 3386, 1, 3389, 3406, 17, 3412, 3414, 1, 3423, 3425, 1, 3450, 3455, 1, 3461, 3478, 1, 3482, 3505, 1, 3507, 3515, 1, 3517, 3520, 3, 3521, 3526, 1, 3585, 3632, 1, 3634, 3635, 1, 3648, 3654, 1, 3713, 3714, 1, 3716, 3718, 2, 3719, 3722, 1, 3724, 3747, 1, 3749, 3751, 2, 3752, 3760, 1, 3762, 3763, 1, 3773, 3776, 3, 3777, 3780, 1, 3782, 3804, 22, 3805, 3807, 1, 3840, 3904, 64, 3905, 3911, 1, 3913, 3948, 1, 3976, 3980, 1, 4096, 4138, 1, 4159, 4176, 17, 4177, 4181, 1, 4186, 4189, 1, 4193, 4197, 4, 4198, 4206, 8, 4207, 4208, 1, 4213, 4225, 1, 4238, 4256, 18, 4257, 4293, 1, 4295, 4301, 6, 4304, 4346, 1, 4348, 4680, 1, 4682, 4685, 1, 4688, 4694, 1, 4696, 4698, 2, 4699, 4701, 1, 4704, 4744, 1, 4746, 4749, 1, 4752, 4784, 1, 4786, 4789, 1, 4792, 4798, 1, 4800, 4802, 2, 4803, 4805, 1, 4808, 4822, 1, 4824, 4880, 1, 4882, 4885, 1, 4888, 4954, 1, 4992, 5007, 1, 5024, 5109, 1, 5112, 5117, 1, 5121, 5740, 1, 5743, 5759, 1, 5761, 5786, 1, 5792, 5866, 1, 5873, 5880, 1, 5888, 5905, 1, 5919, 5937, 1, 5952, 5969, 1, 5984, 5996, 1, 5998, 6000, 1, 6016, 6067, 1, 6103, 6108, 5, 6176, 6264, 1, 6272, 6276, 1, 6279, 6312, 1, 6314, 6320, 6, 6321, 6389, 1, 6400, 6430, 1, 6480, 6509, 1, 6512, 6516, 1, 6528, 6571, 1, 6576, 6601, 1, 6656, 6678, 1, 6688, 6740, 1, 6823, 6917, 94, 6918, 6963, 1, 6981, 6988, 1, 7043, 7072, 1, 7086, 7087, 1, 7098, 7141, 1, 7168, 7203, 1, 7245, 7247, 1, 7258, 7293, 1, 7296, 7306, 1, 7312, 7354, 1, 7357, 7359, 1, 7401, 7404, 1, 7406, 7411, 1, 7413, 7414, 1, 7418, 7424, 6, 7425, 7615, 1, 7680, 7957, 1, 7960, 7965, 1, 7968, 8005, 1, 8008, 8013, 1, 8016, 8023, 1, 8025, 8031, 2, 8032, 8061, 1, 8064, 8116, 1, 8118, 8124, 1, 8126, 8130, 4, 8131, 8132, 1, 8134, 8140, 1, 8144, 8147, 1, 8150, 8155, 1, 8160, 8172, 1, 8178, 8180, 1, 8182, 8188, 1, 8305, 8319, 14, 8336, 8348, 1, 8450, 8455, 5, 8458, 8467, 1, 8469, 8473, 4, 8474, 8477, 1, 8484, 8490, 2, 8491, 8493, 1, 8495, 8505, 1, 8508, 8511, 1, 8517, 8521, 1, 8526, 8579, 53, 8580, 11264, 2684, 11265, 11492, 1, 11499, 11502, 1, 11506, 11507, 1, 11520, 11557, 1, 11559, 11565, 6, 11568, 11623, 1, 11631, 11648, 17, 11649, 11670, 1, 11680, 11686, 1, 11688, 11694, 1, 11696, 11702, 1, 11704, 11710, 1, 11712, 11718, 1, 11720, 11726, 1, 11728, 11734, 1, 11736, 11742, 1, 11823, 12293, 470, 12294, 12337, 43, 12338, 12341, 1, 12347, 12348, 1, 12353, 12438, 1, 12445, 12447, 1, 12449, 12538, 1, 12540, 12543, 1, 12549, 12591, 1, 12593, 12686, 1, 12704, 12735, 1, 12784, 12799, 1, 13312, 19903, 1, 19968, 42124, 1, 42192, 42237, 1, 42240, 42508, 1, 42512, 42527, 1, 42538, 42539, 1, 42560, 42606, 1, 42623, 42653, 1, 42656, 42725, 1, 42775, 42783, 1, 42786, 42888, 1, 42891, 42957, 1, 42960, 42961, 1, 42963, 42965, 2, 42966, 42972, 1, 42994, 43009, 1, 43011, 43013, 1, 43015, 43018, 1, 43020, 43042, 1, 43072, 43123, 1, 43138, 43187, 1, 43250, 43255, 1, 43259, 43261, 2, 43262, 43274, 12, 43275, 43301, 1, 43312, 43334, 1, 43360, 43388, 1, 43396, 43442, 1, 43471, 43488, 17, 43489, 43492, 1, 43494, 43503, 1, 43514, 43518, 1, 43520, 43560, 1, 43584, 43586, 1, 43588, 43595, 1, 43616, 43638, 1, 43642, 43646, 4, 43647, 43695, 1, 43697, 43701, 4, 43702, 43705, 3, 43706, 43709, 1, 43712, 43714, 2, 43739, 43741, 1, 43744, 43754, 1, 43762, 43764, 1, 43777, 43782, 1, 43785, 43790, 1, 43793, 43798, 1, 43808, 43814, 1, 43816, 43822, 1, 43824, 43866, 1, 43868, 43881, 1, 43888, 44002, 1, 44032, 55203, 1, 55216, 55238, 1, 55243, 55291, 1, 63744, 64109, 1, 64112, 64217, 1, 64256, 64262, 1, 64275, 64279, 1, 64285, 64287, 2, 64288, 64296, 1, 64298, 64310, 1, 64312, 64316, 1, 64318, 64320, 2, 64321, 64323, 2, 64324, 64326, 2, 64327, 64433, 1, 64467, 64829, 1, 64848, 64911, 1, 64914, 64967, 1, 65008, 65019, 1, 65136, 65140, 1, 65142, 65276, 1, 65313, 65338, 1, 65345, 65370, 1, 65382, 65470, 1, 65474, 65479, 1, 65482, 65487, 1, 65490, 65495, 1, 65498, 65500, 1, 65536, 65547, 1, 65549, 65574, 1, 65576, 65594, 1, 65596, 65597, 1, 65599, 65613, 1, 65616, 65629, 1, 65664, 65786, 1, 66176, 66204, 1, 66208, 66256, 1, 66304, 66335, 1, 66349, 66368, 1, 66370, 66377, 1, 66384, 66421, 1, 66432, 66461, 1, 66464, 66499, 1, 66504, 66511, 1, 66560, 66717, 1, 66736, 66771, 1, 66776, 66811, 1, 66816, 66855, 1, 66864, 66915, 1, 66928, 66938, 1, 66940, 66954, 1, 66956, 66962, 1, 66964, 66965, 1, 66967, 66977, 1, 66979, 66993, 1, 66995, 67001, 1, 67003, 67004, 1, 67008, 67059, 1, 67072, 67382, 1, 67392, 67413, 1, 67424, 67431, 1, 67456, 67461, 1, 67463, 67504, 1, 67506, 67514, 1, 67584, 67589, 1, 67592, 67594, 2, 67595, 67637, 1, 67639, 67640, 1, 67644, 67647, 3, 67648, 67669, 1, 67680, 67702, 1, 67712, 67742, 1, 67808, 67826, 1, 67828, 67829, 1, 67840, 67861, 1, 67872, 67897, 1, 67968, 68023, 1, 68030, 68031, 1, 68096, 68112, 16, 68113, 68115, 1, 68117, 68119, 1, 68121, 68149, 1, 68192, 68220, 1, 68224, 68252, 1, 68288, 68295, 1, 68297, 68324, 1, 68352, 68405, 1, 68416, 68437, 1, 68448, 68466, 1, 68480, 68497, 1, 68608, 68680, 1, 68736, 68786, 1, 68800, 68850, 1, 68864, 68899, 1, 68938, 68965, 1, 68975, 68997, 1, 69248, 69289, 1, 69296, 69297, 1, 69314, 69316, 1, 69376, 69404, 1, 69415, 69424, 9, 69425, 69445, 1, 69488, 69505, 1, 69552, 69572, 1, 69600, 69622, 1, 69635, 69687, 1, 69745, 69746, 1, 69749, 69763, 14, 69764, 69807, 1, 69840, 69864, 1, 69891, 69926, 1, 69956, 69959, 3, 69968, 70002, 1, 70006, 70019, 13, 70020, 70066, 1, 70081, 70084, 1, 70106, 70108, 2, 70144, 70161, 1, 70163, 70187, 1, 70207, 70208, 1, 70272, 70278, 1, 70280, 70282, 2, 70283, 70285, 1, 70287, 70301, 1, 70303, 70312, 1, 70320, 70366, 1, 70405, 70412, 1, 70415, 70416, 1, 70419, 70440, 1, 70442, 70448, 1, 70450, 70451, 1, 70453, 70457, 1, 70461, 70480, 19, 70493, 70497, 1, 70528, 70537, 1, 70539, 70542, 3, 70544, 70581, 1, 70583, 70609, 26, 70611, 70656, 45, 70657, 70708, 1, 70727, 70730, 1, 70751, 70753, 1, 70784, 70831, 1, 70852, 70853, 1, 70855, 71040, 185, 71041, 71086, 1, 71128, 71131, 1, 71168, 71215, 1, 71236, 71296, 60, 71297, 71338, 1, 71352, 71424, 72, 71425, 71450, 1, 71488, 71494, 1, 71680, 71723, 1, 71840, 71903, 1, 71935, 71942, 1, 71945, 71948, 3, 71949, 71955, 1, 71957, 71958, 1, 71960, 71983, 1, 71999, 72001, 2, 72096, 72103, 1, 72106, 72144, 1, 72161, 72163, 2, 72192, 72203, 11, 72204, 72242, 1, 72250, 72272, 22, 72284, 72329, 1, 72349, 72368, 19, 72369, 72440, 1, 72640, 72672, 1, 72704, 72712, 1, 72714, 72750, 1, 72768, 72818, 50, 72819, 72847, 1, 72960, 72966, 1, 72968, 72969, 1, 72971, 73008, 1, 73030, 73056, 26, 73057, 73061, 1, 73063, 73064, 1, 73066, 73097, 1, 73112, 73440, 328, 73441, 73458, 1, 73474, 73476, 2, 73477, 73488, 1, 73490, 73523, 1, 73648, 73728, 80, 73729, 74649, 1, 74880, 75075, 1, 77712, 77808, 1, 77824, 78895, 1, 78913, 78918, 1, 78944, 82938, 1, 82944, 83526, 1, 90368, 90397, 1, 92160, 92728, 1, 92736, 92766, 1, 92784, 92862, 1, 92880, 92909, 1, 92928, 92975, 1, 92992, 92995, 1, 93027, 93047, 1, 93053, 93071, 1, 93504, 93548, 1, 93760, 93823, 1, 93952, 94026, 1, 94032, 94099, 67, 94100, 94111, 1, 94176, 94177, 1, 94179, 94208, 29, 94209, 100343, 1, 100352, 101589, 1, 101631, 101640, 1, 110576, 110579, 1, 110581, 110587, 1, 110589, 110590, 1, 110592, 110882, 1, 110898, 110928, 30, 110929, 110930, 1, 110933, 110948, 15, 110949, 110951, 1, 110960, 111355, 1, 113664, 113770, 1, 113776, 113788, 1, 113792, 113800, 1, 113808, 113817, 1, 119808, 119892, 1, 119894, 119964, 1, 119966, 119967, 1, 119970, 119973, 3, 119974, 119977, 3, 119978, 119980, 1, 119982, 119993, 1, 119995, 119997, 2, 119998, 120003, 1, 120005, 120069, 1, 120071, 120074, 1, 120077, 120084, 1, 120086, 120092, 1, 120094, 120121, 1, 120123, 120126, 1, 120128, 120132, 1, 120134, 120138, 4, 120139, 120144, 1, 120146, 120485, 1, 120488, 120512, 1, 120514, 120538, 1, 120540, 120570, 1, 120572, 120596, 1, 120598, 120628, 1, 120630, 120654, 1, 120656, 120686, 1, 120688, 120712, 1, 120714, 120744, 1, 120746, 120770, 1, 120772, 120779, 1, 122624, 122654, 1, 122661, 122666, 1, 122928, 122989, 1, 123136, 123180, 1, 123191, 123197, 1, 123214, 123536, 322, 123537, 123565, 1, 123584, 123627, 1, 124112, 124139, 1, 124368, 124397, 1, 124400, 124896, 496, 124897, 124902, 1, 124904, 124907, 1, 124909, 124910, 1, 124912, 124926, 1, 124928, 125124, 1, 125184, 125251, 1, 125259, 126464, 1205, 126465, 126467, 1, 126469, 126495, 1, 126497, 126498, 1, 126500, 126503, 3, 126505, 126514, 1, 126516, 126519, 1, 126521, 126523, 2, 126530, 126535, 5, 126537, 126541, 2, 126542, 126543, 1, 126545, 126546, 1, 126548, 126551, 3, 126553, 126561, 2, 126562, 126564, 2, 126567, 126570, 1, 126572, 126578, 1, 126580, 126583, 1, 126585, 126588, 1, 126590, 126592, 2, 126593, 126601, 1, 126603, 126619, 1, 126625, 126627, 1, 126629, 126633, 1, 126635, 126651, 1, 131072, 173791, 1, 173824, 177977, 1, 177984, 178205, 1, 178208, 183969, 1, 183984, 191456, 1, 191472, 192093, 1, 194560, 195101, 1, 196608, 201546, 1, 201552, 205743, 1]));
|
|
129
|
-
static
|
|
130
|
-
static
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
static
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
static
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
static
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
static Print = new UnicodeRangeTable(new Uint32Array([33, 126, 1, 161, 172, 1, 174, 887, 1, 890, 895, 1, 900, 906, 1, 908, 910, 2, 911, 929, 1, 931, 1327, 1, 1329, 1366, 1, 1369, 1418, 1, 1421, 1423, 1, 1425, 1479, 1, 1488, 1514, 1, 1519, 1524, 1, 1542, 1563, 1, 1565, 1756, 1, 1758, 1805, 1, 1808, 1866, 1, 1869, 1969, 1, 1984, 2042, 1, 2045, 2093, 1, 2096, 2110, 1, 2112, 2139, 1, 2142, 2144, 2, 2145, 2154, 1, 2160, 2190, 1, 2199, 2273, 1, 2275, 2435, 1, 2437, 2444, 1, 2447, 2448, 1, 2451, 2472, 1, 2474, 2480, 1, 2482, 2486, 4, 2487, 2489, 1, 2492, 2500, 1, 2503, 2504, 1, 2507, 2510, 1, 2519, 2524, 5, 2525, 2527, 2, 2528, 2531, 1, 2534, 2558, 1, 2561, 2563, 1, 2565, 2570, 1, 2575, 2576, 1, 2579, 2600, 1, 2602, 2608, 1, 2610, 2611, 1, 2613, 2614, 1, 2616, 2617, 1, 2620, 2622, 2, 2623, 2626, 1, 2631, 2632, 1, 2635, 2637, 1, 2641, 2649, 8, 2650, 2652, 1, 2654, 2662, 8, 2663, 2678, 1, 2689, 2691, 1, 2693, 2701, 1, 2703, 2705, 1, 2707, 2728, 1, 2730, 2736, 1, 2738, 2739, 1, 2741, 2745, 1, 2748, 2757, 1, 2759, 2761, 1, 2763, 2765, 1, 2768, 2784, 16, 2785, 2787, 1, 2790, 2801, 1, 2809, 2815, 1, 2817, 2819, 1, 2821, 2828, 1, 2831, 2832, 1, 2835, 2856, 1, 2858, 2864, 1, 2866, 2867, 1, 2869, 2873, 1, 2876, 2884, 1, 2887, 2888, 1, 2891, 2893, 1, 2901, 2903, 1, 2908, 2909, 1, 2911, 2915, 1, 2918, 2935, 1, 2946, 2947, 1, 2949, 2954, 1, 2958, 2960, 1, 2962, 2965, 1, 2969, 2970, 1, 2972, 2974, 2, 2975, 2979, 4, 2980, 2984, 4, 2985, 2986, 1, 2990, 3001, 1, 3006, 3010, 1, 3014, 3016, 1, 3018, 3021, 1, 3024, 3031, 7, 3046, 3066, 1, 3072, 3084, 1, 3086, 3088, 1, 3090, 3112, 1, 3114, 3129, 1, 3132, 3140, 1, 3142, 3144, 1, 3146, 3149, 1, 3157, 3158, 1, 3160, 3162, 1, 3165, 3168, 3, 3169, 3171, 1, 3174, 3183, 1, 3191, 3212, 1, 3214, 3216, 1, 3218, 3240, 1, 3242, 3251, 1, 3253, 3257, 1, 3260, 3268, 1, 3270, 3272, 1, 3274, 3277, 1, 3285, 3286, 1, 3293, 3294, 1, 3296, 3299, 1, 3302, 3311, 1, 3313, 3315, 1, 3328, 3340, 1, 3342, 3344, 1, 3346, 3396, 1, 3398, 3400, 1, 3402, 3407, 1, 3412, 3427, 1, 3430, 3455, 1, 3457, 3459, 1, 3461, 3478, 1, 3482, 3505, 1, 3507, 3515, 1, 3517, 3520, 3, 3521, 3526, 1, 3530, 3535, 5, 3536, 3540, 1, 3542, 3544, 2, 3545, 3551, 1, 3558, 3567, 1, 3570, 3572, 1, 3585, 3642, 1, 3647, 3675, 1, 3713, 3714, 1, 3716, 3718, 2, 3719, 3722, 1, 3724, 3747, 1, 3749, 3751, 2, 3752, 3773, 1, 3776, 3780, 1, 3782, 3784, 2, 3785, 3790, 1, 3792, 3801, 1, 3804, 3807, 1, 3840, 3911, 1, 3913, 3948, 1, 3953, 3991, 1, 3993, 4028, 1, 4030, 4044, 1, 4046, 4058, 1, 4096, 4293, 1, 4295, 4301, 6, 4304, 4680, 1, 4682, 4685, 1, 4688, 4694, 1, 4696, 4698, 2, 4699, 4701, 1, 4704, 4744, 1, 4746, 4749, 1, 4752, 4784, 1, 4786, 4789, 1, 4792, 4798, 1, 4800, 4802, 2, 4803, 4805, 1, 4808, 4822, 1, 4824, 4880, 1, 4882, 4885, 1, 4888, 4954, 1, 4957, 4988, 1, 4992, 5017, 1, 5024, 5109, 1, 5112, 5117, 1, 5120, 5759, 1, 5761, 5788, 1, 5792, 5880, 1, 5888, 5909, 1, 5919, 5942, 1, 5952, 5971, 1, 5984, 5996, 1, 5998, 6000, 1, 6002, 6003, 1, 6016, 6109, 1, 6112, 6121, 1, 6128, 6137, 1, 6144, 6157, 1, 6159, 6169, 1, 6176, 6264, 1, 6272, 6314, 1, 6320, 6389, 1, 6400, 6430, 1, 6432, 6443, 1, 6448, 6459, 1, 6464, 6468, 4, 6469, 6509, 1, 6512, 6516, 1, 6528, 6571, 1, 6576, 6601, 1, 6608, 6618, 1, 6622, 6683, 1, 6686, 6750, 1, 6752, 6780, 1, 6783, 6793, 1, 6800, 6809, 1, 6816, 6829, 1, 6832, 6862, 1, 6912, 6988, 1, 6990, 7155, 1, 7164, 7223, 1, 7227, 7241, 1, 7245, 7306, 1, 7312, 7354, 1, 7357, 7367, 1, 7376, 7418, 1, 7424, 7957, 1, 7960, 7965, 1, 7968, 8005, 1, 8008, 8013, 1, 8016, 8023, 1, 8025, 8031, 2, 8032, 8061, 1, 8064, 8116, 1, 8118, 8132, 1, 8134, 8147, 1, 8150, 8155, 1, 8157, 8175, 1, 8178, 8180, 1, 8182, 8190, 1, 8208, 8231, 1, 8240, 8286, 1, 8304, 8305, 1, 8308, 8334, 1, 8336, 8348, 1, 8352, 8384, 1, 8400, 8432, 1, 8448, 8587, 1, 8592, 9257, 1, 9280, 9290, 1, 9312, 11123, 1, 11126, 11157, 1, 11159, 11507, 1, 11513, 11557, 1, 11559, 11565, 6, 11568, 11623, 1, 11631, 11632, 1, 11647, 11670, 1, 11680, 11686, 1, 11688, 11694, 1, 11696, 11702, 1, 11704, 11710, 1, 11712, 11718, 1, 11720, 11726, 1, 11728, 11734, 1, 11736, 11742, 1, 11744, 11869, 1, 11904, 11929, 1, 11931, 12019, 1, 12032, 12245, 1, 12272, 12287, 1, 12289, 12351, 1, 12353, 12438, 1, 12441, 12543, 1, 12549, 12591, 1, 12593, 12686, 1, 12688, 12773, 1, 12783, 12830, 1, 12832, 42124, 1, 42128, 42182, 1, 42192, 42539, 1, 42560, 42743, 1, 42752, 42957, 1, 42960, 42961, 1, 42963, 42965, 2, 42966, 42972, 1, 42994, 43052, 1, 43056, 43065, 1, 43072, 43127, 1, 43136, 43205, 1, 43214, 43225, 1, 43232, 43347, 1, 43359, 43388, 1, 43392, 43469, 1, 43471, 43481, 1, 43486, 43518, 1, 43520, 43574, 1, 43584, 43597, 1, 43600, 43609, 1, 43612, 43714, 1, 43739, 43766, 1, 43777, 43782, 1, 43785, 43790, 1, 43793, 43798, 1, 43808, 43814, 1, 43816, 43822, 1, 43824, 43883, 1, 43888, 44013, 1, 44016, 44025, 1, 44032, 55203, 1, 55216, 55238, 1, 55243, 55291, 1, 63744, 64109, 1, 64112, 64217, 1, 64256, 64262, 1, 64275, 64279, 1, 64285, 64310, 1, 64312, 64316, 1, 64318, 64320, 2, 64321, 64323, 2, 64324, 64326, 2, 64327, 64450, 1, 64467, 64911, 1, 64914, 64967, 1, 64975, 65008, 33, 65009, 65049, 1, 65056, 65106, 1, 65108, 65126, 1, 65128, 65131, 1, 65136, 65140, 1, 65142, 65276, 1, 65281, 65470, 1, 65474, 65479, 1, 65482, 65487, 1, 65490, 65495, 1, 65498, 65500, 1, 65504, 65510, 1, 65512, 65518, 1, 65532, 65533, 1, 65536, 65547, 1, 65549, 65574, 1, 65576, 65594, 1, 65596, 65597, 1, 65599, 65613, 1, 65616, 65629, 1, 65664, 65786, 1, 65792, 65794, 1, 65799, 65843, 1, 65847, 65934, 1, 65936, 65948, 1, 65952, 66000, 48, 66001, 66045, 1, 66176, 66204, 1, 66208, 66256, 1, 66272, 66299, 1, 66304, 66339, 1, 66349, 66378, 1, 66384, 66426, 1, 66432, 66461, 1, 66463, 66499, 1, 66504, 66517, 1, 66560, 66717, 1, 66720, 66729, 1, 66736, 66771, 1, 66776, 66811, 1, 66816, 66855, 1, 66864, 66915, 1, 66927, 66938, 1, 66940, 66954, 1, 66956, 66962, 1, 66964, 66965, 1, 66967, 66977, 1, 66979, 66993, 1, 66995, 67001, 1, 67003, 67004, 1, 67008, 67059, 1, 67072, 67382, 1, 67392, 67413, 1, 67424, 67431, 1, 67456, 67461, 1, 67463, 67504, 1, 67506, 67514, 1, 67584, 67589, 1, 67592, 67594, 2, 67595, 67637, 1, 67639, 67640, 1, 67644, 67647, 3, 67648, 67669, 1, 67671, 67742, 1, 67751, 67759, 1, 67808, 67826, 1, 67828, 67829, 1, 67835, 67867, 1, 67871, 67897, 1, 67903, 67968, 65, 67969, 68023, 1, 68028, 68047, 1, 68050, 68099, 1, 68101, 68102, 1, 68108, 68115, 1, 68117, 68119, 1, 68121, 68149, 1, 68152, 68154, 1, 68159, 68168, 1, 68176, 68184, 1, 68192, 68255, 1, 68288, 68326, 1, 68331, 68342, 1, 68352, 68405, 1, 68409, 68437, 1, 68440, 68466, 1, 68472, 68497, 1, 68505, 68508, 1, 68521, 68527, 1, 68608, 68680, 1, 68736, 68786, 1, 68800, 68850, 1, 68858, 68903, 1, 68912, 68921, 1, 68928, 68965, 1, 68969, 68997, 1, 69006, 69007, 1, 69216, 69246, 1, 69248, 69289, 1, 69291, 69293, 1, 69296, 69297, 1, 69314, 69316, 1, 69372, 69415, 1, 69424, 69465, 1, 69488, 69513, 1, 69552, 69579, 1, 69600, 69622, 1, 69632, 69709, 1, 69714, 69749, 1, 69759, 69820, 1, 69822, 69826, 1, 69840, 69864, 1, 69872, 69881, 1, 69888, 69940, 1, 69942, 69959, 1, 69968, 70006, 1, 70016, 70111, 1, 70113, 70132, 1, 70144, 70161, 1, 70163, 70209, 1, 70272, 70278, 1, 70280, 70282, 2, 70283, 70285, 1, 70287, 70301, 1, 70303, 70313, 1, 70320, 70378, 1, 70384, 70393, 1, 70400, 70403, 1, 70405, 70412, 1, 70415, 70416, 1, 70419, 70440, 1, 70442, 70448, 1, 70450, 70451, 1, 70453, 70457, 1, 70459, 70468, 1, 70471, 70472, 1, 70475, 70477, 1, 70480, 70487, 7, 70493, 70499, 1, 70502, 70508, 1, 70512, 70516, 1, 70528, 70537, 1, 70539, 70542, 3, 70544, 70581, 1, 70583, 70592, 1, 70594, 70597, 3, 70599, 70602, 1, 70604, 70613, 1, 70615, 70616, 1, 70625, 70626, 1, 70656, 70747, 1, 70749, 70753, 1, 70784, 70855, 1, 70864, 70873, 1, 71040, 71093, 1, 71096, 71133, 1, 71168, 71236, 1, 71248, 71257, 1, 71264, 71276, 1, 71296, 71353, 1, 71360, 71369, 1, 71376, 71395, 1, 71424, 71450, 1, 71453, 71467, 1, 71472, 71494, 1, 71680, 71739, 1, 71840, 71922, 1, 71935, 71942, 1, 71945, 71948, 3, 71949, 71955, 1, 71957, 71958, 1, 71960, 71989, 1, 71991, 71992, 1, 71995, 72006, 1, 72016, 72025, 1, 72096, 72103, 1, 72106, 72151, 1, 72154, 72164, 1, 72192, 72263, 1, 72272, 72354, 1, 72368, 72440, 1, 72448, 72457, 1, 72640, 72673, 1, 72688, 72697, 1, 72704, 72712, 1, 72714, 72758, 1, 72760, 72773, 1, 72784, 72812, 1, 72816, 72847, 1, 72850, 72871, 1, 72873, 72886, 1, 72960, 72966, 1, 72968, 72969, 1, 72971, 73014, 1, 73018, 73020, 2, 73021, 73023, 2, 73024, 73031, 1, 73040, 73049, 1, 73056, 73061, 1, 73063, 73064, 1, 73066, 73102, 1, 73104, 73105, 1, 73107, 73112, 1, 73120, 73129, 1, 73440, 73464, 1, 73472, 73488, 1, 73490, 73530, 1, 73534, 73562, 1, 73648, 73664, 16, 73665, 73713, 1, 73727, 74649, 1, 74752, 74862, 1, 74864, 74868, 1, 74880, 75075, 1, 77712, 77810, 1, 77824, 78895, 1, 78912, 78933, 1, 78944, 82938, 1, 82944, 83526, 1, 90368, 90425, 1, 92160, 92728, 1, 92736, 92766, 1, 92768, 92777, 1, 92782, 92862, 1, 92864, 92873, 1, 92880, 92909, 1, 92912, 92917, 1, 92928, 92997, 1, 93008, 93017, 1, 93019, 93025, 1, 93027, 93047, 1, 93053, 93071, 1, 93504, 93561, 1, 93760, 93850, 1, 93952, 94026, 1, 94031, 94087, 1, 94095, 94111, 1, 94176, 94180, 1, 94192, 94193, 1, 94208, 100343, 1, 100352, 101589, 1, 101631, 101640, 1, 110576, 110579, 1, 110581, 110587, 1, 110589, 110590, 1, 110592, 110882, 1, 110898, 110928, 30, 110929, 110930, 1, 110933, 110948, 15, 110949, 110951, 1, 110960, 111355, 1, 113664, 113770, 1, 113776, 113788, 1, 113792, 113800, 1, 113808, 113817, 1, 113820, 113823, 1, 117760, 118009, 1, 118016, 118451, 1, 118528, 118573, 1, 118576, 118598, 1, 118608, 118723, 1, 118784, 119029, 1, 119040, 119078, 1, 119081, 119154, 1, 119163, 119274, 1, 119296, 119365, 1, 119488, 119507, 1, 119520, 119539, 1, 119552, 119638, 1, 119648, 119672, 1, 119808, 119892, 1, 119894, 119964, 1, 119966, 119967, 1, 119970, 119973, 3, 119974, 119977, 3, 119978, 119980, 1, 119982, 119993, 1, 119995, 119997, 2, 119998, 120003, 1, 120005, 120069, 1, 120071, 120074, 1, 120077, 120084, 1, 120086, 120092, 1, 120094, 120121, 1, 120123, 120126, 1, 120128, 120132, 1, 120134, 120138, 4, 120139, 120144, 1, 120146, 120485, 1, 120488, 120779, 1, 120782, 121483, 1, 121499, 121503, 1, 121505, 121519, 1, 122624, 122654, 1, 122661, 122666, 1, 122880, 122886, 1, 122888, 122904, 1, 122907, 122913, 1, 122915, 122916, 1, 122918, 122922, 1, 122928, 122989, 1, 123023, 123136, 113, 123137, 123180, 1, 123184, 123197, 1, 123200, 123209, 1, 123214, 123215, 1, 123536, 123566, 1, 123584, 123641, 1, 123647, 124112, 465, 124113, 124153, 1, 124368, 124410, 1, 124415, 124896, 481, 124897, 124902, 1, 124904, 124907, 1, 124909, 124910, 1, 124912, 124926, 1, 124928, 125124, 1, 125127, 125142, 1, 125184, 125259, 1, 125264, 125273, 1, 125278, 125279, 1, 126065, 126132, 1, 126209, 126269, 1, 126464, 126467, 1, 126469, 126495, 1, 126497, 126498, 1, 126500, 126503, 3, 126505, 126514, 1, 126516, 126519, 1, 126521, 126523, 2, 126530, 126535, 5, 126537, 126541, 2, 126542, 126543, 1, 126545, 126546, 1, 126548, 126551, 3, 126553, 126561, 2, 126562, 126564, 2, 126567, 126570, 1, 126572, 126578, 1, 126580, 126583, 1, 126585, 126588, 1, 126590, 126592, 2, 126593, 126601, 1, 126603, 126619, 1, 126625, 126627, 1, 126629, 126633, 1, 126635, 126651, 1, 126704, 126705, 1, 126976, 127019, 1, 127024, 127123, 1, 127136, 127150, 1, 127153, 127167, 1, 127169, 127183, 1, 127185, 127221, 1, 127232, 127405, 1, 127462, 127490, 1, 127504, 127547, 1, 127552, 127560, 1, 127568, 127569, 1, 127584, 127589, 1, 127744, 128727, 1, 128732, 128748, 1, 128752, 128764, 1, 128768, 128886, 1, 128891, 128985, 1, 128992, 129003, 1, 129008, 129024, 16, 129025, 129035, 1, 129040, 129095, 1, 129104, 129113, 1, 129120, 129159, 1, 129168, 129197, 1, 129200, 129211, 1, 129216, 129217, 1, 129280, 129619, 1, 129632, 129645, 1, 129648, 129660, 1, 129664, 129673, 1, 129679, 129734, 1, 129742, 129756, 1, 129759, 129769, 1, 129776, 129784, 1, 129792, 129938, 1, 129940, 130041, 1, 131072, 173791, 1, 173824, 177977, 1, 177984, 178205, 1, 178208, 183969, 1, 183984, 191456, 1, 191472, 192093, 1, 194560, 195101, 1, 196608, 201546, 1, 201552, 205743, 1, 917760, 917999, 1]));
|
|
201
|
+
static _CASE_ORBIT = null;
|
|
202
|
+
static get CASE_ORBIT() {
|
|
203
|
+
if (!this._CASE_ORBIT) {
|
|
204
|
+
this._CASE_ORBIT = decodeOrbit('rCrDIzDYqpII-LiC8cQlHa+0HGrpI6EzClClOBmOBkOBoOBpOBnOBrOBsOBqOlByPBzPBxPyK5crCz+HCydD1dD4dB5dB6dC8dEgeBheCieDmeDpeHj-HCweD1fDxeB+9HBwfC1FE2eBxfBjeBjdD1eDmpIHycB0fEmdBgda6cBhdD4cB1cdyhBC0hBK+hBDhiBBiiBIqiBIgkHChkHKikHDjkHBkkHImkHYjjBBnkH9gGygBB0gBB+gBBhhBBlkHBihBBqhBBijBBqypB4OhzHB70H6BgzHD-GiHo8HBp8HBq8HBr8HBs8HBt8HBu8HBv8HBg8HBh8HBi8HBj8HBk8HBl8HBm8HBn8HB48HB58HB68HB78HB88HB98HB+8HB-8HBw8HBx8HBy8HBz8HB08HB18HB28HB38HBo9HBp9HBq9HBr9HBs9HBt9HBu9HBv9HBg9HBh9HBi9HBj9HBk9HBl9HBm9HBn9HE89HJz9HClaFs+HJj+HHwcQwdQ8-HJz-HqJpdErCBlG-ohBrypBBokH6lVm4+BBl4+B6nCohhCBphhCBqhhCBrhhCBshhCBthhCBuhhCBvhhCBwhhCBxhhCByhhCBzhhCB0hhCB1hhCB2hhCB3hhCB4hhCB5hhCB6hhCB7hhCB8hhCB9hhCB+hhCB-hhCBgihCBhihCBiihCBjihCBkihCBlihCBmihCBnihCBoihCBpihCBqihCBrihCBsihCBtihCBuihCBvihCBgghCBhghCBighCBjghCBkghCBlghCBmghCBnghCBoghCBpghCBqghCBrghCBsghCBtghCBughCBvghCBwghCBxghCByghCBzghCB0ghCB1ghCB2ghCB3ghCB4ghCB5ghCB6ghCB7ghCB8ghCB9ghCB+ghCB-ghCBghhCBhhhCBihhCBjhhCBkhhCBlhhCBmhhCBnhhChD4mhCB5mhCB6mhCB7mhCB8mhCB9mhCB+mhCB-mhCBgnhCBhnhCBinhCBjnhCBknhCBlnhCBmnhCBnnhCBonhCBpnhCBqnhCBrnhCBsnhCBtnhCBunhCBvnhCBwnhCBxnhCBynhCBznhCB0nhCB1nhCB2nhCB3nhCB4nhCB5nhCB6nhCB7nhCFwlhCBxlhCBylhCBzlhCB0lhCB1lhCB2lhCB3lhCB4lhCB5lhCB6lhCB7lhCB8lhCB9lhCB+lhCB-lhCBgmhCBhmhCBimhCBjmhCBkmhCBlmhCBmmhCBnmhCBomhCBpmhCBqmhCBrmhCBsmhCBtmhCBumhCBvmhCBwmhCBxmhCBymhCBzmhC1D3shCB4shCB5shCB6shCB7shCB8shCB9shCB+shCB-shCBgthCBhthCCjthCBkthCBlthCBmthCBnthCBothCBpthCBqthCBrthCBsthCBtthCButhCBvthCBwthCBxthCCzthCB0thCB1thCB2thCB3thCB4thCB5thCC7thCB8thCCwrhCBxrhCByrhCBzrhCB0rhCB1rhCB2rhCB3rhCB4rhCB5rhCB6rhCC8rhCB9rhCB+rhCB-rhCBgshCBhshCBishCBjshCBkshCBlshCBmshCBnshCBoshCBpshCBqshCCsshCBtshCBushCBvshCBwshCBxshCByshCC0shCB1shCk2BgmjCBhmjCBimjCBjmjCBkmjCBlmjCBmmjCBnmjCBomjCBpmjCBqmjCBrmjCBsmjCBtmjCBumjCBvmjCBwmjCBxmjCBymjCBzmjCB0mjCB1mjCB2mjCB3mjCB4mjCB5mjCB6mjCB7mjCB8mjCB9mjCB+mjCB-mjCBgnjCBhnjCBinjCBjnjCBknjCBlnjCBmnjCBnnjCBonjCBpnjCBqnjCBrnjCBsnjCBtnjCBunjCBvnjCBwnjCBxnjCBynjCOgkjCBhkjCBikjCBjkjCBkkjCBlkjCBmkjCBnkjCBokjCBpkjCBqkjCBrkjCBskjCBtkjCBukjCBvkjCBwkjCBxkjCBykjCBzkjCB0kjCB1kjCB2kjCB3kjCB4kjCB5kjCB6kjCB7kjCB8kjCB9kjCB+kjCB-kjCBgljCBhljCBiljCBjljCBkljCBlljCBmljCBnljCBoljCBpljCBqljCBrljCBsljCBtljCBuljCBvljCBwljCBxljCByljC+CwrjCBxrjCByrjCBzrjCB0rjCB1rjCB2rjCB3rjCB4rjCB5rjCB6rjCB7rjCB8rjCB9rjCB+rjCB-rjCBgsjCBhsjCBisjCBjsjCBksjCBlsjCLwqjCBxqjCByqjCBzqjCB0qjCB1qjCB2qjCB3qjCB4qjCB5qjCB6qjCB7qjCB8qjCB9qjCB+qjCB-qjCBgrjCBhrjCBirjCBjrjCBkrjCBlrjC74CgmmCBhmmCBimmCBjmmCBkmmCBlmmCBmmmCBnmmCBommCBpmmCBqmmCBrmmCBsmmCBtmmCBummCBvmmCBwmmCBxmmCBymmCBzmmCB0mmCB1mmCB2mmCB3mmCB4mmCB5mmCB6mmCB7mmCB8mmCB9mmCB+mmCB-mmCBglmCBhlmCBilmCBjlmCBklmCBllmCBmlmCBnlmCBolmCBplmCBqlmCBrlmCBslmCBtlmCBulmCBvlmCBwlmCBxlmCBylmCBzlmCB0lmCB1lmCB2lmCB3lmCB4lmCB5lmCB6lmCB7lmCB8lmCB9lmCB+lmCB-lmChrVgz7CBhz7CBiz7CBjz7CBkz7CBlz7CBmz7CBnz7CBoz7CBpz7CBqz7CBrz7CBsz7CBtz7CBuz7CBvz7CBwz7CBxz7CByz7CBzz7CB0z7CB1z7CB2z7CB3z7CB4z7CB5z7CB6z7CB7z7CB8z7CB9z7CB+z7CB-z7CBgy7CBhy7CBiy7CBjy7CBky7CBly7CBmy7CBny7CBoy7CBpy7CBqy7CBry7CBsy7CBty7CBuy7CBvy7CBwy7CBxy7CByy7CBzy7CB0y7CB1y7CB2y7CB3y7CB4y7CB5y7CB6y7CB7y7CB8y7CB9y7CB+y7CB-y7Ch0eip6DBjp6DBkp6DBlp6DBmp6DBnp6DBop6DBpp6DBqp6DBrp6DBsp6DBtp6DBup6DBvp6DBwp6DBxp6DByp6DBzp6DB0p6DB1p6DB2p6DB3p6DB4p6DB5p6DB6p6DB7p6DB8p6DB9p6DB+p6DB-p6DBgq6DBhq6DBiq6DBjq6DBgo6DBho6DBio6DBjo6DBko6DBlo6DBmo6DBno6DBoo6DBpo6DBqo6DBro6DBso6DBto6DBuo6DBvo6DBwo6DBxo6DByo6DBzo6DB0o6DB1o6DB2o6DB3o6DB4o6DB5o6DB6o6DB7o6DB8o6DB9o6DB+o6DB-o6DBgp6DBhp6D');
|
|
205
|
+
}
|
|
206
|
+
return this._CASE_ORBIT;
|
|
207
|
+
}
|
|
208
|
+
static _Print = null;
|
|
209
|
+
static get Print() {
|
|
210
|
+
if (!this._Print) {
|
|
211
|
+
this._Print = new UnicodeRangeTable(decodeRanges('hB9CBjBLBCpWBDFBFGBCCCBSBCsMBClBBDxBBDCBC2BBJaBFFBSVBC-FBCvBBD6BBDkDBP6BBDwBBDOBCbBDCCBJBGeBJqCBCgFBCHBDBBDVBCGBCEEBCBDIBDBBDDBJFFBCCBDBDYBDCBCFBFBBDVBCGBCBBCBBCBBDCCBDBFBBDCBEIIBCBCIIBPBLCBCIBCCBCVBCGBCBBCEBDJBCCBCCBDQQBCBDLBIGBCCBCHBDBBDVBCGBCBBCEBDIBDBBDCBICBFBBCEBDRBLBBCFBECBCDBEBBCCCBEEBEEBBBELBFEBECBCDBDHHPUBGMBCCBCWBCPBDIBCCBCDBIBBCCBDDDBCBDJBIVBCCBCWBCJBCEBDIBCCBCDBIBBHBBCDBDJBCCBNMBCCBCyBBCCBCFBFPBDZBCCBCRBEXBCIBCDDBFBEFFBEBCCCBGBHJBDCBN5BBFcBmBBBCCCBDBCXBCCCBVBDEBCCCBFBCJBDDBhBnCBCjBBFmBBCjBBCOBCMBmBlGBCGGD4LBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBDfBEZBH1CBDFBD-TBCbBE4CBIVBKXBKTBNMBCCBCBBN9CBDJBHJBHNBCKBH4CBIqBBGlCBLeBCLBFLBFEEBoBBDEBMrBBFZBHKBE9BBDgCBCcBDKBHJBHNBDeByBsCBClFBJ7BBEOBE9BBGqBBDKBJqBBG1QBDFBDlBBDFBDHBCGCBdBD0BBCOBCNBDFBCSBDCBCIBSXBJuBBSBBDaBCMBEgBBQgBBQrEBF5UBXKBWz4BBDfBC8KBGsBBCGGD3BBIBBPXBKGBCGBCGBCGBCGBCGBCGBCGBC9DBjBZBC4CBN1GBbPBC+BBC1CBDmDBGqBBC9CBC1CBKvBBCszcBE2BBK7KBV3FBJtGBDBBCCCBGBW6BBEJBH3BBJlCBJLBHzDBMdBEtCBCKBFgBBC2BBKNBDJBDmDBZbBLFBDFBDFBKGBCGBC7BBF9DBDJBHj9KBNWBFwBBloItLBDpDBnBGBNEBGZBCEBCCCBCCBCCB7DBR8NBD1BBIhBhBBoBBHyBBCSBCDBFEBCmEBF9FBEFBDFBDFBDCBEGBCGBOBBDLBCZBCSBCBBCOBDNBjB6DBGCBFsBBE3CBCMBEwBwBBsBBjEcBEwBBQbBFjBBKdBGqBBGdBCkBBFNBrB9EBDJBHjBBFjBBFnBBJzBBMLBCOBCGBCBBCKBCOBCGBCBBEzBBN2JBKVBLHBZFBCpBBCIBmCFBDCCBqBBCBBEDDBVBCnCBJIBxBSBCBBGgBBEaBGhChCB2BBFTBDxBBCBBGHBCCBCcBDCBFJBIIBI-BBhBmBBFLBK1BBEcBDaBGZBIDBNGBxCoCB4ByBBOyBBItBBJJBHlBBEcBJBBxGeBCpBBCCBDBBRCB4BrBBJpBBXZBnBbBVWBKtCBFjBBK9BBCEBOYBIJBH0BBCRBJmBBK-CBCTBMRBCuBB-BGBCCCBCBCOBCKBH6BBGJBHDBCHBDBBDVBCGBCBBCEBCJBDBBDCBDHHGGBDGBEEBMJBCDDClBBCJBCDDCDBCJBCBBJBBe7CBCEBfnCBJJBnF1BBDlBBjBkCBMJBHMBU5BBHJBHTBdaBDOBFWB6F7BBlDyCBNHBDDDBGBCBBCdBCBBDLBKJBnCHBDtBBDKBcnCBJyCBOoCBIJB3FhBBPJBHIBCsBBCNBLcBEfBDVBCNBqCGBCBBCrBBECCBCCBHBJJBHFBCBBCkBBCBBCFBIJB3JYBIQBCoBBEcB2CQQBwBBO6cBnDuDBCEBMjGBtyCiDBOvhBBRVBL68DBGmSB61G5BBn2B4RBIeBCJBFwCBCJBHdBDFBLlCBLJBCGBCUBGSBxN5BBnG6CBmDqCBF4BBIQBhCEBMBBP3-FBJ1mBBqBJBo3IDBCGBCBBCiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBDDBh7D5HBHzNBtCtBBDWBKzDB9B1HBLmBBDpCBJvDBWlCB7DTBNTBN2CBKYBoE0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDjJBD9VBQEBCOBxiBeBHFB2GGBCQBDGBCBBCEBG9BBiBxDxDBrBBENBDJBFBBhKeBS5BBGxOxOBoBB3GqBBFhPhPBFBCDBCBBCOBCkGBDPBqBrCBFJBFBByYjCBtC8BBjGDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQB1BBBvIrBBFjDBNOBDOBCOBCkBBLtFB5BcBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBClDBngB-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEBxq3VvHB', false));
|
|
212
|
+
}
|
|
213
|
+
return this._Print;
|
|
214
|
+
}
|
|
215
|
+
static CATEGORIES = new LazyMap({
|
|
216
|
+
C: () => new UnicodeRangeTable(decodeRanges('AfBgDgBBOrWrWBHHBCBICCVuMuMnBBBzBBBE4B4BBGBcDBHQBXhGhGxBBB8BBBmDNB8BBByBBBQddBCCMEBgBHBsCiFiFJBBDBBXIICCBFBBKBBDBBFHBCDBDGGBaaBEEHDBDBBXIIDGDBCCGDBDBBECBCGBFCCBFBSJBEKKEXXIDDGBBLIEBCCBNBFBBNGBIEEJBBDBBXIIDGGBKKBDDBEEBFBEDBDGGBTTBIBDHHBBBEFFBBBDCCDCBDCBECBNDBGCBEFFBCCBEBCNBWEBOEEYRRBKKEFFBFBDEEBCCBFFBLLBFBXEEYLLGBBKEEFGBDFBDFFBLLELBOEE0BEEHDBRBBbEETCBZKKCBBICBCDBHCCJFBLBBELB7BDBekBBDCCGZZCYYBGGCIILBBFfBpClBlBBCBoBlBlBQOOBjBBnGCCBDBCBB6LFFBIICFFBqBqBFBBiBFFBIICFFBQQ6BFFBkCkCBhBhBBBBbFB3CBBHBB+UCB6CGBXIBZIBVLBOEEDLB-CBBLFBLFBPMMBEB6CGBsBEBnCJBgBNNBCBNDBCCBrBBBGKBtBDBbFBMCB-BBBiCeeBMMBEBLFBPBBgBwBBuCnFnFBGB9BCBQCB-BEBsBBBMHBsBEB3QBBHBBnBBBHBBJGCgBBB2BQQPBBHUUBEEKMMBDBbEByBPBDBBcOOBBBiBOBiBOBtEDB7UVBMUB14BBBhB+K+KBDBuBCCBDBCBB5BGBDNBZIBI4BI-DhBBb6C6CBKB3GZBxC3C3CBoDoDBDBsB-C-C3CIBxBuzcuzcBBB4BIB9KTB5FHBvGBBDCCJUB8BCBLFB5BHBnCHBNFB1DKBfCBvCMMBCBiB4B4BBHBPBBLBBoDXBdJBHBBHBBHIBIII9BDB-DBBLFBl9KLBYDByBjoIBvLBBrDlBBILBGEBbGGCGD+DPB+NBB3BGBCfBrBFB0BUUFDBGoEoEBCB-FCBHBBHBBHBBECBIIIBLBDBBNbbUDDQBBPhBB8DEBEDBuBCB5COOBBBCuBBvBhEBeCByBOBdDBlBIBfEBsBEBfmBmBBCBPpBB-EBBLFBlBDBlBDBpBHB1BKBNQQIDDMQQIDDBBB1BLB4JIBXJBJXBHrBrBKkCBHBBCtBtBDCBCBBYpCpCBGBKvBBUDDBDBiBCBcEBC-BB5BDBVBBzBDDBDBJEEeBBEDBLGBKGBhCfBoBDBNIB3BCBeBBcEBbGBFLBIvCBqC2BB0BMB0BGBvBHBLFBnBCBeHBDvGBgBrBrBEBBDPBE2BBtBHBrBVBblBBdTBYIBvCDBlBIB-BGGBLBaGBLFB2BTTBGBoBIBhDVVBJBTwBwBB8BBICCFQQMFB8BEBLFBFJJBDDBXXIDDGLLBDDBEEBCCBEBCEBIBBICBGKBLCCBCCnBLLCBBCFFLDDBGBDcB9CGGBcBpCHBLlFB3BBBnBhBBmCKBLFBOSB7BFBLFBVbBcBBQDBY4FB9BjDB0CLBJBBCBBJDDfDDBNNBHBLlCBJBBvBBBMaBpCHB0CMBqCGBL1FBjBNBLFBKuBuBPJBeCBhBBBXPPBnCBIDDtBCBCDDKHBLFBHDDmBDDHGBL1JBaGBSqBqBBBBe0CBCOBzBMB8clDBwDGGBJBlGryCBkDMBxhBPBXJB88DEBoS41GB7Bl2BB6RGBgBLLBCByCLLBEBfBBHJBnCJBLIIWEBUvNB7BlGB8CkDBsCDB6BGBS-BBGKBDNB5-FHB3mBoBBLm3IBFIIDkJkJBNBCcBEBBCNBFHBtMjoCBsDEBOCBKGBLBBF-6DB7HFB1NrCBvBBBYIB1D7BB3HJBoBBBrCHBxDUBnC5DBVLBVLB4CIBamEB2CoCoCDBBCBBDBBFNNCIIiCFFBJJIddFGGCCBI1K1KBlJlJB-V-VBNBGQQBuiBBgBFBH0GBISSBIIDGGBDB-BgBBCvDBuBCBPBBLDBD-JBgBQB7BEBCvOBrB1GBsBDBC-OBIFFDQQmGBBRoBBtCDBLDBDwYBlCrCB+BhGBFccDCCBCCLFFCCCBEBCDBCECEDDCBBCICDCCBFFIKFCLLSEBEGGSzBBDtIBtBDBlDLBQBBQQQmBJBvF3BBeMBtBDBKGBDNBH5EB5eDBSCBOCB4DDBgDFBNDBCOBNDB5BHBLFBpBHBfBBNDBD9BB1KLBPBBOCBLEB5BGBQBBMFBKGB0EnDnDBkgBBh3pBfB7hEFB-GBBj0FNBypHOBvThtCB-QhvBBs6EEBhjEvq3VBxHvw-FB', false)),
|
|
217
|
+
Cc: () => new UnicodeRangeTable(decodeRanges('AfgDgB', true)),
|
|
218
|
+
Cf: () => new UnicodeRangeTable(decodeRanges('tFzqBzqBBEBXhGhGyBhMhMBxCxCs5D9-B9-BBDBbEByBEBCJBw03B6H6HBBBimEQQj7IPBhjiBDBwmFHBn0rYffB+CB', false)),
|
|
219
|
+
Cn: () => new UnicodeRangeTable(decodeRanges('4bBBHDBICCVuMuMnBBBzBBBE4B4BBGBcDBHKBvI9B9BBmDmDBMB8BBByBBBQddBCCMEBgBDDBDBuHJJBDDBXXICCBBBFBBKBBDBBFHBCDBDGGBaaBEEHDBDBBXIIDGDBCCGDBDBBECBCGBFCCBFBSJBEKKEXXIDDGBBLIEBCCBNBFBBNGBIEEJBBDBBXIIDGGBKKBDDBEEBFBEDBDGGBTTBIBDHHBBBEFFBBBDCCDCBDCBECBNDBGCBEFFBCCBEBCNBWEBOEEYRRBKKEFFBFBDEEBCCBFFBLLBFBXEEYLLGBBKEEFGBDFBDFFBLLELBOEE0BEEHDBRBBbEETCBZKKCBBICBCDBHCCJFBLBBELB7BDBekBBDCCGZZCYYBGGCIILBBFfBpClBlBBCBoBlBlBQOOBjBBnGCCBDBCBB6LFFBIICFFBqBqBFBBiBFFBIICFFBQQ6BFFBkCkCBhBhBBBBbFB3CBBHBB+UCB6CGBXIBZIBVLBOEEDLB-CBBLFBLFBbFB6CGBsBEBnCJBgBNNBCBNDBCCBrBBBGKBtBDBbFBMCB-BBBiCeeBMMBEBLFBPBBgBwBBuCnFnFBGB9BCBQCB-BEBsBBBMHBsBEB3QBBHBBnBBBHBBJGCgBBB2BQQPBBHUUBEEKmDmDNBBcOOBBBiBOBiBOBtEDB7UVBMUB14BBBhB+K+KBDBuBCCBDBCBB5BGBDNBZIBI4BI-DhBBb6C6CBKB3GZBxC3C3CBoDoDBDBsB-C-C3CIBxBuzcuzcBBB4BIB9KTB5FHBvGBBDCCJUB8BCBLFB5BHBnCHBNFB1DKBfCBvCMMBCBiB4B4BBHBPBBLBBoDXBdJBHBBHBBHIBIII9BDB-DBBLFBl9KLBYDByBDBvzIBBrDlBBILBGEBbGGCGD+DPB+NBB3BGBCfBrBFB0BUUFDBGoEoEBCC-FCBHBBHBBHBBECBIIIBIBGBBNbbUDDQBBPhBB8DEBEDBuBCB5COOBBBCuBBvBhEBeCByBOBdDBlBIBfEBsBEBfmBmBBCBPpBB-EBBLFBlBDBlBDBpBHB1BKBNQQIDDMQQIDDBBB1BLB4JIBXJBJXBHrBrBKkCBHBBCtBtBDCBCBBYpCpCBGBKvBBUDDBDBiBCBcEBC-BB5BDBVBBzBDDBDBJEEeBBEDBLGBKGBhCfBoBDBNIB3BCBeBBcEBbGBFLBIvCBqC2BB0BMB0BGBvBHBLFBnBCBeHBDvGBgBrBrBEBBDPBE2BBtBHBrBVBblBBdTBYIBvCDBlBIBlCJBCBBaGBLFB2BTTBGBoBIBhDVVBJBTwBwBB8BBICCFQQMFB8BEBLFBFJJBDDBXXIDDGLLBDDBEEBCCBEBCEBIBBICBGKBLCCBCCnBLLCBBCFFLDDBGBDcB9CGGBcBpCHBLlFB3BBBnBhBBmCKBLFBOSB7BFBLFBVbBcBBQDBY4FB9BjDB0CLBJBBCBBJDDfDDBNNBHBLlCBJBBvBBBMaBpCHB0CMBqCGBL1FBjBNBLFBKuBuBPJBeCBhBBBXPPBnCBIDDtBCBCDDKHBLFBHDDmBDDHGBL1JBaGBSqBqBBBBe0CBCOBzBMB8clDBwDGGBJBlGryCBkDMB3iBJB88DEBoS41GB7Bl2BB6RGBgBLLBCByCLLBEBfBBHJBnCJBLIIWEBUvNB7BlGB8CkDBsCDB6BGBS-BBGKBDNB5-FHB3mBoBBLm3IBFIIDkJkJBNBCcBEBBCNBFHBtMjoCBsDEBOCBKGBLBBJ76DB7HFB1NrCBvBBBYIB1D7BB3HJBoBBBjGUBnC5DBVLBVLB4CIBamEB2CoCoCDBBCBBDBBFNNCIIiCFFBJJIddFGGCCBI1K1KBlJlJB-V-VBNBGQQBuiBBgBFBH0GBISSBIIDGGBDB-BgBBCvDBuBCBPBBLDBD-JBgBQB7BEBCvOBrB1GBsBDBC-OBIFFDQQmGBBRoBBtCDBLDBDwYBlCrCB+BhGBFccDCCBCCLFFCCCBEBCDBCECEDDCBBCICDCCBFFIKFCLLSEBEGGSzBBDtIBtBDBlDLBQBBQQQmBJBvF3BBeMBtBDBKGBDNBH5EB5eDBSCBOCB4DDBgDFBNDBCOBNDB5BHBLFBpBHBfBBNDBD9BB1KLBPBBOCBLEB5BGBQBBMFBKGB0EnDnDBkgBBh3pBfB7hEFB-GBBj0FNBypHOBvThtCB-QhvBBs6EEBhjEwi3VBCdBhD-DBxHvw-BB---BBB---BBB', false)),
|
|
220
|
+
Co: () => new UnicodeRangeTable(decodeRanges('gg4B-nGh4hc9--BD9--B', true)),
|
|
221
|
+
Cs: () => new UnicodeRangeTable(decodeRanges('gg2B--B', true)),
|
|
222
|
+
L: () => new UnicodeRangeTable(decodeRanges('hCZBHZBwBLLFGGBVBCeBCpOBFLBPEBICCiEEBCBBDDBCHHCCBCCCBSBCyCBCqEBJlFBClBBDHHBnBBoCaBFDBuBqBBkBBBCiDBCQQBIIBLLBBBDRRCdBe4CBMZZBfBKBBFGGBUBFKKEYYBXBIKBGXBCFBSpBB7B1BBETTIJBQPBFHBDBBDVBCGBCEEBCBERROBBCCBPBBLJJBEBFBBDVBCGBCBBCBBCBBgBDBCUUBBBRIBCCBCVBCGBCBBCEBETTQBBYMMBGBDBBDVBCGBCBBCEBEffBCCBBBQSSCFBECBCDBEBBCCCBEEBEEBBBELBX1B1BBGBCCBCWBCPBEbbBBBDDDBffFHBCCBCWBCJBCEBEgBgBBCCBQQBSSBHBCCBCoBBDRRGCBJCBZFBGRBEXBCIBCDDBFB7BvBBCBBNGB7BBBCCCBDBCXBCCCBIBCBBKDDBDBCWWBCBhBgCgCBGBCjBBcEB0DqBBVRRBEBFDBEEEBIIBBBFMBNSSBkBBCGGDqBBCsKBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBmBPBR1CBDFBErTBDQBCZBGqCBHHBIRBOSBPRBPMBCCBQzBBkBFFkC4CBIEBDhBBCGGBkCBLeByBdBDEBMrBBFZB3BWBK0BBzC+C+CBtBBSHB3BdBOBBLrBBbjBBqBCBLjBBDKBGqBBDCBqBDBCFBCBBEGGB+FBhC1IBDFBDlBBDFBDHBCGCBdBD0BBCGBCEEBBBCGBEDBDFBFMBGCBCGB1DOORMBmDFFDJBCEEBDBHGCBCBCKBDDBGEBF1B1BB8zC8zCBjHBHDBEBBNlBBCGGD3BBIRRBVBKGBCGBCGBCGBCGBCGBCGBCGBxC2O2OBrBrBBDBGBBF1CBHCBC5CBCDBGqBBC9CBSfBxBPBhQ-tGBhCs0VBkCtBBDsIBEPBLBBVuBBReBDlCByBIBDmDBDiCBDBBCCCBGBWPBCCBCDBCWBezBBPxBB-BFBECCBMMBaBLWBacBIuBBdRRBDBCJBLEBCoBBYCBCHBVWBEEEBwBBCEEBDDBDBDCCZCBDKBICBNFBDFBDFBKGBCGBCqBBCNBHyDBej9KBNWBFwBBloItLBDpDBnBGBNEBGCCBIBCMBCEBCCCBCCBCCBqDBiBqLBT-BBD1BBpBLB1DEBCmEBlBZBHZBM4CBEFBDFBDFBDCBkBLBCZBCSBCBBCOBDNBjB6DBmMcBEwBBwBfBOTBCHBHlBBLdBDjBBFHBxB9EBTjBBFjBBFnBBJzBBNKBCOBCGBCBBCKBCOBCGBCBBEzBBN2JBKVBLHBZFBCpBBCIBmCFBDCCBqBBCBBEDDBVBLWBKeBiCSBCBBLVBLZBnC3BBHBBhCQQBCBCCBCcBrBcBEcBkBHBCbBc1BBLVBLSBORBvDoCB4ByBBOyBBOjBBnBbBKWB7HpBBHBBRCB8BcBLJJBUBrBRBvBUBcWBN0BB6BBBDOOBrBBhBYBbjBBeDDJiBBENNBuBBPDBWCCkBRBCYBUBBgCGBCCCBCBCOBCJBIuBBnBHBDBBDVBCGBCBBCEBETTNEBfJBCDDClBBCaaCtBtBBzBBTDBVCBfvBBVBBC5F5FBtBBqBDBlBvBBV8B8BBpBBOoCoCBZBmBGB6FrBB1D-BBgBHBDDDBGBCBBCXBQCC-CHBDmBBRCCdLLBmBBIWWMtBBUTTBnCBoGgBBgBIBCkBBSyByBBcBxDGBCBBClBBWaaBEBCBBCfBPoKoKBRBQCCBLBChBB9DwCwCB4cBnHjGBtyCgDBQvhBBSFBa68DBGmSB61GdBj3B4RBIeBSuCBSdBTvBBRDBgBUBGSBxNsBB0G-BBhEqCBGjCjCBLBhCBBCddB2-FBJ1mBBqBJBo3IDBCGBCBBCiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBn7F0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDYBCYBCeBCYBCeBCYBCeBCYBCeBCYBCHB15BeBHFBmI9BBzEsBBLGBRiKiKBcBTrBBlPbBlHdBDwPwPBFBCDBCBBCOBCkGB8BjCBI1lB1lBBCBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQBlqE-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
|
|
223
|
+
LC: () => new UnicodeRangeTable(decodeRanges('hCZBHZB7BLLBVBCeBCiGBCDBFvGBCaBhGDBDBBECBCHHCCBCCCBSBCyCBCqEBJlFBClBBKoBB44ClBBCGGDqBBDCBhV1CBDFBjkCKBGqBBDCBhCrBBgCMBChBBmD1IBDFBDlBBDFBDHBCGCBdBD0BBCGBCEEBBBCGBEDBDFBFMBGCBCGBmIFFDJBCEEBDBHGCBCBCFBFDDBCBGEBF1B1BB8zC8zCB6DBDmDBHDBEBBNlBBCGGzoetBBTbBnEtCBCWBEDBC9BBDBBCCCBGBZBBE2Z2ZBpBBGIBIvCBh6TGBNEBqgBZBHZBmlBvCBhDjBBFjBB1DKBCOBCGBCBBCKBCOBCGBCBBk2ByBBOyBB+CVBLVB74C-BBhrV-BBhsZ0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDYBCYBCeBCYBCeBCYBCeBCYBCeBCYBCHB15BJBCTBHFB2uCjCB', false)),
|
|
224
|
+
Ll: () => new UnicodeRangeTable(decodeRanges('hDZB7BqBqBBWBCHBC2BCBQCBuBCDECBBBDCCDEEBFFDEEBBBDDDCCCDCCBCCDEECDDBDDBBBHGDCOCBSCBDDCEEC4BCBFBDDDBCCFICBjCBCaBiGCCEEEBBBTccBhBBCBBECBCWCBDBCGDB0B0BBuBBCgBCK0BCDMCBgDCxBoBBo6CqBBDCB5XFBjkCIBC2D2DBqBBgCMBChBBnD0ECBHBCgDCBHBJFBLHBJHBJFBLHBJHBJNBDHBJHBJHBJEBCBBHEEBBBCBBJDBDBBJHBLCBCBBzIEEBEEcKFDBBJDBF2B2Bs1CvBBCEEBGCFCCBCCBEBGiDCBIICFFNlBBCGG0oesBCUaCoEMCBBBC+BCBGBCCCDICFCCDCCBBBCSCGGGCMCFCCDEECICbEE2ZqBBGIBIvCBh6TGBNEBqhBZBumBnBBpEjBB8EKBCOBCGBCBBk4ByBB+DVB75CfBhsVfB7sZZBbGBCRBbZBbDBCCCBFBCKBbZBbZBbZBbZBbZBbZBbZBbZBbbBdYBCFBbYBCFBbYBCFBbYBCFBbYBCFBC15B15BBIBCTBHFB4vChBB', false)),
|
|
225
|
+
Lm: () => new UnicodeRangeTable(decodeRanges('wVRBFLBPEBICCmEGG-OnHnHlFBBuIBBFgBgBKEEhFoFoF1mBgEgE2R72B72BsDkTkTxOFBvF+BBOjBjBBjBByVOORMBg-CBByHgGgG2OsBsBBDBGiDiDB+C+CBBB34bjnBjnBBEBvIzDzDdBB6DIBxCYYqDCBEBB2OXXqEtDtDWBBoDDBKngVngVuBBBh-BFBCpBBCIB0sBhBhBxuXDB9PCBpBBBnRMBhCBBCtgQtgQBCBCGBCBByhM9BBqGGBudgjBgjB', false)),
|
|
226
|
+
Lo: () => new UnicodeRangeTable(decodeRanges('qFQQhIFFBCBxG8Z8ZBZBFDBuBfBCJBkBBBCiDBCZZBLLBBBDRRCdBe4CBMZZBfBWVBrBYBIKBGXBCFBSoBB8B1BBETTIJBROBFHBDBBDVBCGBCEEBCBERROBBCCBPBBLJJBEBFBBDVBCGBCBBCBBCBBgBDBCUUBBBRIBCCBCVBCGBCBBCEBETTQBBYMMBGBDBBDVBCGBCBBCEBEffBCCBBBQSSCFBECBCDBEBBCCCBEEBEEBBBELBX1B1BBGBCCBCWBCPBEbbBBBDDDBffFHBCCBCWBCJBCEBEgBgBBCCBQQBSSBHBCCBCoBBDRRGCBJCBZFBGRBEXBCIBCDDBFB7BvBBCBBNFB8BBBCCCBDBCXBCCCBIBCBBKDDBDBYDBhBgCgCBGBCjBBcEB0DqBBVRRBEBFDBEEEBIIBBBFMBNyDyDBnKBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBmBPByDrTBDQBCZBGqCBHHBIRBOSBPRBPMBCCBQzBBpBkCkCBhBBC0BBIEBDhBBCGGBkCBLeByBdBDEBMrBBFZB3BWBK0BBxFuBBSHB3BdBOBBLrBBbjBBqBCBLdByDDBCFBCBBE7hB7hBBCB4-C3BBZWBKGBCGBCGBCGBCGBCGBCGBCGBoR2B2BF1CBJCCB4CBFGGBpBBC9CBSfBxBPBhQ-tGBhC0wUBC2jBBkCnBBJrIBFPBLBBjCyByBBkCBqFoDoDEGBCCBCDBCWBezBBPxBB-BFBECCBMMBaBLWBacBIuBBuBEBDIBLEBCoBBYCBCHBVPBCFBEEEBwBBCEEBDDBDBDCCZBBEKBIPPBEBDFBDFBKGBCGByEiBBej9KBNWBFwBBloItLBDpDBkCCCBIBCMBCEBCCCBCCBCCBqDBiBqLBT-BBD1BBpBLB1DEBCmEBqDJBCsBBDeBEFBDFBDFBDCBkBLBCZBCSBCBBCOBDNBjB6DBmMcBEwBBwBfBOTBCHBHlBBLdBDjBBFHBhEtCBjDnBBJzBB9CzBBN2JBKVBLHB5EFBDCCBqBBCBBEDDBVBLWBKeBiCSBCBBLVBLZBnC3BBHBBhCQQBCBCCBCcBrBcBEcBkBHBCbBc1BBLVBLSBORBvDoCB4FjBBnBDBCxJxJBoBBHBBRCB8BcBLJJBUBrBRBvBUBcWBN0BB6BBBDOOBrBBhBYBbjBBeDDJiBBENNBuBBPDBWCCkBRBCYBUBBgCGBCCCBCBCOBCJBIuBBnBHBDBBDVBCGBCBBCEBETTNEBfJBCDDClBBCaaCtBtBBzBBTDBVCBfvBBVBBC5F5FBtBBqBDBlBvBBV8B8BBpBBOoCoCBZBmBGB6FrBB0GHBDDDBGBCBBCXBQCC-CHBDmBBRCCdLLBmBBIWWMtBBUTTBnCBoGgBBgBIBCkBBSyByBBcBxDGBCBBClBBWaaBEBCBBCfBPoKoKBRBQCCBLBChBB9DwCwCB4cBnHjGBtyCgDBQvhBBSFBa68DBGmSB61GdBj3B4RBIeBSuCBSdBTvBB0BUBGSB0NnBB2MqCBGwFwFB2-FBJ1mBBqBJB43IiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBxzI2P2PBrBBiBiKiKBcBTrBBlPaBmHdBDwPwPBFBCDBCBBCOBCkGB8pBDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQBlqE-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
|
|
227
|
+
Lt: () => new UnicodeRangeTable(decodeRanges('lOGDnB2sH2sHBGBJHBJHBNQQwBAB', false)),
|
|
228
|
+
Lu: () => new UnicodeRangeTable(decodeRanges('hCZBmDWBCGBiB2BCDOCDuBCBECEBBCCCBCCBBBDDBCBBCCBEBBCBBCECBCCDCCBCCBBBCCCBEEIJDCMCDQCDDDCCBC4BCIBBCBBDCCBCBCGCiJCCEJJHCCBBBCCCBCCBPBCIBkBDDBBBEWCGDDCBBDyBBxBgBCK2BCBMCD+CCDlBBq6ClBBCGGzW1CB0kCHHBpBBDCBhK0ECKgDCKHBJFBLHBJHBJFBMGCJHBpCDBNDBNDBNEBMDBnIFFECBDCBDEEBDBHGCBCBDDBLBBG+B+B9zCvBBxBCCBBBDGCBCBCDDJCBCgDCJCCFuqeuqeCqBCUaCoEMCE8BCLECBICFCCDCCEUCBDBCEBCOCBCBCCCBEEGGCZs5Vs5VBYBmmBnBBpEjBB9EKBCOBCGBCBBr3ByBB+EVB75CfBhsVfBhtZZBbZBbZBbCCBGDBDDBCBCHBbZBbBBCDBDHBCGBcBBCDBCEBCEEBFBcZBbZBbZBbZBbZBbZBfYBiBYBiBYBiBYBiBYBiB2pE2pEBgBB', false)),
|
|
229
|
+
M: () => new UnicodeRangeTable(decodeRanges('gYvDB0IGBoIsBBCCCBCCBCCpCKBxBUBRmDmDBFBDFBDBBCDBkBffBZB8CKB7BIBKZZBCBCIBCCBCEBsBCB8BIBrBXBCgBB3BCBCRBCGBLBBeCB5BCCBFBDBBDCBKLLBbbDCB5BCCBDBFBBDCBEffBEEMCB5BCCBGBCCBCCBVBBXFBCCB5BCCBFBDBBDCBICBLBBf8B8BBDBECBCDBKpBpBBDB4BCCBFBCCBCDBIBBMBBeCB5BCCBFBCCBCDBIBBMBBQNNBCB4BBBCGBCCBCDBKLLBeeBBBnCFFBEBCCCBGBTBB+BDDBFBNHBjDDDBHBMGBqCBBcECFBByBTBCBBGKBCjBBKlDlDBSBYDBFCBCCBDGBEDBOLBCLLBCBgWCBzdDBdCBeBBfBBhCfBKuBuBBBBC2D2DBjBjB3DLBFLB8GEB6BJBCcBDxBxBBdByBEBwBQBnBIBNCBfMB5BNBxBTB5ECBCUBFHHDCBnG-BBxWgBB--CCBuEhDhDBeBrRFBqDBB1udDBCJBhBBBxCBBxIEEFYYBDBF0C0CBzBzBBQBbRBOnBnBBGBaMBtBDBwBNBlBkCkCBMBNJJBuBuBBBBzBCCBBBDBBGBBCqBqBBDBGBBtHHBCBBx5TiXiXBOBRPBuejHjH2EEBn0BCBCBBGDBpBCBFmFmFB+R+RBCBiCEB+JBBwCDBnCKByBDB7DCB2BOBqBDDBLLBCBuBKBI+B+BBBBlBNBRBBtBNNBBBxBNBJDBCBB9CLBHDD+ELBWDB4BBBCGBDBBDCBKLLBDDBFBEEBkCIBCDDCDBCEBCPPBzCzCBQBYyCyCBSBsHGBDIBcBBzCQBrDMBmDOBhIOB2HFBCBBDDBCCCBuEuEBFBDGBEddBIBpBGBCDBJKKBJBvBPB2MHBCHBzCVBCNB7DFBECCBCCBFBCjCjCBDBCBBCEB8KDBKBBCxBxBBFBEEBYmnFmnFHOBpmLRBhuCEB8BGB5gBCCB1BBIDByCMMBslTslTBizEizEBsBBDWB-QEBEFBJHBDGBfDB1ECB89B2BBFxBBJPPXEBCOBxqBGBCQBDGBCBBCEBlDhFhFBFB4L+B+BBCB9PDB-HBBhXGBuDGB29lYvHB', false)),
|
|
230
|
+
Mc: () => new UnicodeRangeTable(decodeRanges('joC4B4BDCBJDBCBBzBBB7BCBHBBDBBLsBsB7BCBjC7B7BBBBJCCB2B2BB7B7BCHHBDDBLLnDBBCBBECBCCBLqBqBBBB+BDB+BBB7BCCBDBDBBCBBKBBdPPB7B7BBBBGCBCCBLrBrBBsCsCBBBHHBTBBrKBBgCsFsFBFFHDDBaaBLLBBBDGBWBBDFBDLLBBB5zBffiEIIBGBCBB7KDBDCBFBBCFBhHBB7BCCKCCBJJBEByExBxBGCCBDBCBB+BffFBBD9B9BDCBCEEBxBxBBGBJBBsFWW35EBB0-dBBD5C5CBzBzBBOBvEBBwBxBxBBFFBDDBBBvDBBDBBZuBuBCuDuDDBBGuHuHBCCBCCBCC0gZCCgEuBuBBBBFBB0DZZB8B8BxBCBKBBO+C+CBBBEBBCrFrFBBBgBBB7BBBCDBDBBDCBKLLB1C1CBBBIDDCDBCBBCmDmDBBBJBBErDrDBBBHCCBCBDuHuHBBBHDBDyDyDBBBJBBCuDuDCBBHoDoDCBBFmImIBBBK4H4HBEBCBBFDDCvEvEBBBJDBF1C1CeBB-B4M4MPrDrDIDD2GEBFBBC-K-KBNNxBBBJBBCpvQpvQBBBlxD2BBpDBB0rYBBHFB', false)),
|
|
231
|
+
Me: () => new UnicodeRangeTable(decodeRanges('okBBB1xF-wB-wBBCBCCBsshBCB', false)),
|
|
232
|
+
Mn: () => new UnicodeRangeTable(decodeRanges('gYvDB0IEBqIsBBCCCBCCBCCpCKBxBUBRmDmDBFBDFBDBBCDBkBffBZB8CKB7BIBKZZBCBCIBCCBCEBsBCB8BIBrBXBCfB4BCCFHBFEEBFBLBBe7B7BFDBJVVBbbDBB6BFFBFFBDDBBBEffBEEMBB6BFFBDBCBBFVVBXXBEBC7B7BDCCBCBJIIBMMBff+BNNzBEE4BCCBBBGCBCDBIBBMBBe7B7BDHHGBBVBBdBB6BBBFDBJVVBeepCIIBBBC7C7CDGBNHBjDDDBHBMGBqCBBcEC4BNBCEBCBBGKBCjBBKnDnDBCBCFBCBBDBBaBBFCBRDBODDBHHQgWgWBBBzdCBeBBfBBfBBhCBBCGBJDDBJBKuBuBBBBC2D2DBjBjB3DCBFBBKHHBBB8GBBD7B7BCGBCCCDHBHJBDxBxBBMBCPByBDBxBCCBDBCGGpBIBNBBhBDBDBBCCB5BCCBEECCB7BHBDBB5ECBCMBCGBFHHEBBnG-BBxWMBFEEBKB--CCBuEhDhDBeBrRDBsDBB1udFFBIBhBBBxCBBxIEEFaaBGG4EBBbRBOnBnBBGBaKBvBCBxBDDBCBDBBoBkCkCBEBDBBDBBNJJwB0B0BCCBDBBGBBCrBrBBJJvHDDFx5Tx5TiXPBRPBuejHjH2EEBn0BCBCBBGDBpBCBFmFmFB+R+RBCBiCEB+JBBwCDBnCKByBDB8D3B3BBNBqBDDBLLBBByBDBDBBI+B+BBBBlBEBCHB-BNNB1B1BBHBLDBDgDgDBBBDCCBHHD+E+EEHBWBB6BBBEmBmBBFBEEBnCFBOECPBB2CHBDCBCYY1CFBCFFBCCBvHvHBCBHBBCBBcBB2CHBDCCBrDrDCDDBEBCmDmDCDDBCBCEBkIIBCBBhIBBCFFxEDBDBBFhBhBBIBpBFBDDBJKKBEBDCBvBMBCBB3MGBCFBCzCzCBUBDGBCBBCBB7DFBECCBCCBFBCpCpCBEEC8K8KBMMB1B1BBDBGCCYmnFmnFHOBpmLLBECBhuCEB8BGB5gBgCgCBCByC5lT5lTBizEizEBsBBDWBhRCBSHBDGBfDB1ECB89B2BBFxBBJPPXEBCOBxqBGBCQBDGBCBBCEBlDhFhFBFB4L+B+BBCB9PDB-HBBhXGBuDGB29lYvHB', false)),
|
|
233
|
+
N: () => new UnicodeRangeTable(decodeRanges('wBJB5DBBGDDBBBitBJBnEJBnGJB9MJB3DJBFFBtDJB3DJB3DJBDFBvDMB0DJBJGBoDJBpDGBISBuDJBhDJB3DJBnCTBtIJBnCJBwWTBybCBwHJBHJBXJBtJJBhEKBmFJBHJB3FJB3CJBnEJBHJB3gBEEBEBHJBnGyBBDEB3W7BBvCVB3TdBqrBqYqYaIBPCB4KDBrEJBfHBCOBhBJBoBOBh7cJB9FJBhKFB7EJBnBJBnGJBXJB3CJB3MJB34UJBuPsBBN4BBSBB2KaBlBDBeJJnEEBrGJBvdHBaGBoBIBsCEBXFBhFBBDPBDtBBhCIB1BBBfCBsCEBpDHBZHBqBGBrKFBxBJBHJB3IeB-EJBrBDBxDGBnEdBhEJB9BJBxEJBITB8HJB3KJB3DJB3LJBnDJBHTBtCLBlNSB+CJB3UJB3CcBkHJBnCJBnNJBnDUBshBuDBimPJBnpCJB3CJBnEJBCGBvQJBnIWB6yXJBnuBTBNTBtDYB2iBxBBhqCJBnNJB3PJB4HJBtWIBhEJB4Y6BBCCBCDBtCsBBCOBjeMBk3CJB', false)),
|
|
234
|
+
Nd: () => new UnicodeRangeTable(decodeRanges('wBJnxBJnEJnGJ9MJ3DJ3DJ3DJ3DJ3DJ3DJ3DJ3DJ3DJhDJ3DJnCJ3IJnCJn6BJnBJtJJhEJnFJHJ3FJ3CJnEJHJnuiBJnVJnBJnGJXJ3CJ3MJ34UJnsBJnkCJHJ9YJhEJ9BJxEJ3IJ3KJ3DJ3LJnDJHTtCJnNJnDJ3UJ3CJ3HJnCJnNJ3uQJnpCJ3CJnEJ3QJ37XJ12CxBhqCJnNJ3PJ4HJ2aJ30EJ', true)),
|
|
235
|
+
Nl: () => new UnicodeRangeTable(decodeRanges('u3FCBwzCiBBDDB-zDaaBHBPCBs1dJBxyW0BBtOJJnEEBrhIuDB', false)),
|
|
236
|
+
No: () => new UnicodeRangeTable(decodeRanges('yFBBGDDBBB2pCFB5LFB5DCBmEGB6GGBSIByNJB2hBTB0jBJBhP20B20BEFBHJBnGPBqB3W3WB6BBvCVB3TdBqrB1kB1kBBCBrEJBfHBCOBhBJBoBOBxrdFBymWsBBiCDBSBB2KaBlBDB1pBHBaGBoBIBsCEBXFBhFBBDPBDtBBhCIB1BBBfCBsCEBpDHBZHBqBGBrKFBhLeB-EJBrBDBxDGBnETB8LTBmqBBBvNIBobSB0aUBn8SGB-YWBqhZTBNTBtDYBvqFIBid6BBCCBCDBtCsBBCOBjeMB', false)),
|
|
237
|
+
P: () => new UnicodeRangeTable(decodeRanges('hBCBCFBCDBLBBEBBbCBCccCkBkBGEELBBEEE-VJJzOFBqBBB0BCCDDDtBBBVBBCBBOCCBBBrCDBnDsBsBBMBqHCB3BOBgBmImIBLLtE5D5D6DnMnMNwLwL7CLLBpFpFBNBCmBmBBCBoCrCrCBDBFBBwDFBsFlTlTBHB4EuTuTtBBBvCCBoCBB+ECBCCBmBKB6JBB5GBBhEGBCFBhFBBLGBdCB9DDB8BEB-BBBhCHBM9Z9ZBWBJTBCMBCLBfBBPBB6TDBeBB+hBNBwCBBgBJB0MVBgCDBhBBB8XDBCBBxDwEwEBtBBCfBDLBkNCBFJBDLBRNNjD7C7CjgdBBuICBkDLL0DFB9LDB3CBBpBCBCyByBBwBwBiDMBRBB9DDB-DBBRBB6HzqUzqUBxGxGBIBXiBBCNBCFFCBB2ECBCFBCDBLBBEBBbCBCccCCCBFB7MCB9UxBxB-MoXoXoGgBgBxIIBnBxDxDBFBjCGB6CDByO-J-JoFEBtBDB+FGBuDBBCDB-DDBxBBBwCDBFOOCCB5CFBsDrJrJBCCBzDzDBDBLBBCpDpD7HWBqDCBdMBtCjEjEBBB9HpIpIBBB8E9C9CBGB0CCBCEB+CJB4GgDgDBDBrBBBmUBBrCMBwFxjBxjBBDB97CBB8zOBBmEiCiCBDBJpRpRBBBoJDBoK9lT9lTovHEB07C-a-aBAB', false)),
|
|
238
|
+
Pc: () => new UnicodeRangeTable(decodeRanges('-Cg-Hg-HBUU-u3BBBZCBwHAB', false)),
|
|
239
|
+
Pd: () => new UnicodeRangeTable(decodeRanges('tB9qB9qB0BiyDiyDmgBqgCqgCBEBiwDDDgBBBFdd-NUUwDxszBxszBBmBmBLqFqFhzD-J-J', false)),
|
|
240
|
+
Pe: () => new UnicodeRangeTable(decodeRanges('pB0B0BgB+1D+1DC-6B-6BqtC4B4BQ7T7TCff-hBMCxChBhBCGC1MUChCCCiBmhBmhBCECtBGCtNICEGCDBB-ozB6G6GeOCESSCCCrF0B0BgBGD', false)),
|
|
241
|
+
Pf: () => new UnicodeRangeTable(decodeRanges('7F+6H+6HEddpuDCCFDDQEE', false)),
|
|
242
|
+
Pi: () => new UnicodeRangeTable(decodeRanges('rFt7Ht7HDBBDaapuDCCFDDQEE', false)),
|
|
243
|
+
Po: () => new UnicodeRangeTable(decodeRanges('hBCBCCBDECBLLBEEBcclCGGPBBI-V-VJzOzOBEBqB3B3BDDDtBBBVBBCBBOCCBBBrCDBnDsBsBBMBqHCB3BOBgBmImIBLLtE5D5D6DnMnMNwLwL7CLLBpFpFBNBCxDxDrCEBFBBwDFBsFlTlTBHBmY9D9DBBBoCBB+ECBCCBmBFBCDB6JBB5GBBhEGBCFBhFBBLGBdCB9DDB8BEB-BBBhCHBMjajaBJJBGBJIBDDBDCBEKBCCCBIB7kDDBCBBxDwEwEBFFBBBDDDBHBCBBCDDBLLBDBCJBDDBCCCBLBDCBtNCB6B+F+FjgdBBuICBkDLL0DFB9LDB3CBBpBCBCyByBBwBwBiDMBRBB9DDB-DBBRBB6HlxUlxUBFBDXXVBBDDBECBCDBICBHCCB2E2EBBBCCBDECBLLBEEBcclBDDB7M7MBBB9UxBxB-MoXoXoGgBgBxIIBnBxDxDBFBjCGB6CDB5dEBtBDB+FGBuDBBCDB-DDBxBBBwCDBFOOCCB5CFBsDrJrJBCCBzDzDBDBLBBCpDpD7HWBqDCBdMBtCjEjEBBB9HpIpIBBB8E9C9CBGB0CCBCEB+CJB4GgDgDBDBrBBBmUBBrCMBwFxjBxjBBDB97CBB8zOBBmEiCiCBDBJpRpRBBBoJDBoK9lT9lTovHEB07C-a-aBAB', false)),
|
|
244
|
+
Ps: () => new UnicodeRangeTable(decodeRanges('oBzBzBgB-1D-1DC-6B-6B-rCEEnB4B4BQ7T7TCff-hBMCxChBhBCGC1MUChCCCiBmhBmhBCECaTTCECtNICEGCDipzBipzB4GeeCMCESSCCCrFzBzBgBEEDAB', false)),
|
|
245
|
+
S: () => new UnicodeRangeTable(decodeRanges('kBHHRCBgBCCcCCkBEBCBBDCCBCBDEEfgBgBrODBNNBGGBCCCBPB2DPPBxDxDsErIrIBBB3DCBDDDBvGvGLUUB4H4HIBBpEqLqLBHHB2H2H-DjEjEBGBlEwGwGqBmGmGiGCBQCCBBBDFBVECmEHBCFBCBBGDBmGBBxXJB0WuLuLlL+E+EBgBBiLJBKIBhiBCCBBBMCBOCBOCBOBBmCOOoBCBOCBUgBBgCBBCDBCBBLCCBBBGFBCECFMMBFFBDBGDBC7B7BBFFB2LBFcBD+HBXKByCtCBXnTBtBwBBDeBLyMBX+BBFfBD1LBDfBCoDBmHFBmLBBvBZBC4CBN1GBbPBFOOBNNWBBHBB8CBB0HBBFJBhBlBBKRRBdBMdBJQQBeBLmBBQ-JBhuG-BBx0V2BB6RWBKBBoDBB+EDBLDB+RCBiHPPB+9T+9TpEQB+LPBgEtBtBBCBjDCCBBBD7E7EHRRBBBgBCCcCCiEGBCGBOBB6JIB6BQBDCBCMBEwBwBBrBB7zBBBwSmWmWBwtCwtC2kCcBr6SDBG3qU3qUk7DvHBRzNB9EzDB9B1HBLmBBD7BBGCBXBBIdBF8BBWhCBE7F7FB1CBrbaagBaagBaagBaagBaa9B-PB4BDBzBHBCNBCBBp2BwNwNttCEE+DiOiOBvIvIBqBBFjDBNOBDOBCOBCkBBYgFB5BcBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBC7CB', false)),
|
|
246
|
+
Sc: () => new UnicodeRangeTable(decodeRanges('kB+D+DBCBqnB8D8DzPBBzPBBI2H2HoImSmS8sClmClmCBfB47hBkuVkuVtD7E7E8GBBEBB3-HDB-4wBxtCxtC', false)),
|
|
247
|
+
Sk: () => new UnicodeRangeTable(decodeRanges('+CCCoCHHFEEqQDBNNBGGBCCCBPB2DPPBjoBjoB15FCCBBBMCBOCBOCBOBB9kEBBkzdWBKBBoDBBxePPBniUniUBPB8bCCjF4g9B4g9BBDB', false)),
|
|
248
|
+
Sm: () => new UnicodeRangeTable(decodeRanges('rBRRBBB+BCCuBFFmBgBgB-XwQwQBBB8xGOOoBCBOCBsEoBoBBDBHlClCBDBGBBFGDIgBgBBDDCgBgBBqIBhBBB7CffBXBpBFB2OKK3BHBwDxKxKBDBDeBLPBhIiEBX+BBFfBDhIBxBUBDFB9+zB5Z5ZCCBlFRRBBB+BCCkEHHBCBitDBBypyBaagBaagBaagBaagBaat5FBB', false)),
|
|
249
|
+
So: () => new UnicodeRangeTable(decodeRanges('mFDDFCCyerIrIBgEgEBvGvGLUUB4H4HkQ2L2LjEFBClElEwGqBqBoMCBQCCBBBDFBVECmEHBCFBCBBGDBmGBBxXJB0WzWzW+EhBBiLJBKIBksBBBCDBCBBLCCBHHBEBCECFMMBPPCBBC7B7BBKKBDBDDBCBBCBBCGBCeBDBBCCCBdBtIHBFTBDGBDwCBCdBanBBHnCBXKByCtCBX2FBCIBC1BBJuDBC3HBtBrBBhC-HBhQvBBWBBHmBBDfBCoDBmHFBmLBBvBZBC4CBN1GBbPBFOOBNNWBBHBBxKBBFJBhBlBBKRRBdBMdBJQQBeBLmBBQ-JBhuG-BBx0V2BBibDBLBBC+R+RBBBn2UPBgEuBuBBBBlPEEFBBOBB6JIB6BQBDCBCMBEwBwBBrBB7zBBBwS3jD3jD2kCHBFQBr6SDBG3qU3qUk7DvHBRzNB9EzDB9B1HBLmBBD7BBGCBXBBIdBF8BBWhCBE7F7FB1CBqlB-PB4BDBzBHBCNBCBBp2B96C96CiEyWyWBqBBFjDBNOBDOBCOBCkBBYgFB5BcBOrBBFIBIBBPFB7E6HBG3WBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBC7CB', false)),
|
|
250
|
+
Z: () => new UnicodeRangeTable(decodeRanges('gBgEgEgvFgsCgsCBJBeBBGwBwBh9DAB', false)),
|
|
251
|
+
Zl: () => new UnicodeRangeTable(decodeRanges('ohIA', true)),
|
|
252
|
+
Zp: () => new UnicodeRangeTable(decodeRanges('phIA', true)),
|
|
253
|
+
Zs: () => new UnicodeRangeTable(decodeRanges('gBgEgEgvFgsCgsCBJBlBwBwBh9DAB', false))
|
|
254
|
+
});
|
|
255
|
+
static get Upper() {
|
|
256
|
+
return this.CATEGORIES.get('Lu');
|
|
257
|
+
}
|
|
258
|
+
static SCRIPTS = new LazyMap({
|
|
259
|
+
Adlam: () => new UnicodeRangeTable(decodeRanges('go6DrCFJFB', true)),
|
|
260
|
+
Ahom: () => new UnicodeRangeTable(decodeRanges('g4lCaDOFW', true)),
|
|
261
|
+
Anatolian_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('ggxCmS', true)),
|
|
262
|
+
Arabic: () => new UnicodeRangeTable(decodeRanges('gwBEBCFBCNBCCBCfBCJBMZBCrDBChBBxCvBBxHeBCBBGqCBCcBxy8ByDBRqLBDvCBD1BBIhBhBBOBxDEBCmEBk7DeBkCCB4BDBh43BDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQB1BBB', false)),
|
|
263
|
+
Armenian: () => new UnicodeRangeTable(decodeRanges('xpBlBDxBDCks9BE', true)),
|
|
264
|
+
Avestan: () => new UnicodeRangeTable(decodeRanges('g4iC1BEG', true)),
|
|
265
|
+
Balinese: () => new UnicodeRangeTable(decodeRanges('g4GsCCxB', true)),
|
|
266
|
+
Bamum: () => new UnicodeRangeTable(decodeRanges('g1pB3CpowB4R', true)),
|
|
267
|
+
Bassa_Vah: () => new UnicodeRangeTable(decodeRanges('w26CdDF', true)),
|
|
268
|
+
Batak: () => new UnicodeRangeTable(decodeRanges('g+GzBJD', true)),
|
|
269
|
+
Bengali: () => new UnicodeRangeTable(decodeRanges('gsCDBCHBDBBDVBCGBCEEBCBDIBDBBDDBJFFBCCBDBDYB', false)),
|
|
270
|
+
Bhaiksuki: () => new UnicodeRangeTable(decodeRanges('ggnCICsBCNLc', true)),
|
|
271
|
+
Bopomofo: () => new UnicodeRangeTable(decodeRanges('qXB6wLqBxDf', true)),
|
|
272
|
+
Brahmi: () => new UnicodeRangeTable(decodeRanges('ggkCtCFjBKA', true)),
|
|
273
|
+
Braille: () => new UnicodeRangeTable(decodeRanges('ggK-H', true)),
|
|
274
|
+
Buginese: () => new UnicodeRangeTable(decodeRanges('gwGbDB', true)),
|
|
275
|
+
Buhid: () => new UnicodeRangeTable(decodeRanges('g6FT', true)),
|
|
276
|
+
Canadian_Aboriginal: () => new UnicodeRangeTable(decodeRanges('ggF-TxRlC7tgCP', true)),
|
|
277
|
+
Carian: () => new UnicodeRangeTable(decodeRanges('g1gCwB', true)),
|
|
278
|
+
Caucasian_Albanian: () => new UnicodeRangeTable(decodeRanges('wphCzBMA', true)),
|
|
279
|
+
Chakma: () => new UnicodeRangeTable(decodeRanges('gokC0BCR', true)),
|
|
280
|
+
Cham: () => new UnicodeRangeTable(decodeRanges('gwqB2BKNDJDD', true)),
|
|
281
|
+
Cherokee: () => new UnicodeRangeTable(decodeRanges('g9E1CDFz7lBvC', true)),
|
|
282
|
+
Chorasmian: () => new UnicodeRangeTable(decodeRanges('w9jCb', true)),
|
|
283
|
+
Common: () => new UnicodeRangeTable(decodeRanges('AgCBbFBbuBBCOBCEBYgBgBiOmBBGEBDTB1DKKHCC+THHPEEhB9E9ElQiEiEB6mB6mB2MDBjJwvBwvBBBBoCBBsGBBCumBumBOIIBCBCFBCCBDmYmYBKBD2CBCKBEKBCOBSgBBgClBBCCBDFBCaBCQBqBCBF5UBXKBW-cBhIzTBDfBCoDBhQ9CBzMUBCCCBXBQHBFDB8CBBE7C7CB0E0EBOBhBlBBKxBxBB+BBgBwCBwB5C5CBmFBhuG-BBhoWhBBnDCBmFJB1HhFhFsMPPBzuUzuUBxGxGBIBXiBBCSBCDB0ECCBeBbFBbKBLuBuBBhChCBFBCGBLEBjICBFsBBEIBxCMB0BsBBlHaBltuBDB96D5HBHzNB9EzDB9B1HBLmBBD9BBEQBJBBIdBF8BB2GTBNTBN2CBKYBoE0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDjJBDxBByjFjCBtC8BBjWrBBFjDBNOBDOBCOBCkBBLtFB5BZBCBBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBClDBoghYffB+CB', false)),
|
|
284
|
+
Coptic: () => new UnicodeRangeTable(decodeRanges('ifNxkKzDGG', true)),
|
|
285
|
+
Cuneiform: () => new UnicodeRangeTable(decodeRanges('ggoC5cnDuDCEMjG', true)),
|
|
286
|
+
Cypriot: () => new UnicodeRangeTable(decodeRanges('ggiCFBDCCBqBBCBBEDD', false)),
|
|
287
|
+
Cypro_Minoan: () => new UnicodeRangeTable(decodeRanges('w8rCiD', true)),
|
|
288
|
+
Cyrillic: () => new UnicodeRangeTable(decodeRanges('ggBkEBDoFBx6FKBhFtCtCojEfBhie-CBv8VBBhw4B9BBiBAB', false)),
|
|
289
|
+
Deseret: () => new UnicodeRangeTable(decodeRanges('gghCvC', true)),
|
|
290
|
+
Devanagari: () => new UnicodeRangeTable(decodeRanges('goCwCFODZh7nBfhwcJ', true)),
|
|
291
|
+
Dives_Akuru: () => new UnicodeRangeTable(decodeRanges('gomCGBDDDBGBCBBCdBCBBDLBKJB', false)),
|
|
292
|
+
Dogra: () => new UnicodeRangeTable(decodeRanges('ggmC7B', true)),
|
|
293
|
+
Duployan: () => new UnicodeRangeTable(decodeRanges('ggvDqDGMEIIJDD', true)),
|
|
294
|
+
Egyptian_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('ggsC1iBL68D', true)),
|
|
295
|
+
Elbasan: () => new UnicodeRangeTable(decodeRanges('gohCnB', true)),
|
|
296
|
+
Elymaic: () => new UnicodeRangeTable(decodeRanges('g-jCW', true)),
|
|
297
|
+
Ethiopic: () => new UnicodeRangeTable(decodeRanges('gwEoCBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBDfBEZBnvGWBKGBCGBCGBCGBCGBCGBCGBCGBjpfFBDFBDFBKGBCGBylvCGBCDBCBBCOB', false)),
|
|
298
|
+
Garay: () => new UnicodeRangeTable(decodeRanges('gqjClBEcJB', true)),
|
|
299
|
+
Georgian: () => new UnicodeRangeTable(decodeRanges('glElBBCGGDqBBCDBx8CqBBDCBhiElBBCGG', false)),
|
|
300
|
+
Glagolitic: () => new UnicodeRangeTable(decodeRanges('ggL-Ch9sDGCQDGCBCE', true)),
|
|
301
|
+
Gothic: () => new UnicodeRangeTable(decodeRanges('w5gCa', true)),
|
|
302
|
+
Grantha: () => new UnicodeRangeTable(decodeRanges('g4kCDBCHBDBBDVBCGBCBBCEBDIBDBBDCBDHHGGBDGBEEB', false)),
|
|
303
|
+
Greek: () => new UnicodeRangeTable(decodeRanges('wbDBCCBDDBCFFCCCBBBCCCBSBC+BBPPBnpGEBzBEBFEB1ChKhKBUBDFBDlBBDFBDHBCGCBdBD0BBCOBCNBDFBCSBDCBCIBoJ-xiB-xiB7uVuCBSgj0Bgj0BBkCB', false)),
|
|
304
|
+
Gujarati: () => new UnicodeRangeTable(decodeRanges('h0CCBCIBCCBCVBCGBCBBCEBDJBCCBCCBDQQBCBDLBIGB', false)),
|
|
305
|
+
Gunjala_Gondi: () => new UnicodeRangeTable(decodeRanges('grnCFCBCkBCBCFIJ', true)),
|
|
306
|
+
Gurmukhi: () => new UnicodeRangeTable(decodeRanges('hwCCBCFBFBBDVBCGBCBBCBBCBBDCCBDBFBBDCBEIIBCBCIIBPB', false)),
|
|
307
|
+
Gurung_Khema: () => new UnicodeRangeTable(decodeRanges('go4C5B', true)),
|
|
308
|
+
Han: () => new UnicodeRangeTable(decodeRanges('g0LZBC4CBN1GBwBCCaIBPDBle-tGBhC-vUBhoWtLBDpDBpodBBNBBvgkB-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
|
|
309
|
+
Hangul: () => new UnicodeRangeTable(decodeRanges('goE-HvxHBiI9CyDeiCei3dckUj9KNWFwBl9JeEFDFDFDC', true)),
|
|
310
|
+
Hanifi_Rohingya: () => new UnicodeRangeTable(decodeRanges('gojCnBJJ', true)),
|
|
311
|
+
Hanunoo: () => new UnicodeRangeTable(decodeRanges('g5FU', true)),
|
|
312
|
+
Hatran: () => new UnicodeRangeTable(decodeRanges('gniCSCBGE', true)),
|
|
313
|
+
Hebrew: () => new UnicodeRangeTable(decodeRanges('xsB2BBJaBFFBpp9BZBCEBCCCBCCBCCBIB', false)),
|
|
314
|
+
Hiragana: () => new UnicodeRangeTable(decodeRanges('hiM1CBHCBi7-C+IBTeeBBBulQAB', false)),
|
|
315
|
+
Imperial_Aramaic: () => new UnicodeRangeTable(decodeRanges('giiCVCI', true)),
|
|
316
|
+
Inherited: () => new UnicodeRangeTable(decodeRanges('gYvDB2IBBlOKBbhXhXBCB8qEeBiQCBCMBCGBFHHEBBnG-BBtQBBjGgBB65DDBsDBBmrzBPBRNBwejHjH7iEl+uBl+uBBsBBDWBhRCBSHBDGBfDBz6rYvHB', false)),
|
|
317
|
+
Inscriptional_Pahlavi: () => new UnicodeRangeTable(decodeRanges('g7iCSGH', true)),
|
|
318
|
+
Inscriptional_Parthian: () => new UnicodeRangeTable(decodeRanges('g6iCVDH', true)),
|
|
319
|
+
Javanese: () => new UnicodeRangeTable(decodeRanges('gsqBtCDJFB', true)),
|
|
320
|
+
Kaithi: () => new UnicodeRangeTable(decodeRanges('gkkCiCLA', true)),
|
|
321
|
+
Kannada: () => new UnicodeRangeTable(decodeRanges('gkDMCCCWCJCEDICCCDIBHBCDDJCC', true)),
|
|
322
|
+
Katakana: () => new UnicodeRangeTable(decodeRanges('hlM5CBDCBxHPBxGuBBC3CBvgzBJBCsBBzisBDBCGBCBBCgJgJBBBzBPPBCB', false)),
|
|
323
|
+
Kawi: () => new UnicodeRangeTable(decodeRanges('g4nCQCoBEc', true)),
|
|
324
|
+
Kayah_Li: () => new UnicodeRangeTable(decodeRanges('goqBtBCA', true)),
|
|
325
|
+
Kharoshthi: () => new UnicodeRangeTable(decodeRanges('gwiCDCBGHCCCcDCFJII', true)),
|
|
326
|
+
Khitan_Small_Script: () => new UnicodeRangeTable(decodeRanges('k-7C84G84GB0OBqBAB', false)),
|
|
327
|
+
Khmer: () => new UnicodeRangeTable(decodeRanges('g8F9CDJHJnPf', true)),
|
|
328
|
+
Khojki: () => new UnicodeRangeTable(decodeRanges('gwkCRCuB', true)),
|
|
329
|
+
Khudawadi: () => new UnicodeRangeTable(decodeRanges('w1kC6BGJ', true)),
|
|
330
|
+
Kirat_Rai: () => new UnicodeRangeTable(decodeRanges('gq7C5B', true)),
|
|
331
|
+
Lao: () => new UnicodeRangeTable(decodeRanges('h0DBBCCCBDBCXBCCCBVBDEBCCCBFBCJBDDB', false)),
|
|
332
|
+
Latin: () => new UnicodeRangeTable(decodeRanges('hCZBHZBwBQQGWBCeBCgOBoBEB8wGlBBHwBBGDBGMBClCBiC-HByLOORMBuEBBHccSoBB42CfBj1elDBEiCBDBBCCCBGBWNBxZqBBCIBCDB38TGB7gBZBHZBmhCFBCpBBCIBm61BeBHFB', false)),
|
|
333
|
+
Lepcha: () => new UnicodeRangeTable(decodeRanges('ggH3BEOEC', true)),
|
|
334
|
+
Limbu: () => new UnicodeRangeTable(decodeRanges('goGeBCLBFLBFEEBKB', false)),
|
|
335
|
+
Linear_A: () => new UnicodeRangeTable(decodeRanges('gwhC2JKVLH', true)),
|
|
336
|
+
Linear_B: () => new UnicodeRangeTable(decodeRanges('gggCLCZCSCBCODNjB6D', true)),
|
|
337
|
+
Lisu: () => new UnicodeRangeTable(decodeRanges('wmpBvBx1eA', true)),
|
|
338
|
+
Lycian: () => new UnicodeRangeTable(decodeRanges('g0gCc', true)),
|
|
339
|
+
Lydian: () => new UnicodeRangeTable(decodeRanges('gpiCZGA', true)),
|
|
340
|
+
Mahajani: () => new UnicodeRangeTable(decodeRanges('wqkCmB', true)),
|
|
341
|
+
Makasar: () => new UnicodeRangeTable(decodeRanges('g3nCY', true)),
|
|
342
|
+
Malayalam: () => new UnicodeRangeTable(decodeRanges('goDMCCCyBCCCFFPDZ', true)),
|
|
343
|
+
Mandaic: () => new UnicodeRangeTable(decodeRanges('giCbDA', true)),
|
|
344
|
+
Manichaean: () => new UnicodeRangeTable(decodeRanges('g2iCmBFL', true)),
|
|
345
|
+
Marchen: () => new UnicodeRangeTable(decodeRanges('wjnCfDVCN', true)),
|
|
346
|
+
Masaram_Gondi: () => new UnicodeRangeTable(decodeRanges('gonCGBCBBCrBBECCBCCBHBJJB', false)),
|
|
347
|
+
Medefaidrin: () => new UnicodeRangeTable(decodeRanges('gy7C6C', true)),
|
|
348
|
+
Meetei_Mayek: () => new UnicodeRangeTable(decodeRanges('g3qBWqGtBDJ', true)),
|
|
349
|
+
Mende_Kikakui: () => new UnicodeRangeTable(decodeRanges('gg6DkGDP', true)),
|
|
350
|
+
Meroitic_Cursive: () => new UnicodeRangeTable(decodeRanges('gtiCXFTDtB', true)),
|
|
351
|
+
Meroitic_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('gsiCf', true)),
|
|
352
|
+
Miao: () => new UnicodeRangeTable(decodeRanges('g47CqCF4BIQ', true)),
|
|
353
|
+
Modi: () => new UnicodeRangeTable(decodeRanges('gwlCkCMJ', true)),
|
|
354
|
+
Mongolian: () => new UnicodeRangeTable(decodeRanges('ggGBBDCCBSBH4CBIqBB2t-BMB', false)),
|
|
355
|
+
Mro: () => new UnicodeRangeTable(decodeRanges('gy6CeCJFB', true)),
|
|
356
|
+
Multani: () => new UnicodeRangeTable(decodeRanges('g0kCGBCCCBCBCOBCKB', false)),
|
|
357
|
+
Myanmar: () => new UnicodeRangeTable(decodeRanges('ggE-EhqmBeiDfxibT', true)),
|
|
358
|
+
Nabataean: () => new UnicodeRangeTable(decodeRanges('gkiCeJI', true)),
|
|
359
|
+
Nag_Mundari: () => new UnicodeRangeTable(decodeRanges('wm5DpB', true)),
|
|
360
|
+
Nandinagari: () => new UnicodeRangeTable(decodeRanges('gtmCHDtBDK', true)),
|
|
361
|
+
New_Tai_Lue: () => new UnicodeRangeTable(decodeRanges('gsGrBFZHKEB', true)),
|
|
362
|
+
Newa: () => new UnicodeRangeTable(decodeRanges('gglC7CCE', true)),
|
|
363
|
+
Nko: () => new UnicodeRangeTable(decodeRanges('g+B6BDC', true)),
|
|
364
|
+
Nushu: () => new UnicodeRangeTable(decodeRanges('h-7CvsQvsQBqMB', false)),
|
|
365
|
+
Nyiakeng_Puachue_Hmong: () => new UnicodeRangeTable(decodeRanges('go4DsBENDJFB', true)),
|
|
366
|
+
Ogham: () => new UnicodeRangeTable(decodeRanges('g0Fc', true)),
|
|
367
|
+
Ol_Chiki: () => new UnicodeRangeTable(decodeRanges('wiHvB', true)),
|
|
368
|
+
Ol_Onal: () => new UnicodeRangeTable(decodeRanges('wu5DqBFA', true)),
|
|
369
|
+
Old_Hungarian: () => new UnicodeRangeTable(decodeRanges('gkjCyBOyBIF', true)),
|
|
370
|
+
Old_Italic: () => new UnicodeRangeTable(decodeRanges('g4gCjBKC', true)),
|
|
371
|
+
Old_North_Arabian: () => new UnicodeRangeTable(decodeRanges('g0iCf', true)),
|
|
372
|
+
Old_Permic: () => new UnicodeRangeTable(decodeRanges('w6gCqB', true)),
|
|
373
|
+
Old_Persian: () => new UnicodeRangeTable(decodeRanges('g9gCjBFN', true)),
|
|
374
|
+
Old_Sogdian: () => new UnicodeRangeTable(decodeRanges('g4jCnB', true)),
|
|
375
|
+
Old_South_Arabian: () => new UnicodeRangeTable(decodeRanges('gziCf', true)),
|
|
376
|
+
Old_Turkic: () => new UnicodeRangeTable(decodeRanges('ggjCoC', true)),
|
|
377
|
+
Old_Uyghur: () => new UnicodeRangeTable(decodeRanges('w7jCZ', true)),
|
|
378
|
+
Oriya: () => new UnicodeRangeTable(decodeRanges('h4CCCHDBDVCGCBCEDIDBDCICFBCEDR', true)),
|
|
379
|
+
Osage: () => new UnicodeRangeTable(decodeRanges('wlhCjBFjB', true)),
|
|
380
|
+
Osmanya: () => new UnicodeRangeTable(decodeRanges('gkhCdDJ', true)),
|
|
381
|
+
Pahawh_Hmong: () => new UnicodeRangeTable(decodeRanges('g46ClCLJCGCUGS', true)),
|
|
382
|
+
Palmyrene: () => new UnicodeRangeTable(decodeRanges('gjiCf', true)),
|
|
383
|
+
Pau_Cin_Hau: () => new UnicodeRangeTable(decodeRanges('g2mC4B', true)),
|
|
384
|
+
Phags_Pa: () => new UnicodeRangeTable(decodeRanges('giqB3B', true)),
|
|
385
|
+
Phoenician: () => new UnicodeRangeTable(decodeRanges('goiCbEA', true)),
|
|
386
|
+
Psalter_Pahlavi: () => new UnicodeRangeTable(decodeRanges('g8iCRIDNG', true)),
|
|
387
|
+
Rejang: () => new UnicodeRangeTable(decodeRanges('wpqBjBMA', true)),
|
|
388
|
+
Runic: () => new UnicodeRangeTable(decodeRanges('g1FqCEK', true)),
|
|
389
|
+
Samaritan: () => new UnicodeRangeTable(decodeRanges('ggCtBDO', true)),
|
|
390
|
+
Saurashtra: () => new UnicodeRangeTable(decodeRanges('gkqBlCJL', true)),
|
|
391
|
+
Sharada: () => new UnicodeRangeTable(decodeRanges('gskC-C', true)),
|
|
392
|
+
Shavian: () => new UnicodeRangeTable(decodeRanges('wihCvB', true)),
|
|
393
|
+
Siddham: () => new UnicodeRangeTable(decodeRanges('gslC1BDlB', true)),
|
|
394
|
+
SignWriting: () => new UnicodeRangeTable(decodeRanges('gg2DrUQECO', true)),
|
|
395
|
+
Sinhala: () => new UnicodeRangeTable(decodeRanges('hsDCBCRBEXBCIBCDDBFBEFFBEBCCCBGBHJBDCBt-gCTB', false)),
|
|
396
|
+
Sogdian: () => new UnicodeRangeTable(decodeRanges('w5jCpB', true)),
|
|
397
|
+
Sora_Sompeng: () => new UnicodeRangeTable(decodeRanges('wmkCYIJ', true)),
|
|
398
|
+
Soyombo: () => new UnicodeRangeTable(decodeRanges('wymCyC', true)),
|
|
399
|
+
Sundanese: () => new UnicodeRangeTable(decodeRanges('g8G-BhIH', true)),
|
|
400
|
+
Sunuwar: () => new UnicodeRangeTable(decodeRanges('g+mChBPJ', true)),
|
|
401
|
+
Syloti_Nagri: () => new UnicodeRangeTable(decodeRanges('ggqBsB', true)),
|
|
402
|
+
Syriac: () => new UnicodeRangeTable(decodeRanges('g4BNC7BDCxIK', true)),
|
|
403
|
+
Tagalog: () => new UnicodeRangeTable(decodeRanges('g4FVKA', true)),
|
|
404
|
+
Tagbanwa: () => new UnicodeRangeTable(decodeRanges('g7FMCCCB', true)),
|
|
405
|
+
Tai_Le: () => new UnicodeRangeTable(decodeRanges('wqGdDE', true)),
|
|
406
|
+
Tai_Tham: () => new UnicodeRangeTable(decodeRanges('gxG+BCcDKHJHN', true)),
|
|
407
|
+
Tai_Viet: () => new UnicodeRangeTable(decodeRanges('g0qBiCZE', true)),
|
|
408
|
+
Takri: () => new UnicodeRangeTable(decodeRanges('g0lC5BHJ', true)),
|
|
409
|
+
Tamil: () => new UnicodeRangeTable(decodeRanges('i8CBBCFBECBCDBEBBCCCBEEBEEBBBELBFEBECBCDBDHHPUBm+kCxBBOAB', false)),
|
|
410
|
+
Tangsa: () => new UnicodeRangeTable(decodeRanges('wz6CuCCJ', true)),
|
|
411
|
+
Tangut: () => new UnicodeRangeTable(decodeRanges('g-7CgBgBB2-FBJ-XBhQIB', false)),
|
|
412
|
+
Telugu: () => new UnicodeRangeTable(decodeRanges('ggDMBCCBCWBCPBDIBCCBCDBIBBCCBDDDBCBDJBIIB', false)),
|
|
413
|
+
Thaana: () => new UnicodeRangeTable(decodeRanges('g8BxB', true)),
|
|
414
|
+
Thai: () => new UnicodeRangeTable(decodeRanges('hwD5BGb', true)),
|
|
415
|
+
Tibetan: () => new UnicodeRangeTable(decodeRanges('g4DnCCjBFmBCjBCOCGFB', true)),
|
|
416
|
+
Tifinagh: () => new UnicodeRangeTable(decodeRanges('wpL3BIBPA', true)),
|
|
417
|
+
Tirhuta: () => new UnicodeRangeTable(decodeRanges('gklCnCJJ', true)),
|
|
418
|
+
Todhri: () => new UnicodeRangeTable(decodeRanges('guhCzB', true)),
|
|
419
|
+
Toto: () => new UnicodeRangeTable(decodeRanges('w04De', true)),
|
|
420
|
+
Tulu_Tigalari: () => new UnicodeRangeTable(decodeRanges('g8kCJBCDDClBBCJBCDDCDBCJBCBBJBB', false)),
|
|
421
|
+
Ugaritic: () => new UnicodeRangeTable(decodeRanges('g8gCdCA', true)),
|
|
422
|
+
Unknown: () => new UnicodeRangeTable(decodeRanges('4bBBHDBICCVuMuMnBBBzBBBE4B4BBGBcDBHKBvI9B9BBmDmDBMB8BBByBBBQddBCCMEBgBDDBDBuHJJBDDBXXICCBBBFBBKBBDBBFHBCDBDGGBaaBEEHDBDBBXIIDGDBCCGDBDBBECBCGBFCCBFBSJBEKKEXXIDDGBBLIEBCCBNBFBBNGBIEEJBBDBBXIIDGGBKKBDDBEEBFBEDBDGGBTTBIBDHHBBBEFFBBBDCCDCBDCBECBNDBGCBEFFBCCBEBCNBWEBOEEYRRBKKEFFBFBDEEBCCBFFBLLBFBXEEYLLGBBKEEFGBDFBDFFBLLELBOEE0BEEHDBRBBbEETCBZKKCBBICBCDBHCCJFBLBBELB7BDBekBBDCCGZZCYYBGGCIILBBFfBpClBlBBCBoBlBlBQOOBjBBnGCCBDBCBB6LFFBIICFFBqBqBFBBiBFFBIICFFBQQ6BFFBkCkCBhBhBBBBbFB3CBBHBB+UCB6CGBXIBZIBVLBOEEDLB-CBBLFBLFBbFB6CGBsBEBnCJBgBNNBCBNDBCCBrBBBGKBtBDBbFBMCB-BBBiCeeBMMBEBLFBPBBgBwBBuCnFnFBGB9BCBQCB-BEBsBBBMHBsBEB3QBBHBBnBBBHBBJGCgBBB2BQQPBBHUUBEEKmDmDNBBcOOBBBiBOBiBOBtEDB7UVBMUB14BBBhB+K+KBDBuBCCBDBCBB5BGBDNBZIBI4BI-DhBBb6C6CBKB3GZBxC3C3CBoDoDBDBsB-C-C3CIBxBuzcuzcBBB4BIB9KTB5FHBvGBBDCCJUB8BCBLFB5BHBnCHBNFB1DKBfCBvCMMBCBiB4B4BBHBPBBLBBoDXBdJBHBBHBBHIBIII9BDB-DBBLFBl9KLBYDByBjoIBvLBBrDlBBILBGEBbGGCGD+DPB+NBB3BGBCfBrBFB0BUUFDBGoEoEBCC-FCBHBBHBBHBBECBIIIBIBGBBNbbUDDQBBPhBB8DEBEDBuBCB5COOBBBCuBBvBhEBeCByBOBdDBlBIBfEBsBEBfmBmBBCBPpBB-EBBLFBlBDBlBDBpBHB1BKBNQQIDDMQQIDDBBB1BLB4JIBXJBJXBHrBrBKkCBHBBCtBtBDCBCBBYpCpCBGBKvBBUDDBDBiBCBcEBC-BB5BDBVBBzBDDBDBJEEeBBEDBLGBKGBhCfBoBDBNIB3BCBeBBcEBbGBFLBIvCBqC2BB0BMB0BGBvBHBLFBnBCBeHBDvGBgBrBrBEBBDPBE2BBtBHBrBVBblBBdTBYIBvCDBlBIBlCJBCBBaGBLFB2BTTBGBoBIBhDVVBJBTwBwBB8BBICCFQQMFB8BEBLFBFJJBDDBXXIDDGLLBDDBEEBCCBEBCEBIBBICBGKBLCCBCCnBLLCBBCFFLDDBGBDcB9CGGBcBpCHBLlFB3BBBnBhBBmCKBLFBOSB7BFBLFBVbBcBBQDBY4FB9BjDB0CLBJBBCBBJDDfDDBNNBHBLlCBJBBvBBBMaBpCHB0CMBqCGBL1FBjBNBLFBKuBuBPJBeCBhBBBXPPBnCBIDDtBCBCDDKHBLFBHDDmBDDHGBL1JBaGBSqBqBBBBe0CBCOBzBMB8clDBwDGGBJBlGryCBkDMB3iBJB88DEBoS41GB7Bl2BB6RGBgBLLBCByCLLBEBfBBHJBnCJBLIIWEBUvNB7BlGB8CkDBsCDB6BGBS-BBGKBDNB5-FHB3mBoBBLm3IBFIIDkJkJBNBCcBEBBCNBFHBtMjoCBsDEBOCBKGBLBBJ76DB7HFB1NrCBvBBBYIB1D7BB3HJBoBBBjGUBnC5DBVLBVLB4CIBamEB2CoCoCDBBCBBDBBFNNCIIiCFFBJJIddFGGCCBI1K1KBlJlJB-V-VBNBGQQBuiBBgBFBH0GBISSBIIDGGBDB-BgBBCvDBuBCBPBBLDBD-JBgBQB7BEBCvOBrB1GBsBDBC-OBIFFDQQmGBBRoBBtCDBLDBDwYBlCrCB+BhGBFccDCCBCCLFFCCCBEBCDBCECEDDCBBCICDCCBFFIKFCLLSEBEGGSzBBDtIBtBDBlDLBQBBQQQmBJBvF3BBeMBtBDBKGBDNBH5EB5eDBSCBOCB4DDBgDFBNDBCOBNDB5BHBLFBpBHBfBBNDBD9BB1KLBPBBOCBLEB5BGBQBBMFBKGB0EnDnDBkgBBh3pBfB7hEFB-GBBj0FNBypHOBvThtCB-QhvBBs6EEBhjEwi3VBCdBhD-DBxHvw-FB', false)),
|
|
423
|
+
Vai: () => new UnicodeRangeTable(decodeRanges('gopBrJ', true)),
|
|
424
|
+
Vithkuqi: () => new UnicodeRangeTable(decodeRanges('wrhCKCOCGCBCKCOCGCB', true)),
|
|
425
|
+
Wancho: () => new UnicodeRangeTable(decodeRanges('g24D5BGA', true)),
|
|
426
|
+
Warang_Citi: () => new UnicodeRangeTable(decodeRanges('glmCyCNA', true)),
|
|
427
|
+
Yezidi: () => new UnicodeRangeTable(decodeRanges('g0jCpBCCDB', true)),
|
|
428
|
+
Yi: () => new UnicodeRangeTable(decodeRanges('ggoBskBE2B', true)),
|
|
429
|
+
Zanabazar_Square: () => new UnicodeRangeTable(decodeRanges('gwmCnC', true))
|
|
430
|
+
});
|
|
431
|
+
static FOLD_CATEGORIES = new LazyMap({
|
|
432
|
+
C: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false)),
|
|
433
|
+
Cn: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false)),
|
|
434
|
+
L: () => new UnicodeRangeTable(decodeRanges('latkpBtkpBCAB', false)),
|
|
435
|
+
LC: () => new UnicodeRangeTable(decodeRanges('latkpBtkpBCAB', false)),
|
|
436
|
+
Ll: () => new UnicodeRangeTable(decodeRanges('hCZBmDWBCGBiBuBCEECDOCDuBCBECEBBCCCBCCBBBDDBCBBCCBEBBCBBCECBCCDCCBCCBBBCCCBEEIBBCBBCBBCOCDQCDBBCCCBBBC4BCIBBCBBDCCBCBCGC3HrBrBCEEJHHCCBCCCBCCBPBCIBkBJJCUCGDDCBBDyBBxBgBCK2BCBMCD+CCDlBBq6ClBBCGGzW1CB0kCHHBpBBDCBhK0ECKgDCKHBJFBLHBJHBJFBMGCJHBZHBJHBJHBJEBMEBMDBNEBMEBqJEEBHHxC9zC9zCBuBBxBCCBBBDGCBCBCDDJCBCgDCJCCFuqeuqeCqBCUaCoEMCE8BCLECBICFCCDCCEUCBDBCEBCOCBCBCCCBEECKCZs5Vs5VBYBmmBnBBpEjBB9EKBCOBCGBCBBr3ByBB+EVB75CfBhsVfBh1ehBB', false)),
|
|
437
|
+
Lt: () => new UnicodeRangeTable(decodeRanges('kOCCBCCBCClBCCtsHHBJHBJHBMQQwBAB', false)),
|
|
438
|
+
Lu: () => new UnicodeRangeTable(decodeRanges('hDZB7BqBqBBWBCHBCuBCEECDOCDsBCDECBBBDCCDEEGDDECBDDDCCCDFFDEECDDECCGBBCBBCBBCOCBSCDBBCEECkBCEQCJDDBCCFICBEBCBBCCCBEEBCCBCBCEBDCCBDDIDDCBBEFBGLLBnFnFsBCCEEEBBBvBDBCdBCBBECBCWCBDBCGD1BvBBCgBCK0BCDMCBgDCyBlBBq6CqBBDCB5XFBjkCIBCvHvHERRzD0ECGGGC8CCBHBJFBLHBJHBJFBMGCJHBJNBzBBBNSSBPPBEEpL2B2Bs1CvBBCEEBGCHDDLiDCJCCFNNBkBBCGG0oesBCUaCoEMCE8BCLCCDICFFFCBBDSCMOCFCCDEEGECb9a9advCBi8UZBumBnBBpEjBB8EKBCOBCGBCBBk4ByBB+DVB75CfBhsVfBj1ehBB', false)),
|
|
439
|
+
M: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false)),
|
|
440
|
+
Mn: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false))
|
|
441
|
+
});
|
|
442
|
+
static FOLD_SCRIPT = new LazyMap({
|
|
443
|
+
Common: () => new UnicodeRangeTable(decodeRanges('8cgBgB', false)),
|
|
444
|
+
Greek: () => new UnicodeRangeTable(decodeRanges('1FwUwU', false)),
|
|
445
|
+
Inherited: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false)),
|
|
446
|
+
Latin: () => new UnicodeRangeTable(decodeRanges('y+pBCC', false)),
|
|
447
|
+
Unknown: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false))
|
|
448
|
+
});
|
|
344
449
|
}
|
|
345
450
|
|
|
346
451
|
/**
|
|
@@ -593,7 +698,7 @@ class Utils {
|
|
|
593
698
|
|
|
594
699
|
// Returns the array of runes in the specified Java UTF-16 string.
|
|
595
700
|
static stringToRunes(str) {
|
|
596
|
-
return String(str)
|
|
701
|
+
return Array.from(String(str)).map(s => s.codePointAt(0));
|
|
597
702
|
}
|
|
598
703
|
|
|
599
704
|
// Returns the Java UTF-16 string containing the single rune |r|.
|
|
@@ -864,6 +969,14 @@ class MachineInputBase {
|
|
|
864
969
|
endPos() {
|
|
865
970
|
return this.end;
|
|
866
971
|
}
|
|
972
|
+
hasString() {
|
|
973
|
+
return false;
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
// Helper for the exact-literal fast-path execution router
|
|
977
|
+
prefixLength() {
|
|
978
|
+
return 0;
|
|
979
|
+
}
|
|
867
980
|
}
|
|
868
981
|
|
|
869
982
|
// An implementation of MachineInput for UTF-8 byte arrays.
|
|
@@ -875,6 +988,14 @@ class MachineUTF8Input extends MachineInputBase {
|
|
|
875
988
|
this.start = start;
|
|
876
989
|
this.end = end;
|
|
877
990
|
}
|
|
991
|
+
hasString(prefilter, pos) {
|
|
992
|
+
const target = prefilter.bytes;
|
|
993
|
+
if (target.length === 0) return true;
|
|
994
|
+
|
|
995
|
+
// Reuse the high-speed indexOf method already implemented below
|
|
996
|
+
const idx = this.indexOf(this.bytes, target, this.start + pos);
|
|
997
|
+
return idx !== -1 && idx <= this.end - target.length;
|
|
998
|
+
}
|
|
878
999
|
|
|
879
1000
|
// Returns the rune at the specified index; the units are
|
|
880
1001
|
// unspecified, but could be UTF-8 byte, UTF-16 char, or rune
|
|
@@ -951,10 +1072,10 @@ class MachineUTF8Input extends MachineInputBase {
|
|
|
951
1072
|
indexOf(source, target, fromIndex = 0) {
|
|
952
1073
|
let targetLength = target.length;
|
|
953
1074
|
if (targetLength === 0) {
|
|
954
|
-
return -1;
|
|
1075
|
+
return fromIndex <= this.end ? fromIndex : -1;
|
|
955
1076
|
}
|
|
956
|
-
let
|
|
957
|
-
for (let i = fromIndex; i <=
|
|
1077
|
+
let limit = this.end - targetLength;
|
|
1078
|
+
for (let i = fromIndex; i <= limit; i++) {
|
|
958
1079
|
for (let j = 0; j < targetLength; j++) {
|
|
959
1080
|
if (source[i + j] !== target[j]) {
|
|
960
1081
|
break;
|
|
@@ -965,6 +1086,9 @@ class MachineUTF8Input extends MachineInputBase {
|
|
|
965
1086
|
}
|
|
966
1087
|
return -1;
|
|
967
1088
|
}
|
|
1089
|
+
prefixLength(re2) {
|
|
1090
|
+
return re2.prefixUTF8.length;
|
|
1091
|
+
}
|
|
968
1092
|
}
|
|
969
1093
|
|
|
970
1094
|
// |pos| and |width| are in JS "char" units.
|
|
@@ -975,6 +1099,10 @@ class MachineUTF16Input extends MachineInputBase {
|
|
|
975
1099
|
this.start = start;
|
|
976
1100
|
this.end = end;
|
|
977
1101
|
}
|
|
1102
|
+
hasString(prefilter, pos) {
|
|
1103
|
+
const idx = this.charSequence.indexOf(prefilter.str, this.start + pos);
|
|
1104
|
+
return idx !== -1 && idx <= this.end - prefilter.str.length;
|
|
1105
|
+
}
|
|
978
1106
|
|
|
979
1107
|
// Returns the rune at the specified index; the units are
|
|
980
1108
|
// unspecified, but could be UTF-8 byte, UTF-16 char, or rune
|
|
@@ -1020,6 +1148,9 @@ class MachineUTF16Input extends MachineInputBase {
|
|
|
1020
1148
|
const r2 = pos < this.charSequence.length ? this.charSequence.codePointAt(pos) : -1;
|
|
1021
1149
|
return Utils.emptyOpContext(r1, r2);
|
|
1022
1150
|
}
|
|
1151
|
+
prefixLength(re2) {
|
|
1152
|
+
return re2.prefix.length;
|
|
1153
|
+
}
|
|
1023
1154
|
}
|
|
1024
1155
|
class MachineInput {
|
|
1025
1156
|
static fromUTF8(bytes, start = 0, end = bytes.length) {
|
|
@@ -1110,6 +1241,17 @@ class RE2JSFlagsException extends RE2JSException {
|
|
|
1110
1241
|
}
|
|
1111
1242
|
}
|
|
1112
1243
|
|
|
1244
|
+
/**
|
|
1245
|
+
* An exception thrown for internal engine errors, such as corrupted bytecodes.
|
|
1246
|
+
*/
|
|
1247
|
+
class RE2JSInternalException extends RE2JSException {
|
|
1248
|
+
/** @param {string} message */
|
|
1249
|
+
constructor(message) {
|
|
1250
|
+
super(message);
|
|
1251
|
+
this.name = 'RE2JSInternalException';
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1113
1255
|
/**
|
|
1114
1256
|
* A stateful iterator that interprets a regex {@code RE2JS} on a specific input.
|
|
1115
1257
|
*
|
|
@@ -1312,6 +1454,23 @@ class Matcher {
|
|
|
1312
1454
|
}
|
|
1313
1455
|
return this.substring(start, end);
|
|
1314
1456
|
}
|
|
1457
|
+
|
|
1458
|
+
/**
|
|
1459
|
+
* Returns a dictionary map of all named capturing groups and their matched values.
|
|
1460
|
+
* If a group was not matched, its value will be `null`.
|
|
1461
|
+
* @returns {Record<string, string|null>}
|
|
1462
|
+
*/
|
|
1463
|
+
getNamedGroups() {
|
|
1464
|
+
if (!this.hasMatch) {
|
|
1465
|
+
throw new RE2JSGroupException('perhaps no match attempted');
|
|
1466
|
+
}
|
|
1467
|
+
const result = {};
|
|
1468
|
+
for (const name of Object.keys(this.namedGroups)) {
|
|
1469
|
+
result[name] = this.group(name);
|
|
1470
|
+
}
|
|
1471
|
+
return result;
|
|
1472
|
+
}
|
|
1473
|
+
|
|
1315
1474
|
/**
|
|
1316
1475
|
* Returns the number of subgroups in this pattern.
|
|
1317
1476
|
*
|
|
@@ -1736,16 +1895,20 @@ class Inst {
|
|
|
1736
1895
|
}
|
|
1737
1896
|
return r === r0;
|
|
1738
1897
|
}
|
|
1739
|
-
|
|
1740
|
-
//
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1898
|
+
const len = this.runes.length;
|
|
1899
|
+
// If the array is exactly 2, 4, 6, or 8 items, DO NOT fall through to binary search
|
|
1900
|
+
if (len === 2 || len === 4 || len === 6 || len === 8) {
|
|
1901
|
+
for (let j = 0; j < len; j += 2) {
|
|
1902
|
+
if (r < this.runes[j]) {
|
|
1903
|
+
return false;
|
|
1904
|
+
}
|
|
1905
|
+
if (r <= this.runes[j + 1]) {
|
|
1906
|
+
return true;
|
|
1907
|
+
}
|
|
1747
1908
|
}
|
|
1909
|
+
return false; // Stop here
|
|
1748
1910
|
}
|
|
1911
|
+
|
|
1749
1912
|
// Otherwise binary search.
|
|
1750
1913
|
let lo = 0;
|
|
1751
1914
|
let hi = this.runes.length / 2 | 0;
|
|
@@ -1763,6 +1926,40 @@ class Inst {
|
|
|
1763
1926
|
}
|
|
1764
1927
|
return false;
|
|
1765
1928
|
}
|
|
1929
|
+
|
|
1930
|
+
// matchRunePos checks whether the instruction matches (and consumes) r.
|
|
1931
|
+
// If so, it returns the index of the matching rune pair.
|
|
1932
|
+
// If not, it returns -1.
|
|
1933
|
+
matchRunePos(r) {
|
|
1934
|
+
if (this.runes.length === 1) {
|
|
1935
|
+
const r0 = this.runes[0];
|
|
1936
|
+
if ((this.arg & RE2Flags.FOLD_CASE) !== 0) {
|
|
1937
|
+
return Unicode.equalsIgnoreCase(r0, r) ? 0 : -1;
|
|
1938
|
+
}
|
|
1939
|
+
return r === r0 ? 0 : -1;
|
|
1940
|
+
}
|
|
1941
|
+
const len = this.runes.length;
|
|
1942
|
+
if (len === 2 || len === 4 || len === 6 || len === 8) {
|
|
1943
|
+
for (let j = 0; j < len; j += 2) {
|
|
1944
|
+
if (r < this.runes[j]) return -1;
|
|
1945
|
+
if (r <= this.runes[j + 1]) return Math.floor(j / 2);
|
|
1946
|
+
}
|
|
1947
|
+
return -1;
|
|
1948
|
+
}
|
|
1949
|
+
let lo = 0;
|
|
1950
|
+
let hi = Math.floor(len / 2);
|
|
1951
|
+
while (lo < hi) {
|
|
1952
|
+
const m = lo + hi >> 1;
|
|
1953
|
+
const c = this.runes[2 * m];
|
|
1954
|
+
if (c <= r) {
|
|
1955
|
+
if (r <= this.runes[2 * m + 1]) return m;
|
|
1956
|
+
lo = m + 1;
|
|
1957
|
+
} else {
|
|
1958
|
+
hi = m;
|
|
1959
|
+
}
|
|
1960
|
+
}
|
|
1961
|
+
return -1;
|
|
1962
|
+
}
|
|
1766
1963
|
/**
|
|
1767
1964
|
*
|
|
1768
1965
|
* @returns {string}
|
|
@@ -1778,7 +1975,7 @@ class Inst {
|
|
|
1778
1975
|
case Inst.EMPTY_WIDTH:
|
|
1779
1976
|
return `empty ${this.arg} -> ${this.out}`;
|
|
1780
1977
|
case Inst.MATCH:
|
|
1781
|
-
return
|
|
1978
|
+
return `match${this.arg !== 0 ? ` ${this.arg}` : ''}`;
|
|
1782
1979
|
case Inst.FAIL:
|
|
1783
1980
|
return 'fail';
|
|
1784
1981
|
case Inst.NOP:
|
|
@@ -1804,7 +2001,7 @@ class Inst {
|
|
|
1804
2001
|
class Thread {
|
|
1805
2002
|
constructor() {
|
|
1806
2003
|
this.inst = null;
|
|
1807
|
-
this.cap =
|
|
2004
|
+
this.cap = null; // Initialized to Int32Array later
|
|
1808
2005
|
}
|
|
1809
2006
|
}
|
|
1810
2007
|
|
|
@@ -1832,9 +2029,11 @@ class Queue {
|
|
|
1832
2029
|
return j;
|
|
1833
2030
|
}
|
|
1834
2031
|
clear() {
|
|
1835
|
-
|
|
1836
|
-
this.
|
|
1837
|
-
|
|
2032
|
+
// Prevent memory leaks by nulling out used object references
|
|
2033
|
+
for (let i = 0; i < this.size; i++) {
|
|
2034
|
+
this.denseThreads[i] = null;
|
|
2035
|
+
}
|
|
2036
|
+
// The sparse set logic safely ignores stale integers in Typed Arrays.
|
|
1838
2037
|
this.size = 0;
|
|
1839
2038
|
}
|
|
1840
2039
|
toString() {
|
|
@@ -1863,22 +2062,13 @@ class Machine {
|
|
|
1863
2062
|
m.pool = [];
|
|
1864
2063
|
m.poolSize = 0;
|
|
1865
2064
|
m.matched = false;
|
|
1866
|
-
|
|
2065
|
+
// Use Int32Array instead of standard JS array
|
|
2066
|
+
m.matchcap = new Int32Array(m.prog.numCap < 2 ? 2 : m.prog.numCap);
|
|
1867
2067
|
m.ncap = 0;
|
|
1868
2068
|
return m;
|
|
1869
2069
|
}
|
|
1870
2070
|
static fromMachine(machine) {
|
|
1871
|
-
|
|
1872
|
-
m.re2 = machine.re2;
|
|
1873
|
-
m.prog = machine.prog;
|
|
1874
|
-
m.q0 = machine.q0;
|
|
1875
|
-
m.q1 = machine.q1;
|
|
1876
|
-
m.pool = machine.pool;
|
|
1877
|
-
m.poolSize = machine.poolSize;
|
|
1878
|
-
m.matched = machine.matched;
|
|
1879
|
-
m.matchcap = machine.matchcap;
|
|
1880
|
-
m.ncap = machine.ncap;
|
|
1881
|
-
return m;
|
|
2071
|
+
return Machine.fromRE2(machine.re2);
|
|
1882
2072
|
}
|
|
1883
2073
|
|
|
1884
2074
|
// init() reinitializes an existing Machine for re-use on a new input.
|
|
@@ -1887,27 +2077,30 @@ class Machine {
|
|
|
1887
2077
|
if (ncap > this.matchcap.length) {
|
|
1888
2078
|
this.initNewCap(ncap);
|
|
1889
2079
|
} else {
|
|
1890
|
-
this.resetCap(
|
|
2080
|
+
this.resetCap();
|
|
1891
2081
|
}
|
|
1892
2082
|
}
|
|
1893
|
-
|
|
2083
|
+
|
|
2084
|
+
// Wipes existing typed array memory without reallocating
|
|
2085
|
+
resetCap() {
|
|
1894
2086
|
for (let i = 0; i < this.poolSize; i++) {
|
|
1895
2087
|
const t = this.pool[i];
|
|
1896
|
-
t.cap
|
|
2088
|
+
t.cap.fill(0);
|
|
1897
2089
|
}
|
|
1898
2090
|
}
|
|
1899
2091
|
initNewCap(ncap) {
|
|
1900
2092
|
for (let i = 0; i < this.poolSize; i++) {
|
|
1901
2093
|
const t = this.pool[i];
|
|
1902
|
-
t.cap =
|
|
2094
|
+
t.cap = new Int32Array(ncap);
|
|
1903
2095
|
}
|
|
1904
|
-
this.matchcap =
|
|
2096
|
+
this.matchcap = new Int32Array(ncap);
|
|
1905
2097
|
}
|
|
1906
2098
|
submatches() {
|
|
1907
2099
|
if (this.ncap === 0) {
|
|
1908
2100
|
return Utils.emptyInts();
|
|
1909
2101
|
}
|
|
1910
|
-
|
|
2102
|
+
// Use subarray() to create a zero-allocation view before converting
|
|
2103
|
+
return Array.from(this.matchcap.subarray(0, this.ncap));
|
|
1911
2104
|
}
|
|
1912
2105
|
|
|
1913
2106
|
// alloc() allocates a new thread with the given instruction.
|
|
@@ -1919,6 +2112,7 @@ class Machine {
|
|
|
1919
2112
|
t = this.pool[this.poolSize];
|
|
1920
2113
|
} else {
|
|
1921
2114
|
t = new Thread();
|
|
2115
|
+
t.cap = new Int32Array(this.matchcap.length);
|
|
1922
2116
|
}
|
|
1923
2117
|
t.inst = inst;
|
|
1924
2118
|
return t;
|
|
@@ -1926,16 +2120,10 @@ class Machine {
|
|
|
1926
2120
|
|
|
1927
2121
|
// Frees all threads on the thread queue, returning them to the free pool.
|
|
1928
2122
|
freeQueue(queue, from = 0) {
|
|
1929
|
-
const numberOfThread = queue.size - from;
|
|
1930
|
-
const requiredPoolLength = this.poolSize + numberOfThread;
|
|
1931
|
-
if (this.pool.length < requiredPoolLength) {
|
|
1932
|
-
this.pool = this.pool.slice(0, Math.max(this.pool.length * 2, requiredPoolLength));
|
|
1933
|
-
}
|
|
1934
2123
|
for (let i = from; i < queue.size; i++) {
|
|
1935
2124
|
const t = queue.denseThreads[i];
|
|
1936
2125
|
if (t !== null) {
|
|
1937
|
-
this.pool[this.poolSize] = t;
|
|
1938
|
-
this.poolSize++;
|
|
2126
|
+
this.pool[this.poolSize++] = t;
|
|
1939
2127
|
}
|
|
1940
2128
|
}
|
|
1941
2129
|
queue.clear();
|
|
@@ -1943,11 +2131,7 @@ class Machine {
|
|
|
1943
2131
|
|
|
1944
2132
|
// freeThread() returns t to the free pool.
|
|
1945
2133
|
freeThread(t) {
|
|
1946
|
-
|
|
1947
|
-
this.pool = this.pool.slice(0, this.pool.length * 2);
|
|
1948
|
-
}
|
|
1949
|
-
this.pool[this.poolSize] = t;
|
|
1950
|
-
this.poolSize++;
|
|
2134
|
+
this.pool[this.poolSize++] = t;
|
|
1951
2135
|
}
|
|
1952
2136
|
match(input, pos, anchor) {
|
|
1953
2137
|
const startCond = this.re2.cond;
|
|
@@ -1958,7 +2142,7 @@ class Machine {
|
|
|
1958
2142
|
return false;
|
|
1959
2143
|
}
|
|
1960
2144
|
this.matched = false;
|
|
1961
|
-
this.matchcap
|
|
2145
|
+
this.matchcap.fill(-1);
|
|
1962
2146
|
let runq = this.q0;
|
|
1963
2147
|
let nextq = this.q1;
|
|
1964
2148
|
let r = input.step(pos);
|
|
@@ -2029,6 +2213,85 @@ class Machine {
|
|
|
2029
2213
|
this.freeQueue(nextq);
|
|
2030
2214
|
return this.matched;
|
|
2031
2215
|
}
|
|
2216
|
+
matchSet(input, pos, anchor) {
|
|
2217
|
+
const startCond = this.re2.cond;
|
|
2218
|
+
if (startCond === Utils.EMPTY_ALL) return [];
|
|
2219
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
2220
|
+
return [];
|
|
2221
|
+
}
|
|
2222
|
+
let runq = this.q0;
|
|
2223
|
+
let nextq = this.q1;
|
|
2224
|
+
let r = input.step(pos);
|
|
2225
|
+
let rune = r >> 3;
|
|
2226
|
+
let width = r & 7;
|
|
2227
|
+
let rune1 = -1;
|
|
2228
|
+
let width1 = 0;
|
|
2229
|
+
if (r !== MachineInputBase.EOF()) {
|
|
2230
|
+
r = input.step(pos + width);
|
|
2231
|
+
rune1 = r >> 3;
|
|
2232
|
+
width1 = r & 7;
|
|
2233
|
+
}
|
|
2234
|
+
let flag = pos === 0 ? Utils.emptyOpContext(-1, rune) : input.context(pos);
|
|
2235
|
+
const matches = new Set();
|
|
2236
|
+
while (true) {
|
|
2237
|
+
if (runq.isEmpty()) {
|
|
2238
|
+
if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 && pos !== 0) break;
|
|
2239
|
+
}
|
|
2240
|
+
if (pos === 0 || anchor === RE2Flags.UNANCHORED) {
|
|
2241
|
+
this.add(runq, this.prog.start, pos, this.matchcap, flag, null);
|
|
2242
|
+
}
|
|
2243
|
+
const nextPos = pos + width;
|
|
2244
|
+
flag = input.context(nextPos);
|
|
2245
|
+
for (let j = 0; j < runq.size; j++) {
|
|
2246
|
+
let t = runq.denseThreads[j];
|
|
2247
|
+
if (t === null) continue;
|
|
2248
|
+
const i = t.inst;
|
|
2249
|
+
let add = false;
|
|
2250
|
+
switch (i.op) {
|
|
2251
|
+
case Inst.MATCH:
|
|
2252
|
+
if (anchor === RE2Flags.ANCHOR_BOTH && pos !== input.endPos()) break;
|
|
2253
|
+
matches.add(i.arg); // Record the matched Set ID
|
|
2254
|
+
break;
|
|
2255
|
+
case Inst.RUNE:
|
|
2256
|
+
add = i.matchRune(rune);
|
|
2257
|
+
break;
|
|
2258
|
+
case Inst.RUNE1:
|
|
2259
|
+
add = rune === i.runes[0];
|
|
2260
|
+
break;
|
|
2261
|
+
case Inst.RUNE_ANY:
|
|
2262
|
+
add = true;
|
|
2263
|
+
break;
|
|
2264
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
2265
|
+
add = rune !== Codepoint.CODES.get('\n');
|
|
2266
|
+
break;
|
|
2267
|
+
default:
|
|
2268
|
+
throw new RE2JSInternalException('bad inst');
|
|
2269
|
+
}
|
|
2270
|
+
if (add) {
|
|
2271
|
+
t = this.add(nextq, i.out, nextPos, t.cap, flag, t);
|
|
2272
|
+
}
|
|
2273
|
+
if (t !== null) {
|
|
2274
|
+
this.freeThread(t);
|
|
2275
|
+
runq.denseThreads[j] = null;
|
|
2276
|
+
}
|
|
2277
|
+
}
|
|
2278
|
+
runq.clear();
|
|
2279
|
+
if (width === 0) break;
|
|
2280
|
+
pos += width;
|
|
2281
|
+
rune = rune1;
|
|
2282
|
+
width = width1;
|
|
2283
|
+
if (rune !== -1) {
|
|
2284
|
+
r = input.step(pos + width);
|
|
2285
|
+
rune1 = r >> 3;
|
|
2286
|
+
width1 = r & 7;
|
|
2287
|
+
}
|
|
2288
|
+
const tmpq = runq;
|
|
2289
|
+
runq = nextq;
|
|
2290
|
+
nextq = tmpq;
|
|
2291
|
+
}
|
|
2292
|
+
this.freeQueue(nextq);
|
|
2293
|
+
return Array.from(matches).sort((a, b) => a - b);
|
|
2294
|
+
}
|
|
2032
2295
|
step(runq, nextq, pos, nextPos, c, nextCond, anchor, atEnd) {
|
|
2033
2296
|
const longest = this.re2.longest;
|
|
2034
2297
|
for (let j = 0; j < runq.size; j++) {
|
|
@@ -2049,7 +2312,9 @@ class Machine {
|
|
|
2049
2312
|
}
|
|
2050
2313
|
if (this.ncap > 0 && (!longest || !this.matched || this.matchcap[1] < pos)) {
|
|
2051
2314
|
t.cap[1] = pos;
|
|
2052
|
-
|
|
2315
|
+
// Using subarray creates a fast view, avoiding a full array copy
|
|
2316
|
+
// until the submatches are finalized at the very end.
|
|
2317
|
+
this.matchcap.set(t.cap.subarray(0, this.ncap));
|
|
2053
2318
|
}
|
|
2054
2319
|
if (!longest) {
|
|
2055
2320
|
this.freeQueue(runq, j + 1);
|
|
@@ -2069,7 +2334,7 @@ class Machine {
|
|
|
2069
2334
|
add = c !== Codepoint.CODES.get('\n');
|
|
2070
2335
|
break;
|
|
2071
2336
|
default:
|
|
2072
|
-
throw new
|
|
2337
|
+
throw new RE2JSInternalException('bad inst');
|
|
2073
2338
|
}
|
|
2074
2339
|
if (add) {
|
|
2075
2340
|
t = this.add(nextq, i.out, nextPos, t.cap, nextCond, t);
|
|
@@ -2127,7 +2392,10 @@ class Machine {
|
|
|
2127
2392
|
t.inst = inst;
|
|
2128
2393
|
}
|
|
2129
2394
|
if (this.ncap > 0 && t.cap !== cap) {
|
|
2130
|
-
|
|
2395
|
+
// Direct assignment utilizing Typed Array performance
|
|
2396
|
+
for (let c = 0; c < this.ncap; c++) {
|
|
2397
|
+
t.cap[c] = cap[c];
|
|
2398
|
+
}
|
|
2131
2399
|
}
|
|
2132
2400
|
q.denseThreads[d] = t;
|
|
2133
2401
|
t = null;
|
|
@@ -2159,20 +2427,24 @@ const arraysEqual = (a, b) => {
|
|
|
2159
2427
|
return true;
|
|
2160
2428
|
};
|
|
2161
2429
|
class DFAState {
|
|
2162
|
-
constructor(nfaStates, isMatch) {
|
|
2430
|
+
constructor(nfaStates, isMatch, matchIDs = []) {
|
|
2163
2431
|
this.nfaStates = nfaStates; // Int32Array of Instruction PCs
|
|
2164
2432
|
this.isMatch = isMatch; // Boolean
|
|
2433
|
+
this.matchIDs = matchIDs; // Array of integers indicating which Set patterns matched
|
|
2165
2434
|
this.nextAscii = new Array(Unicode.MAX_ASCII + 1).fill(null); // Flat array for blisteringly fast ASCII lookups
|
|
2166
2435
|
this.nextMap = new Map(); // Cache of Char -> DFAState
|
|
2167
2436
|
}
|
|
2168
2437
|
}
|
|
2169
2438
|
class DFA {
|
|
2439
|
+
static MAX_CACHE_CLEARS = 5;
|
|
2170
2440
|
constructor(prog) {
|
|
2171
2441
|
this.prog = prog;
|
|
2172
2442
|
this.stateCache = new Map(); // hash(number) -> DFAState[]
|
|
2173
2443
|
this.stateCount = 0; // Tracks total states for memory limits
|
|
2174
2444
|
this.startState = null;
|
|
2175
2445
|
this.stateLimit = 10000; // Prevent memory explosion (ReDoS protection)
|
|
2446
|
+
this.cacheClears = 0; // Track thrashing
|
|
2447
|
+
this.failed = false; // mark if DFA cannot work with provided prog
|
|
2176
2448
|
}
|
|
2177
2449
|
|
|
2178
2450
|
// Follows epsilon (empty) transitions to find all reachable states without consuming a char
|
|
@@ -2180,6 +2452,7 @@ class DFA {
|
|
|
2180
2452
|
const closure = new Set();
|
|
2181
2453
|
const stack = [...pcs];
|
|
2182
2454
|
let isMatch = false;
|
|
2455
|
+
const matchIDs = [];
|
|
2183
2456
|
while (stack.length > 0) {
|
|
2184
2457
|
const pc = stack.pop();
|
|
2185
2458
|
if (closure.has(pc)) continue;
|
|
@@ -2188,6 +2461,7 @@ class DFA {
|
|
|
2188
2461
|
switch (inst.op) {
|
|
2189
2462
|
case Inst.MATCH:
|
|
2190
2463
|
isMatch = true;
|
|
2464
|
+
if (!matchIDs.includes(inst.arg)) matchIDs.push(inst.arg);
|
|
2191
2465
|
break;
|
|
2192
2466
|
case Inst.ALT:
|
|
2193
2467
|
case Inst.ALT_MATCH:
|
|
@@ -2205,9 +2479,11 @@ class DFA {
|
|
|
2205
2479
|
}
|
|
2206
2480
|
}
|
|
2207
2481
|
const sortedPCs = Int32Array.from(closure).sort();
|
|
2482
|
+
matchIDs.sort((a, b) => a - b);
|
|
2208
2483
|
return {
|
|
2209
2484
|
pcs: sortedPCs,
|
|
2210
|
-
isMatch
|
|
2485
|
+
isMatch,
|
|
2486
|
+
matchIDs
|
|
2211
2487
|
};
|
|
2212
2488
|
}
|
|
2213
2489
|
|
|
@@ -2234,17 +2510,27 @@ class DFA {
|
|
|
2234
2510
|
this.stateCache.set(hash, bucket);
|
|
2235
2511
|
}
|
|
2236
2512
|
|
|
2513
|
+
// DFA already failed once - exit
|
|
2514
|
+
if (this.failed) return null;
|
|
2515
|
+
|
|
2237
2516
|
// Safety: prevent memory exhaustion from state explosion
|
|
2238
2517
|
// We flush the cache and return null, which seamlessly routes execution to the NFA
|
|
2239
2518
|
if (this.stateCount >= this.stateLimit) {
|
|
2240
2519
|
this.stateCache.clear();
|
|
2241
2520
|
this.stateCount = 0;
|
|
2242
2521
|
this.startState = null;
|
|
2522
|
+
this.cacheClears++;
|
|
2523
|
+
|
|
2524
|
+
// If this regex causes continuous cache thrashing, permanently fall back to NFA
|
|
2525
|
+
// to avoid spending CPU cycles constantly rebuilding the DFA tree.
|
|
2526
|
+
if (this.cacheClears >= DFA.MAX_CACHE_CLEARS) {
|
|
2527
|
+
this.failed = true;
|
|
2528
|
+
}
|
|
2243
2529
|
return null;
|
|
2244
2530
|
}
|
|
2245
2531
|
|
|
2246
2532
|
// State not found, create it and add to bucket
|
|
2247
|
-
const state = new DFAState(sortedPCs, closureResult.isMatch);
|
|
2533
|
+
const state = new DFAState(sortedPCs, closureResult.isMatch, closureResult.matchIDs);
|
|
2248
2534
|
bucket.push(state);
|
|
2249
2535
|
this.stateCount++;
|
|
2250
2536
|
return state;
|
|
@@ -2272,68 +2558,800 @@ class DFA {
|
|
|
2272
2558
|
nextPCs.push(inst.out);
|
|
2273
2559
|
}
|
|
2274
2560
|
}
|
|
2275
|
-
if (anchor === RE2Flags.UNANCHORED) {
|
|
2276
|
-
nextPCs.push(this.prog.start);
|
|
2561
|
+
if (anchor === RE2Flags.UNANCHORED) {
|
|
2562
|
+
nextPCs.push(this.prog.start);
|
|
2563
|
+
}
|
|
2564
|
+
const nextState = this.getState(nextPCs);
|
|
2565
|
+
|
|
2566
|
+
// Cache the result
|
|
2567
|
+
if (anchor === RE2Flags.UNANCHORED && charCode <= Unicode.MAX_ASCII) {
|
|
2568
|
+
state.nextAscii[charCode] = nextState;
|
|
2569
|
+
} else {
|
|
2570
|
+
const key = charCode + (anchor === RE2Flags.UNANCHORED ? 0 : Unicode.MAX_RUNE + 1);
|
|
2571
|
+
state.nextMap.set(key, nextState);
|
|
2572
|
+
}
|
|
2573
|
+
return nextState;
|
|
2574
|
+
}
|
|
2575
|
+
|
|
2576
|
+
// The hot loop: Execute the Lazy DFA
|
|
2577
|
+
match(input, pos, anchor) {
|
|
2578
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
2579
|
+
return false;
|
|
2580
|
+
}
|
|
2581
|
+
if (!this.startState) {
|
|
2582
|
+
this.startState = this.getState([this.prog.start]);
|
|
2583
|
+
if (!this.startState) return null; // Fallback to NFA
|
|
2584
|
+
}
|
|
2585
|
+
let endPos = input.endPos();
|
|
2586
|
+
let currentState = this.startState;
|
|
2587
|
+
if (currentState.isMatch) {
|
|
2588
|
+
if (anchor === RE2Flags.ANCHOR_BOTH) {
|
|
2589
|
+
if (pos === endPos) return true;
|
|
2590
|
+
} else {
|
|
2591
|
+
return true;
|
|
2592
|
+
}
|
|
2593
|
+
}
|
|
2594
|
+
let i = pos;
|
|
2595
|
+
while (i < endPos) {
|
|
2596
|
+
const r = input.step(i);
|
|
2597
|
+
const rune = r >> 3;
|
|
2598
|
+
const width = r & 7;
|
|
2599
|
+
|
|
2600
|
+
// prevent infinite loop on EOF
|
|
2601
|
+
if (width === 0) {
|
|
2602
|
+
break;
|
|
2603
|
+
}
|
|
2604
|
+
currentState = anchor === RE2Flags.UNANCHORED && rune <= Unicode.MAX_ASCII && currentState.nextAscii[rune] || this.step(currentState, rune, anchor);
|
|
2605
|
+
|
|
2606
|
+
// If we hit an unrecoverable DFA error or bailout, signal fallback
|
|
2607
|
+
if (currentState === null) return null;
|
|
2608
|
+
if (currentState.isMatch) {
|
|
2609
|
+
if (anchor === RE2Flags.ANCHOR_BOTH) {
|
|
2610
|
+
if (i + width === endPos) return true;
|
|
2611
|
+
} else {
|
|
2612
|
+
return true;
|
|
2613
|
+
}
|
|
2614
|
+
}
|
|
2615
|
+
|
|
2616
|
+
// If we hit a dead end, and anchored, fail early
|
|
2617
|
+
if (currentState.nfaStates.length === 0) {
|
|
2618
|
+
if (anchor !== RE2Flags.UNANCHORED) return false;
|
|
2619
|
+
}
|
|
2620
|
+
i += width;
|
|
2621
|
+
}
|
|
2622
|
+
return false;
|
|
2623
|
+
}
|
|
2624
|
+
|
|
2625
|
+
// The hot loop for evaluating Multi-Pattern Sets
|
|
2626
|
+
matchSet(input, pos, anchor) {
|
|
2627
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
2628
|
+
return [];
|
|
2629
|
+
}
|
|
2630
|
+
if (!this.startState) {
|
|
2631
|
+
this.startState = this.getState([this.prog.start]);
|
|
2632
|
+
if (!this.startState) return null; // Fallback to NFA
|
|
2633
|
+
}
|
|
2634
|
+
let endPos = input.endPos();
|
|
2635
|
+
let currentState = this.startState;
|
|
2636
|
+
const matches = new Set();
|
|
2637
|
+
const checkMatch = (state, currentPos) => {
|
|
2638
|
+
if (state.isMatch) {
|
|
2639
|
+
if (anchor === RE2Flags.ANCHOR_BOTH) {
|
|
2640
|
+
if (currentPos === endPos) {
|
|
2641
|
+
state.matchIDs.forEach(id => matches.add(id));
|
|
2642
|
+
}
|
|
2643
|
+
} else {
|
|
2644
|
+
state.matchIDs.forEach(id => matches.add(id));
|
|
2645
|
+
}
|
|
2646
|
+
}
|
|
2647
|
+
};
|
|
2648
|
+
checkMatch(currentState, pos);
|
|
2649
|
+
let i = pos;
|
|
2650
|
+
while (i < endPos) {
|
|
2651
|
+
const r = input.step(i);
|
|
2652
|
+
const rune = r >> 3;
|
|
2653
|
+
const width = r & 7;
|
|
2654
|
+
if (width === 0) break;
|
|
2655
|
+
currentState = anchor === RE2Flags.UNANCHORED && rune <= Unicode.MAX_ASCII && currentState.nextAscii[rune] || this.step(currentState, rune, anchor);
|
|
2656
|
+
if (currentState === null) return null; // Bailout to NFA
|
|
2657
|
+
|
|
2658
|
+
i += width;
|
|
2659
|
+
checkMatch(currentState, i);
|
|
2660
|
+
if (currentState.nfaStates.length === 0) {
|
|
2661
|
+
if (anchor !== RE2Flags.UNANCHORED) break;
|
|
2662
|
+
}
|
|
2663
|
+
}
|
|
2664
|
+
return Array.from(matches).sort((a, b) => a - b);
|
|
2665
|
+
}
|
|
2666
|
+
}
|
|
2667
|
+
|
|
2668
|
+
const VISITED_BITS = 32;
|
|
2669
|
+
const MAX_BACKTRACK_PROG = 500;
|
|
2670
|
+
const INITIAL_JOB_CAPACITY = 256; // Starting size for the job stack arrays
|
|
2671
|
+
const MAX_BACKTRACK_VECTOR = 256 * 1024; // 32 KB limit for the visited bit-mask
|
|
2672
|
+
|
|
2673
|
+
class BitState {
|
|
2674
|
+
constructor() {
|
|
2675
|
+
this.end = 0;
|
|
2676
|
+
this.cap = new Int32Array(0);
|
|
2677
|
+
this.matchcap = new Int32Array(0);
|
|
2678
|
+
this.ncap = 0;
|
|
2679
|
+
|
|
2680
|
+
// Parallel arrays acting as the backtrack job stack
|
|
2681
|
+
this.jobPc = new Int32Array(INITIAL_JOB_CAPACITY);
|
|
2682
|
+
this.jobArg = new Uint8Array(INITIAL_JOB_CAPACITY);
|
|
2683
|
+
this.jobPos = new Int32Array(INITIAL_JOB_CAPACITY);
|
|
2684
|
+
this.jobLen = 0;
|
|
2685
|
+
this.visited = new Uint32Array(0);
|
|
2686
|
+
}
|
|
2687
|
+
reset(prog, end, ncap) {
|
|
2688
|
+
this.end = end;
|
|
2689
|
+
this.jobLen = 0;
|
|
2690
|
+
this.ncap = ncap;
|
|
2691
|
+
|
|
2692
|
+
// Bitwise shift (>>> 5) instead of Math.floor( / 32)
|
|
2693
|
+
const visitedSize = prog.numInst() * (end + 1) + VISITED_BITS - 1 >>> 5;
|
|
2694
|
+
if (this.visited.length < visitedSize) {
|
|
2695
|
+
this.visited = new Uint32Array(Math.floor(MAX_BACKTRACK_VECTOR / VISITED_BITS));
|
|
2696
|
+
} else {
|
|
2697
|
+
this.visited.fill(0, 0, visitedSize);
|
|
2698
|
+
}
|
|
2699
|
+
if (this.cap.length < ncap) {
|
|
2700
|
+
// Must explicitly fill with -1 as Int32Array defaults to 0
|
|
2701
|
+
this.cap = new Int32Array(ncap).fill(-1);
|
|
2702
|
+
} else {
|
|
2703
|
+
this.cap.fill(-1, 0, ncap);
|
|
2704
|
+
}
|
|
2705
|
+
if (this.matchcap.length < ncap) {
|
|
2706
|
+
this.matchcap = new Int32Array(ncap).fill(-1);
|
|
2707
|
+
} else {
|
|
2708
|
+
this.matchcap.fill(-1, 0, ncap);
|
|
2709
|
+
}
|
|
2710
|
+
}
|
|
2711
|
+
shouldVisit(pc, pos) {
|
|
2712
|
+
const n = pc * (this.end + 1) + pos;
|
|
2713
|
+
const idx = n >>> 5; // Equivalent to Math.floor(n / 32)
|
|
2714
|
+
const mask = 1 << (n & 31); // Equivalent to n % 32
|
|
2715
|
+
|
|
2716
|
+
if ((this.visited[idx] & mask) !== 0) {
|
|
2717
|
+
return false;
|
|
2718
|
+
}
|
|
2719
|
+
this.visited[idx] |= mask;
|
|
2720
|
+
return true;
|
|
2721
|
+
}
|
|
2722
|
+
push(re2, pc, pos, arg) {
|
|
2723
|
+
if (re2.prog.getInst(pc).op !== Inst.FAIL && (arg || this.shouldVisit(pc, pos))) {
|
|
2724
|
+
if (this.jobLen >= this.jobPc.length) {
|
|
2725
|
+
const newSize = this.jobPc.length * 2;
|
|
2726
|
+
const newPc = new Int32Array(newSize);
|
|
2727
|
+
newPc.set(this.jobPc);
|
|
2728
|
+
this.jobPc = newPc;
|
|
2729
|
+
const newArg = new Uint8Array(newSize);
|
|
2730
|
+
newArg.set(this.jobArg);
|
|
2731
|
+
this.jobArg = newArg;
|
|
2732
|
+
const newPos = new Int32Array(newSize);
|
|
2733
|
+
newPos.set(this.jobPos);
|
|
2734
|
+
this.jobPos = newPos;
|
|
2735
|
+
}
|
|
2736
|
+
this.jobPc[this.jobLen] = pc;
|
|
2737
|
+
this.jobArg[this.jobLen] = arg ? 1 : 0;
|
|
2738
|
+
this.jobPos[this.jobLen] = pos;
|
|
2739
|
+
this.jobLen++;
|
|
2740
|
+
}
|
|
2741
|
+
}
|
|
2742
|
+
tryBacktrack(re2, input, pc, pos, anchor) {
|
|
2743
|
+
const longest = re2.longest;
|
|
2744
|
+
this.push(re2, pc, pos, false);
|
|
2745
|
+
while (this.jobLen > 0) {
|
|
2746
|
+
this.jobLen--;
|
|
2747
|
+
let currentPc = this.jobPc[this.jobLen];
|
|
2748
|
+
let arg = this.jobArg[this.jobLen] === 1;
|
|
2749
|
+
let currentPos = this.jobPos[this.jobLen];
|
|
2750
|
+
let skipShouldVisit = true;
|
|
2751
|
+
while (true) {
|
|
2752
|
+
if (!skipShouldVisit) {
|
|
2753
|
+
if (!this.shouldVisit(currentPc, currentPos)) {
|
|
2754
|
+
break;
|
|
2755
|
+
}
|
|
2756
|
+
}
|
|
2757
|
+
skipShouldVisit = false;
|
|
2758
|
+
const inst = re2.prog.getInst(currentPc);
|
|
2759
|
+
switch (inst.op) {
|
|
2760
|
+
case Inst.FAIL:
|
|
2761
|
+
{
|
|
2762
|
+
throw new RE2JSInternalException('unexpected InstFail');
|
|
2763
|
+
}
|
|
2764
|
+
case Inst.ALT:
|
|
2765
|
+
{
|
|
2766
|
+
if (arg) {
|
|
2767
|
+
arg = false;
|
|
2768
|
+
currentPc = inst.arg;
|
|
2769
|
+
continue;
|
|
2770
|
+
} else {
|
|
2771
|
+
this.push(re2, currentPc, currentPos, true);
|
|
2772
|
+
currentPc = inst.out;
|
|
2773
|
+
continue;
|
|
2774
|
+
}
|
|
2775
|
+
}
|
|
2776
|
+
case Inst.ALT_MATCH:
|
|
2777
|
+
{
|
|
2778
|
+
const outInst = re2.prog.getInst(inst.out);
|
|
2779
|
+
if (Inst.isRuneOp(outInst.op)) {
|
|
2780
|
+
this.push(re2, inst.arg, currentPos, false);
|
|
2781
|
+
currentPc = inst.out;
|
|
2782
|
+
continue;
|
|
2783
|
+
}
|
|
2784
|
+
this.push(re2, inst.out, this.end, false);
|
|
2785
|
+
currentPc = inst.arg;
|
|
2786
|
+
continue;
|
|
2787
|
+
}
|
|
2788
|
+
case Inst.RUNE:
|
|
2789
|
+
{
|
|
2790
|
+
const r = input.step(currentPos);
|
|
2791
|
+
if (r === MachineInputBase.EOF()) break;
|
|
2792
|
+
if (!inst.matchRune(r >> 3)) break;
|
|
2793
|
+
currentPos += r & 7;
|
|
2794
|
+
currentPc = inst.out;
|
|
2795
|
+
continue;
|
|
2796
|
+
}
|
|
2797
|
+
case Inst.RUNE1:
|
|
2798
|
+
{
|
|
2799
|
+
const r = input.step(currentPos);
|
|
2800
|
+
if (r === MachineInputBase.EOF()) break;
|
|
2801
|
+
if (r >> 3 !== inst.runes[0]) break;
|
|
2802
|
+
currentPos += r & 7;
|
|
2803
|
+
currentPc = inst.out;
|
|
2804
|
+
continue;
|
|
2805
|
+
}
|
|
2806
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
2807
|
+
{
|
|
2808
|
+
const r = input.step(currentPos);
|
|
2809
|
+
if (r === MachineInputBase.EOF()) break;
|
|
2810
|
+
if (r >> 3 === 10) break;
|
|
2811
|
+
currentPos += r & 7;
|
|
2812
|
+
currentPc = inst.out;
|
|
2813
|
+
continue;
|
|
2814
|
+
}
|
|
2815
|
+
case Inst.RUNE_ANY:
|
|
2816
|
+
{
|
|
2817
|
+
const r = input.step(currentPos);
|
|
2818
|
+
if (r === MachineInputBase.EOF()) break;
|
|
2819
|
+
currentPos += r & 7;
|
|
2820
|
+
currentPc = inst.out;
|
|
2821
|
+
continue;
|
|
2822
|
+
}
|
|
2823
|
+
case Inst.CAPTURE:
|
|
2824
|
+
{
|
|
2825
|
+
if (arg) {
|
|
2826
|
+
this.cap[inst.arg] = currentPos;
|
|
2827
|
+
break;
|
|
2828
|
+
} else {
|
|
2829
|
+
if (inst.arg < this.ncap) {
|
|
2830
|
+
this.push(re2, currentPc, this.cap[inst.arg], true);
|
|
2831
|
+
this.cap[inst.arg] = currentPos;
|
|
2832
|
+
}
|
|
2833
|
+
currentPc = inst.out;
|
|
2834
|
+
continue;
|
|
2835
|
+
}
|
|
2836
|
+
}
|
|
2837
|
+
case Inst.EMPTY_WIDTH:
|
|
2838
|
+
{
|
|
2839
|
+
const flag = input.context(currentPos);
|
|
2840
|
+
if ((inst.arg & ~flag) !== 0) break;
|
|
2841
|
+
currentPc = inst.out;
|
|
2842
|
+
continue;
|
|
2843
|
+
}
|
|
2844
|
+
case Inst.NOP:
|
|
2845
|
+
{
|
|
2846
|
+
currentPc = inst.out;
|
|
2847
|
+
continue;
|
|
2848
|
+
}
|
|
2849
|
+
case Inst.MATCH:
|
|
2850
|
+
{
|
|
2851
|
+
if (anchor === RE2Flags.ANCHOR_BOTH && currentPos !== this.end) {
|
|
2852
|
+
break;
|
|
2853
|
+
}
|
|
2854
|
+
if (this.ncap === 0) return true;
|
|
2855
|
+
if (this.ncap > 1) {
|
|
2856
|
+
this.cap[1] = currentPos;
|
|
2857
|
+
}
|
|
2858
|
+
const old = this.matchcap[1];
|
|
2859
|
+
if (old === -1 || longest && currentPos > 0 && currentPos > old) {
|
|
2860
|
+
this.matchcap.set(this.cap);
|
|
2861
|
+
}
|
|
2862
|
+
if (!longest) return true;
|
|
2863
|
+
if (currentPos === this.end) return true;
|
|
2864
|
+
break;
|
|
2865
|
+
}
|
|
2866
|
+
default:
|
|
2867
|
+
{
|
|
2868
|
+
throw new RE2JSInternalException('bad inst');
|
|
2869
|
+
}
|
|
2870
|
+
}
|
|
2871
|
+
break;
|
|
2872
|
+
}
|
|
2873
|
+
}
|
|
2874
|
+
return longest && this.matchcap.length > 1 && this.matchcap[1] >= 0;
|
|
2875
|
+
}
|
|
2876
|
+
}
|
|
2877
|
+
const bitStatePool = [];
|
|
2878
|
+
class Backtracker {
|
|
2879
|
+
static shouldBacktrack(prog) {
|
|
2880
|
+
return prog.numInst() <= MAX_BACKTRACK_PROG;
|
|
2881
|
+
}
|
|
2882
|
+
static maxBitStateLen(prog) {
|
|
2883
|
+
if (!Backtracker.shouldBacktrack(prog)) {
|
|
2884
|
+
return 0;
|
|
2885
|
+
}
|
|
2886
|
+
return Math.floor(MAX_BACKTRACK_VECTOR / prog.numInst());
|
|
2887
|
+
}
|
|
2888
|
+
static execute(re2, input, pos, anchor, ncap) {
|
|
2889
|
+
const startCond = re2.cond;
|
|
2890
|
+
if (startCond === Utils.EMPTY_ALL) {
|
|
2891
|
+
return null;
|
|
2892
|
+
}
|
|
2893
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
2894
|
+
return null;
|
|
2895
|
+
}
|
|
2896
|
+
if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 && pos !== 0) {
|
|
2897
|
+
return null;
|
|
2898
|
+
}
|
|
2899
|
+
const b = bitStatePool.length > 0 ? bitStatePool.pop() : new BitState();
|
|
2900
|
+
const end = input.endPos();
|
|
2901
|
+
b.reset(re2.prog, end, ncap);
|
|
2902
|
+
let matched = false;
|
|
2903
|
+
if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 || anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) {
|
|
2904
|
+
if (b.ncap > 0) {
|
|
2905
|
+
b.cap[0] = pos;
|
|
2906
|
+
}
|
|
2907
|
+
if (b.tryBacktrack(re2, input, re2.prog.start, pos, anchor)) {
|
|
2908
|
+
matched = true;
|
|
2909
|
+
}
|
|
2910
|
+
} else {
|
|
2911
|
+
let width = -1;
|
|
2912
|
+
for (; pos <= end && width !== 0; pos += width) {
|
|
2913
|
+
if (re2.prefix.length > 0) {
|
|
2914
|
+
const advance = input.index(re2, pos);
|
|
2915
|
+
if (advance < 0) {
|
|
2916
|
+
break;
|
|
2917
|
+
}
|
|
2918
|
+
pos += advance;
|
|
2919
|
+
}
|
|
2920
|
+
if (b.ncap > 0) {
|
|
2921
|
+
b.cap[0] = pos;
|
|
2922
|
+
}
|
|
2923
|
+
if (b.tryBacktrack(re2, input, re2.prog.start, pos, anchor)) {
|
|
2924
|
+
matched = true;
|
|
2925
|
+
break;
|
|
2926
|
+
}
|
|
2927
|
+
const r = input.step(pos);
|
|
2928
|
+
width = r === MachineInputBase.EOF() ? 0 : r & 7;
|
|
2929
|
+
}
|
|
2930
|
+
}
|
|
2931
|
+
if (!matched) {
|
|
2932
|
+
bitStatePool.push(b);
|
|
2933
|
+
return null;
|
|
2934
|
+
}
|
|
2935
|
+
|
|
2936
|
+
// Must slice so we don't accidentally leak trailing arrays from previously recycled typed arrays
|
|
2937
|
+
const result = ncap === 0 ? [] : Array.from(b.matchcap.subarray(0, ncap));
|
|
2938
|
+
bitStatePool.push(b);
|
|
2939
|
+
return result;
|
|
2940
|
+
}
|
|
2941
|
+
}
|
|
2942
|
+
|
|
2943
|
+
class QueueOnePass {
|
|
2944
|
+
constructor(size) {
|
|
2945
|
+
this.sparse = new Uint32Array(size);
|
|
2946
|
+
this.dense = new Uint32Array(size);
|
|
2947
|
+
this.size = 0;
|
|
2948
|
+
this.nextIndex = 0;
|
|
2949
|
+
}
|
|
2950
|
+
empty() {
|
|
2951
|
+
return this.nextIndex >= this.size;
|
|
2952
|
+
}
|
|
2953
|
+
next() {
|
|
2954
|
+
return this.dense[this.nextIndex++];
|
|
2955
|
+
}
|
|
2956
|
+
clear() {
|
|
2957
|
+
this.size = 0;
|
|
2958
|
+
this.nextIndex = 0;
|
|
2959
|
+
}
|
|
2960
|
+
contains(u) {
|
|
2961
|
+
return u < this.sparse.length && this.sparse[u] < this.size && this.dense[this.sparse[u]] === u;
|
|
2962
|
+
}
|
|
2963
|
+
insert(u) {
|
|
2964
|
+
if (!this.contains(u)) this.insertNew(u);
|
|
2965
|
+
}
|
|
2966
|
+
insertNew(u) {
|
|
2967
|
+
if (u >= this.sparse.length) return;
|
|
2968
|
+
this.sparse[u] = this.size;
|
|
2969
|
+
this.dense[this.size] = u;
|
|
2970
|
+
this.size++;
|
|
2971
|
+
}
|
|
2972
|
+
}
|
|
2973
|
+
const mergeRuneSets = (leftRunes, rightRunes, leftPC, rightPC) => {
|
|
2974
|
+
const leftLen = leftRunes.length;
|
|
2975
|
+
const rightLen = rightRunes.length;
|
|
2976
|
+
let lx = 0,
|
|
2977
|
+
rx = 0;
|
|
2978
|
+
const merged = [];
|
|
2979
|
+
const next = [];
|
|
2980
|
+
let ok = true;
|
|
2981
|
+
let ix = -1;
|
|
2982
|
+
const extend = isLeft => {
|
|
2983
|
+
const newArray = isLeft ? leftRunes : rightRunes;
|
|
2984
|
+
const low = isLeft ? lx : rx;
|
|
2985
|
+
const pc = isLeft ? leftPC : rightPC;
|
|
2986
|
+
if (ix > 0 && newArray[low] <= merged[ix]) return false;
|
|
2987
|
+
merged.push(newArray[low], newArray[low + 1]);
|
|
2988
|
+
if (isLeft) lx += 2;else rx += 2;
|
|
2989
|
+
ix += 2;
|
|
2990
|
+
next.push(pc);
|
|
2991
|
+
return true;
|
|
2992
|
+
};
|
|
2993
|
+
while (lx < leftLen || rx < rightLen) {
|
|
2994
|
+
if (rx >= rightLen) {
|
|
2995
|
+
ok = extend(true);
|
|
2996
|
+
} else if (lx >= leftLen) {
|
|
2997
|
+
ok = extend(false);
|
|
2998
|
+
} else if (rightRunes[rx] < leftRunes[lx]) {
|
|
2999
|
+
ok = extend(false);
|
|
3000
|
+
} else {
|
|
3001
|
+
ok = extend(true);
|
|
3002
|
+
}
|
|
3003
|
+
if (!ok) return null;
|
|
3004
|
+
}
|
|
3005
|
+
return {
|
|
3006
|
+
merged,
|
|
3007
|
+
next
|
|
3008
|
+
};
|
|
3009
|
+
};
|
|
3010
|
+
class OnePassProg {
|
|
3011
|
+
constructor(prog) {
|
|
3012
|
+
this.start = prog.start;
|
|
3013
|
+
this.numCap = prog.numCap;
|
|
3014
|
+
this.inst = new Array(prog.inst.length);
|
|
3015
|
+
for (let i = 0; i < prog.inst.length; i++) {
|
|
3016
|
+
const orig = prog.inst[i];
|
|
3017
|
+
const inst = new Inst(orig.op);
|
|
3018
|
+
inst.out = orig.out;
|
|
3019
|
+
inst.arg = orig.arg;
|
|
3020
|
+
inst.runes = orig.runes ? orig.runes.slice() : [];
|
|
3021
|
+
inst.next = null;
|
|
3022
|
+
this.inst[i] = inst;
|
|
3023
|
+
}
|
|
3024
|
+
}
|
|
3025
|
+
}
|
|
3026
|
+
const onePassCopy = prog => {
|
|
3027
|
+
const p = new OnePassProg(prog);
|
|
3028
|
+
|
|
3029
|
+
// Rewrites one or more common Prog constructs that enable some otherwise
|
|
3030
|
+
// non-onepass Progs to be onepass.
|
|
3031
|
+
for (let pc = 0; pc < p.inst.length; pc++) {
|
|
3032
|
+
const inst = p.inst[pc];
|
|
3033
|
+
if (inst.op !== Inst.ALT && inst.op !== Inst.ALT_MATCH) continue;
|
|
3034
|
+
let pAOther = 'out';
|
|
3035
|
+
let pAAlt = 'arg';
|
|
3036
|
+
let instAlt = p.inst[inst[pAAlt]];
|
|
3037
|
+
if (instAlt.op !== Inst.ALT && instAlt.op !== Inst.ALT_MATCH) {
|
|
3038
|
+
pAOther = 'arg';
|
|
3039
|
+
pAAlt = 'out';
|
|
3040
|
+
instAlt = p.inst[inst[pAAlt]];
|
|
3041
|
+
if (instAlt.op !== Inst.ALT && instAlt.op !== Inst.ALT_MATCH) continue;
|
|
3042
|
+
}
|
|
3043
|
+
const instOther = p.inst[inst[pAOther]];
|
|
3044
|
+
if (instOther.op === Inst.ALT || instOther.op === Inst.ALT_MATCH) continue;
|
|
3045
|
+
let pBAlt = 'out';
|
|
3046
|
+
let pBOther = 'arg';
|
|
3047
|
+
let patch = false;
|
|
3048
|
+
if (instAlt.out === pc) {
|
|
3049
|
+
patch = true;
|
|
3050
|
+
} else if (instAlt.arg === pc) {
|
|
3051
|
+
patch = true;
|
|
3052
|
+
pBAlt = 'arg';
|
|
3053
|
+
pBOther = 'out';
|
|
3054
|
+
}
|
|
3055
|
+
if (patch) instAlt[pBAlt] = inst[pAOther];
|
|
3056
|
+
if (inst[pAOther] === instAlt[pBAlt]) inst[pAAlt] = instAlt[pBOther];
|
|
3057
|
+
}
|
|
3058
|
+
return p;
|
|
3059
|
+
};
|
|
3060
|
+
const makeOnePass = p => {
|
|
3061
|
+
if (p.inst.length >= 1000) return null;
|
|
3062
|
+
const instQueue = new QueueOnePass(p.inst.length);
|
|
3063
|
+
const visitQueue = new QueueOnePass(p.inst.length);
|
|
3064
|
+
const onePassRunes = new Array(p.inst.length);
|
|
3065
|
+
const m = new Array(p.inst.length).fill(false);
|
|
3066
|
+
const check = pc => {
|
|
3067
|
+
let ok = true;
|
|
3068
|
+
const inst = p.inst[pc];
|
|
3069
|
+
if (visitQueue.contains(pc)) return true;
|
|
3070
|
+
visitQueue.insert(pc);
|
|
3071
|
+
switch (inst.op) {
|
|
3072
|
+
case Inst.ALT:
|
|
3073
|
+
case Inst.ALT_MATCH:
|
|
3074
|
+
{
|
|
3075
|
+
ok = check(inst.out) && check(inst.arg);
|
|
3076
|
+
let matchOut = m[inst.out];
|
|
3077
|
+
let matchArg = m[inst.arg];
|
|
3078
|
+
if (matchOut && matchArg) return false;
|
|
3079
|
+
if (matchArg) {
|
|
3080
|
+
const tempOut = inst.out;
|
|
3081
|
+
inst.out = inst.arg;
|
|
3082
|
+
inst.arg = tempOut;
|
|
3083
|
+
const tempMatch = matchOut;
|
|
3084
|
+
matchOut = matchArg;
|
|
3085
|
+
matchArg = tempMatch;
|
|
3086
|
+
}
|
|
3087
|
+
if (matchOut) {
|
|
3088
|
+
m[pc] = true;
|
|
3089
|
+
inst.op = Inst.ALT_MATCH;
|
|
3090
|
+
}
|
|
3091
|
+
const leftRunes = onePassRunes[inst.out] || [];
|
|
3092
|
+
const rightRunes = onePassRunes[inst.arg] || [];
|
|
3093
|
+
const mergeRes = mergeRuneSets(leftRunes, rightRunes, inst.out, inst.arg);
|
|
3094
|
+
if (!mergeRes) return false;
|
|
3095
|
+
onePassRunes[pc] = mergeRes.merged;
|
|
3096
|
+
inst.next = new Uint32Array(mergeRes.next);
|
|
3097
|
+
break;
|
|
3098
|
+
}
|
|
3099
|
+
case Inst.CAPTURE:
|
|
3100
|
+
case Inst.EMPTY_WIDTH:
|
|
3101
|
+
case Inst.NOP:
|
|
3102
|
+
{
|
|
3103
|
+
ok = check(inst.out);
|
|
3104
|
+
m[pc] = m[inst.out];
|
|
3105
|
+
onePassRunes[pc] = onePassRunes[inst.out] ? onePassRunes[inst.out].slice() : [];
|
|
3106
|
+
inst.next = new Uint32Array(Math.floor(onePassRunes[pc].length / 2) + 1).fill(inst.out);
|
|
3107
|
+
break;
|
|
3108
|
+
}
|
|
3109
|
+
case Inst.MATCH:
|
|
3110
|
+
case Inst.FAIL:
|
|
3111
|
+
{
|
|
3112
|
+
m[pc] = inst.op === Inst.MATCH;
|
|
3113
|
+
break;
|
|
3114
|
+
}
|
|
3115
|
+
case Inst.RUNE:
|
|
3116
|
+
{
|
|
3117
|
+
m[pc] = false;
|
|
3118
|
+
if (inst.next && inst.next.length > 0) break;
|
|
3119
|
+
instQueue.insert(inst.out);
|
|
3120
|
+
if (!inst.runes || inst.runes.length === 0) {
|
|
3121
|
+
onePassRunes[pc] = [];
|
|
3122
|
+
inst.next = new Uint32Array([inst.out]);
|
|
3123
|
+
break;
|
|
3124
|
+
}
|
|
3125
|
+
let runes = [];
|
|
3126
|
+
if (inst.runes.length === 1 && (inst.arg & RE2Flags.FOLD_CASE) !== 0) {
|
|
3127
|
+
const r0 = inst.runes[0];
|
|
3128
|
+
runes.push(r0, r0);
|
|
3129
|
+
for (let r1 = Unicode.simpleFold(r0); r1 !== r0; r1 = Unicode.simpleFold(r1)) {
|
|
3130
|
+
runes.push(r1, r1);
|
|
3131
|
+
}
|
|
3132
|
+
runes.sort((a, b) => a - b);
|
|
3133
|
+
} else {
|
|
3134
|
+
runes.push(...inst.runes);
|
|
3135
|
+
}
|
|
3136
|
+
onePassRunes[pc] = runes;
|
|
3137
|
+
inst.next = new Uint32Array(Math.floor(runes.length / 2) + 1).fill(inst.out);
|
|
3138
|
+
inst.op = Inst.RUNE;
|
|
3139
|
+
break;
|
|
3140
|
+
}
|
|
3141
|
+
case Inst.RUNE1:
|
|
3142
|
+
{
|
|
3143
|
+
m[pc] = false;
|
|
3144
|
+
if (inst.next && inst.next.length > 0) break;
|
|
3145
|
+
instQueue.insert(inst.out);
|
|
3146
|
+
let runes = [];
|
|
3147
|
+
if ((inst.arg & RE2Flags.FOLD_CASE) !== 0) {
|
|
3148
|
+
const r0 = inst.runes[0];
|
|
3149
|
+
runes.push(r0, r0);
|
|
3150
|
+
for (let r1 = Unicode.simpleFold(r0); r1 !== r0; r1 = Unicode.simpleFold(r1)) {
|
|
3151
|
+
runes.push(r1, r1);
|
|
3152
|
+
}
|
|
3153
|
+
runes.sort((a, b) => a - b);
|
|
3154
|
+
} else {
|
|
3155
|
+
runes.push(inst.runes[0], inst.runes[0]);
|
|
3156
|
+
}
|
|
3157
|
+
onePassRunes[pc] = runes;
|
|
3158
|
+
inst.next = new Uint32Array(Math.floor(runes.length / 2) + 1).fill(inst.out);
|
|
3159
|
+
inst.op = Inst.RUNE;
|
|
3160
|
+
break;
|
|
3161
|
+
}
|
|
3162
|
+
case Inst.RUNE_ANY:
|
|
3163
|
+
{
|
|
3164
|
+
m[pc] = false;
|
|
3165
|
+
if (inst.next && inst.next.length > 0) break;
|
|
3166
|
+
instQueue.insert(inst.out);
|
|
3167
|
+
onePassRunes[pc] = [0, Unicode.MAX_RUNE];
|
|
3168
|
+
inst.next = new Uint32Array([inst.out]);
|
|
3169
|
+
break;
|
|
3170
|
+
}
|
|
3171
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
3172
|
+
{
|
|
3173
|
+
m[pc] = false;
|
|
3174
|
+
if (inst.next && inst.next.length > 0) break;
|
|
3175
|
+
instQueue.insert(inst.out);
|
|
3176
|
+
onePassRunes[pc] = [0, 9, 11, Unicode.MAX_RUNE]; // \n is 10
|
|
3177
|
+
inst.next = new Uint32Array(Math.floor(onePassRunes[pc].length / 2) + 1).fill(inst.out);
|
|
3178
|
+
break;
|
|
3179
|
+
}
|
|
3180
|
+
}
|
|
3181
|
+
return ok;
|
|
3182
|
+
};
|
|
3183
|
+
instQueue.clear();
|
|
3184
|
+
instQueue.insert(p.start);
|
|
3185
|
+
while (!instQueue.empty()) {
|
|
3186
|
+
visitQueue.clear();
|
|
3187
|
+
const pc = instQueue.next();
|
|
3188
|
+
if (!check(pc)) return null;
|
|
3189
|
+
}
|
|
3190
|
+
for (let i = 0; i < p.inst.length; i++) {
|
|
3191
|
+
if (onePassRunes[i]) p.inst[i].runes = onePassRunes[i];
|
|
3192
|
+
}
|
|
3193
|
+
return p;
|
|
3194
|
+
};
|
|
3195
|
+
const cleanupOnePass = (p, original) => {
|
|
3196
|
+
for (let ix = 0; ix < original.inst.length; ix++) {
|
|
3197
|
+
const instOriginal = original.inst[ix];
|
|
3198
|
+
switch (instOriginal.op) {
|
|
3199
|
+
case Inst.ALT:
|
|
3200
|
+
case Inst.ALT_MATCH:
|
|
3201
|
+
case Inst.RUNE:
|
|
3202
|
+
break;
|
|
3203
|
+
case Inst.CAPTURE:
|
|
3204
|
+
case Inst.EMPTY_WIDTH:
|
|
3205
|
+
case Inst.NOP:
|
|
3206
|
+
case Inst.MATCH:
|
|
3207
|
+
case Inst.FAIL:
|
|
3208
|
+
p.inst[ix].next = null;
|
|
3209
|
+
break;
|
|
3210
|
+
case Inst.RUNE1:
|
|
3211
|
+
case Inst.RUNE_ANY:
|
|
3212
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
3213
|
+
p.inst[ix].next = null;
|
|
3214
|
+
p.inst[ix].op = instOriginal.op;
|
|
3215
|
+
p.inst[ix].runes = instOriginal.runes ? instOriginal.runes.slice() : [];
|
|
3216
|
+
break;
|
|
3217
|
+
}
|
|
3218
|
+
}
|
|
3219
|
+
};
|
|
3220
|
+
class OnePass {
|
|
3221
|
+
static compile(prog) {
|
|
3222
|
+
if (prog.start === 0) return null;
|
|
3223
|
+
const startInst = prog.inst[prog.start];
|
|
3224
|
+
// onepass regexps must be strictly anchored
|
|
3225
|
+
if (startInst.op !== Inst.EMPTY_WIDTH || (startInst.arg & Utils.EMPTY_BEGIN_TEXT) === 0) {
|
|
3226
|
+
return null;
|
|
2277
3227
|
}
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
const key = charCode + (anchor === RE2Flags.UNANCHORED ? 0 : Unicode.MAX_RUNE + 1);
|
|
2285
|
-
state.nextMap.set(key, nextState);
|
|
3228
|
+
let hasAlt = false;
|
|
3229
|
+
for (let i = 0; i < prog.inst.length; i++) {
|
|
3230
|
+
if (prog.inst[i].op === Inst.ALT || prog.inst[i].op === Inst.ALT_MATCH) {
|
|
3231
|
+
hasAlt = true;
|
|
3232
|
+
break;
|
|
3233
|
+
}
|
|
2286
3234
|
}
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
2293
|
-
|
|
3235
|
+
for (let i = 0; i < prog.inst.length; i++) {
|
|
3236
|
+
const inst = prog.inst[i];
|
|
3237
|
+
const opOut = prog.inst[inst.out].op;
|
|
3238
|
+
switch (inst.op) {
|
|
3239
|
+
case Inst.ALT:
|
|
3240
|
+
case Inst.ALT_MATCH:
|
|
3241
|
+
if (opOut === Inst.MATCH || prog.inst[inst.arg].op === Inst.MATCH) {
|
|
3242
|
+
return null;
|
|
3243
|
+
}
|
|
3244
|
+
break;
|
|
3245
|
+
case Inst.EMPTY_WIDTH:
|
|
3246
|
+
if (opOut === Inst.MATCH) {
|
|
3247
|
+
if ((inst.arg & Utils.EMPTY_END_TEXT) === Utils.EMPTY_END_TEXT) {
|
|
3248
|
+
continue;
|
|
3249
|
+
}
|
|
3250
|
+
return null;
|
|
3251
|
+
}
|
|
3252
|
+
break;
|
|
3253
|
+
default:
|
|
3254
|
+
if (opOut === Inst.MATCH && hasAlt) {
|
|
3255
|
+
return null;
|
|
3256
|
+
}
|
|
3257
|
+
break;
|
|
3258
|
+
}
|
|
2294
3259
|
}
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
3260
|
+
let p = onePassCopy(prog);
|
|
3261
|
+
p = makeOnePass(p);
|
|
3262
|
+
if (p !== null) {
|
|
3263
|
+
cleanupOnePass(p, prog);
|
|
2298
3264
|
}
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
3265
|
+
return p;
|
|
3266
|
+
}
|
|
3267
|
+
static next(inst, r) {
|
|
3268
|
+
const nextIdx = inst.matchRunePos(r);
|
|
3269
|
+
if (nextIdx >= 0) return inst.next[nextIdx];
|
|
3270
|
+
if (inst.op === Inst.ALT_MATCH) return inst.out;
|
|
3271
|
+
return 0; // fail
|
|
3272
|
+
}
|
|
3273
|
+
static execute(re2, input, pos, anchor, ncap) {
|
|
3274
|
+
const onepass = re2.onepass;
|
|
3275
|
+
if (!onepass) return null;
|
|
3276
|
+
const matchcap = new Int32Array(ncap).fill(-1);
|
|
3277
|
+
let matched = false;
|
|
3278
|
+
let r = input.step(pos);
|
|
3279
|
+
let rune = r >> 3;
|
|
3280
|
+
let width = r & 7;
|
|
3281
|
+
let r1 = MachineInputBase.EOF();
|
|
3282
|
+
let rune1 = -1;
|
|
3283
|
+
let width1 = 0;
|
|
3284
|
+
if (r !== MachineInputBase.EOF()) {
|
|
3285
|
+
r1 = input.step(pos + width);
|
|
3286
|
+
if (r1 !== MachineInputBase.EOF()) {
|
|
3287
|
+
rune1 = r1 >> 3;
|
|
3288
|
+
width1 = r1 & 7;
|
|
2306
3289
|
}
|
|
2307
3290
|
}
|
|
2308
|
-
let
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
3291
|
+
let flag = pos === 0 ? Utils.emptyOpContext(-1, rune) : input.context(pos);
|
|
3292
|
+
let pc = onepass.start;
|
|
3293
|
+
let inst;
|
|
3294
|
+
while (true) {
|
|
3295
|
+
inst = onepass.inst[pc];
|
|
3296
|
+
pc = inst.out;
|
|
3297
|
+
switch (inst.op) {
|
|
3298
|
+
case Inst.MATCH:
|
|
3299
|
+
{
|
|
3300
|
+
matched = true;
|
|
3301
|
+
if (matchcap.length > 0) {
|
|
3302
|
+
matchcap[0] = 0;
|
|
3303
|
+
matchcap[1] = pos;
|
|
3304
|
+
}
|
|
3305
|
+
return ncap === 0 ? [] : Array.from(matchcap);
|
|
3306
|
+
}
|
|
3307
|
+
case Inst.RUNE:
|
|
3308
|
+
if (!inst.matchRune(rune)) return null;
|
|
3309
|
+
break;
|
|
3310
|
+
case Inst.RUNE1:
|
|
3311
|
+
if (rune !== inst.runes[0]) return null;
|
|
3312
|
+
break;
|
|
3313
|
+
case Inst.RUNE_ANY:
|
|
3314
|
+
break;
|
|
3315
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
3316
|
+
if (rune === 10) return null;
|
|
3317
|
+
break;
|
|
3318
|
+
case Inst.ALT:
|
|
3319
|
+
case Inst.ALT_MATCH:
|
|
3320
|
+
pc = OnePass.next(inst, rune);
|
|
3321
|
+
continue;
|
|
3322
|
+
case Inst.FAIL:
|
|
3323
|
+
return null;
|
|
3324
|
+
case Inst.NOP:
|
|
3325
|
+
continue;
|
|
3326
|
+
case Inst.EMPTY_WIDTH:
|
|
3327
|
+
if ((inst.arg & ~flag) !== 0) return null;
|
|
3328
|
+
continue;
|
|
3329
|
+
case Inst.CAPTURE:
|
|
3330
|
+
if (inst.arg < matchcap.length) {
|
|
3331
|
+
matchcap[inst.arg] = pos;
|
|
3332
|
+
}
|
|
3333
|
+
continue;
|
|
3334
|
+
default:
|
|
3335
|
+
throw new RE2JSInternalException('bad inst');
|
|
2317
3336
|
}
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
3337
|
+
if (width === 0) break;
|
|
3338
|
+
flag = Utils.emptyOpContext(rune, rune1);
|
|
3339
|
+
pos += width;
|
|
3340
|
+
rune = rune1;
|
|
3341
|
+
width = width1;
|
|
3342
|
+
if (rune !== -1) {
|
|
3343
|
+
r1 = input.step(pos + width);
|
|
3344
|
+
if (r1 !== MachineInputBase.EOF()) {
|
|
3345
|
+
rune1 = r1 >> 3;
|
|
3346
|
+
width1 = r1 & 7;
|
|
2325
3347
|
} else {
|
|
2326
|
-
|
|
3348
|
+
rune1 = -1;
|
|
3349
|
+
width1 = 0;
|
|
2327
3350
|
}
|
|
2328
3351
|
}
|
|
2329
|
-
|
|
2330
|
-
// If we hit a dead end, and anchored, fail early
|
|
2331
|
-
if (currentState.nfaStates.length === 0) {
|
|
2332
|
-
if (anchor !== RE2Flags.UNANCHORED) return false;
|
|
2333
|
-
}
|
|
2334
|
-
i += width;
|
|
2335
3352
|
}
|
|
2336
|
-
return
|
|
3353
|
+
if (!matched) return null;
|
|
3354
|
+
return ncap === 0 ? [] : Array.from(matchcap);
|
|
2337
3355
|
}
|
|
2338
3356
|
}
|
|
2339
3357
|
|
|
@@ -2418,7 +3436,7 @@ class Regexp {
|
|
|
2418
3436
|
this.max = 0; // max for REPEAT
|
|
2419
3437
|
this.cap = 0; // capturing index, for CAPTURE
|
|
2420
3438
|
this.name = null; // capturing name, for CAPTURE
|
|
2421
|
-
this.namedGroups =
|
|
3439
|
+
this.namedGroups = Object.create(null); // map of group name -> capturing index
|
|
2422
3440
|
}
|
|
2423
3441
|
reinit() {
|
|
2424
3442
|
this.flags = 0;
|
|
@@ -2428,7 +3446,7 @@ class Regexp {
|
|
|
2428
3446
|
this.min = 0;
|
|
2429
3447
|
this.max = 0;
|
|
2430
3448
|
this.name = null;
|
|
2431
|
-
this.namedGroups =
|
|
3449
|
+
this.namedGroups = Object.create(null);
|
|
2432
3450
|
}
|
|
2433
3451
|
toString() {
|
|
2434
3452
|
return this.appendTo();
|
|
@@ -2688,6 +3706,188 @@ class Regexp {
|
|
|
2688
3706
|
}
|
|
2689
3707
|
}
|
|
2690
3708
|
|
|
3709
|
+
class Prefilter {
|
|
3710
|
+
static Type = {
|
|
3711
|
+
NONE: 0,
|
|
3712
|
+
EXACT: 1,
|
|
3713
|
+
AND: 2,
|
|
3714
|
+
OR: 3
|
|
3715
|
+
};
|
|
3716
|
+
constructor(type) {
|
|
3717
|
+
this.type = type;
|
|
3718
|
+
this.subs = [];
|
|
3719
|
+
this.str = '';
|
|
3720
|
+
this.bytes = null;
|
|
3721
|
+
}
|
|
3722
|
+
eval(input, pos) {
|
|
3723
|
+
switch (this.type) {
|
|
3724
|
+
case Prefilter.Type.NONE:
|
|
3725
|
+
return true;
|
|
3726
|
+
case Prefilter.Type.EXACT:
|
|
3727
|
+
return input.hasString(this, pos);
|
|
3728
|
+
case Prefilter.Type.AND:
|
|
3729
|
+
for (let i = 0; i < this.subs.length; i++) {
|
|
3730
|
+
if (!this.subs[i].eval(input, pos)) return false;
|
|
3731
|
+
}
|
|
3732
|
+
return true;
|
|
3733
|
+
case Prefilter.Type.OR:
|
|
3734
|
+
for (let i = 0; i < this.subs.length; i++) {
|
|
3735
|
+
if (this.subs[i].eval(input, pos)) return true;
|
|
3736
|
+
}
|
|
3737
|
+
return false;
|
|
3738
|
+
default:
|
|
3739
|
+
return true;
|
|
3740
|
+
}
|
|
3741
|
+
}
|
|
3742
|
+
}
|
|
3743
|
+
class PrefilterTree {
|
|
3744
|
+
static build(re) {
|
|
3745
|
+
const pf = PrefilterTree.fromRegexp(re);
|
|
3746
|
+
return PrefilterTree.simplify(pf);
|
|
3747
|
+
}
|
|
3748
|
+
static fromRegexp(re) {
|
|
3749
|
+
if (!re) return new Prefilter(Prefilter.Type.NONE);
|
|
3750
|
+
switch (re.op) {
|
|
3751
|
+
case Regexp.Op.NO_MATCH:
|
|
3752
|
+
case Regexp.Op.EMPTY_MATCH:
|
|
3753
|
+
case Regexp.Op.BEGIN_LINE:
|
|
3754
|
+
case Regexp.Op.END_LINE:
|
|
3755
|
+
case Regexp.Op.BEGIN_TEXT:
|
|
3756
|
+
case Regexp.Op.END_TEXT:
|
|
3757
|
+
case Regexp.Op.WORD_BOUNDARY:
|
|
3758
|
+
case Regexp.Op.NO_WORD_BOUNDARY:
|
|
3759
|
+
case Regexp.Op.CHAR_CLASS:
|
|
3760
|
+
case Regexp.Op.ANY_CHAR_NOT_NL:
|
|
3761
|
+
case Regexp.Op.ANY_CHAR:
|
|
3762
|
+
{
|
|
3763
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3764
|
+
}
|
|
3765
|
+
case Regexp.Op.LITERAL:
|
|
3766
|
+
{
|
|
3767
|
+
if (re.runes.length === 0 || (re.flags & RE2Flags.FOLD_CASE) !== 0) {
|
|
3768
|
+
// Skip case-folded literals for simplicity
|
|
3769
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3770
|
+
}
|
|
3771
|
+
const pf = new Prefilter(Prefilter.Type.EXACT);
|
|
3772
|
+
let str = '';
|
|
3773
|
+
for (let i = 0; i < re.runes.length; i++) {
|
|
3774
|
+
str += String.fromCodePoint(re.runes[i]);
|
|
3775
|
+
}
|
|
3776
|
+
pf.str = str;
|
|
3777
|
+
pf.bytes = Utils.stringToUtf8ByteArray(pf.str);
|
|
3778
|
+
return pf;
|
|
3779
|
+
}
|
|
3780
|
+
case Regexp.Op.CAPTURE:
|
|
3781
|
+
case Regexp.Op.PLUS:
|
|
3782
|
+
{
|
|
3783
|
+
return PrefilterTree.fromRegexp(re.subs[0]);
|
|
3784
|
+
}
|
|
3785
|
+
case Regexp.Op.REPEAT:
|
|
3786
|
+
{
|
|
3787
|
+
if (re.min >= 1) {
|
|
3788
|
+
return PrefilterTree.fromRegexp(re.subs[0]);
|
|
3789
|
+
}
|
|
3790
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3791
|
+
}
|
|
3792
|
+
case Regexp.Op.CONCAT:
|
|
3793
|
+
{
|
|
3794
|
+
const pf = new Prefilter(Prefilter.Type.AND);
|
|
3795
|
+
for (const sub of re.subs) {
|
|
3796
|
+
pf.subs.push(PrefilterTree.fromRegexp(sub));
|
|
3797
|
+
}
|
|
3798
|
+
return pf;
|
|
3799
|
+
}
|
|
3800
|
+
case Regexp.Op.ALTERNATE:
|
|
3801
|
+
{
|
|
3802
|
+
const pf = new Prefilter(Prefilter.Type.OR);
|
|
3803
|
+
for (const sub of re.subs) {
|
|
3804
|
+
pf.subs.push(PrefilterTree.fromRegexp(sub));
|
|
3805
|
+
}
|
|
3806
|
+
return pf;
|
|
3807
|
+
}
|
|
3808
|
+
default:
|
|
3809
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3810
|
+
}
|
|
3811
|
+
}
|
|
3812
|
+
static simplify(pf) {
|
|
3813
|
+
if (pf.type === Prefilter.Type.EXACT || pf.type === Prefilter.Type.NONE) {
|
|
3814
|
+
return pf;
|
|
3815
|
+
}
|
|
3816
|
+
if (pf.type === Prefilter.Type.AND) {
|
|
3817
|
+
const newSubs = [];
|
|
3818
|
+
for (const sub of pf.subs) {
|
|
3819
|
+
const s = PrefilterTree.simplify(sub);
|
|
3820
|
+
if (s.type !== Prefilter.Type.NONE) {
|
|
3821
|
+
if (s.type === Prefilter.Type.AND) {
|
|
3822
|
+
newSubs.push(...s.subs);
|
|
3823
|
+
} else {
|
|
3824
|
+
newSubs.push(s);
|
|
3825
|
+
}
|
|
3826
|
+
}
|
|
3827
|
+
}
|
|
3828
|
+
if (newSubs.length === 0) return new Prefilter(Prefilter.Type.NONE);
|
|
3829
|
+
if (newSubs.length === 1) return newSubs[0];
|
|
3830
|
+
pf.subs = newSubs;
|
|
3831
|
+
return pf;
|
|
3832
|
+
}
|
|
3833
|
+
if (pf.type === Prefilter.Type.OR) {
|
|
3834
|
+
const newSubs = [];
|
|
3835
|
+
for (const sub of pf.subs) {
|
|
3836
|
+
const s = PrefilterTree.simplify(sub);
|
|
3837
|
+
if (s.type === Prefilter.Type.NONE) {
|
|
3838
|
+
// If any branch of an OR has no requirements, the whole OR has no requirements
|
|
3839
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3840
|
+
}
|
|
3841
|
+
if (s.type === Prefilter.Type.OR) {
|
|
3842
|
+
newSubs.push(...s.subs);
|
|
3843
|
+
} else {
|
|
3844
|
+
newSubs.push(s);
|
|
3845
|
+
}
|
|
3846
|
+
}
|
|
3847
|
+
if (newSubs.length === 0) return new Prefilter(Prefilter.Type.NONE);
|
|
3848
|
+
if (newSubs.length === 1) return newSubs[0];
|
|
3849
|
+
|
|
3850
|
+
// De-duplicate EXACT branches
|
|
3851
|
+
const seen = new Set();
|
|
3852
|
+
const uniqueSubs = [];
|
|
3853
|
+
for (const sub of newSubs) {
|
|
3854
|
+
if (sub.type === Prefilter.Type.EXACT) {
|
|
3855
|
+
if (!seen.has(sub.str)) {
|
|
3856
|
+
seen.add(sub.str);
|
|
3857
|
+
uniqueSubs.push(sub);
|
|
3858
|
+
}
|
|
3859
|
+
} else {
|
|
3860
|
+
uniqueSubs.push(sub);
|
|
3861
|
+
}
|
|
3862
|
+
}
|
|
3863
|
+
pf.subs = uniqueSubs;
|
|
3864
|
+
return pf;
|
|
3865
|
+
}
|
|
3866
|
+
return pf;
|
|
3867
|
+
}
|
|
3868
|
+
}
|
|
3869
|
+
|
|
3870
|
+
/**
|
|
3871
|
+
* A list of instruction pointers waiting to be patched.
|
|
3872
|
+
* Tracks both `head` and `tail` to allow O(1) appending during compilation.
|
|
3873
|
+
* * Values are encoded integers, not standard memory pointers:
|
|
3874
|
+
* - Program instruction index: `l >> 1`
|
|
3875
|
+
* - Patch `.out` field if: `(l & 1) === 0`
|
|
3876
|
+
* - Patch `.arg` field if: `(l & 1) === 1`
|
|
3877
|
+
* - `0` denotes an empty list.
|
|
3878
|
+
* * @see https://swtch.com/~rsc/regexp/regexp1.html
|
|
3879
|
+
*/
|
|
3880
|
+
class PatchList {
|
|
3881
|
+
/**
|
|
3882
|
+
* @param {number} head - Encoded pointer to the start of the patch list.
|
|
3883
|
+
* @param {number} tail - Encoded pointer to the end of the patch list.
|
|
3884
|
+
*/
|
|
3885
|
+
constructor(head = 0, tail = 0) {
|
|
3886
|
+
this.head = head;
|
|
3887
|
+
this.tail = tail;
|
|
3888
|
+
}
|
|
3889
|
+
}
|
|
3890
|
+
|
|
2691
3891
|
/**
|
|
2692
3892
|
* A Prog is a compiled regular expression program.
|
|
2693
3893
|
*/
|
|
@@ -2789,39 +3989,30 @@ class Prog {
|
|
|
2789
3989
|
return i.arg;
|
|
2790
3990
|
}
|
|
2791
3991
|
patch(l, val) {
|
|
2792
|
-
|
|
2793
|
-
|
|
2794
|
-
|
|
2795
|
-
|
|
3992
|
+
let head = l.head;
|
|
3993
|
+
while (head !== 0) {
|
|
3994
|
+
const i = this.inst[head >> 1];
|
|
3995
|
+
if ((head & 1) === 0) {
|
|
3996
|
+
head = i.out;
|
|
2796
3997
|
i.out = val;
|
|
2797
3998
|
} else {
|
|
2798
|
-
|
|
3999
|
+
head = i.arg;
|
|
2799
4000
|
i.arg = val;
|
|
2800
4001
|
}
|
|
2801
4002
|
}
|
|
2802
4003
|
}
|
|
2803
4004
|
append(l1, l2) {
|
|
2804
|
-
if (l1 === 0)
|
|
2805
|
-
|
|
2806
|
-
|
|
2807
|
-
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
|
|
2811
|
-
for (;;) {
|
|
2812
|
-
const next = this.next(last);
|
|
2813
|
-
if (next === 0) {
|
|
2814
|
-
break;
|
|
2815
|
-
}
|
|
2816
|
-
last = next;
|
|
2817
|
-
}
|
|
2818
|
-
const i = this.inst[last >> 1];
|
|
2819
|
-
if ((last & 1) === 0) {
|
|
2820
|
-
i.out = l2;
|
|
4005
|
+
if (l1.head === 0) return l2;
|
|
4006
|
+
if (l2.head === 0) return l1;
|
|
4007
|
+
|
|
4008
|
+
// We know exactly where the tail is
|
|
4009
|
+
const i = this.inst[l1.tail >> 1];
|
|
4010
|
+
if ((l1.tail & 1) === 0) {
|
|
4011
|
+
i.out = l2.head;
|
|
2821
4012
|
} else {
|
|
2822
|
-
i.arg = l2;
|
|
4013
|
+
i.arg = l2.head;
|
|
2823
4014
|
}
|
|
2824
|
-
return l1;
|
|
4015
|
+
return new PatchList(l1.head, l2.tail);
|
|
2825
4016
|
}
|
|
2826
4017
|
/**
|
|
2827
4018
|
*
|
|
@@ -2850,7 +4041,7 @@ class Prog {
|
|
|
2850
4041
|
* @class
|
|
2851
4042
|
*/
|
|
2852
4043
|
class Frag {
|
|
2853
|
-
constructor(i = 0, out =
|
|
4044
|
+
constructor(i = 0, out = new PatchList(), nullable = false) {
|
|
2854
4045
|
this.i = i; // an instruction address (pc).
|
|
2855
4046
|
this.out = out; // a patch list; see explanation in Prog.js
|
|
2856
4047
|
this.nullable = nullable; // whether the fragment can match the empty string
|
|
@@ -2875,6 +4066,33 @@ class Compiler {
|
|
|
2875
4066
|
c.prog.start = f.i;
|
|
2876
4067
|
return c.prog;
|
|
2877
4068
|
}
|
|
4069
|
+
static compileSet(regexps) {
|
|
4070
|
+
const c = new Compiler();
|
|
4071
|
+
if (regexps.length === 0) {
|
|
4072
|
+
c.prog.start = c.newInst(Inst.FAIL).i;
|
|
4073
|
+
return c.prog;
|
|
4074
|
+
}
|
|
4075
|
+
let starts = [];
|
|
4076
|
+
for (let i = 0; i < regexps.length; i++) {
|
|
4077
|
+
const f = c.compile(regexps[i]);
|
|
4078
|
+
const m = c.newInst(Inst.MATCH);
|
|
4079
|
+
c.prog.getInst(m.i).arg = i; // Store the regex index
|
|
4080
|
+
c.prog.patch(f.out, m.i);
|
|
4081
|
+
starts.push(f.i);
|
|
4082
|
+
}
|
|
4083
|
+
|
|
4084
|
+
// Link starts together via ALT
|
|
4085
|
+
let start = starts[0];
|
|
4086
|
+
for (let i = 1; i < starts.length; i++) {
|
|
4087
|
+
const f = c.newInst(Inst.ALT);
|
|
4088
|
+
const inst = c.prog.getInst(f.i);
|
|
4089
|
+
inst.out = start;
|
|
4090
|
+
inst.arg = starts[i];
|
|
4091
|
+
start = f.i;
|
|
4092
|
+
}
|
|
4093
|
+
c.prog.start = start;
|
|
4094
|
+
return c.prog;
|
|
4095
|
+
}
|
|
2878
4096
|
constructor() {
|
|
2879
4097
|
this.prog = new Prog();
|
|
2880
4098
|
this.newInst(Inst.FAIL);
|
|
@@ -2887,7 +4105,7 @@ class Compiler {
|
|
|
2887
4105
|
// Returns a no-op fragment. Sometimes unavoidable.
|
|
2888
4106
|
nop() {
|
|
2889
4107
|
const f = this.newInst(Inst.NOP);
|
|
2890
|
-
f.out = f.i << 1;
|
|
4108
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2891
4109
|
return f;
|
|
2892
4110
|
}
|
|
2893
4111
|
fail() {
|
|
@@ -2898,7 +4116,7 @@ class Compiler {
|
|
|
2898
4116
|
// Given a fragment a, returns a fragment with capturing parens around a.
|
|
2899
4117
|
cap(arg) {
|
|
2900
4118
|
const f = this.newInst(Inst.CAPTURE);
|
|
2901
|
-
f.out = f.i << 1;
|
|
4119
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2902
4120
|
this.prog.getInst(f.i).arg = arg;
|
|
2903
4121
|
if (this.prog.numCap < arg + 1) {
|
|
2904
4122
|
this.prog.numCap = arg + 1;
|
|
@@ -2946,10 +4164,10 @@ class Compiler {
|
|
|
2946
4164
|
const i = this.prog.getInst(f.i);
|
|
2947
4165
|
if (nongreedy) {
|
|
2948
4166
|
i.arg = f1.i;
|
|
2949
|
-
f.out = f.i << 1;
|
|
4167
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2950
4168
|
} else {
|
|
2951
4169
|
i.out = f1.i;
|
|
2952
|
-
f.out = f.i << 1 | 1;
|
|
4170
|
+
f.out = new PatchList(f.i << 1 | 1, f.i << 1 | 1);
|
|
2953
4171
|
}
|
|
2954
4172
|
this.prog.patch(f1.out, f.i);
|
|
2955
4173
|
return f;
|
|
@@ -2961,10 +4179,10 @@ class Compiler {
|
|
|
2961
4179
|
const i = this.prog.getInst(f.i);
|
|
2962
4180
|
if (nongreedy) {
|
|
2963
4181
|
i.arg = f1.i;
|
|
2964
|
-
f.out = f.i << 1;
|
|
4182
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2965
4183
|
} else {
|
|
2966
4184
|
i.out = f1.i;
|
|
2967
|
-
f.out = f.i << 1 | 1;
|
|
4185
|
+
f.out = new PatchList(f.i << 1 | 1, f.i << 1 | 1);
|
|
2968
4186
|
}
|
|
2969
4187
|
f.out = this.prog.append(f.out, f1.out);
|
|
2970
4188
|
return f;
|
|
@@ -2987,7 +4205,7 @@ class Compiler {
|
|
|
2987
4205
|
empty(op) {
|
|
2988
4206
|
const f = this.newInst(Inst.EMPTY_WIDTH);
|
|
2989
4207
|
this.prog.getInst(f.i).arg = op;
|
|
2990
|
-
f.out = f.i << 1;
|
|
4208
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2991
4209
|
return f;
|
|
2992
4210
|
}
|
|
2993
4211
|
|
|
@@ -3002,7 +4220,7 @@ class Compiler {
|
|
|
3002
4220
|
flags &= -2;
|
|
3003
4221
|
}
|
|
3004
4222
|
i.arg = flags;
|
|
3005
|
-
f.out = f.i << 1;
|
|
4223
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
3006
4224
|
if ((flags & RE2Flags.FOLD_CASE) === 0 && runes.length === 1 || runes.length === 2 && runes[0] === runes[1]) {
|
|
3007
4225
|
i.op = Inst.RUNE1;
|
|
3008
4226
|
} else if (runes.length === 2 && runes[0] === 0 && runes[1] === Unicode.MAX_RUNE) {
|
|
@@ -3107,23 +4325,92 @@ class Simplify {
|
|
|
3107
4325
|
}
|
|
3108
4326
|
switch (re.op) {
|
|
3109
4327
|
case Regexp.Op.CAPTURE:
|
|
4328
|
+
{
|
|
4329
|
+
const sub = Simplify.simplify(re.subs[0]);
|
|
4330
|
+
if (sub !== re.subs[0]) {
|
|
4331
|
+
const nre = Regexp.fromRegexp(re);
|
|
4332
|
+
nre.runes = [];
|
|
4333
|
+
nre.subs = [sub];
|
|
4334
|
+
return nre;
|
|
4335
|
+
}
|
|
4336
|
+
return re;
|
|
4337
|
+
}
|
|
3110
4338
|
case Regexp.Op.CONCAT:
|
|
3111
4339
|
case Regexp.Op.ALTERNATE:
|
|
3112
4340
|
{
|
|
3113
|
-
|
|
4341
|
+
const newSubs = [];
|
|
4342
|
+
let changed = false;
|
|
3114
4343
|
for (let i = 0; i < re.subs.length; i++) {
|
|
3115
4344
|
const sub = re.subs[i];
|
|
3116
4345
|
const nsub = Simplify.simplify(sub);
|
|
3117
|
-
if (
|
|
3118
|
-
|
|
3119
|
-
|
|
3120
|
-
|
|
4346
|
+
if (nsub !== sub) {
|
|
4347
|
+
changed = true;
|
|
4348
|
+
}
|
|
4349
|
+
if (re.op === Regexp.Op.CONCAT) {
|
|
4350
|
+
// If any part of a CONCAT is mathematically impossible,
|
|
4351
|
+
// the entire CONCAT sequence becomes impossible.
|
|
4352
|
+
if (nsub.op === Regexp.Op.NO_MATCH) {
|
|
4353
|
+
return new Regexp(Regexp.Op.NO_MATCH);
|
|
4354
|
+
}
|
|
4355
|
+
// Drop empty 0-width match nodes entirely from sequences
|
|
4356
|
+
if (nsub.op === Regexp.Op.EMPTY_MATCH) {
|
|
4357
|
+
changed = true;
|
|
4358
|
+
continue;
|
|
4359
|
+
}
|
|
4360
|
+
// Flatten nested concatenations
|
|
4361
|
+
if (nsub.op === Regexp.Op.CONCAT) {
|
|
4362
|
+
changed = true;
|
|
4363
|
+
newSubs.push(...nsub.subs);
|
|
4364
|
+
continue;
|
|
4365
|
+
}
|
|
4366
|
+
} else if (re.op === Regexp.Op.ALTERNATE) {
|
|
4367
|
+
// Drop impossible branches from alternations
|
|
4368
|
+
if (nsub.op === Regexp.Op.NO_MATCH) {
|
|
4369
|
+
changed = true;
|
|
4370
|
+
continue;
|
|
4371
|
+
}
|
|
4372
|
+
// Flatten nested alternations
|
|
4373
|
+
if (nsub.op === Regexp.Op.ALTERNATE) {
|
|
4374
|
+
changed = true;
|
|
4375
|
+
newSubs.push(...nsub.subs);
|
|
4376
|
+
continue;
|
|
4377
|
+
}
|
|
4378
|
+
}
|
|
4379
|
+
newSubs.push(nsub);
|
|
4380
|
+
}
|
|
4381
|
+
if (changed) {
|
|
4382
|
+
// If we filtered out all nodes, return the mathematically correct fallback
|
|
4383
|
+
if (newSubs.length === 0) {
|
|
4384
|
+
return new Regexp(re.op === Regexp.Op.CONCAT ? Regexp.Op.EMPTY_MATCH : Regexp.Op.NO_MATCH);
|
|
3121
4385
|
}
|
|
3122
|
-
|
|
3123
|
-
|
|
4386
|
+
// If only 1 node remains, we don't need a CONCAT/ALT container at all
|
|
4387
|
+
if (newSubs.length === 1) {
|
|
4388
|
+
return newSubs[0];
|
|
3124
4389
|
}
|
|
4390
|
+
const nre = Regexp.fromRegexp(re);
|
|
4391
|
+
nre.runes = [];
|
|
4392
|
+
nre.subs = newSubs;
|
|
4393
|
+
return nre;
|
|
4394
|
+
}
|
|
4395
|
+
return re;
|
|
4396
|
+
}
|
|
4397
|
+
case Regexp.Op.CHAR_CLASS:
|
|
4398
|
+
{
|
|
4399
|
+
if (re.runes === null) return re;
|
|
4400
|
+
|
|
4401
|
+
// Empty character classes match nothing.
|
|
4402
|
+
if (re.runes.length === 0) {
|
|
4403
|
+
return new Regexp(Regexp.Op.NO_MATCH);
|
|
4404
|
+
}
|
|
4405
|
+
// Full character classes match everything.
|
|
4406
|
+
if (re.runes.length === 2 && re.runes[0] === 0 && re.runes[1] === Unicode.MAX_RUNE) {
|
|
4407
|
+
return new Regexp(Regexp.Op.ANY_CHAR);
|
|
4408
|
+
}
|
|
4409
|
+
// Standard catch-all except newline
|
|
4410
|
+
if (re.runes.length === 4 && re.runes[0] === 0 && re.runes[1] === Codepoint.CODES.get('\n') - 1 && re.runes[2] === Codepoint.CODES.get('\n') + 1 && re.runes[3] === Unicode.MAX_RUNE) {
|
|
4411
|
+
return new Regexp(Regexp.Op.ANY_CHAR_NOT_NL);
|
|
3125
4412
|
}
|
|
3126
|
-
return
|
|
4413
|
+
return re;
|
|
3127
4414
|
}
|
|
3128
4415
|
case Regexp.Op.STAR:
|
|
3129
4416
|
case Regexp.Op.PLUS:
|
|
@@ -3160,7 +4447,9 @@ class Simplify {
|
|
|
3160
4447
|
}
|
|
3161
4448
|
subs.push(Simplify.simplify1(Regexp.Op.PLUS, re.flags, sub, null));
|
|
3162
4449
|
nre.subs = subs.slice(0);
|
|
3163
|
-
|
|
4450
|
+
|
|
4451
|
+
// Ensure newly created CONCAT is properly flattened
|
|
4452
|
+
return Simplify.simplify(nre);
|
|
3164
4453
|
}
|
|
3165
4454
|
// Special case x{0} handled above.
|
|
3166
4455
|
|
|
@@ -3198,7 +4487,8 @@ class Simplify {
|
|
|
3198
4487
|
if (prefixSubs !== null) {
|
|
3199
4488
|
const prefix = new Regexp(Regexp.Op.CONCAT);
|
|
3200
4489
|
prefix.subs = prefixSubs.slice(0);
|
|
3201
|
-
|
|
4490
|
+
// Ensure newly created CONCAT is properly flattened
|
|
4491
|
+
return Simplify.simplify(prefix);
|
|
3202
4492
|
}
|
|
3203
4493
|
|
|
3204
4494
|
// Some degenerate case like min > max or min < max < 0.
|
|
@@ -3231,6 +4521,13 @@ class Simplify {
|
|
|
3231
4521
|
return sub;
|
|
3232
4522
|
}
|
|
3233
4523
|
|
|
4524
|
+
// Handle impossible targets gracefully.
|
|
4525
|
+
// e.g. Trying to match "NO_MATCH" 0 or 1 times (QUEST/STAR) evaluates to EMPTY_MATCH.
|
|
4526
|
+
if (sub.op === Regexp.Op.NO_MATCH) {
|
|
4527
|
+
if (op === Regexp.Op.PLUS) return sub; // 1+ times is impossible
|
|
4528
|
+
return new Regexp(Regexp.Op.EMPTY_MATCH);
|
|
4529
|
+
}
|
|
4530
|
+
|
|
3234
4531
|
// The operators are idempotent if the flags match.
|
|
3235
4532
|
if (op === sub.op && (flags & RE2Flags.NON_GREEDY) === (sub.flags & RE2Flags.NON_GREEDY)) {
|
|
3236
4533
|
return sub;
|
|
@@ -3238,10 +4535,10 @@ class Simplify {
|
|
|
3238
4535
|
if (re !== null && re.op === op && (re.flags & RE2Flags.NON_GREEDY) === (flags & RE2Flags.NON_GREEDY) && sub === re.subs[0]) {
|
|
3239
4536
|
return re;
|
|
3240
4537
|
}
|
|
3241
|
-
|
|
3242
|
-
|
|
3243
|
-
|
|
3244
|
-
return
|
|
4538
|
+
const nre = new Regexp(op);
|
|
4539
|
+
nre.flags = flags;
|
|
4540
|
+
nre.subs = [sub];
|
|
4541
|
+
return nre;
|
|
3245
4542
|
}
|
|
3246
4543
|
}
|
|
3247
4544
|
|
|
@@ -3587,16 +4884,6 @@ class CharClass {
|
|
|
3587
4884
|
}
|
|
3588
4885
|
}
|
|
3589
4886
|
|
|
3590
|
-
class Pair {
|
|
3591
|
-
static of(first, second) {
|
|
3592
|
-
return new Pair(first, second);
|
|
3593
|
-
}
|
|
3594
|
-
constructor(first, second) {
|
|
3595
|
-
this.first = first;
|
|
3596
|
-
this.second = second;
|
|
3597
|
-
}
|
|
3598
|
-
}
|
|
3599
|
-
|
|
3600
4887
|
// StringIterator: a stream of runes with an opaque cursor, permitting
|
|
3601
4888
|
// rewinding. The units of the cursor are not specified beyond the
|
|
3602
4889
|
// fact that ASCII characters are single width. (Cursor positions
|
|
@@ -3743,18 +5030,59 @@ class Parser {
|
|
|
3743
5030
|
// stride).
|
|
3744
5031
|
static ANY_TABLE = new UnicodeRangeTable(new Uint32Array([0, Unicode.MAX_RUNE, 1]));
|
|
3745
5032
|
|
|
5033
|
+
// Ascii tables
|
|
5034
|
+
static ASCII_TABLE = new UnicodeRangeTable(new Uint32Array([0, 0x7f, 1]));
|
|
5035
|
+
static ASCII_FOLD_TABLE = new UnicodeRangeTable(new Uint32Array([0, 0x7f, 1, 0x017f, 0x017f, 1,
|
|
5036
|
+
// Old English long s (ſ), folds to S/s.
|
|
5037
|
+
0x212a, 0x212a, 1 // Kelvin K, folds to K/k.
|
|
5038
|
+
]));
|
|
5039
|
+
|
|
3746
5040
|
// unicodeTable() returns the Unicode RangeTable identified by name
|
|
3747
5041
|
// and the table of additional fold-equivalent code points.
|
|
3748
5042
|
// Returns null if |name| does not identify a Unicode character range.
|
|
3749
5043
|
static unicodeTable(name) {
|
|
3750
5044
|
if (name === 'Any') {
|
|
3751
|
-
return
|
|
5045
|
+
return {
|
|
5046
|
+
tab: Parser.ANY_TABLE,
|
|
5047
|
+
fold: Parser.ANY_TABLE,
|
|
5048
|
+
sign: 1
|
|
5049
|
+
};
|
|
5050
|
+
}
|
|
5051
|
+
if (name === 'Ascii') {
|
|
5052
|
+
return {
|
|
5053
|
+
tab: Parser.ASCII_TABLE,
|
|
5054
|
+
fold: Parser.ASCII_FOLD_TABLE,
|
|
5055
|
+
sign: 1
|
|
5056
|
+
};
|
|
5057
|
+
}
|
|
5058
|
+
if (name === 'Assigned') {
|
|
5059
|
+
// Assigned is the mathematical inversion of Cn (Unassigned)
|
|
5060
|
+
return {
|
|
5061
|
+
tab: UnicodeTables.CATEGORIES.get('Cn'),
|
|
5062
|
+
fold: UnicodeTables.CATEGORIES.get('Cn'),
|
|
5063
|
+
sign: -1
|
|
5064
|
+
};
|
|
5065
|
+
}
|
|
5066
|
+
if (name === 'Lc') {
|
|
5067
|
+
return {
|
|
5068
|
+
tab: UnicodeTables.CATEGORIES.get('LC'),
|
|
5069
|
+
fold: UnicodeTables.FOLD_CATEGORIES.get('LC'),
|
|
5070
|
+
sign: 1
|
|
5071
|
+
};
|
|
3752
5072
|
}
|
|
3753
5073
|
if (UnicodeTables.CATEGORIES.has(name)) {
|
|
3754
|
-
return
|
|
5074
|
+
return {
|
|
5075
|
+
tab: UnicodeTables.CATEGORIES.get(name),
|
|
5076
|
+
fold: UnicodeTables.FOLD_CATEGORIES.get(name),
|
|
5077
|
+
sign: 1
|
|
5078
|
+
};
|
|
3755
5079
|
}
|
|
3756
5080
|
if (UnicodeTables.SCRIPTS.has(name)) {
|
|
3757
|
-
return
|
|
5081
|
+
return {
|
|
5082
|
+
tab: UnicodeTables.SCRIPTS.get(name),
|
|
5083
|
+
fold: UnicodeTables.FOLD_SCRIPT.get(name),
|
|
5084
|
+
sign: 1
|
|
5085
|
+
};
|
|
3758
5086
|
}
|
|
3759
5087
|
return null;
|
|
3760
5088
|
}
|
|
@@ -4063,7 +5391,7 @@ class Parser {
|
|
|
4063
5391
|
this.flags = flags;
|
|
4064
5392
|
// number of capturing groups seen
|
|
4065
5393
|
this.numCap = 0;
|
|
4066
|
-
this.namedGroups =
|
|
5394
|
+
this.namedGroups = Object.create(null);
|
|
4067
5395
|
// Stack of parsed expressions.
|
|
4068
5396
|
this.stack = [];
|
|
4069
5397
|
this.free = null;
|
|
@@ -4474,8 +5802,9 @@ class Parser {
|
|
|
4474
5802
|
let i = 0;
|
|
4475
5803
|
for (let sub of subs) {
|
|
4476
5804
|
if (sub.op === op) {
|
|
4477
|
-
|
|
4478
|
-
|
|
5805
|
+
for (let j = 0; j < sub.subs.length; j++) {
|
|
5806
|
+
newsubs[i++] = sub.subs[j];
|
|
5807
|
+
}
|
|
4479
5808
|
this.reuse(sub);
|
|
4480
5809
|
} else {
|
|
4481
5810
|
newsubs[i++] = sub;
|
|
@@ -4906,9 +6235,11 @@ class Parser {
|
|
|
4906
6235
|
const i = lit.indexOf('\\E');
|
|
4907
6236
|
if (i >= 0) {
|
|
4908
6237
|
lit = lit.substring(0, i);
|
|
6238
|
+
t.skipString(lit);
|
|
6239
|
+
t.skipString('\\E');
|
|
6240
|
+
} else {
|
|
6241
|
+
t.skipString(lit);
|
|
4909
6242
|
}
|
|
4910
|
-
t.skipString(lit);
|
|
4911
|
-
t.skipString('\\E');
|
|
4912
6243
|
let j = 0;
|
|
4913
6244
|
while (j < lit.length) {
|
|
4914
6245
|
const codepoint = lit.codePointAt(j);
|
|
@@ -4924,6 +6255,9 @@ class Parser {
|
|
|
4924
6255
|
t.rewindTo(savedPos);
|
|
4925
6256
|
break;
|
|
4926
6257
|
}
|
|
6258
|
+
} else {
|
|
6259
|
+
// Unconditionally rewind if PERL_X is off, or if string ended abruptly
|
|
6260
|
+
t.rewindTo(savedPos);
|
|
4927
6261
|
}
|
|
4928
6262
|
const re = this.newRegexp(Regexp.Op.CHAR_CLASS);
|
|
4929
6263
|
re.flags = this.flags;
|
|
@@ -5249,8 +6583,11 @@ class Parser {
|
|
|
5249
6583
|
if (pair === null) {
|
|
5250
6584
|
throw new RE2JSSyntaxException(Parser.ERR_INVALID_CHAR_RANGE, t.from(startPos));
|
|
5251
6585
|
}
|
|
5252
|
-
|
|
5253
|
-
|
|
6586
|
+
if (pair.sign < 0) {
|
|
6587
|
+
sign = 0 - sign;
|
|
6588
|
+
}
|
|
6589
|
+
const tab = pair.tab;
|
|
6590
|
+
const fold = pair.fold; // fold-equivalent table
|
|
5254
6591
|
// Variation of CharClass.appendGroup() for tables.
|
|
5255
6592
|
if ((this.flags & RE2Flags.FOLD_CASE) === 0 || fold === null) {
|
|
5256
6593
|
cc.appendTableWithSign(tab, sign);
|
|
@@ -5394,6 +6731,7 @@ class RE2 {
|
|
|
5394
6731
|
res.prefixUTF8 = re2.prefixUTF8;
|
|
5395
6732
|
res.prefixComplete = re2.prefixComplete;
|
|
5396
6733
|
res.prefixRune = re2.prefixRune;
|
|
6734
|
+
res.prefilter = re2.prefilter;
|
|
5397
6735
|
return res;
|
|
5398
6736
|
}
|
|
5399
6737
|
|
|
@@ -5436,8 +6774,10 @@ class RE2 {
|
|
|
5436
6774
|
let re = Parser.parse(expr, mode);
|
|
5437
6775
|
const maxCap = re.maxCap();
|
|
5438
6776
|
re = Simplify.simplify(re);
|
|
6777
|
+
const prefilter = PrefilterTree.build(re);
|
|
5439
6778
|
const prog = Compiler.compileRegexp(re);
|
|
5440
6779
|
const re2 = new RE2(expr, prog, maxCap, longest);
|
|
6780
|
+
re2.prefilter = prefilter.type === Prefilter.Type.NONE ? null : prefilter;
|
|
5441
6781
|
const [prefixCompl, prefixStr] = prog.prefix();
|
|
5442
6782
|
re2.prefixComplete = prefixCompl;
|
|
5443
6783
|
re2.prefix = prefixStr;
|
|
@@ -5469,12 +6809,78 @@ class RE2 {
|
|
|
5469
6809
|
this.prefixComplete = false; // true if prefix is the entire regexp
|
|
5470
6810
|
this.prefixRune = 0; // first rune in prefix
|
|
5471
6811
|
this.pooled = new AtomicReference(); // Cache of machines for running regexp. Forms a Treiber stack.
|
|
5472
|
-
this.dfa = new DFA(prog); //
|
|
6812
|
+
this.dfa = new DFA(this.prog); // initialize Lazy DFA
|
|
6813
|
+
this.onepass = OnePass.compile(this.prog); // compile OnePass
|
|
6814
|
+
this.prefilter = null;
|
|
6815
|
+
}
|
|
6816
|
+
matchPrefixComplete(input, pos, anchor, ncap) {
|
|
6817
|
+
// If strictly anchored, execution must start at 0
|
|
6818
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
6819
|
+
return null;
|
|
6820
|
+
}
|
|
6821
|
+
let matchStart = -1;
|
|
6822
|
+
let matchEnd = -1;
|
|
6823
|
+
const pLen = input.prefixLength(this);
|
|
6824
|
+
if (anchor === RE2Flags.UNANCHORED) {
|
|
6825
|
+
const idx = input.index(this, pos);
|
|
6826
|
+
if (idx < 0) return null;
|
|
6827
|
+
matchStart = pos + idx;
|
|
6828
|
+
matchEnd = matchStart + pLen;
|
|
6829
|
+
} else if (anchor === RE2Flags.ANCHOR_BOTH) {
|
|
6830
|
+
if (input.endPos() !== pLen) return null;
|
|
6831
|
+
const idx = input.index(this, 0);
|
|
6832
|
+
if (idx !== 0) return null;
|
|
6833
|
+
matchStart = 0;
|
|
6834
|
+
matchEnd = pLen;
|
|
6835
|
+
} else if (anchor === RE2Flags.ANCHOR_START) {
|
|
6836
|
+
const idx = input.index(this, 0);
|
|
6837
|
+
if (idx !== 0) return null;
|
|
6838
|
+
matchStart = 0;
|
|
6839
|
+
matchEnd = pLen;
|
|
6840
|
+
}
|
|
6841
|
+
if (matchStart < 0) return null;
|
|
6842
|
+
|
|
6843
|
+
// If captures are requested (e.g. findSubmatch instead of test), populate bounds
|
|
6844
|
+
if (ncap > 0) {
|
|
6845
|
+
const matchcap = new Int32Array(ncap).fill(-1);
|
|
6846
|
+
matchcap[0] = matchStart;
|
|
6847
|
+
matchcap[1] = matchEnd;
|
|
6848
|
+
return Array.from(matchcap);
|
|
6849
|
+
}
|
|
6850
|
+
return []; // Matched successfully, but no capture data requested
|
|
5473
6851
|
}
|
|
5474
6852
|
executeEngine(input, pos, anchor, ncap) {
|
|
6853
|
+
// LITERAL FAST PATH
|
|
6854
|
+
// If the entire regex is just a literal string (and no nested capture boundaries are requested),
|
|
6855
|
+
// bypass all state machines and execute via V8's blistering fast native indexOf
|
|
6856
|
+
if (this.prefixComplete && (ncap === 0 || this.numSubexp === 0)) {
|
|
6857
|
+
return this.matchPrefixComplete(input, pos, anchor, ncap);
|
|
6858
|
+
}
|
|
6859
|
+
|
|
6860
|
+
// PREFILTER FAST PATH
|
|
6861
|
+
// If the unanchored query requires specific literal strings (e.g. "a.*b"),
|
|
6862
|
+
// verify those strings exist using high-speed JS string searches before waking up the state engines.
|
|
6863
|
+
if (this.prefilter !== null && anchor === RE2Flags.UNANCHORED) {
|
|
6864
|
+
if (!this.prefilter.eval(input, pos)) {
|
|
6865
|
+
return null;
|
|
6866
|
+
}
|
|
6867
|
+
}
|
|
6868
|
+
|
|
6869
|
+
// FAST PATH: OnePass DFA engine.
|
|
6870
|
+
// If compiled successfully, it perfectly supports capture groups
|
|
6871
|
+
// and is blisteringly fast since it skips thread queues completely.
|
|
6872
|
+
if (this.onepass !== null) {
|
|
6873
|
+
return OnePass.execute(this, input, pos, anchor, ncap);
|
|
6874
|
+
}
|
|
6875
|
+
|
|
5475
6876
|
// If the user wants capturing groups (ncap > 0), the DFA mathematically CANNOT do it.
|
|
5476
6877
|
// We must use the NFA.
|
|
5477
6878
|
if (ncap > 0) {
|
|
6879
|
+
// Backtracker bit-state execution bounds check
|
|
6880
|
+
if (input.endPos() <= Backtracker.maxBitStateLen(this.prog)) {
|
|
6881
|
+
return Backtracker.execute(this, input, pos, anchor, ncap);
|
|
6882
|
+
}
|
|
6883
|
+
// NFA execution
|
|
5478
6884
|
return this.doExecuteNFA(input, pos, anchor, ncap);
|
|
5479
6885
|
}
|
|
5480
6886
|
const dfaResult = this.dfa.match(input, pos, anchor);
|
|
@@ -5483,6 +6889,11 @@ class RE2 {
|
|
|
5483
6889
|
return dfaResult ? [] : null; // Return empty array to signify "matched but no captures"
|
|
5484
6890
|
}
|
|
5485
6891
|
|
|
6892
|
+
// Backtracker bit-state execution bounds check
|
|
6893
|
+
if (input.endPos() <= Backtracker.maxBitStateLen(this.prog)) {
|
|
6894
|
+
return Backtracker.execute(this, input, pos, anchor, ncap);
|
|
6895
|
+
}
|
|
6896
|
+
|
|
5486
6897
|
// Fallback to NFA
|
|
5487
6898
|
return this.doExecuteNFA(input, pos, anchor, ncap);
|
|
5488
6899
|
}
|
|
@@ -6063,6 +7474,50 @@ class RE2 {
|
|
|
6063
7474
|
}
|
|
6064
7475
|
}
|
|
6065
7476
|
|
|
7477
|
+
class RE2Set {
|
|
7478
|
+
constructor(anchor = RE2Flags.UNANCHORED, flags = RE2Flags.PERL) {
|
|
7479
|
+
this.anchor = anchor;
|
|
7480
|
+
this.flags = flags;
|
|
7481
|
+
this.regexps = [];
|
|
7482
|
+
this.prog = null;
|
|
7483
|
+
this.dfa = null;
|
|
7484
|
+
this.dummyRe2 = null;
|
|
7485
|
+
}
|
|
7486
|
+
add(pattern) {
|
|
7487
|
+
if (this.prog) {
|
|
7488
|
+
throw new RE2JSCompileException('Cannot add patterns after compile');
|
|
7489
|
+
}
|
|
7490
|
+
const re = Parser.parse(pattern, this.flags);
|
|
7491
|
+
this.regexps.push(Simplify.simplify(re));
|
|
7492
|
+
return this.regexps.length - 1;
|
|
7493
|
+
}
|
|
7494
|
+
compile() {
|
|
7495
|
+
if (this.prog) return;
|
|
7496
|
+
this.prog = Compiler.compileSet(this.regexps);
|
|
7497
|
+
this.dfa = new DFA(this.prog);
|
|
7498
|
+
this.dummyRe2 = {
|
|
7499
|
+
prog: this.prog,
|
|
7500
|
+
cond: this.prog.startCond(),
|
|
7501
|
+
prefix: '',
|
|
7502
|
+
prefixRune: 0,
|
|
7503
|
+
longest: false
|
|
7504
|
+
};
|
|
7505
|
+
}
|
|
7506
|
+
match(input) {
|
|
7507
|
+
if (!this.prog) this.compile();
|
|
7508
|
+
const machineInput = Array.isArray(input) ? MachineInput.fromUTF8(input) : MachineInput.fromUTF16(input);
|
|
7509
|
+
|
|
7510
|
+
// Fast path: Try the blistering fast DFA
|
|
7511
|
+
const dfaResult = this.dfa.matchSet(machineInput, 0, this.anchor);
|
|
7512
|
+
if (dfaResult !== null) return dfaResult;
|
|
7513
|
+
|
|
7514
|
+
// Safe Fallback: Handle boundaries (\b) or massive state explosions via NFA
|
|
7515
|
+
const machine = Machine.fromRE2(this.dummyRe2);
|
|
7516
|
+
machine.init(0);
|
|
7517
|
+
return machine.matchSet(machineInput, 0, this.anchor);
|
|
7518
|
+
}
|
|
7519
|
+
}
|
|
7520
|
+
|
|
6066
7521
|
/**
|
|
6067
7522
|
* Transform JS regex string to RE2 regex string
|
|
6068
7523
|
*/
|
|
@@ -6073,13 +7528,6 @@ class TranslateRegExpString {
|
|
|
6073
7528
|
static isHexadecimal(ch) {
|
|
6074
7529
|
return '0' <= ch && ch <= '9' || 'A' <= ch && ch <= 'F' || 'a' <= ch && ch <= 'f';
|
|
6075
7530
|
}
|
|
6076
|
-
static getUtf8CharSize(ch) {
|
|
6077
|
-
const code = ch.charCodeAt(0);
|
|
6078
|
-
if (code < 0x80) return 1; // 1-byte (ASCII)
|
|
6079
|
-
if (code < 0x800) return 2; // 2-byte
|
|
6080
|
-
if (code < 0x10000) return 3; // 3-byte
|
|
6081
|
-
return 4; // 4-byte (surrogate pairs, rare characters)
|
|
6082
|
-
}
|
|
6083
7531
|
static translate(data) {
|
|
6084
7532
|
if (typeof data !== 'string') {
|
|
6085
7533
|
return data;
|
|
@@ -6152,7 +7600,8 @@ class TranslateRegExpString {
|
|
|
6152
7600
|
default:
|
|
6153
7601
|
{
|
|
6154
7602
|
result += '\\';
|
|
6155
|
-
let
|
|
7603
|
+
let cp = data.codePointAt(i + 1);
|
|
7604
|
+
let symSize = Utils.charCount(cp);
|
|
6156
7605
|
result += data.substring(i + 1, i + 1 + symSize);
|
|
6157
7606
|
i += symSize + 1;
|
|
6158
7607
|
continue;
|
|
@@ -6172,7 +7621,8 @@ class TranslateRegExpString {
|
|
|
6172
7621
|
continue;
|
|
6173
7622
|
}
|
|
6174
7623
|
}
|
|
6175
|
-
let
|
|
7624
|
+
let cp = data.codePointAt(i);
|
|
7625
|
+
let symSize = Utils.charCount(cp);
|
|
6176
7626
|
result += data.substring(i, i + symSize);
|
|
6177
7627
|
i += symSize;
|
|
6178
7628
|
}
|
|
@@ -6529,5 +7979,5 @@ class RE2JS {
|
|
|
6529
7979
|
}
|
|
6530
7980
|
}
|
|
6531
7981
|
|
|
6532
|
-
export { Matcher, RE2JS, RE2JSCompileException, RE2JSException, RE2JSFlagsException, RE2JSGroupException, RE2JSSyntaxException };
|
|
7982
|
+
export { Matcher, RE2JS, RE2JSCompileException, RE2JSException, RE2JSFlagsException, RE2JSGroupException, RE2JSInternalException, RE2JSSyntaxException, RE2Set };
|
|
6533
7983
|
//# sourceMappingURL=index.esm.js.map
|