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.cjs.cjs
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
|
|
@@ -56,6 +56,23 @@ class RE2Flags {
|
|
|
56
56
|
/**
|
|
57
57
|
* Various constants and helper for unicode codepoints.
|
|
58
58
|
*/
|
|
59
|
+
const ASCII_SIZE = 128;
|
|
60
|
+
const ASCII_TO_UPPER = new Int32Array(ASCII_SIZE);
|
|
61
|
+
const ASCII_TO_LOWER = new Int32Array(ASCII_SIZE);
|
|
62
|
+
for (let i = 0; i < ASCII_SIZE; i++) {
|
|
63
|
+
if (i >= 97 && i <= 122) {
|
|
64
|
+
// a-z
|
|
65
|
+
ASCII_TO_UPPER[i] = i - 32;
|
|
66
|
+
} else {
|
|
67
|
+
ASCII_TO_UPPER[i] = i;
|
|
68
|
+
}
|
|
69
|
+
if (i >= 65 && i <= 90) {
|
|
70
|
+
// A-Z
|
|
71
|
+
ASCII_TO_LOWER[i] = i + 32;
|
|
72
|
+
} else {
|
|
73
|
+
ASCII_TO_LOWER[i] = i;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
59
76
|
class Codepoint {
|
|
60
77
|
// codePointAt(0)
|
|
61
78
|
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]]);
|
|
@@ -63,6 +80,7 @@ class Codepoint {
|
|
|
63
80
|
// convert unicode codepoint to upper case codepoint
|
|
64
81
|
// return same codepoint, if cannot do it (or codepoint not have upper variation)
|
|
65
82
|
static toUpperCase(codepoint) {
|
|
83
|
+
if (codepoint < ASCII_SIZE) return ASCII_TO_UPPER[codepoint];
|
|
66
84
|
const s = String.fromCodePoint(codepoint).toUpperCase();
|
|
67
85
|
if (s.length > 1) {
|
|
68
86
|
return codepoint;
|
|
@@ -77,6 +95,7 @@ class Codepoint {
|
|
|
77
95
|
// convert unicode codepoint to lower case codepoint
|
|
78
96
|
// return same codepoint, if cannot do it (or codepoint not have lower variation)
|
|
79
97
|
static toLowerCase(codepoint) {
|
|
98
|
+
if (codepoint < ASCII_SIZE) return ASCII_TO_LOWER[codepoint];
|
|
80
99
|
const s = String.fromCodePoint(codepoint).toLowerCase();
|
|
81
100
|
if (s.length > 1) {
|
|
82
101
|
return codepoint;
|
|
@@ -90,9 +109,10 @@ class Codepoint {
|
|
|
90
109
|
}
|
|
91
110
|
|
|
92
111
|
class UnicodeRangeTable {
|
|
93
|
-
|
|
94
|
-
constructor(data) {
|
|
112
|
+
constructor(data, isStride1 = false) {
|
|
95
113
|
this.data = data; // A Uint32Array
|
|
114
|
+
this.isStride1 = isStride1;
|
|
115
|
+
this.SIZE = isStride1 ? 2 : 3;
|
|
96
116
|
}
|
|
97
117
|
|
|
98
118
|
// High-performance getters that do NOT allocate memory
|
|
@@ -103,14 +123,11 @@ class UnicodeRangeTable {
|
|
|
103
123
|
return this.data[index * this.SIZE + 1];
|
|
104
124
|
}
|
|
105
125
|
getStride(index) {
|
|
106
|
-
return this.data[index * this.SIZE + 2];
|
|
126
|
+
return this.isStride1 ? 1 : this.data[index * this.SIZE + 2];
|
|
107
127
|
}
|
|
108
|
-
|
|
109
|
-
// Convenience getter (slower, for debugging or non-critical paths)
|
|
110
128
|
get(index) {
|
|
111
129
|
const i = index * this.SIZE;
|
|
112
|
-
|
|
113
|
-
return [this.data[i], this.data[i + 1], this.data[i + 2]];
|
|
130
|
+
return [this.data[i], this.data[i + 1], this.getStride(index)];
|
|
114
131
|
}
|
|
115
132
|
get length() {
|
|
116
133
|
return this.data.length / this.SIZE;
|
|
@@ -120,229 +137,317 @@ class UnicodeRangeTable {
|
|
|
120
137
|
// GENERATED BY tools/scripts/genUnicodeTable.js; DO NOT EDIT.
|
|
121
138
|
// yarn node ./tools/scripts/genUnicodeTable.js > src/UnicodeTables.js
|
|
122
139
|
|
|
140
|
+
const B64_MAP = new Uint8Array(256);
|
|
141
|
+
for (let i = 0, b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-'; i < 64; i++) {
|
|
142
|
+
B64_MAP[b.charCodeAt(i)] = i;
|
|
143
|
+
}
|
|
144
|
+
const decodeVLQ = str => {
|
|
145
|
+
const res = [];
|
|
146
|
+
let value = 0,
|
|
147
|
+
shift = 0;
|
|
148
|
+
for (let i = 0; i < str.length; i++) {
|
|
149
|
+
let digit = B64_MAP[str.charCodeAt(i)];
|
|
150
|
+
value |= (digit & 0x1f) << shift;
|
|
151
|
+
if ((digit & 0x20) === 0) {
|
|
152
|
+
res.push(value);
|
|
153
|
+
value = 0;
|
|
154
|
+
shift = 0;
|
|
155
|
+
} else {
|
|
156
|
+
shift += 5;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return res;
|
|
160
|
+
};
|
|
161
|
+
const decodeRanges = (str, isStride1) => {
|
|
162
|
+
const res = decodeVLQ(str);
|
|
163
|
+
const numRanges = isStride1 ? res.length / 2 : res.length / 3;
|
|
164
|
+
const out = new Uint32Array(numRanges * 3);
|
|
165
|
+
let current = 0,
|
|
166
|
+
resIdx = 0;
|
|
167
|
+
for (let i = 0; i < numRanges; i++) {
|
|
168
|
+
current += res[resIdx++];
|
|
169
|
+
out[i * 3] = current;
|
|
170
|
+
current += res[resIdx++];
|
|
171
|
+
out[i * 3 + 1] = current;
|
|
172
|
+
out[i * 3 + 2] = isStride1 ? 1 : res[resIdx++];
|
|
173
|
+
}
|
|
174
|
+
return out;
|
|
175
|
+
};
|
|
176
|
+
const decodeOrbit = str => {
|
|
177
|
+
const res = decodeVLQ(str);
|
|
178
|
+
const map = new Map();
|
|
179
|
+
let currentKey = 0;
|
|
180
|
+
for (let i = 0; i < res.length; i += 2) {
|
|
181
|
+
currentKey += res[i];
|
|
182
|
+
map.set(currentKey, res[i + 1]);
|
|
183
|
+
}
|
|
184
|
+
return map;
|
|
185
|
+
};
|
|
186
|
+
class LazyMap {
|
|
187
|
+
constructor(initializer) {
|
|
188
|
+
this.initializer = initializer;
|
|
189
|
+
this.cache = new Map();
|
|
190
|
+
}
|
|
191
|
+
has(key) {
|
|
192
|
+
return key in this.initializer;
|
|
193
|
+
}
|
|
194
|
+
get(key) {
|
|
195
|
+
if (this.cache.has(key)) return this.cache.get(key);
|
|
196
|
+
const fn = this.initializer[key];
|
|
197
|
+
const val = fn ? fn() : null;
|
|
198
|
+
this.cache.set(key, val);
|
|
199
|
+
return val;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
123
202
|
class UnicodeTables {
|
|
124
|
-
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]]);
|
|
125
|
-
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]));
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
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]));
|
|
131
|
-
static
|
|
132
|
-
static
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
static
|
|
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
|
-
|
|
177
|
-
|
|
178
|
-
static
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
static
|
|
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
|
-
|
|
344
|
-
|
|
345
|
-
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]));
|
|
203
|
+
static _CASE_ORBIT = null;
|
|
204
|
+
static get CASE_ORBIT() {
|
|
205
|
+
if (!this._CASE_ORBIT) {
|
|
206
|
+
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');
|
|
207
|
+
}
|
|
208
|
+
return this._CASE_ORBIT;
|
|
209
|
+
}
|
|
210
|
+
static _Print = null;
|
|
211
|
+
static get Print() {
|
|
212
|
+
if (!this._Print) {
|
|
213
|
+
this._Print = new UnicodeRangeTable(decodeRanges('hB9CBjBLBCpWBDFBFGBCCCBSBCsMBClBBDxBBDCBC2BBJaBFFBSVBC-FBCvBBD6BBDkDBP6BBDwBBDOBCbBDCCBJBGeBJqCBCgFBCHBDBBDVBCGBCEEBCBDIBDBBDDBJFFBCCBDBDYBDCBCFBFBBDVBCGBCBBCBBCBBDCCBDBFBBDCBEIIBCBCIIBPBLCBCIBCCBCVBCGBCBBCEBDJBCCBCCBDQQBCBDLBIGBCCBCHBDBBDVBCGBCBBCEBDIBDBBDCBICBFBBCEBDRBLBBCFBECBCDBEBBCCCBEEBEEBBBELBFEBECBCDBDHHPUBGMBCCBCWBCPBDIBCCBCDBIBBCCBDDDBCBDJBIVBCCBCWBCJBCEBDIBCCBCDBIBBHBBCDBDJBCCBNMBCCBCyBBCCBCFBFPBDZBCCBCRBEXBCIBCDDBFBEFFBEBCCCBGBHJBDCBN5BBFcBmBBBCCCBDBCXBCCCBVBDEBCCCBFBCJBDDBhBnCBCjBBFmBBCjBBCOBCMBmBlGBCGGD4LBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBDfBEZBH1CBDFBD-TBCbBE4CBIVBKXBKTBNMBCCBCBBN9CBDJBHJBHNBCKBH4CBIqBBGlCBLeBCLBFLBFEEBoBBDEBMrBBFZBHKBE9BBDgCBCcBDKBHJBHNBDeByBsCBClFBJ7BBEOBE9BBGqBBDKBJqBBG1QBDFBDlBBDFBDHBCGCBdBD0BBCOBCNBDFBCSBDCBCIBSXBJuBBSBBDaBCMBEgBBQgBBQrEBF5UBXKBWz4BBDfBC8KBGsBBCGGD3BBIBBPXBKGBCGBCGBCGBCGBCGBCGBCGBC9DBjBZBC4CBN1GBbPBC+BBC1CBDmDBGqBBC9CBC1CBKvBBCszcBE2BBK7KBV3FBJtGBDBBCCCBGBW6BBEJBH3BBJlCBJLBHzDBMdBEtCBCKBFgBBC2BBKNBDJBDmDBZbBLFBDFBDFBKGBCGBC7BBF9DBDJBHj9KBNWBFwBBloItLBDpDBnBGBNEBGZBCEBCCCBCCBCCB7DBR8NBD1BBIhBhBBoBBHyBBCSBCDBFEBCmEBF9FBEFBDFBDFBDCBEGBCGBOBBDLBCZBCSBCBBCOBDNBjB6DBGCBFsBBE3CBCMBEwBwBBsBBjEcBEwBBQbBFjBBKdBGqBBGdBCkBBFNBrB9EBDJBHjBBFjBBFnBBJzBBMLBCOBCGBCBBCKBCOBCGBCBBEzBBN2JBKVBLHBZFBCpBBCIBmCFBDCCBqBBCBBEDDBVBCnCBJIBxBSBCBBGgBBEaBGhChCB2BBFTBDxBBCBBGHBCCBCcBDCBFJBIIBI-BBhBmBBFLBK1BBEcBDaBGZBIDBNGBxCoCB4ByBBOyBBItBBJJBHlBBEcBJBBxGeBCpBBCCBDBBRCB4BrBBJpBBXZBnBbBVWBKtCBFjBBK9BBCEBOYBIJBH0BBCRBJmBBK-CBCTBMRBCuBB-BGBCCCBCBCOBCKBH6BBGJBHDBCHBDBBDVBCGBCBBCEBCJBDBBDCBDHHGGBDGBEEBMJBCDDClBBCJBCDDCDBCJBCBBJBBe7CBCEBfnCBJJBnF1BBDlBBjBkCBMJBHMBU5BBHJBHTBdaBDOBFWB6F7BBlDyCBNHBDDDBGBCBBCdBCBBDLBKJBnCHBDtBBDKBcnCBJyCBOoCBIJB3FhBBPJBHIBCsBBCNBLcBEfBDVBCNBqCGBCBBCrBBECCBCCBHBJJBHFBCBBCkBBCBBCFBIJB3JYBIQBCoBBEcB2CQQBwBBO6cBnDuDBCEBMjGBtyCiDBOvhBBRVBL68DBGmSB61G5BBn2B4RBIeBCJBFwCBCJBHdBDFBLlCBLJBCGBCUBGSBxN5BBnG6CBmDqCBF4BBIQBhCEBMBBP3-FBJ1mBBqBJBo3IDBCGBCBBCiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBDDBh7D5HBHzNBtCtBBDWBKzDB9B1HBLmBBDpCBJvDBWlCB7DTBNTBN2CBKYBoE0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDjJBD9VBQEBCOBxiBeBHFB2GGBCQBDGBCBBCEBG9BBiBxDxDBrBBENBDJBFBBhKeBS5BBGxOxOBoBB3GqBBFhPhPBFBCDBCBBCOBCkGBDPBqBrCBFJBFBByYjCBtC8BBjGDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQB1BBBvIrBBFjDBNOBDOBCOBCkBBLtFB5BcBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBClDBngB-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEBxq3VvHB', false));
|
|
214
|
+
}
|
|
215
|
+
return this._Print;
|
|
216
|
+
}
|
|
217
|
+
static CATEGORIES = new LazyMap({
|
|
218
|
+
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)),
|
|
219
|
+
Cc: () => new UnicodeRangeTable(decodeRanges('AfgDgB', true)),
|
|
220
|
+
Cf: () => new UnicodeRangeTable(decodeRanges('tFzqBzqBBEBXhGhGyBhMhMBxCxCs5D9-B9-BBDBbEByBEBCJBw03B6H6HBBBimEQQj7IPBhjiBDBwmFHBn0rYffB+CB', false)),
|
|
221
|
+
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)),
|
|
222
|
+
Co: () => new UnicodeRangeTable(decodeRanges('gg4B-nGh4hc9--BD9--B', true)),
|
|
223
|
+
Cs: () => new UnicodeRangeTable(decodeRanges('gg2B--B', true)),
|
|
224
|
+
L: () => new UnicodeRangeTable(decodeRanges('hCZBHZBwBLLFGGBVBCeBCpOBFLBPEBICCiEEBCBBDDBCHHCCBCCCBSBCyCBCqEBJlFBClBBDHHBnBBoCaBFDBuBqBBkBBBCiDBCQQBIIBLLBBBDRRCdBe4CBMZZBfBKBBFGGBUBFKKEYYBXBIKBGXBCFBSpBB7B1BBETTIJBQPBFHBDBBDVBCGBCEEBCBERROBBCCBPBBLJJBEBFBBDVBCGBCBBCBBCBBgBDBCUUBBBRIBCCBCVBCGBCBBCEBETTQBBYMMBGBDBBDVBCGBCBBCEBEffBCCBBBQSSCFBECBCDBEBBCCCBEEBEEBBBELBX1B1BBGBCCBCWBCPBEbbBBBDDDBffFHBCCBCWBCJBCEBEgBgBBCCBQQBSSBHBCCBCoBBDRRGCBJCBZFBGRBEXBCIBCDDBFB7BvBBCBBNGB7BBBCCCBDBCXBCCCBIBCBBKDDBDBCWWBCBhBgCgCBGBCjBBcEB0DqBBVRRBEBFDBEEEBIIBBBFMBNSSBkBBCGGDqBBCsKBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBmBPBR1CBDFBErTBDQBCZBGqCBHHBIRBOSBPRBPMBCCBQzBBkBFFkC4CBIEBDhBBCGGBkCBLeByBdBDEBMrBBFZB3BWBK0BBzC+C+CBtBBSHB3BdBOBBLrBBbjBBqBCBLjBBDKBGqBBDCBqBDBCFBCBBEGGB+FBhC1IBDFBDlBBDFBDHBCGCBdBD0BBCGBCEEBBBCGBEDBDFBFMBGCBCGB1DOORMBmDFFDJBCEEBDBHGCBCBCKBDDBGEBF1B1BB8zC8zCBjHBHDBEBBNlBBCGGD3BBIRRBVBKGBCGBCGBCGBCGBCGBCGBCGBxC2O2OBrBrBBDBGBBF1CBHCBC5CBCDBGqBBC9CBSfBxBPBhQ-tGBhCs0VBkCtBBDsIBEPBLBBVuBBReBDlCByBIBDmDBDiCBDBBCCCBGBWPBCCBCDBCWBezBBPxBB-BFBECCBMMBaBLWBacBIuBBdRRBDBCJBLEBCoBBYCBCHBVWBEEEBwBBCEEBDDBDBDCCZCBDKBICBNFBDFBDFBKGBCGBCqBBCNBHyDBej9KBNWBFwBBloItLBDpDBnBGBNEBGCCBIBCMBCEBCCCBCCBCCBqDBiBqLBT-BBD1BBpBLB1DEBCmEBlBZBHZBM4CBEFBDFBDFBDCBkBLBCZBCSBCBBCOBDNBjB6DBmMcBEwBBwBfBOTBCHBHlBBLdBDjBBFHBxB9EBTjBBFjBBFnBBJzBBNKBCOBCGBCBBCKBCOBCGBCBBEzBBN2JBKVBLHBZFBCpBBCIBmCFBDCCBqBBCBBEDDBVBLWBKeBiCSBCBBLVBLZBnC3BBHBBhCQQBCBCCBCcBrBcBEcBkBHBCbBc1BBLVBLSBORBvDoCB4ByBBOyBBOjBBnBbBKWB7HpBBHBBRCB8BcBLJJBUBrBRBvBUBcWBN0BB6BBBDOOBrBBhBYBbjBBeDDJiBBENNBuBBPDBWCCkBRBCYBUBBgCGBCCCBCBCOBCJBIuBBnBHBDBBDVBCGBCBBCEBETTNEBfJBCDDClBBCaaCtBtBBzBBTDBVCBfvBBVBBC5F5FBtBBqBDBlBvBBV8B8BBpBBOoCoCBZBmBGB6FrBB1D-BBgBHBDDDBGBCBBCXBQCC-CHBDmBBRCCdLLBmBBIWWMtBBUTTBnCBoGgBBgBIBCkBBSyByBBcBxDGBCBBClBBWaaBEBCBBCfBPoKoKBRBQCCBLBChBB9DwCwCB4cBnHjGBtyCgDBQvhBBSFBa68DBGmSB61GdBj3B4RBIeBSuCBSdBTvBBRDBgBUBGSBxNsBB0G-BBhEqCBGjCjCBLBhCBBCddB2-FBJ1mBBqBJBo3IDBCGBCBBCiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBn7F0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDYBCYBCeBCYBCeBCYBCeBCYBCeBCYBCHB15BeBHFBmI9BBzEsBBLGBRiKiKBcBTrBBlPbBlHdBDwPwPBFBCDBCBBCOBCkGB8BjCBI1lB1lBBCBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQBlqE-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
|
|
225
|
+
LC: () => new UnicodeRangeTable(decodeRanges('hCZBHZB7BLLBVBCeBCiGBCDBFvGBCaBhGDBDBBECBCHHCCBCCCBSBCyCBCqEBJlFBClBBKoBB44ClBBCGGDqBBDCBhV1CBDFBjkCKBGqBBDCBhCrBBgCMBChBBmD1IBDFBDlBBDFBDHBCGCBdBD0BBCGBCEEBBBCGBEDBDFBFMBGCBCGBmIFFDJBCEEBDBHGCBCBCFBFDDBCBGEBF1B1BB8zC8zCB6DBDmDBHDBEBBNlBBCGGzoetBBTbBnEtCBCWBEDBC9BBDBBCCCBGBZBBE2Z2ZBpBBGIBIvCBh6TGBNEBqgBZBHZBmlBvCBhDjBBFjBB1DKBCOBCGBCBBCKBCOBCGBCBBk2ByBBOyBB+CVBLVB74C-BBhrV-BBhsZ0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDYBCYBCeBCYBCeBCYBCeBCYBCeBCYBCHB15BJBCTBHFB2uCjCB', false)),
|
|
226
|
+
Ll: () => new UnicodeRangeTable(decodeRanges('hDZB7BqBqBBWBCHBC2BCBQCBuBCDECBBBDCCDEEBFFDEEBBBDDDCCCDCCBCCDEECDDBDDBBBHGDCOCBSCBDDCEEC4BCBFBDDDBCCFICBjCBCaBiGCCEEEBBBTccBhBBCBBECBCWCBDBCGDB0B0BBuBBCgBCK0BCDMCBgDCxBoBBo6CqBBDCB5XFBjkCIBC2D2DBqBBgCMBChBBnD0ECBHBCgDCBHBJFBLHBJHBJFBLHBJHBJNBDHBJHBJHBJEBCBBHEEBBBCBBJDBDBBJHBLCBCBBzIEEBEEcKFDBBJDBF2B2Bs1CvBBCEEBGCFCCBCCBEBGiDCBIICFFNlBBCGG0oesBCUaCoEMCBBBC+BCBGBCCCDICFCCDCCBBBCSCGGGCMCFCCDEECICbEE2ZqBBGIBIvCBh6TGBNEBqhBZBumBnBBpEjBB8EKBCOBCGBCBBk4ByBB+DVB75CfBhsVfB7sZZBbGBCRBbZBbDBCCCBFBCKBbZBbZBbZBbZBbZBbZBbZBbZBbbBdYBCFBbYBCFBbYBCFBbYBCFBbYBCFBC15B15BBIBCTBHFB4vChBB', false)),
|
|
227
|
+
Lm: () => new UnicodeRangeTable(decodeRanges('wVRBFLBPEBICCmEGG-OnHnHlFBBuIBBFgBgBKEEhFoFoF1mBgEgE2R72B72BsDkTkTxOFBvF+BBOjBjBBjBByVOORMBg-CBByHgGgG2OsBsBBDBGiDiDB+C+CBBB34bjnBjnBBEBvIzDzDdBB6DIBxCYYqDCBEBB2OXXqEtDtDWBBoDDBKngVngVuBBBh-BFBCpBBCIB0sBhBhBxuXDB9PCBpBBBnRMBhCBBCtgQtgQBCBCGBCBByhM9BBqGGBudgjBgjB', false)),
|
|
228
|
+
Lo: () => new UnicodeRangeTable(decodeRanges('qFQQhIFFBCBxG8Z8ZBZBFDBuBfBCJBkBBBCiDBCZZBLLBBBDRRCdBe4CBMZZBfBWVBrBYBIKBGXBCFBSoBB8B1BBETTIJBROBFHBDBBDVBCGBCEEBCBERROBBCCBPBBLJJBEBFBBDVBCGBCBBCBBCBBgBDBCUUBBBRIBCCBCVBCGBCBBCEBETTQBBYMMBGBDBBDVBCGBCBBCEBEffBCCBBBQSSCFBECBCDBEBBCCCBEEBEEBBBELBX1B1BBGBCCBCWBCPBEbbBBBDDDBffFHBCCBCWBCJBCEBEgBgBBCCBQQBSSBHBCCBCoBBDRRGCBJCBZFBGRBEXBCIBCDDBFB7BvBBCBBNFB8BBBCCCBDBCXBCCCBIBCBBKDDBDBYDBhBgCgCBGBCjBBcEB0DqBBVRRBEBFDBEEEBIIBBBFMBNyDyDBnKBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBmBPByDrTBDQBCZBGqCBHHBIRBOSBPRBPMBCCBQzBBpBkCkCBhBBC0BBIEBDhBBCGGBkCBLeByBdBDEBMrBBFZB3BWBK0BBxFuBBSHB3BdBOBBLrBBbjBBqBCBLdByDDBCFBCBBE7hB7hBBCB4-C3BBZWBKGBCGBCGBCGBCGBCGBCGBCGBoR2B2BF1CBJCCB4CBFGGBpBBC9CBSfBxBPBhQ-tGBhC0wUBC2jBBkCnBBJrIBFPBLBBjCyByBBkCBqFoDoDEGBCCBCDBCWBezBBPxBB-BFBECCBMMBaBLWBacBIuBBuBEBDIBLEBCoBBYCBCHBVPBCFBEEEBwBBCEEBDDBDBDCCZBBEKBIPPBEBDFBDFBKGBCGByEiBBej9KBNWBFwBBloItLBDpDBkCCCBIBCMBCEBCCCBCCBCCBqDBiBqLBT-BBD1BBpBLB1DEBCmEBqDJBCsBBDeBEFBDFBDFBDCBkBLBCZBCSBCBBCOBDNBjB6DBmMcBEwBBwBfBOTBCHBHlBBLdBDjBBFHBhEtCBjDnBBJzBB9CzBBN2JBKVBLHB5EFBDCCBqBBCBBEDDBVBLWBKeBiCSBCBBLVBLZBnC3BBHBBhCQQBCBCCBCcBrBcBEcBkBHBCbBc1BBLVBLSBORBvDoCB4FjBBnBDBCxJxJBoBBHBBRCB8BcBLJJBUBrBRBvBUBcWBN0BB6BBBDOOBrBBhBYBbjBBeDDJiBBENNBuBBPDBWCCkBRBCYBUBBgCGBCCCBCBCOBCJBIuBBnBHBDBBDVBCGBCBBCEBETTNEBfJBCDDClBBCaaCtBtBBzBBTDBVCBfvBBVBBC5F5FBtBBqBDBlBvBBV8B8BBpBBOoCoCBZBmBGB6FrBB0GHBDDDBGBCBBCXBQCC-CHBDmBBRCCdLLBmBBIWWMtBBUTTBnCBoGgBBgBIBCkBBSyByBBcBxDGBCBBClBBWaaBEBCBBCfBPoKoKBRBQCCBLBChBB9DwCwCB4cBnHjGBtyCgDBQvhBBSFBa68DBGmSB61GdBj3B4RBIeBSuCBSdBTvBB0BUBGSB0NnBB2MqCBGwFwFB2-FBJ1mBBqBJB43IiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBxzI2P2PBrBBiBiKiKBcBTrBBlPaBmHdBDwPwPBFBCDBCBBCOBCkGB8pBDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQBlqE-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
|
|
229
|
+
Lt: () => new UnicodeRangeTable(decodeRanges('lOGDnB2sH2sHBGBJHBJHBNQQwBAB', false)),
|
|
230
|
+
Lu: () => new UnicodeRangeTable(decodeRanges('hCZBmDWBCGBiB2BCDOCDuBCBECEBBCCCBCCBBBDDBCBBCCBEBBCBBCECBCCDCCBCCBBBCCCBEEIJDCMCDQCDDDCCBC4BCIBBCBBDCCBCBCGCiJCCEJJHCCBBBCCCBCCBPBCIBkBDDBBBEWCGDDCBBDyBBxBgBCK2BCBMCD+CCDlBBq6ClBBCGGzW1CB0kCHHBpBBDCBhK0ECKgDCKHBJFBLHBJHBJFBMGCJHBpCDBNDBNDBNEBMDBnIFFECBDCBDEEBDBHGCBCBDDBLBBG+B+B9zCvBBxBCCBBBDGCBCBCDDJCBCgDCJCCFuqeuqeCqBCUaCoEMCE8BCLECBICFCCDCCEUCBDBCEBCOCBCBCCCBEEGGCZs5Vs5VBYBmmBnBBpEjBB9EKBCOBCGBCBBr3ByBB+EVB75CfBhsVfBhtZZBbZBbZBbCCBGDBDDBCBCHBbZBbBBCDBDHBCGBcBBCDBCEBCEEBFBcZBbZBbZBbZBbZBbZBfYBiBYBiBYBiBYBiBYBiB2pE2pEBgBB', false)),
|
|
231
|
+
M: () => new UnicodeRangeTable(decodeRanges('gYvDB0IGBoIsBBCCCBCCBCCpCKBxBUBRmDmDBFBDFBDBBCDBkBffBZB8CKB7BIBKZZBCBCIBCCBCEBsBCB8BIBrBXBCgBB3BCBCRBCGBLBBeCB5BCCBFBDBBDCBKLLBbbDCB5BCCBDBFBBDCBEffBEEMCB5BCCBGBCCBCCBVBBXFBCCB5BCCBFBDBBDCBICBLBBf8B8BBDBECBCDBKpBpBBDB4BCCBFBCCBCDBIBBMBBeCB5BCCBFBCCBCDBIBBMBBQNNBCB4BBBCGBCCBCDBKLLBeeBBBnCFFBEBCCCBGBTBB+BDDBFBNHBjDDDBHBMGBqCBBcECFBByBTBCBBGKBCjBBKlDlDBSBYDBFCBCCBDGBEDBOLBCLLBCBgWCBzdDBdCBeBBfBBhCfBKuBuBBBBC2D2DBjBjB3DLBFLB8GEB6BJBCcBDxBxBBdByBEBwBQBnBIBNCBfMB5BNBxBTB5ECBCUBFHHDCBnG-BBxWgBB--CCBuEhDhDBeBrRFBqDBB1udDBCJBhBBBxCBBxIEEFYYBDBF0C0CBzBzBBQBbRBOnBnBBGBaMBtBDBwBNBlBkCkCBMBNJJBuBuBBBBzBCCBBBDBBGBBCqBqBBDBGBBtHHBCBBx5TiXiXBOBRPBuejHjH2EEBn0BCBCBBGDBpBCBFmFmFB+R+RBCBiCEB+JBBwCDBnCKByBDB7DCB2BOBqBDDBLLBCBuBKBI+B+BBBBlBNBRBBtBNNBBBxBNBJDBCBB9CLBHDD+ELBWDB4BBBCGBDBBDCBKLLBDDBFBEEBkCIBCDDCDBCEBCPPBzCzCBQBYyCyCBSBsHGBDIBcBBzCQBrDMBmDOBhIOB2HFBCBBDDBCCCBuEuEBFBDGBEddBIBpBGBCDBJKKBJBvBPB2MHBCHBzCVBCNB7DFBECCBCCBFBCjCjCBDBCBBCEB8KDBKBBCxBxBBFBEEBYmnFmnFHOBpmLRBhuCEB8BGB5gBCCB1BBIDByCMMBslTslTBizEizEBsBBDWB-QEBEFBJHBDGBfDB1ECB89B2BBFxBBJPPXEBCOBxqBGBCQBDGBCBBCEBlDhFhFBFB4L+B+BBCB9PDB-HBBhXGBuDGB29lYvHB', false)),
|
|
232
|
+
Mc: () => new UnicodeRangeTable(decodeRanges('joC4B4BDCBJDBCBBzBBB7BCBHBBDBBLsBsB7BCBjC7B7BBBBJCCB2B2BB7B7BCHHBDDBLLnDBBCBBECBCCBLqBqBBBB+BDB+BBB7BCCBDBDBBCBBKBBdPPB7B7BBBBGCBCCBLrBrBBsCsCBBBHHBTBBrKBBgCsFsFBFFHDDBaaBLLBBBDGBWBBDFBDLLBBB5zBffiEIIBGBCBB7KDBDCBFBBCFBhHBB7BCCKCCBJJBEByExBxBGCCBDBCBB+BffFBBD9B9BDCBCEEBxBxBBGBJBBsFWW35EBB0-dBBD5C5CBzBzBBOBvEBBwBxBxBBFFBDDBBBvDBBDBBZuBuBCuDuDDBBGuHuHBCCBCCBCC0gZCCgEuBuBBBBFBB0DZZB8B8BxBCBKBBO+C+CBBBEBBCrFrFBBBgBBB7BBBCDBDBBDCBKLLB1C1CBBBIDDCDBCBBCmDmDBBBJBBErDrDBBBHCCBCBDuHuHBBBHDBDyDyDBBBJBBCuDuDCBBHoDoDCBBFmImIBBBK4H4HBEBCBBFDDCvEvEBBBJDBF1C1CeBB-B4M4MPrDrDIDD2GEBFBBC-K-KBNNxBBBJBBCpvQpvQBBBlxD2BBpDBB0rYBBHFB', false)),
|
|
233
|
+
Me: () => new UnicodeRangeTable(decodeRanges('okBBB1xF-wB-wBBCBCCBsshBCB', false)),
|
|
234
|
+
Mn: () => new UnicodeRangeTable(decodeRanges('gYvDB0IEBqIsBBCCCBCCBCCpCKBxBUBRmDmDBFBDFBDBBCDBkBffBZB8CKB7BIBKZZBCBCIBCCBCEBsBCB8BIBrBXBCfB4BCCFHBFEEBFBLBBe7B7BFDBJVVBbbDBB6BFFBFFBDDBBBEffBEEMBB6BFFBDBCBBFVVBXXBEBC7B7BDCCBCBJIIBMMBff+BNNzBEE4BCCBBBGCBCDBIBBMBBe7B7BDHHGBBVBBdBB6BBBFDBJVVBeepCIIBBBC7C7CDGBNHBjDDDBHBMGBqCBBcEC4BNBCEBCBBGKBCjBBKnDnDBCBCFBCBBDBBaBBFCBRDBODDBHHQgWgWBBBzdCBeBBfBBfBBhCBBCGBJDDBJBKuBuBBBBC2D2DBjBjB3DCBFBBKHHBBB8GBBD7B7BCGBCCCDHBHJBDxBxBBMBCPByBDBxBCCBDBCGGpBIBNBBhBDBDBBCCB5BCCBEECCB7BHBDBB5ECBCMBCGBFHHEBBnG-BBxWMBFEEBKB--CCBuEhDhDBeBrRDBsDBB1udFFBIBhBBBxCBBxIEEFaaBGG4EBBbRBOnBnBBGBaKBvBCBxBDDBCBDBBoBkCkCBEBDBBDBBNJJwB0B0BCCBDBBGBBCrBrBBJJvHDDFx5Tx5TiXPBRPBuejHjH2EEBn0BCBCBBGDBpBCBFmFmFB+R+RBCBiCEB+JBBwCDBnCKByBDB8D3B3BBNBqBDDBLLBBByBDBDBBI+B+BBBBlBEBCHB-BNNB1B1BBHBLDBDgDgDBBBDCCBHHD+E+EEHBWBB6BBBEmBmBBFBEEBnCFBOECPBB2CHBDCBCYY1CFBCFFBCCBvHvHBCBHBBCBBcBB2CHBDCCBrDrDCDDBEBCmDmDCDDBCBCEBkIIBCBBhIBBCFFxEDBDBBFhBhBBIBpBFBDDBJKKBEBDCBvBMBCBB3MGBCFBCzCzCBUBDGBCBBCBB7DFBECCBCCBFBCpCpCBEEC8K8KBMMB1B1BBDBGCCYmnFmnFHOBpmLLBECBhuCEB8BGB5gBgCgCBCByC5lT5lTBizEizEBsBBDWBhRCBSHBDGBfDB1ECB89B2BBFxBBJPPXEBCOBxqBGBCQBDGBCBBCEBlDhFhFBFB4L+B+BBCB9PDB-HBBhXGBuDGB29lYvHB', false)),
|
|
235
|
+
N: () => new UnicodeRangeTable(decodeRanges('wBJB5DBBGDDBBBitBJBnEJBnGJB9MJB3DJBFFBtDJB3DJB3DJBDFBvDMB0DJBJGBoDJBpDGBISBuDJBhDJB3DJBnCTBtIJBnCJBwWTBybCBwHJBHJBXJBtJJBhEKBmFJBHJB3FJB3CJBnEJBHJB3gBEEBEBHJBnGyBBDEB3W7BBvCVB3TdBqrBqYqYaIBPCB4KDBrEJBfHBCOBhBJBoBOBh7cJB9FJBhKFB7EJBnBJBnGJBXJB3CJB3MJB34UJBuPsBBN4BBSBB2KaBlBDBeJJnEEBrGJBvdHBaGBoBIBsCEBXFBhFBBDPBDtBBhCIB1BBBfCBsCEBpDHBZHBqBGBrKFBxBJBHJB3IeB-EJBrBDBxDGBnEdBhEJB9BJBxEJBITB8HJB3KJB3DJB3LJBnDJBHTBtCLBlNSB+CJB3UJB3CcBkHJBnCJBnNJBnDUBshBuDBimPJBnpCJB3CJBnEJBCGBvQJBnIWB6yXJBnuBTBNTBtDYB2iBxBBhqCJBnNJB3PJB4HJBtWIBhEJB4Y6BBCCBCDBtCsBBCOBjeMBk3CJB', false)),
|
|
236
|
+
Nd: () => new UnicodeRangeTable(decodeRanges('wBJnxBJnEJnGJ9MJ3DJ3DJ3DJ3DJ3DJ3DJ3DJ3DJ3DJhDJ3DJnCJ3IJnCJn6BJnBJtJJhEJnFJHJ3FJ3CJnEJHJnuiBJnVJnBJnGJXJ3CJ3MJ34UJnsBJnkCJHJ9YJhEJ9BJxEJ3IJ3KJ3DJ3LJnDJHTtCJnNJnDJ3UJ3CJ3HJnCJnNJ3uQJnpCJ3CJnEJ3QJ37XJ12CxBhqCJnNJ3PJ4HJ2aJ30EJ', true)),
|
|
237
|
+
Nl: () => new UnicodeRangeTable(decodeRanges('u3FCBwzCiBBDDB-zDaaBHBPCBs1dJBxyW0BBtOJJnEEBrhIuDB', false)),
|
|
238
|
+
No: () => new UnicodeRangeTable(decodeRanges('yFBBGDDBBB2pCFB5LFB5DCBmEGB6GGBSIByNJB2hBTB0jBJBhP20B20BEFBHJBnGPBqB3W3WB6BBvCVB3TdBqrB1kB1kBBCBrEJBfHBCOBhBJBoBOBxrdFBymWsBBiCDBSBB2KaBlBDB1pBHBaGBoBIBsCEBXFBhFBBDPBDtBBhCIB1BBBfCBsCEBpDHBZHBqBGBrKFBhLeB-EJBrBDBxDGBnETB8LTBmqBBBvNIBobSB0aUBn8SGB-YWBqhZTBNTBtDYBvqFIBid6BBCCBCDBtCsBBCOBjeMB', false)),
|
|
239
|
+
P: () => new UnicodeRangeTable(decodeRanges('hBCBCFBCDBLBBEBBbCBCccCkBkBGEELBBEEE-VJJzOFBqBBB0BCCDDDtBBBVBBCBBOCCBBBrCDBnDsBsBBMBqHCB3BOBgBmImIBLLtE5D5D6DnMnMNwLwL7CLLBpFpFBNBCmBmBBCBoCrCrCBDBFBBwDFBsFlTlTBHB4EuTuTtBBBvCCBoCBB+ECBCCBmBKB6JBB5GBBhEGBCFBhFBBLGBdCB9DDB8BEB-BBBhCHBM9Z9ZBWBJTBCMBCLBfBBPBB6TDBeBB+hBNBwCBBgBJB0MVBgCDBhBBB8XDBCBBxDwEwEBtBBCfBDLBkNCBFJBDLBRNNjD7C7CjgdBBuICBkDLL0DFB9LDB3CBBpBCBCyByBBwBwBiDMBRBB9DDB-DBBRBB6HzqUzqUBxGxGBIBXiBBCNBCFFCBB2ECBCFBCDBLBBEBBbCBCccCCCBFB7MCB9UxBxB-MoXoXoGgBgBxIIBnBxDxDBFBjCGB6CDByO-J-JoFEBtBDB+FGBuDBBCDB-DDBxBBBwCDBFOOCCB5CFBsDrJrJBCCBzDzDBDBLBBCpDpD7HWBqDCBdMBtCjEjEBBB9HpIpIBBB8E9C9CBGB0CCBCEB+CJB4GgDgDBDBrBBBmUBBrCMBwFxjBxjBBDB97CBB8zOBBmEiCiCBDBJpRpRBBBoJDBoK9lT9lTovHEB07C-a-aBAB', false)),
|
|
240
|
+
Pc: () => new UnicodeRangeTable(decodeRanges('-Cg-Hg-HBUU-u3BBBZCBwHAB', false)),
|
|
241
|
+
Pd: () => new UnicodeRangeTable(decodeRanges('tB9qB9qB0BiyDiyDmgBqgCqgCBEBiwDDDgBBBFdd-NUUwDxszBxszBBmBmBLqFqFhzD-J-J', false)),
|
|
242
|
+
Pe: () => new UnicodeRangeTable(decodeRanges('pB0B0BgB+1D+1DC-6B-6BqtC4B4BQ7T7TCff-hBMCxChBhBCGC1MUChCCCiBmhBmhBCECtBGCtNICEGCDBB-ozB6G6GeOCESSCCCrF0B0BgBGD', false)),
|
|
243
|
+
Pf: () => new UnicodeRangeTable(decodeRanges('7F+6H+6HEddpuDCCFDDQEE', false)),
|
|
244
|
+
Pi: () => new UnicodeRangeTable(decodeRanges('rFt7Ht7HDBBDaapuDCCFDDQEE', false)),
|
|
245
|
+
Po: () => new UnicodeRangeTable(decodeRanges('hBCBCCBDECBLLBEEBcclCGGPBBI-V-VJzOzOBEBqB3B3BDDDtBBBVBBCBBOCCBBBrCDBnDsBsBBMBqHCB3BOBgBmImIBLLtE5D5D6DnMnMNwLwL7CLLBpFpFBNBCxDxDrCEBFBBwDFBsFlTlTBHBmY9D9DBBBoCBB+ECBCCBmBFBCDB6JBB5GBBhEGBCFBhFBBLGBdCB9DDB8BEB-BBBhCHBMjajaBJJBGBJIBDDBDCBEKBCCCBIB7kDDBCBBxDwEwEBFFBBBDDDBHBCBBCDDBLLBDBCJBDDBCCCBLBDCBtNCB6B+F+FjgdBBuICBkDLL0DFB9LDB3CBBpBCBCyByBBwBwBiDMBRBB9DDB-DBBRBB6HlxUlxUBFBDXXVBBDDBECBCDBICBHCCB2E2EBBBCCBDECBLLBEEBcclBDDB7M7MBBB9UxBxB-MoXoXoGgBgBxIIBnBxDxDBFBjCGB6CDB5dEBtBDB+FGBuDBBCDB-DDBxBBBwCDBFOOCCB5CFBsDrJrJBCCBzDzDBDBLBBCpDpD7HWBqDCBdMBtCjEjEBBB9HpIpIBBB8E9C9CBGB0CCBCEB+CJB4GgDgDBDBrBBBmUBBrCMBwFxjBxjBBDB97CBB8zOBBmEiCiCBDBJpRpRBBBoJDBoK9lT9lTovHEB07C-a-aBAB', false)),
|
|
246
|
+
Ps: () => new UnicodeRangeTable(decodeRanges('oBzBzBgB-1D-1DC-6B-6B-rCEEnB4B4BQ7T7TCff-hBMCxChBhBCGC1MUChCCCiBmhBmhBCECaTTCECtNICEGCDipzBipzB4GeeCMCESSCCCrFzBzBgBEEDAB', false)),
|
|
247
|
+
S: () => new UnicodeRangeTable(decodeRanges('kBHHRCBgBCCcCCkBEBCBBDCCBCBDEEfgBgBrODBNNBGGBCCCBPB2DPPBxDxDsErIrIBBB3DCBDDDBvGvGLUUB4H4HIBBpEqLqLBHHB2H2H-DjEjEBGBlEwGwGqBmGmGiGCBQCCBBBDFBVECmEHBCFBCBBGDBmGBBxXJB0WuLuLlL+E+EBgBBiLJBKIBhiBCCBBBMCBOCBOCBOBBmCOOoBCBOCBUgBBgCBBCDBCBBLCCBBBGFBCECFMMBFFBDBGDBC7B7BBFFB2LBFcBD+HBXKByCtCBXnTBtBwBBDeBLyMBX+BBFfBD1LBDfBCoDBmHFBmLBBvBZBC4CBN1GBbPBFOOBNNWBBHBB8CBB0HBBFJBhBlBBKRRBdBMdBJQQBeBLmBBQ-JBhuG-BBx0V2BB6RWBKBBoDBB+EDBLDB+RCBiHPPB+9T+9TpEQB+LPBgEtBtBBCBjDCCBBBD7E7EHRRBBBgBCCcCCiEGBCGBOBB6JIB6BQBDCBCMBEwBwBBrBB7zBBBwSmWmWBwtCwtC2kCcBr6SDBG3qU3qUk7DvHBRzNB9EzDB9B1HBLmBBD7BBGCBXBBIdBF8BBWhCBE7F7FB1CBrbaagBaagBaagBaagBaa9B-PB4BDBzBHBCNBCBBp2BwNwNttCEE+DiOiOBvIvIBqBBFjDBNOBDOBCOBCkBBYgFB5BcBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBC7CB', false)),
|
|
248
|
+
Sc: () => new UnicodeRangeTable(decodeRanges('kB+D+DBCBqnB8D8DzPBBzPBBI2H2HoImSmS8sClmClmCBfB47hBkuVkuVtD7E7E8GBBEBB3-HDB-4wBxtCxtC', false)),
|
|
249
|
+
Sk: () => new UnicodeRangeTable(decodeRanges('+CCCoCHHFEEqQDBNNBGGBCCCBPB2DPPBjoBjoB15FCCBBBMCBOCBOCBOBB9kEBBkzdWBKBBoDBBxePPBniUniUBPB8bCCjF4g9B4g9BBDB', false)),
|
|
250
|
+
Sm: () => new UnicodeRangeTable(decodeRanges('rBRRBBB+BCCuBFFmBgBgB-XwQwQBBB8xGOOoBCBOCBsEoBoBBDBHlClCBDBGBBFGDIgBgBBDDCgBgBBqIBhBBB7CffBXBpBFB2OKK3BHBwDxKxKBDBDeBLPBhIiEBX+BBFfBDhIBxBUBDFB9+zB5Z5ZCCBlFRRBBB+BCCkEHHBCBitDBBypyBaagBaagBaagBaagBaat5FBB', false)),
|
|
251
|
+
So: () => new UnicodeRangeTable(decodeRanges('mFDDFCCyerIrIBgEgEBvGvGLUUB4H4HkQ2L2LjEFBClElEwGqBqBoMCBQCCBBBDFBVECmEHBCFBCBBGDBmGBBxXJB0WzWzW+EhBBiLJBKIBksBBBCDBCBBLCCBHHBEBCECFMMBPPCBBC7B7BBKKBDBDDBCBBCBBCGBCeBDBBCCCBdBtIHBFTBDGBDwCBCdBanBBHnCBXKByCtCBX2FBCIBC1BBJuDBC3HBtBrBBhC-HBhQvBBWBBHmBBDfBCoDBmHFBmLBBvBZBC4CBN1GBbPBFOOBNNWBBHBBxKBBFJBhBlBBKRRBdBMdBJQQBeBLmBBQ-JBhuG-BBx0V2BBibDBLBBC+R+RBBBn2UPBgEuBuBBBBlPEEFBBOBB6JIB6BQBDCBCMBEwBwBBrBB7zBBBwS3jD3jD2kCHBFQBr6SDBG3qU3qUk7DvHBRzNB9EzDB9B1HBLmBBD7BBGCBXBBIdBF8BBWhCBE7F7FB1CBqlB-PB4BDBzBHBCNBCBBp2B96C96CiEyWyWBqBBFjDBNOBDOBCOBCkBBYgFB5BcBOrBBFIBIBBPFB7E6HBG3WBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBC7CB', false)),
|
|
252
|
+
Z: () => new UnicodeRangeTable(decodeRanges('gBgEgEgvFgsCgsCBJBeBBGwBwBh9DAB', false)),
|
|
253
|
+
Zl: () => new UnicodeRangeTable(decodeRanges('ohIA', true)),
|
|
254
|
+
Zp: () => new UnicodeRangeTable(decodeRanges('phIA', true)),
|
|
255
|
+
Zs: () => new UnicodeRangeTable(decodeRanges('gBgEgEgvFgsCgsCBJBlBwBwBh9DAB', false))
|
|
256
|
+
});
|
|
257
|
+
static get Upper() {
|
|
258
|
+
return this.CATEGORIES.get('Lu');
|
|
259
|
+
}
|
|
260
|
+
static SCRIPTS = new LazyMap({
|
|
261
|
+
Adlam: () => new UnicodeRangeTable(decodeRanges('go6DrCFJFB', true)),
|
|
262
|
+
Ahom: () => new UnicodeRangeTable(decodeRanges('g4lCaDOFW', true)),
|
|
263
|
+
Anatolian_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('ggxCmS', true)),
|
|
264
|
+
Arabic: () => new UnicodeRangeTable(decodeRanges('gwBEBCFBCNBCCBCfBCJBMZBCrDBChBBxCvBBxHeBCBBGqCBCcBxy8ByDBRqLBDvCBD1BBIhBhBBOBxDEBCmEBk7DeBkCCB4BDBh43BDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQB1BBB', false)),
|
|
265
|
+
Armenian: () => new UnicodeRangeTable(decodeRanges('xpBlBDxBDCks9BE', true)),
|
|
266
|
+
Avestan: () => new UnicodeRangeTable(decodeRanges('g4iC1BEG', true)),
|
|
267
|
+
Balinese: () => new UnicodeRangeTable(decodeRanges('g4GsCCxB', true)),
|
|
268
|
+
Bamum: () => new UnicodeRangeTable(decodeRanges('g1pB3CpowB4R', true)),
|
|
269
|
+
Bassa_Vah: () => new UnicodeRangeTable(decodeRanges('w26CdDF', true)),
|
|
270
|
+
Batak: () => new UnicodeRangeTable(decodeRanges('g+GzBJD', true)),
|
|
271
|
+
Bengali: () => new UnicodeRangeTable(decodeRanges('gsCDBCHBDBBDVBCGBCEEBCBDIBDBBDDBJFFBCCBDBDYB', false)),
|
|
272
|
+
Bhaiksuki: () => new UnicodeRangeTable(decodeRanges('ggnCICsBCNLc', true)),
|
|
273
|
+
Bopomofo: () => new UnicodeRangeTable(decodeRanges('qXB6wLqBxDf', true)),
|
|
274
|
+
Brahmi: () => new UnicodeRangeTable(decodeRanges('ggkCtCFjBKA', true)),
|
|
275
|
+
Braille: () => new UnicodeRangeTable(decodeRanges('ggK-H', true)),
|
|
276
|
+
Buginese: () => new UnicodeRangeTable(decodeRanges('gwGbDB', true)),
|
|
277
|
+
Buhid: () => new UnicodeRangeTable(decodeRanges('g6FT', true)),
|
|
278
|
+
Canadian_Aboriginal: () => new UnicodeRangeTable(decodeRanges('ggF-TxRlC7tgCP', true)),
|
|
279
|
+
Carian: () => new UnicodeRangeTable(decodeRanges('g1gCwB', true)),
|
|
280
|
+
Caucasian_Albanian: () => new UnicodeRangeTable(decodeRanges('wphCzBMA', true)),
|
|
281
|
+
Chakma: () => new UnicodeRangeTable(decodeRanges('gokC0BCR', true)),
|
|
282
|
+
Cham: () => new UnicodeRangeTable(decodeRanges('gwqB2BKNDJDD', true)),
|
|
283
|
+
Cherokee: () => new UnicodeRangeTable(decodeRanges('g9E1CDFz7lBvC', true)),
|
|
284
|
+
Chorasmian: () => new UnicodeRangeTable(decodeRanges('w9jCb', true)),
|
|
285
|
+
Common: () => new UnicodeRangeTable(decodeRanges('AgCBbFBbuBBCOBCEBYgBgBiOmBBGEBDTB1DKKHCC+THHPEEhB9E9ElQiEiEB6mB6mB2MDBjJwvBwvBBBBoCBBsGBBCumBumBOIIBCBCFBCCBDmYmYBKBD2CBCKBEKBCOBSgBBgClBBCCBDFBCaBCQBqBCBF5UBXKBW-cBhIzTBDfBCoDBhQ9CBzMUBCCCBXBQHBFDB8CBBE7C7CB0E0EBOBhBlBBKxBxBB+BBgBwCBwB5C5CBmFBhuG-BBhoWhBBnDCBmFJB1HhFhFsMPPBzuUzuUBxGxGBIBXiBBCSBCDB0ECCBeBbFBbKBLuBuBBhChCBFBCGBLEBjICBFsBBEIBxCMB0BsBBlHaBltuBDB96D5HBHzNB9EzDB9B1HBLmBBD9BBEQBJBBIdBF8BB2GTBNTBN2CBKYBoE0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDjJBDxBByjFjCBtC8BBjWrBBFjDBNOBDOBCOBCkBBLtFB5BZBCBBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBClDBoghYffB+CB', false)),
|
|
286
|
+
Coptic: () => new UnicodeRangeTable(decodeRanges('ifNxkKzDGG', true)),
|
|
287
|
+
Cuneiform: () => new UnicodeRangeTable(decodeRanges('ggoC5cnDuDCEMjG', true)),
|
|
288
|
+
Cypriot: () => new UnicodeRangeTable(decodeRanges('ggiCFBDCCBqBBCBBEDD', false)),
|
|
289
|
+
Cypro_Minoan: () => new UnicodeRangeTable(decodeRanges('w8rCiD', true)),
|
|
290
|
+
Cyrillic: () => new UnicodeRangeTable(decodeRanges('ggBkEBDoFBx6FKBhFtCtCojEfBhie-CBv8VBBhw4B9BBiBAB', false)),
|
|
291
|
+
Deseret: () => new UnicodeRangeTable(decodeRanges('gghCvC', true)),
|
|
292
|
+
Devanagari: () => new UnicodeRangeTable(decodeRanges('goCwCFODZh7nBfhwcJ', true)),
|
|
293
|
+
Dives_Akuru: () => new UnicodeRangeTable(decodeRanges('gomCGBDDDBGBCBBCdBCBBDLBKJB', false)),
|
|
294
|
+
Dogra: () => new UnicodeRangeTable(decodeRanges('ggmC7B', true)),
|
|
295
|
+
Duployan: () => new UnicodeRangeTable(decodeRanges('ggvDqDGMEIIJDD', true)),
|
|
296
|
+
Egyptian_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('ggsC1iBL68D', true)),
|
|
297
|
+
Elbasan: () => new UnicodeRangeTable(decodeRanges('gohCnB', true)),
|
|
298
|
+
Elymaic: () => new UnicodeRangeTable(decodeRanges('g-jCW', true)),
|
|
299
|
+
Ethiopic: () => new UnicodeRangeTable(decodeRanges('gwEoCBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBDfBEZBnvGWBKGBCGBCGBCGBCGBCGBCGBCGBjpfFBDFBDFBKGBCGBylvCGBCDBCBBCOB', false)),
|
|
300
|
+
Garay: () => new UnicodeRangeTable(decodeRanges('gqjClBEcJB', true)),
|
|
301
|
+
Georgian: () => new UnicodeRangeTable(decodeRanges('glElBBCGGDqBBCDBx8CqBBDCBhiElBBCGG', false)),
|
|
302
|
+
Glagolitic: () => new UnicodeRangeTable(decodeRanges('ggL-Ch9sDGCQDGCBCE', true)),
|
|
303
|
+
Gothic: () => new UnicodeRangeTable(decodeRanges('w5gCa', true)),
|
|
304
|
+
Grantha: () => new UnicodeRangeTable(decodeRanges('g4kCDBCHBDBBDVBCGBCBBCEBDIBDBBDCBDHHGGBDGBEEB', false)),
|
|
305
|
+
Greek: () => new UnicodeRangeTable(decodeRanges('wbDBCCBDDBCFFCCCBBBCCCBSBC+BBPPBnpGEBzBEBFEB1ChKhKBUBDFBDlBBDFBDHBCGCBdBD0BBCOBCNBDFBCSBDCBCIBoJ-xiB-xiB7uVuCBSgj0Bgj0BBkCB', false)),
|
|
306
|
+
Gujarati: () => new UnicodeRangeTable(decodeRanges('h0CCBCIBCCBCVBCGBCBBCEBDJBCCBCCBDQQBCBDLBIGB', false)),
|
|
307
|
+
Gunjala_Gondi: () => new UnicodeRangeTable(decodeRanges('grnCFCBCkBCBCFIJ', true)),
|
|
308
|
+
Gurmukhi: () => new UnicodeRangeTable(decodeRanges('hwCCBCFBFBBDVBCGBCBBCBBCBBDCCBDBFBBDCBEIIBCBCIIBPB', false)),
|
|
309
|
+
Gurung_Khema: () => new UnicodeRangeTable(decodeRanges('go4C5B', true)),
|
|
310
|
+
Han: () => new UnicodeRangeTable(decodeRanges('g0LZBC4CBN1GBwBCCaIBPDBle-tGBhC-vUBhoWtLBDpDBpodBBNBBvgkB-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
|
|
311
|
+
Hangul: () => new UnicodeRangeTable(decodeRanges('goE-HvxHBiI9CyDeiCei3dckUj9KNWFwBl9JeEFDFDFDC', true)),
|
|
312
|
+
Hanifi_Rohingya: () => new UnicodeRangeTable(decodeRanges('gojCnBJJ', true)),
|
|
313
|
+
Hanunoo: () => new UnicodeRangeTable(decodeRanges('g5FU', true)),
|
|
314
|
+
Hatran: () => new UnicodeRangeTable(decodeRanges('gniCSCBGE', true)),
|
|
315
|
+
Hebrew: () => new UnicodeRangeTable(decodeRanges('xsB2BBJaBFFBpp9BZBCEBCCCBCCBCCBIB', false)),
|
|
316
|
+
Hiragana: () => new UnicodeRangeTable(decodeRanges('hiM1CBHCBi7-C+IBTeeBBBulQAB', false)),
|
|
317
|
+
Imperial_Aramaic: () => new UnicodeRangeTable(decodeRanges('giiCVCI', true)),
|
|
318
|
+
Inherited: () => new UnicodeRangeTable(decodeRanges('gYvDB2IBBlOKBbhXhXBCB8qEeBiQCBCMBCGBFHHEBBnG-BBtQBBjGgBB65DDBsDBBmrzBPBRNBwejHjH7iEl+uBl+uBBsBBDWBhRCBSHBDGBfDBz6rYvHB', false)),
|
|
319
|
+
Inscriptional_Pahlavi: () => new UnicodeRangeTable(decodeRanges('g7iCSGH', true)),
|
|
320
|
+
Inscriptional_Parthian: () => new UnicodeRangeTable(decodeRanges('g6iCVDH', true)),
|
|
321
|
+
Javanese: () => new UnicodeRangeTable(decodeRanges('gsqBtCDJFB', true)),
|
|
322
|
+
Kaithi: () => new UnicodeRangeTable(decodeRanges('gkkCiCLA', true)),
|
|
323
|
+
Kannada: () => new UnicodeRangeTable(decodeRanges('gkDMCCCWCJCEDICCCDIBHBCDDJCC', true)),
|
|
324
|
+
Katakana: () => new UnicodeRangeTable(decodeRanges('hlM5CBDCBxHPBxGuBBC3CBvgzBJBCsBBzisBDBCGBCBBCgJgJBBBzBPPBCB', false)),
|
|
325
|
+
Kawi: () => new UnicodeRangeTable(decodeRanges('g4nCQCoBEc', true)),
|
|
326
|
+
Kayah_Li: () => new UnicodeRangeTable(decodeRanges('goqBtBCA', true)),
|
|
327
|
+
Kharoshthi: () => new UnicodeRangeTable(decodeRanges('gwiCDCBGHCCCcDCFJII', true)),
|
|
328
|
+
Khitan_Small_Script: () => new UnicodeRangeTable(decodeRanges('k-7C84G84GB0OBqBAB', false)),
|
|
329
|
+
Khmer: () => new UnicodeRangeTable(decodeRanges('g8F9CDJHJnPf', true)),
|
|
330
|
+
Khojki: () => new UnicodeRangeTable(decodeRanges('gwkCRCuB', true)),
|
|
331
|
+
Khudawadi: () => new UnicodeRangeTable(decodeRanges('w1kC6BGJ', true)),
|
|
332
|
+
Kirat_Rai: () => new UnicodeRangeTable(decodeRanges('gq7C5B', true)),
|
|
333
|
+
Lao: () => new UnicodeRangeTable(decodeRanges('h0DBBCCCBDBCXBCCCBVBDEBCCCBFBCJBDDB', false)),
|
|
334
|
+
Latin: () => new UnicodeRangeTable(decodeRanges('hCZBHZBwBQQGWBCeBCgOBoBEB8wGlBBHwBBGDBGMBClCBiC-HByLOORMBuEBBHccSoBB42CfBj1elDBEiCBDBBCCCBGBWNBxZqBBCIBCDB38TGB7gBZBHZBmhCFBCpBBCIBm61BeBHFB', false)),
|
|
335
|
+
Lepcha: () => new UnicodeRangeTable(decodeRanges('ggH3BEOEC', true)),
|
|
336
|
+
Limbu: () => new UnicodeRangeTable(decodeRanges('goGeBCLBFLBFEEBKB', false)),
|
|
337
|
+
Linear_A: () => new UnicodeRangeTable(decodeRanges('gwhC2JKVLH', true)),
|
|
338
|
+
Linear_B: () => new UnicodeRangeTable(decodeRanges('gggCLCZCSCBCODNjB6D', true)),
|
|
339
|
+
Lisu: () => new UnicodeRangeTable(decodeRanges('wmpBvBx1eA', true)),
|
|
340
|
+
Lycian: () => new UnicodeRangeTable(decodeRanges('g0gCc', true)),
|
|
341
|
+
Lydian: () => new UnicodeRangeTable(decodeRanges('gpiCZGA', true)),
|
|
342
|
+
Mahajani: () => new UnicodeRangeTable(decodeRanges('wqkCmB', true)),
|
|
343
|
+
Makasar: () => new UnicodeRangeTable(decodeRanges('g3nCY', true)),
|
|
344
|
+
Malayalam: () => new UnicodeRangeTable(decodeRanges('goDMCCCyBCCCFFPDZ', true)),
|
|
345
|
+
Mandaic: () => new UnicodeRangeTable(decodeRanges('giCbDA', true)),
|
|
346
|
+
Manichaean: () => new UnicodeRangeTable(decodeRanges('g2iCmBFL', true)),
|
|
347
|
+
Marchen: () => new UnicodeRangeTable(decodeRanges('wjnCfDVCN', true)),
|
|
348
|
+
Masaram_Gondi: () => new UnicodeRangeTable(decodeRanges('gonCGBCBBCrBBECCBCCBHBJJB', false)),
|
|
349
|
+
Medefaidrin: () => new UnicodeRangeTable(decodeRanges('gy7C6C', true)),
|
|
350
|
+
Meetei_Mayek: () => new UnicodeRangeTable(decodeRanges('g3qBWqGtBDJ', true)),
|
|
351
|
+
Mende_Kikakui: () => new UnicodeRangeTable(decodeRanges('gg6DkGDP', true)),
|
|
352
|
+
Meroitic_Cursive: () => new UnicodeRangeTable(decodeRanges('gtiCXFTDtB', true)),
|
|
353
|
+
Meroitic_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('gsiCf', true)),
|
|
354
|
+
Miao: () => new UnicodeRangeTable(decodeRanges('g47CqCF4BIQ', true)),
|
|
355
|
+
Modi: () => new UnicodeRangeTable(decodeRanges('gwlCkCMJ', true)),
|
|
356
|
+
Mongolian: () => new UnicodeRangeTable(decodeRanges('ggGBBDCCBSBH4CBIqBB2t-BMB', false)),
|
|
357
|
+
Mro: () => new UnicodeRangeTable(decodeRanges('gy6CeCJFB', true)),
|
|
358
|
+
Multani: () => new UnicodeRangeTable(decodeRanges('g0kCGBCCCBCBCOBCKB', false)),
|
|
359
|
+
Myanmar: () => new UnicodeRangeTable(decodeRanges('ggE-EhqmBeiDfxibT', true)),
|
|
360
|
+
Nabataean: () => new UnicodeRangeTable(decodeRanges('gkiCeJI', true)),
|
|
361
|
+
Nag_Mundari: () => new UnicodeRangeTable(decodeRanges('wm5DpB', true)),
|
|
362
|
+
Nandinagari: () => new UnicodeRangeTable(decodeRanges('gtmCHDtBDK', true)),
|
|
363
|
+
New_Tai_Lue: () => new UnicodeRangeTable(decodeRanges('gsGrBFZHKEB', true)),
|
|
364
|
+
Newa: () => new UnicodeRangeTable(decodeRanges('gglC7CCE', true)),
|
|
365
|
+
Nko: () => new UnicodeRangeTable(decodeRanges('g+B6BDC', true)),
|
|
366
|
+
Nushu: () => new UnicodeRangeTable(decodeRanges('h-7CvsQvsQBqMB', false)),
|
|
367
|
+
Nyiakeng_Puachue_Hmong: () => new UnicodeRangeTable(decodeRanges('go4DsBENDJFB', true)),
|
|
368
|
+
Ogham: () => new UnicodeRangeTable(decodeRanges('g0Fc', true)),
|
|
369
|
+
Ol_Chiki: () => new UnicodeRangeTable(decodeRanges('wiHvB', true)),
|
|
370
|
+
Ol_Onal: () => new UnicodeRangeTable(decodeRanges('wu5DqBFA', true)),
|
|
371
|
+
Old_Hungarian: () => new UnicodeRangeTable(decodeRanges('gkjCyBOyBIF', true)),
|
|
372
|
+
Old_Italic: () => new UnicodeRangeTable(decodeRanges('g4gCjBKC', true)),
|
|
373
|
+
Old_North_Arabian: () => new UnicodeRangeTable(decodeRanges('g0iCf', true)),
|
|
374
|
+
Old_Permic: () => new UnicodeRangeTable(decodeRanges('w6gCqB', true)),
|
|
375
|
+
Old_Persian: () => new UnicodeRangeTable(decodeRanges('g9gCjBFN', true)),
|
|
376
|
+
Old_Sogdian: () => new UnicodeRangeTable(decodeRanges('g4jCnB', true)),
|
|
377
|
+
Old_South_Arabian: () => new UnicodeRangeTable(decodeRanges('gziCf', true)),
|
|
378
|
+
Old_Turkic: () => new UnicodeRangeTable(decodeRanges('ggjCoC', true)),
|
|
379
|
+
Old_Uyghur: () => new UnicodeRangeTable(decodeRanges('w7jCZ', true)),
|
|
380
|
+
Oriya: () => new UnicodeRangeTable(decodeRanges('h4CCCHDBDVCGCBCEDIDBDCICFBCEDR', true)),
|
|
381
|
+
Osage: () => new UnicodeRangeTable(decodeRanges('wlhCjBFjB', true)),
|
|
382
|
+
Osmanya: () => new UnicodeRangeTable(decodeRanges('gkhCdDJ', true)),
|
|
383
|
+
Pahawh_Hmong: () => new UnicodeRangeTable(decodeRanges('g46ClCLJCGCUGS', true)),
|
|
384
|
+
Palmyrene: () => new UnicodeRangeTable(decodeRanges('gjiCf', true)),
|
|
385
|
+
Pau_Cin_Hau: () => new UnicodeRangeTable(decodeRanges('g2mC4B', true)),
|
|
386
|
+
Phags_Pa: () => new UnicodeRangeTable(decodeRanges('giqB3B', true)),
|
|
387
|
+
Phoenician: () => new UnicodeRangeTable(decodeRanges('goiCbEA', true)),
|
|
388
|
+
Psalter_Pahlavi: () => new UnicodeRangeTable(decodeRanges('g8iCRIDNG', true)),
|
|
389
|
+
Rejang: () => new UnicodeRangeTable(decodeRanges('wpqBjBMA', true)),
|
|
390
|
+
Runic: () => new UnicodeRangeTable(decodeRanges('g1FqCEK', true)),
|
|
391
|
+
Samaritan: () => new UnicodeRangeTable(decodeRanges('ggCtBDO', true)),
|
|
392
|
+
Saurashtra: () => new UnicodeRangeTable(decodeRanges('gkqBlCJL', true)),
|
|
393
|
+
Sharada: () => new UnicodeRangeTable(decodeRanges('gskC-C', true)),
|
|
394
|
+
Shavian: () => new UnicodeRangeTable(decodeRanges('wihCvB', true)),
|
|
395
|
+
Siddham: () => new UnicodeRangeTable(decodeRanges('gslC1BDlB', true)),
|
|
396
|
+
SignWriting: () => new UnicodeRangeTable(decodeRanges('gg2DrUQECO', true)),
|
|
397
|
+
Sinhala: () => new UnicodeRangeTable(decodeRanges('hsDCBCRBEXBCIBCDDBFBEFFBEBCCCBGBHJBDCBt-gCTB', false)),
|
|
398
|
+
Sogdian: () => new UnicodeRangeTable(decodeRanges('w5jCpB', true)),
|
|
399
|
+
Sora_Sompeng: () => new UnicodeRangeTable(decodeRanges('wmkCYIJ', true)),
|
|
400
|
+
Soyombo: () => new UnicodeRangeTable(decodeRanges('wymCyC', true)),
|
|
401
|
+
Sundanese: () => new UnicodeRangeTable(decodeRanges('g8G-BhIH', true)),
|
|
402
|
+
Sunuwar: () => new UnicodeRangeTable(decodeRanges('g+mChBPJ', true)),
|
|
403
|
+
Syloti_Nagri: () => new UnicodeRangeTable(decodeRanges('ggqBsB', true)),
|
|
404
|
+
Syriac: () => new UnicodeRangeTable(decodeRanges('g4BNC7BDCxIK', true)),
|
|
405
|
+
Tagalog: () => new UnicodeRangeTable(decodeRanges('g4FVKA', true)),
|
|
406
|
+
Tagbanwa: () => new UnicodeRangeTable(decodeRanges('g7FMCCCB', true)),
|
|
407
|
+
Tai_Le: () => new UnicodeRangeTable(decodeRanges('wqGdDE', true)),
|
|
408
|
+
Tai_Tham: () => new UnicodeRangeTable(decodeRanges('gxG+BCcDKHJHN', true)),
|
|
409
|
+
Tai_Viet: () => new UnicodeRangeTable(decodeRanges('g0qBiCZE', true)),
|
|
410
|
+
Takri: () => new UnicodeRangeTable(decodeRanges('g0lC5BHJ', true)),
|
|
411
|
+
Tamil: () => new UnicodeRangeTable(decodeRanges('i8CBBCFBECBCDBEBBCCCBEEBEEBBBELBFEBECBCDBDHHPUBm+kCxBBOAB', false)),
|
|
412
|
+
Tangsa: () => new UnicodeRangeTable(decodeRanges('wz6CuCCJ', true)),
|
|
413
|
+
Tangut: () => new UnicodeRangeTable(decodeRanges('g-7CgBgBB2-FBJ-XBhQIB', false)),
|
|
414
|
+
Telugu: () => new UnicodeRangeTable(decodeRanges('ggDMBCCBCWBCPBDIBCCBCDBIBBCCBDDDBCBDJBIIB', false)),
|
|
415
|
+
Thaana: () => new UnicodeRangeTable(decodeRanges('g8BxB', true)),
|
|
416
|
+
Thai: () => new UnicodeRangeTable(decodeRanges('hwD5BGb', true)),
|
|
417
|
+
Tibetan: () => new UnicodeRangeTable(decodeRanges('g4DnCCjBFmBCjBCOCGFB', true)),
|
|
418
|
+
Tifinagh: () => new UnicodeRangeTable(decodeRanges('wpL3BIBPA', true)),
|
|
419
|
+
Tirhuta: () => new UnicodeRangeTable(decodeRanges('gklCnCJJ', true)),
|
|
420
|
+
Todhri: () => new UnicodeRangeTable(decodeRanges('guhCzB', true)),
|
|
421
|
+
Toto: () => new UnicodeRangeTable(decodeRanges('w04De', true)),
|
|
422
|
+
Tulu_Tigalari: () => new UnicodeRangeTable(decodeRanges('g8kCJBCDDClBBCJBCDDCDBCJBCBBJBB', false)),
|
|
423
|
+
Ugaritic: () => new UnicodeRangeTable(decodeRanges('g8gCdCA', true)),
|
|
424
|
+
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)),
|
|
425
|
+
Vai: () => new UnicodeRangeTable(decodeRanges('gopBrJ', true)),
|
|
426
|
+
Vithkuqi: () => new UnicodeRangeTable(decodeRanges('wrhCKCOCGCBCKCOCGCB', true)),
|
|
427
|
+
Wancho: () => new UnicodeRangeTable(decodeRanges('g24D5BGA', true)),
|
|
428
|
+
Warang_Citi: () => new UnicodeRangeTable(decodeRanges('glmCyCNA', true)),
|
|
429
|
+
Yezidi: () => new UnicodeRangeTable(decodeRanges('g0jCpBCCDB', true)),
|
|
430
|
+
Yi: () => new UnicodeRangeTable(decodeRanges('ggoBskBE2B', true)),
|
|
431
|
+
Zanabazar_Square: () => new UnicodeRangeTable(decodeRanges('gwmCnC', true))
|
|
432
|
+
});
|
|
433
|
+
static FOLD_CATEGORIES = new LazyMap({
|
|
434
|
+
C: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false)),
|
|
435
|
+
Cn: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false)),
|
|
436
|
+
L: () => new UnicodeRangeTable(decodeRanges('latkpBtkpBCAB', false)),
|
|
437
|
+
LC: () => new UnicodeRangeTable(decodeRanges('latkpBtkpBCAB', false)),
|
|
438
|
+
Ll: () => new UnicodeRangeTable(decodeRanges('hCZBmDWBCGBiBuBCEECDOCDuBCBECEBBCCCBCCBBBDDBCBBCCBEBBCBBCECBCCDCCBCCBBBCCCBEEIBBCBBCBBCOCDQCDBBCCCBBBC4BCIBBCBBDCCBCBCGC3HrBrBCEEJHHCCBCCCBCCBPBCIBkBJJCUCGDDCBBDyBBxBgBCK2BCBMCD+CCDlBBq6ClBBCGGzW1CB0kCHHBpBBDCBhK0ECKgDCKHBJFBLHBJHBJFBMGCJHBZHBJHBJHBJEBMEBMDBNEBMEBqJEEBHHxC9zC9zCBuBBxBCCBBBDGCBCBCDDJCBCgDCJCCFuqeuqeCqBCUaCoEMCE8BCLECBICFCCDCCEUCBDBCEBCOCBCBCCCBEECKCZs5Vs5VBYBmmBnBBpEjBB9EKBCOBCGBCBBr3ByBB+EVB75CfBhsVfBh1ehBB', false)),
|
|
439
|
+
Lt: () => new UnicodeRangeTable(decodeRanges('kOCCBCCBCClBCCtsHHBJHBJHBMQQwBAB', false)),
|
|
440
|
+
Lu: () => new UnicodeRangeTable(decodeRanges('hDZB7BqBqBBWBCHBCuBCEECDOCDsBCDECBBBDCCDEEGDDECBDDDCCCDFFDEECDDECCGBBCBBCBBCOCBSCDBBCEECkBCEQCJDDBCCFICBEBCBBCCCBEEBCCBCBCEBDCCBDDIDDCBBEFBGLLBnFnFsBCCEEEBBBvBDBCdBCBBECBCWCBDBCGD1BvBBCgBCK0BCDMCBgDCyBlBBq6CqBBDCB5XFBjkCIBCvHvHERRzD0ECGGGC8CCBHBJFBLHBJHBJFBMGCJHBJNBzBBBNSSBPPBEEpL2B2Bs1CvBBCEEBGCHDDLiDCJCCFNNBkBBCGG0oesBCUaCoEMCE8BCLCCDICFFFCBBDSCMOCFCCDEEGECb9a9advCBi8UZBumBnBBpEjBB8EKBCOBCGBCBBk4ByBB+DVB75CfBhsVfBj1ehBB', false)),
|
|
441
|
+
M: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false)),
|
|
442
|
+
Mn: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false))
|
|
443
|
+
});
|
|
444
|
+
static FOLD_SCRIPT = new LazyMap({
|
|
445
|
+
Common: () => new UnicodeRangeTable(decodeRanges('8cgBgB', false)),
|
|
446
|
+
Greek: () => new UnicodeRangeTable(decodeRanges('1FwUwU', false)),
|
|
447
|
+
Inherited: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false)),
|
|
448
|
+
Latin: () => new UnicodeRangeTable(decodeRanges('y+pBCC', false)),
|
|
449
|
+
Unknown: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false))
|
|
450
|
+
});
|
|
346
451
|
}
|
|
347
452
|
|
|
348
453
|
/**
|
|
@@ -595,7 +700,7 @@ class Utils {
|
|
|
595
700
|
|
|
596
701
|
// Returns the array of runes in the specified Java UTF-16 string.
|
|
597
702
|
static stringToRunes(str) {
|
|
598
|
-
return String(str)
|
|
703
|
+
return Array.from(String(str)).map(s => s.codePointAt(0));
|
|
599
704
|
}
|
|
600
705
|
|
|
601
706
|
// Returns the Java UTF-16 string containing the single rune |r|.
|
|
@@ -866,6 +971,14 @@ class MachineInputBase {
|
|
|
866
971
|
endPos() {
|
|
867
972
|
return this.end;
|
|
868
973
|
}
|
|
974
|
+
hasString() {
|
|
975
|
+
return false;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
// Helper for the exact-literal fast-path execution router
|
|
979
|
+
prefixLength() {
|
|
980
|
+
return 0;
|
|
981
|
+
}
|
|
869
982
|
}
|
|
870
983
|
|
|
871
984
|
// An implementation of MachineInput for UTF-8 byte arrays.
|
|
@@ -877,6 +990,14 @@ class MachineUTF8Input extends MachineInputBase {
|
|
|
877
990
|
this.start = start;
|
|
878
991
|
this.end = end;
|
|
879
992
|
}
|
|
993
|
+
hasString(prefilter, pos) {
|
|
994
|
+
const target = prefilter.bytes;
|
|
995
|
+
if (target.length === 0) return true;
|
|
996
|
+
|
|
997
|
+
// Reuse the high-speed indexOf method already implemented below
|
|
998
|
+
const idx = this.indexOf(this.bytes, target, this.start + pos);
|
|
999
|
+
return idx !== -1 && idx <= this.end - target.length;
|
|
1000
|
+
}
|
|
880
1001
|
|
|
881
1002
|
// Returns the rune at the specified index; the units are
|
|
882
1003
|
// unspecified, but could be UTF-8 byte, UTF-16 char, or rune
|
|
@@ -953,10 +1074,10 @@ class MachineUTF8Input extends MachineInputBase {
|
|
|
953
1074
|
indexOf(source, target, fromIndex = 0) {
|
|
954
1075
|
let targetLength = target.length;
|
|
955
1076
|
if (targetLength === 0) {
|
|
956
|
-
return -1;
|
|
1077
|
+
return fromIndex <= this.end ? fromIndex : -1;
|
|
957
1078
|
}
|
|
958
|
-
let
|
|
959
|
-
for (let i = fromIndex; i <=
|
|
1079
|
+
let limit = this.end - targetLength;
|
|
1080
|
+
for (let i = fromIndex; i <= limit; i++) {
|
|
960
1081
|
for (let j = 0; j < targetLength; j++) {
|
|
961
1082
|
if (source[i + j] !== target[j]) {
|
|
962
1083
|
break;
|
|
@@ -967,6 +1088,9 @@ class MachineUTF8Input extends MachineInputBase {
|
|
|
967
1088
|
}
|
|
968
1089
|
return -1;
|
|
969
1090
|
}
|
|
1091
|
+
prefixLength(re2) {
|
|
1092
|
+
return re2.prefixUTF8.length;
|
|
1093
|
+
}
|
|
970
1094
|
}
|
|
971
1095
|
|
|
972
1096
|
// |pos| and |width| are in JS "char" units.
|
|
@@ -977,6 +1101,10 @@ class MachineUTF16Input extends MachineInputBase {
|
|
|
977
1101
|
this.start = start;
|
|
978
1102
|
this.end = end;
|
|
979
1103
|
}
|
|
1104
|
+
hasString(prefilter, pos) {
|
|
1105
|
+
const idx = this.charSequence.indexOf(prefilter.str, this.start + pos);
|
|
1106
|
+
return idx !== -1 && idx <= this.end - prefilter.str.length;
|
|
1107
|
+
}
|
|
980
1108
|
|
|
981
1109
|
// Returns the rune at the specified index; the units are
|
|
982
1110
|
// unspecified, but could be UTF-8 byte, UTF-16 char, or rune
|
|
@@ -1022,6 +1150,9 @@ class MachineUTF16Input extends MachineInputBase {
|
|
|
1022
1150
|
const r2 = pos < this.charSequence.length ? this.charSequence.codePointAt(pos) : -1;
|
|
1023
1151
|
return Utils.emptyOpContext(r1, r2);
|
|
1024
1152
|
}
|
|
1153
|
+
prefixLength(re2) {
|
|
1154
|
+
return re2.prefix.length;
|
|
1155
|
+
}
|
|
1025
1156
|
}
|
|
1026
1157
|
class MachineInput {
|
|
1027
1158
|
static fromUTF8(bytes, start = 0, end = bytes.length) {
|
|
@@ -1112,6 +1243,17 @@ class RE2JSFlagsException extends RE2JSException {
|
|
|
1112
1243
|
}
|
|
1113
1244
|
}
|
|
1114
1245
|
|
|
1246
|
+
/**
|
|
1247
|
+
* An exception thrown for internal engine errors, such as corrupted bytecodes.
|
|
1248
|
+
*/
|
|
1249
|
+
class RE2JSInternalException extends RE2JSException {
|
|
1250
|
+
/** @param {string} message */
|
|
1251
|
+
constructor(message) {
|
|
1252
|
+
super(message);
|
|
1253
|
+
this.name = 'RE2JSInternalException';
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
|
|
1115
1257
|
/**
|
|
1116
1258
|
* A stateful iterator that interprets a regex {@code RE2JS} on a specific input.
|
|
1117
1259
|
*
|
|
@@ -1314,6 +1456,23 @@ class Matcher {
|
|
|
1314
1456
|
}
|
|
1315
1457
|
return this.substring(start, end);
|
|
1316
1458
|
}
|
|
1459
|
+
|
|
1460
|
+
/**
|
|
1461
|
+
* Returns a dictionary map of all named capturing groups and their matched values.
|
|
1462
|
+
* If a group was not matched, its value will be `null`.
|
|
1463
|
+
* @returns {Record<string, string|null>}
|
|
1464
|
+
*/
|
|
1465
|
+
getNamedGroups() {
|
|
1466
|
+
if (!this.hasMatch) {
|
|
1467
|
+
throw new RE2JSGroupException('perhaps no match attempted');
|
|
1468
|
+
}
|
|
1469
|
+
const result = {};
|
|
1470
|
+
for (const name of Object.keys(this.namedGroups)) {
|
|
1471
|
+
result[name] = this.group(name);
|
|
1472
|
+
}
|
|
1473
|
+
return result;
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1317
1476
|
/**
|
|
1318
1477
|
* Returns the number of subgroups in this pattern.
|
|
1319
1478
|
*
|
|
@@ -1738,16 +1897,20 @@ class Inst {
|
|
|
1738
1897
|
}
|
|
1739
1898
|
return r === r0;
|
|
1740
1899
|
}
|
|
1741
|
-
|
|
1742
|
-
//
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1900
|
+
const len = this.runes.length;
|
|
1901
|
+
// If the array is exactly 2, 4, 6, or 8 items, DO NOT fall through to binary search
|
|
1902
|
+
if (len === 2 || len === 4 || len === 6 || len === 8) {
|
|
1903
|
+
for (let j = 0; j < len; j += 2) {
|
|
1904
|
+
if (r < this.runes[j]) {
|
|
1905
|
+
return false;
|
|
1906
|
+
}
|
|
1907
|
+
if (r <= this.runes[j + 1]) {
|
|
1908
|
+
return true;
|
|
1909
|
+
}
|
|
1749
1910
|
}
|
|
1911
|
+
return false; // Stop here
|
|
1750
1912
|
}
|
|
1913
|
+
|
|
1751
1914
|
// Otherwise binary search.
|
|
1752
1915
|
let lo = 0;
|
|
1753
1916
|
let hi = this.runes.length / 2 | 0;
|
|
@@ -1765,6 +1928,40 @@ class Inst {
|
|
|
1765
1928
|
}
|
|
1766
1929
|
return false;
|
|
1767
1930
|
}
|
|
1931
|
+
|
|
1932
|
+
// matchRunePos checks whether the instruction matches (and consumes) r.
|
|
1933
|
+
// If so, it returns the index of the matching rune pair.
|
|
1934
|
+
// If not, it returns -1.
|
|
1935
|
+
matchRunePos(r) {
|
|
1936
|
+
if (this.runes.length === 1) {
|
|
1937
|
+
const r0 = this.runes[0];
|
|
1938
|
+
if ((this.arg & RE2Flags.FOLD_CASE) !== 0) {
|
|
1939
|
+
return Unicode.equalsIgnoreCase(r0, r) ? 0 : -1;
|
|
1940
|
+
}
|
|
1941
|
+
return r === r0 ? 0 : -1;
|
|
1942
|
+
}
|
|
1943
|
+
const len = this.runes.length;
|
|
1944
|
+
if (len === 2 || len === 4 || len === 6 || len === 8) {
|
|
1945
|
+
for (let j = 0; j < len; j += 2) {
|
|
1946
|
+
if (r < this.runes[j]) return -1;
|
|
1947
|
+
if (r <= this.runes[j + 1]) return Math.floor(j / 2);
|
|
1948
|
+
}
|
|
1949
|
+
return -1;
|
|
1950
|
+
}
|
|
1951
|
+
let lo = 0;
|
|
1952
|
+
let hi = Math.floor(len / 2);
|
|
1953
|
+
while (lo < hi) {
|
|
1954
|
+
const m = lo + hi >> 1;
|
|
1955
|
+
const c = this.runes[2 * m];
|
|
1956
|
+
if (c <= r) {
|
|
1957
|
+
if (r <= this.runes[2 * m + 1]) return m;
|
|
1958
|
+
lo = m + 1;
|
|
1959
|
+
} else {
|
|
1960
|
+
hi = m;
|
|
1961
|
+
}
|
|
1962
|
+
}
|
|
1963
|
+
return -1;
|
|
1964
|
+
}
|
|
1768
1965
|
/**
|
|
1769
1966
|
*
|
|
1770
1967
|
* @returns {string}
|
|
@@ -1780,7 +1977,7 @@ class Inst {
|
|
|
1780
1977
|
case Inst.EMPTY_WIDTH:
|
|
1781
1978
|
return `empty ${this.arg} -> ${this.out}`;
|
|
1782
1979
|
case Inst.MATCH:
|
|
1783
|
-
return
|
|
1980
|
+
return `match${this.arg !== 0 ? ` ${this.arg}` : ''}`;
|
|
1784
1981
|
case Inst.FAIL:
|
|
1785
1982
|
return 'fail';
|
|
1786
1983
|
case Inst.NOP:
|
|
@@ -1806,7 +2003,7 @@ class Inst {
|
|
|
1806
2003
|
class Thread {
|
|
1807
2004
|
constructor() {
|
|
1808
2005
|
this.inst = null;
|
|
1809
|
-
this.cap =
|
|
2006
|
+
this.cap = null; // Initialized to Int32Array later
|
|
1810
2007
|
}
|
|
1811
2008
|
}
|
|
1812
2009
|
|
|
@@ -1834,9 +2031,11 @@ class Queue {
|
|
|
1834
2031
|
return j;
|
|
1835
2032
|
}
|
|
1836
2033
|
clear() {
|
|
1837
|
-
|
|
1838
|
-
this.
|
|
1839
|
-
|
|
2034
|
+
// Prevent memory leaks by nulling out used object references
|
|
2035
|
+
for (let i = 0; i < this.size; i++) {
|
|
2036
|
+
this.denseThreads[i] = null;
|
|
2037
|
+
}
|
|
2038
|
+
// The sparse set logic safely ignores stale integers in Typed Arrays.
|
|
1840
2039
|
this.size = 0;
|
|
1841
2040
|
}
|
|
1842
2041
|
toString() {
|
|
@@ -1865,22 +2064,13 @@ class Machine {
|
|
|
1865
2064
|
m.pool = [];
|
|
1866
2065
|
m.poolSize = 0;
|
|
1867
2066
|
m.matched = false;
|
|
1868
|
-
|
|
2067
|
+
// Use Int32Array instead of standard JS array
|
|
2068
|
+
m.matchcap = new Int32Array(m.prog.numCap < 2 ? 2 : m.prog.numCap);
|
|
1869
2069
|
m.ncap = 0;
|
|
1870
2070
|
return m;
|
|
1871
2071
|
}
|
|
1872
2072
|
static fromMachine(machine) {
|
|
1873
|
-
|
|
1874
|
-
m.re2 = machine.re2;
|
|
1875
|
-
m.prog = machine.prog;
|
|
1876
|
-
m.q0 = machine.q0;
|
|
1877
|
-
m.q1 = machine.q1;
|
|
1878
|
-
m.pool = machine.pool;
|
|
1879
|
-
m.poolSize = machine.poolSize;
|
|
1880
|
-
m.matched = machine.matched;
|
|
1881
|
-
m.matchcap = machine.matchcap;
|
|
1882
|
-
m.ncap = machine.ncap;
|
|
1883
|
-
return m;
|
|
2073
|
+
return Machine.fromRE2(machine.re2);
|
|
1884
2074
|
}
|
|
1885
2075
|
|
|
1886
2076
|
// init() reinitializes an existing Machine for re-use on a new input.
|
|
@@ -1889,27 +2079,30 @@ class Machine {
|
|
|
1889
2079
|
if (ncap > this.matchcap.length) {
|
|
1890
2080
|
this.initNewCap(ncap);
|
|
1891
2081
|
} else {
|
|
1892
|
-
this.resetCap(
|
|
2082
|
+
this.resetCap();
|
|
1893
2083
|
}
|
|
1894
2084
|
}
|
|
1895
|
-
|
|
2085
|
+
|
|
2086
|
+
// Wipes existing typed array memory without reallocating
|
|
2087
|
+
resetCap() {
|
|
1896
2088
|
for (let i = 0; i < this.poolSize; i++) {
|
|
1897
2089
|
const t = this.pool[i];
|
|
1898
|
-
t.cap
|
|
2090
|
+
t.cap.fill(0);
|
|
1899
2091
|
}
|
|
1900
2092
|
}
|
|
1901
2093
|
initNewCap(ncap) {
|
|
1902
2094
|
for (let i = 0; i < this.poolSize; i++) {
|
|
1903
2095
|
const t = this.pool[i];
|
|
1904
|
-
t.cap =
|
|
2096
|
+
t.cap = new Int32Array(ncap);
|
|
1905
2097
|
}
|
|
1906
|
-
this.matchcap =
|
|
2098
|
+
this.matchcap = new Int32Array(ncap);
|
|
1907
2099
|
}
|
|
1908
2100
|
submatches() {
|
|
1909
2101
|
if (this.ncap === 0) {
|
|
1910
2102
|
return Utils.emptyInts();
|
|
1911
2103
|
}
|
|
1912
|
-
|
|
2104
|
+
// Use subarray() to create a zero-allocation view before converting
|
|
2105
|
+
return Array.from(this.matchcap.subarray(0, this.ncap));
|
|
1913
2106
|
}
|
|
1914
2107
|
|
|
1915
2108
|
// alloc() allocates a new thread with the given instruction.
|
|
@@ -1921,6 +2114,7 @@ class Machine {
|
|
|
1921
2114
|
t = this.pool[this.poolSize];
|
|
1922
2115
|
} else {
|
|
1923
2116
|
t = new Thread();
|
|
2117
|
+
t.cap = new Int32Array(this.matchcap.length);
|
|
1924
2118
|
}
|
|
1925
2119
|
t.inst = inst;
|
|
1926
2120
|
return t;
|
|
@@ -1928,16 +2122,10 @@ class Machine {
|
|
|
1928
2122
|
|
|
1929
2123
|
// Frees all threads on the thread queue, returning them to the free pool.
|
|
1930
2124
|
freeQueue(queue, from = 0) {
|
|
1931
|
-
const numberOfThread = queue.size - from;
|
|
1932
|
-
const requiredPoolLength = this.poolSize + numberOfThread;
|
|
1933
|
-
if (this.pool.length < requiredPoolLength) {
|
|
1934
|
-
this.pool = this.pool.slice(0, Math.max(this.pool.length * 2, requiredPoolLength));
|
|
1935
|
-
}
|
|
1936
2125
|
for (let i = from; i < queue.size; i++) {
|
|
1937
2126
|
const t = queue.denseThreads[i];
|
|
1938
2127
|
if (t !== null) {
|
|
1939
|
-
this.pool[this.poolSize] = t;
|
|
1940
|
-
this.poolSize++;
|
|
2128
|
+
this.pool[this.poolSize++] = t;
|
|
1941
2129
|
}
|
|
1942
2130
|
}
|
|
1943
2131
|
queue.clear();
|
|
@@ -1945,11 +2133,7 @@ class Machine {
|
|
|
1945
2133
|
|
|
1946
2134
|
// freeThread() returns t to the free pool.
|
|
1947
2135
|
freeThread(t) {
|
|
1948
|
-
|
|
1949
|
-
this.pool = this.pool.slice(0, this.pool.length * 2);
|
|
1950
|
-
}
|
|
1951
|
-
this.pool[this.poolSize] = t;
|
|
1952
|
-
this.poolSize++;
|
|
2136
|
+
this.pool[this.poolSize++] = t;
|
|
1953
2137
|
}
|
|
1954
2138
|
match(input, pos, anchor) {
|
|
1955
2139
|
const startCond = this.re2.cond;
|
|
@@ -1960,7 +2144,7 @@ class Machine {
|
|
|
1960
2144
|
return false;
|
|
1961
2145
|
}
|
|
1962
2146
|
this.matched = false;
|
|
1963
|
-
this.matchcap
|
|
2147
|
+
this.matchcap.fill(-1);
|
|
1964
2148
|
let runq = this.q0;
|
|
1965
2149
|
let nextq = this.q1;
|
|
1966
2150
|
let r = input.step(pos);
|
|
@@ -2031,6 +2215,85 @@ class Machine {
|
|
|
2031
2215
|
this.freeQueue(nextq);
|
|
2032
2216
|
return this.matched;
|
|
2033
2217
|
}
|
|
2218
|
+
matchSet(input, pos, anchor) {
|
|
2219
|
+
const startCond = this.re2.cond;
|
|
2220
|
+
if (startCond === Utils.EMPTY_ALL) return [];
|
|
2221
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
2222
|
+
return [];
|
|
2223
|
+
}
|
|
2224
|
+
let runq = this.q0;
|
|
2225
|
+
let nextq = this.q1;
|
|
2226
|
+
let r = input.step(pos);
|
|
2227
|
+
let rune = r >> 3;
|
|
2228
|
+
let width = r & 7;
|
|
2229
|
+
let rune1 = -1;
|
|
2230
|
+
let width1 = 0;
|
|
2231
|
+
if (r !== MachineInputBase.EOF()) {
|
|
2232
|
+
r = input.step(pos + width);
|
|
2233
|
+
rune1 = r >> 3;
|
|
2234
|
+
width1 = r & 7;
|
|
2235
|
+
}
|
|
2236
|
+
let flag = pos === 0 ? Utils.emptyOpContext(-1, rune) : input.context(pos);
|
|
2237
|
+
const matches = new Set();
|
|
2238
|
+
while (true) {
|
|
2239
|
+
if (runq.isEmpty()) {
|
|
2240
|
+
if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 && pos !== 0) break;
|
|
2241
|
+
}
|
|
2242
|
+
if (pos === 0 || anchor === RE2Flags.UNANCHORED) {
|
|
2243
|
+
this.add(runq, this.prog.start, pos, this.matchcap, flag, null);
|
|
2244
|
+
}
|
|
2245
|
+
const nextPos = pos + width;
|
|
2246
|
+
flag = input.context(nextPos);
|
|
2247
|
+
for (let j = 0; j < runq.size; j++) {
|
|
2248
|
+
let t = runq.denseThreads[j];
|
|
2249
|
+
if (t === null) continue;
|
|
2250
|
+
const i = t.inst;
|
|
2251
|
+
let add = false;
|
|
2252
|
+
switch (i.op) {
|
|
2253
|
+
case Inst.MATCH:
|
|
2254
|
+
if (anchor === RE2Flags.ANCHOR_BOTH && pos !== input.endPos()) break;
|
|
2255
|
+
matches.add(i.arg); // Record the matched Set ID
|
|
2256
|
+
break;
|
|
2257
|
+
case Inst.RUNE:
|
|
2258
|
+
add = i.matchRune(rune);
|
|
2259
|
+
break;
|
|
2260
|
+
case Inst.RUNE1:
|
|
2261
|
+
add = rune === i.runes[0];
|
|
2262
|
+
break;
|
|
2263
|
+
case Inst.RUNE_ANY:
|
|
2264
|
+
add = true;
|
|
2265
|
+
break;
|
|
2266
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
2267
|
+
add = rune !== Codepoint.CODES.get('\n');
|
|
2268
|
+
break;
|
|
2269
|
+
default:
|
|
2270
|
+
throw new RE2JSInternalException('bad inst');
|
|
2271
|
+
}
|
|
2272
|
+
if (add) {
|
|
2273
|
+
t = this.add(nextq, i.out, nextPos, t.cap, flag, t);
|
|
2274
|
+
}
|
|
2275
|
+
if (t !== null) {
|
|
2276
|
+
this.freeThread(t);
|
|
2277
|
+
runq.denseThreads[j] = null;
|
|
2278
|
+
}
|
|
2279
|
+
}
|
|
2280
|
+
runq.clear();
|
|
2281
|
+
if (width === 0) break;
|
|
2282
|
+
pos += width;
|
|
2283
|
+
rune = rune1;
|
|
2284
|
+
width = width1;
|
|
2285
|
+
if (rune !== -1) {
|
|
2286
|
+
r = input.step(pos + width);
|
|
2287
|
+
rune1 = r >> 3;
|
|
2288
|
+
width1 = r & 7;
|
|
2289
|
+
}
|
|
2290
|
+
const tmpq = runq;
|
|
2291
|
+
runq = nextq;
|
|
2292
|
+
nextq = tmpq;
|
|
2293
|
+
}
|
|
2294
|
+
this.freeQueue(nextq);
|
|
2295
|
+
return Array.from(matches).sort((a, b) => a - b);
|
|
2296
|
+
}
|
|
2034
2297
|
step(runq, nextq, pos, nextPos, c, nextCond, anchor, atEnd) {
|
|
2035
2298
|
const longest = this.re2.longest;
|
|
2036
2299
|
for (let j = 0; j < runq.size; j++) {
|
|
@@ -2051,7 +2314,9 @@ class Machine {
|
|
|
2051
2314
|
}
|
|
2052
2315
|
if (this.ncap > 0 && (!longest || !this.matched || this.matchcap[1] < pos)) {
|
|
2053
2316
|
t.cap[1] = pos;
|
|
2054
|
-
|
|
2317
|
+
// Using subarray creates a fast view, avoiding a full array copy
|
|
2318
|
+
// until the submatches are finalized at the very end.
|
|
2319
|
+
this.matchcap.set(t.cap.subarray(0, this.ncap));
|
|
2055
2320
|
}
|
|
2056
2321
|
if (!longest) {
|
|
2057
2322
|
this.freeQueue(runq, j + 1);
|
|
@@ -2071,7 +2336,7 @@ class Machine {
|
|
|
2071
2336
|
add = c !== Codepoint.CODES.get('\n');
|
|
2072
2337
|
break;
|
|
2073
2338
|
default:
|
|
2074
|
-
throw new
|
|
2339
|
+
throw new RE2JSInternalException('bad inst');
|
|
2075
2340
|
}
|
|
2076
2341
|
if (add) {
|
|
2077
2342
|
t = this.add(nextq, i.out, nextPos, t.cap, nextCond, t);
|
|
@@ -2129,7 +2394,10 @@ class Machine {
|
|
|
2129
2394
|
t.inst = inst;
|
|
2130
2395
|
}
|
|
2131
2396
|
if (this.ncap > 0 && t.cap !== cap) {
|
|
2132
|
-
|
|
2397
|
+
// Direct assignment utilizing Typed Array performance
|
|
2398
|
+
for (let c = 0; c < this.ncap; c++) {
|
|
2399
|
+
t.cap[c] = cap[c];
|
|
2400
|
+
}
|
|
2133
2401
|
}
|
|
2134
2402
|
q.denseThreads[d] = t;
|
|
2135
2403
|
t = null;
|
|
@@ -2161,20 +2429,24 @@ const arraysEqual = (a, b) => {
|
|
|
2161
2429
|
return true;
|
|
2162
2430
|
};
|
|
2163
2431
|
class DFAState {
|
|
2164
|
-
constructor(nfaStates, isMatch) {
|
|
2432
|
+
constructor(nfaStates, isMatch, matchIDs = []) {
|
|
2165
2433
|
this.nfaStates = nfaStates; // Int32Array of Instruction PCs
|
|
2166
2434
|
this.isMatch = isMatch; // Boolean
|
|
2435
|
+
this.matchIDs = matchIDs; // Array of integers indicating which Set patterns matched
|
|
2167
2436
|
this.nextAscii = new Array(Unicode.MAX_ASCII + 1).fill(null); // Flat array for blisteringly fast ASCII lookups
|
|
2168
2437
|
this.nextMap = new Map(); // Cache of Char -> DFAState
|
|
2169
2438
|
}
|
|
2170
2439
|
}
|
|
2171
2440
|
class DFA {
|
|
2441
|
+
static MAX_CACHE_CLEARS = 5;
|
|
2172
2442
|
constructor(prog) {
|
|
2173
2443
|
this.prog = prog;
|
|
2174
2444
|
this.stateCache = new Map(); // hash(number) -> DFAState[]
|
|
2175
2445
|
this.stateCount = 0; // Tracks total states for memory limits
|
|
2176
2446
|
this.startState = null;
|
|
2177
2447
|
this.stateLimit = 10000; // Prevent memory explosion (ReDoS protection)
|
|
2448
|
+
this.cacheClears = 0; // Track thrashing
|
|
2449
|
+
this.failed = false; // mark if DFA cannot work with provided prog
|
|
2178
2450
|
}
|
|
2179
2451
|
|
|
2180
2452
|
// Follows epsilon (empty) transitions to find all reachable states without consuming a char
|
|
@@ -2182,6 +2454,7 @@ class DFA {
|
|
|
2182
2454
|
const closure = new Set();
|
|
2183
2455
|
const stack = [...pcs];
|
|
2184
2456
|
let isMatch = false;
|
|
2457
|
+
const matchIDs = [];
|
|
2185
2458
|
while (stack.length > 0) {
|
|
2186
2459
|
const pc = stack.pop();
|
|
2187
2460
|
if (closure.has(pc)) continue;
|
|
@@ -2190,6 +2463,7 @@ class DFA {
|
|
|
2190
2463
|
switch (inst.op) {
|
|
2191
2464
|
case Inst.MATCH:
|
|
2192
2465
|
isMatch = true;
|
|
2466
|
+
if (!matchIDs.includes(inst.arg)) matchIDs.push(inst.arg);
|
|
2193
2467
|
break;
|
|
2194
2468
|
case Inst.ALT:
|
|
2195
2469
|
case Inst.ALT_MATCH:
|
|
@@ -2207,9 +2481,11 @@ class DFA {
|
|
|
2207
2481
|
}
|
|
2208
2482
|
}
|
|
2209
2483
|
const sortedPCs = Int32Array.from(closure).sort();
|
|
2484
|
+
matchIDs.sort((a, b) => a - b);
|
|
2210
2485
|
return {
|
|
2211
2486
|
pcs: sortedPCs,
|
|
2212
|
-
isMatch
|
|
2487
|
+
isMatch,
|
|
2488
|
+
matchIDs
|
|
2213
2489
|
};
|
|
2214
2490
|
}
|
|
2215
2491
|
|
|
@@ -2236,17 +2512,27 @@ class DFA {
|
|
|
2236
2512
|
this.stateCache.set(hash, bucket);
|
|
2237
2513
|
}
|
|
2238
2514
|
|
|
2515
|
+
// DFA already failed once - exit
|
|
2516
|
+
if (this.failed) return null;
|
|
2517
|
+
|
|
2239
2518
|
// Safety: prevent memory exhaustion from state explosion
|
|
2240
2519
|
// We flush the cache and return null, which seamlessly routes execution to the NFA
|
|
2241
2520
|
if (this.stateCount >= this.stateLimit) {
|
|
2242
2521
|
this.stateCache.clear();
|
|
2243
2522
|
this.stateCount = 0;
|
|
2244
2523
|
this.startState = null;
|
|
2524
|
+
this.cacheClears++;
|
|
2525
|
+
|
|
2526
|
+
// If this regex causes continuous cache thrashing, permanently fall back to NFA
|
|
2527
|
+
// to avoid spending CPU cycles constantly rebuilding the DFA tree.
|
|
2528
|
+
if (this.cacheClears >= DFA.MAX_CACHE_CLEARS) {
|
|
2529
|
+
this.failed = true;
|
|
2530
|
+
}
|
|
2245
2531
|
return null;
|
|
2246
2532
|
}
|
|
2247
2533
|
|
|
2248
2534
|
// State not found, create it and add to bucket
|
|
2249
|
-
const state = new DFAState(sortedPCs, closureResult.isMatch);
|
|
2535
|
+
const state = new DFAState(sortedPCs, closureResult.isMatch, closureResult.matchIDs);
|
|
2250
2536
|
bucket.push(state);
|
|
2251
2537
|
this.stateCount++;
|
|
2252
2538
|
return state;
|
|
@@ -2274,68 +2560,800 @@ class DFA {
|
|
|
2274
2560
|
nextPCs.push(inst.out);
|
|
2275
2561
|
}
|
|
2276
2562
|
}
|
|
2277
|
-
if (anchor === RE2Flags.UNANCHORED) {
|
|
2278
|
-
nextPCs.push(this.prog.start);
|
|
2563
|
+
if (anchor === RE2Flags.UNANCHORED) {
|
|
2564
|
+
nextPCs.push(this.prog.start);
|
|
2565
|
+
}
|
|
2566
|
+
const nextState = this.getState(nextPCs);
|
|
2567
|
+
|
|
2568
|
+
// Cache the result
|
|
2569
|
+
if (anchor === RE2Flags.UNANCHORED && charCode <= Unicode.MAX_ASCII) {
|
|
2570
|
+
state.nextAscii[charCode] = nextState;
|
|
2571
|
+
} else {
|
|
2572
|
+
const key = charCode + (anchor === RE2Flags.UNANCHORED ? 0 : Unicode.MAX_RUNE + 1);
|
|
2573
|
+
state.nextMap.set(key, nextState);
|
|
2574
|
+
}
|
|
2575
|
+
return nextState;
|
|
2576
|
+
}
|
|
2577
|
+
|
|
2578
|
+
// The hot loop: Execute the Lazy DFA
|
|
2579
|
+
match(input, pos, anchor) {
|
|
2580
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
2581
|
+
return false;
|
|
2582
|
+
}
|
|
2583
|
+
if (!this.startState) {
|
|
2584
|
+
this.startState = this.getState([this.prog.start]);
|
|
2585
|
+
if (!this.startState) return null; // Fallback to NFA
|
|
2586
|
+
}
|
|
2587
|
+
let endPos = input.endPos();
|
|
2588
|
+
let currentState = this.startState;
|
|
2589
|
+
if (currentState.isMatch) {
|
|
2590
|
+
if (anchor === RE2Flags.ANCHOR_BOTH) {
|
|
2591
|
+
if (pos === endPos) return true;
|
|
2592
|
+
} else {
|
|
2593
|
+
return true;
|
|
2594
|
+
}
|
|
2595
|
+
}
|
|
2596
|
+
let i = pos;
|
|
2597
|
+
while (i < endPos) {
|
|
2598
|
+
const r = input.step(i);
|
|
2599
|
+
const rune = r >> 3;
|
|
2600
|
+
const width = r & 7;
|
|
2601
|
+
|
|
2602
|
+
// prevent infinite loop on EOF
|
|
2603
|
+
if (width === 0) {
|
|
2604
|
+
break;
|
|
2605
|
+
}
|
|
2606
|
+
currentState = anchor === RE2Flags.UNANCHORED && rune <= Unicode.MAX_ASCII && currentState.nextAscii[rune] || this.step(currentState, rune, anchor);
|
|
2607
|
+
|
|
2608
|
+
// If we hit an unrecoverable DFA error or bailout, signal fallback
|
|
2609
|
+
if (currentState === null) return null;
|
|
2610
|
+
if (currentState.isMatch) {
|
|
2611
|
+
if (anchor === RE2Flags.ANCHOR_BOTH) {
|
|
2612
|
+
if (i + width === endPos) return true;
|
|
2613
|
+
} else {
|
|
2614
|
+
return true;
|
|
2615
|
+
}
|
|
2616
|
+
}
|
|
2617
|
+
|
|
2618
|
+
// If we hit a dead end, and anchored, fail early
|
|
2619
|
+
if (currentState.nfaStates.length === 0) {
|
|
2620
|
+
if (anchor !== RE2Flags.UNANCHORED) return false;
|
|
2621
|
+
}
|
|
2622
|
+
i += width;
|
|
2623
|
+
}
|
|
2624
|
+
return false;
|
|
2625
|
+
}
|
|
2626
|
+
|
|
2627
|
+
// The hot loop for evaluating Multi-Pattern Sets
|
|
2628
|
+
matchSet(input, pos, anchor) {
|
|
2629
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
2630
|
+
return [];
|
|
2631
|
+
}
|
|
2632
|
+
if (!this.startState) {
|
|
2633
|
+
this.startState = this.getState([this.prog.start]);
|
|
2634
|
+
if (!this.startState) return null; // Fallback to NFA
|
|
2635
|
+
}
|
|
2636
|
+
let endPos = input.endPos();
|
|
2637
|
+
let currentState = this.startState;
|
|
2638
|
+
const matches = new Set();
|
|
2639
|
+
const checkMatch = (state, currentPos) => {
|
|
2640
|
+
if (state.isMatch) {
|
|
2641
|
+
if (anchor === RE2Flags.ANCHOR_BOTH) {
|
|
2642
|
+
if (currentPos === endPos) {
|
|
2643
|
+
state.matchIDs.forEach(id => matches.add(id));
|
|
2644
|
+
}
|
|
2645
|
+
} else {
|
|
2646
|
+
state.matchIDs.forEach(id => matches.add(id));
|
|
2647
|
+
}
|
|
2648
|
+
}
|
|
2649
|
+
};
|
|
2650
|
+
checkMatch(currentState, pos);
|
|
2651
|
+
let i = pos;
|
|
2652
|
+
while (i < endPos) {
|
|
2653
|
+
const r = input.step(i);
|
|
2654
|
+
const rune = r >> 3;
|
|
2655
|
+
const width = r & 7;
|
|
2656
|
+
if (width === 0) break;
|
|
2657
|
+
currentState = anchor === RE2Flags.UNANCHORED && rune <= Unicode.MAX_ASCII && currentState.nextAscii[rune] || this.step(currentState, rune, anchor);
|
|
2658
|
+
if (currentState === null) return null; // Bailout to NFA
|
|
2659
|
+
|
|
2660
|
+
i += width;
|
|
2661
|
+
checkMatch(currentState, i);
|
|
2662
|
+
if (currentState.nfaStates.length === 0) {
|
|
2663
|
+
if (anchor !== RE2Flags.UNANCHORED) break;
|
|
2664
|
+
}
|
|
2665
|
+
}
|
|
2666
|
+
return Array.from(matches).sort((a, b) => a - b);
|
|
2667
|
+
}
|
|
2668
|
+
}
|
|
2669
|
+
|
|
2670
|
+
const VISITED_BITS = 32;
|
|
2671
|
+
const MAX_BACKTRACK_PROG = 500;
|
|
2672
|
+
const INITIAL_JOB_CAPACITY = 256; // Starting size for the job stack arrays
|
|
2673
|
+
const MAX_BACKTRACK_VECTOR = 256 * 1024; // 32 KB limit for the visited bit-mask
|
|
2674
|
+
|
|
2675
|
+
class BitState {
|
|
2676
|
+
constructor() {
|
|
2677
|
+
this.end = 0;
|
|
2678
|
+
this.cap = new Int32Array(0);
|
|
2679
|
+
this.matchcap = new Int32Array(0);
|
|
2680
|
+
this.ncap = 0;
|
|
2681
|
+
|
|
2682
|
+
// Parallel arrays acting as the backtrack job stack
|
|
2683
|
+
this.jobPc = new Int32Array(INITIAL_JOB_CAPACITY);
|
|
2684
|
+
this.jobArg = new Uint8Array(INITIAL_JOB_CAPACITY);
|
|
2685
|
+
this.jobPos = new Int32Array(INITIAL_JOB_CAPACITY);
|
|
2686
|
+
this.jobLen = 0;
|
|
2687
|
+
this.visited = new Uint32Array(0);
|
|
2688
|
+
}
|
|
2689
|
+
reset(prog, end, ncap) {
|
|
2690
|
+
this.end = end;
|
|
2691
|
+
this.jobLen = 0;
|
|
2692
|
+
this.ncap = ncap;
|
|
2693
|
+
|
|
2694
|
+
// Bitwise shift (>>> 5) instead of Math.floor( / 32)
|
|
2695
|
+
const visitedSize = prog.numInst() * (end + 1) + VISITED_BITS - 1 >>> 5;
|
|
2696
|
+
if (this.visited.length < visitedSize) {
|
|
2697
|
+
this.visited = new Uint32Array(Math.floor(MAX_BACKTRACK_VECTOR / VISITED_BITS));
|
|
2698
|
+
} else {
|
|
2699
|
+
this.visited.fill(0, 0, visitedSize);
|
|
2700
|
+
}
|
|
2701
|
+
if (this.cap.length < ncap) {
|
|
2702
|
+
// Must explicitly fill with -1 as Int32Array defaults to 0
|
|
2703
|
+
this.cap = new Int32Array(ncap).fill(-1);
|
|
2704
|
+
} else {
|
|
2705
|
+
this.cap.fill(-1, 0, ncap);
|
|
2706
|
+
}
|
|
2707
|
+
if (this.matchcap.length < ncap) {
|
|
2708
|
+
this.matchcap = new Int32Array(ncap).fill(-1);
|
|
2709
|
+
} else {
|
|
2710
|
+
this.matchcap.fill(-1, 0, ncap);
|
|
2711
|
+
}
|
|
2712
|
+
}
|
|
2713
|
+
shouldVisit(pc, pos) {
|
|
2714
|
+
const n = pc * (this.end + 1) + pos;
|
|
2715
|
+
const idx = n >>> 5; // Equivalent to Math.floor(n / 32)
|
|
2716
|
+
const mask = 1 << (n & 31); // Equivalent to n % 32
|
|
2717
|
+
|
|
2718
|
+
if ((this.visited[idx] & mask) !== 0) {
|
|
2719
|
+
return false;
|
|
2720
|
+
}
|
|
2721
|
+
this.visited[idx] |= mask;
|
|
2722
|
+
return true;
|
|
2723
|
+
}
|
|
2724
|
+
push(re2, pc, pos, arg) {
|
|
2725
|
+
if (re2.prog.getInst(pc).op !== Inst.FAIL && (arg || this.shouldVisit(pc, pos))) {
|
|
2726
|
+
if (this.jobLen >= this.jobPc.length) {
|
|
2727
|
+
const newSize = this.jobPc.length * 2;
|
|
2728
|
+
const newPc = new Int32Array(newSize);
|
|
2729
|
+
newPc.set(this.jobPc);
|
|
2730
|
+
this.jobPc = newPc;
|
|
2731
|
+
const newArg = new Uint8Array(newSize);
|
|
2732
|
+
newArg.set(this.jobArg);
|
|
2733
|
+
this.jobArg = newArg;
|
|
2734
|
+
const newPos = new Int32Array(newSize);
|
|
2735
|
+
newPos.set(this.jobPos);
|
|
2736
|
+
this.jobPos = newPos;
|
|
2737
|
+
}
|
|
2738
|
+
this.jobPc[this.jobLen] = pc;
|
|
2739
|
+
this.jobArg[this.jobLen] = arg ? 1 : 0;
|
|
2740
|
+
this.jobPos[this.jobLen] = pos;
|
|
2741
|
+
this.jobLen++;
|
|
2742
|
+
}
|
|
2743
|
+
}
|
|
2744
|
+
tryBacktrack(re2, input, pc, pos, anchor) {
|
|
2745
|
+
const longest = re2.longest;
|
|
2746
|
+
this.push(re2, pc, pos, false);
|
|
2747
|
+
while (this.jobLen > 0) {
|
|
2748
|
+
this.jobLen--;
|
|
2749
|
+
let currentPc = this.jobPc[this.jobLen];
|
|
2750
|
+
let arg = this.jobArg[this.jobLen] === 1;
|
|
2751
|
+
let currentPos = this.jobPos[this.jobLen];
|
|
2752
|
+
let skipShouldVisit = true;
|
|
2753
|
+
while (true) {
|
|
2754
|
+
if (!skipShouldVisit) {
|
|
2755
|
+
if (!this.shouldVisit(currentPc, currentPos)) {
|
|
2756
|
+
break;
|
|
2757
|
+
}
|
|
2758
|
+
}
|
|
2759
|
+
skipShouldVisit = false;
|
|
2760
|
+
const inst = re2.prog.getInst(currentPc);
|
|
2761
|
+
switch (inst.op) {
|
|
2762
|
+
case Inst.FAIL:
|
|
2763
|
+
{
|
|
2764
|
+
throw new RE2JSInternalException('unexpected InstFail');
|
|
2765
|
+
}
|
|
2766
|
+
case Inst.ALT:
|
|
2767
|
+
{
|
|
2768
|
+
if (arg) {
|
|
2769
|
+
arg = false;
|
|
2770
|
+
currentPc = inst.arg;
|
|
2771
|
+
continue;
|
|
2772
|
+
} else {
|
|
2773
|
+
this.push(re2, currentPc, currentPos, true);
|
|
2774
|
+
currentPc = inst.out;
|
|
2775
|
+
continue;
|
|
2776
|
+
}
|
|
2777
|
+
}
|
|
2778
|
+
case Inst.ALT_MATCH:
|
|
2779
|
+
{
|
|
2780
|
+
const outInst = re2.prog.getInst(inst.out);
|
|
2781
|
+
if (Inst.isRuneOp(outInst.op)) {
|
|
2782
|
+
this.push(re2, inst.arg, currentPos, false);
|
|
2783
|
+
currentPc = inst.out;
|
|
2784
|
+
continue;
|
|
2785
|
+
}
|
|
2786
|
+
this.push(re2, inst.out, this.end, false);
|
|
2787
|
+
currentPc = inst.arg;
|
|
2788
|
+
continue;
|
|
2789
|
+
}
|
|
2790
|
+
case Inst.RUNE:
|
|
2791
|
+
{
|
|
2792
|
+
const r = input.step(currentPos);
|
|
2793
|
+
if (r === MachineInputBase.EOF()) break;
|
|
2794
|
+
if (!inst.matchRune(r >> 3)) break;
|
|
2795
|
+
currentPos += r & 7;
|
|
2796
|
+
currentPc = inst.out;
|
|
2797
|
+
continue;
|
|
2798
|
+
}
|
|
2799
|
+
case Inst.RUNE1:
|
|
2800
|
+
{
|
|
2801
|
+
const r = input.step(currentPos);
|
|
2802
|
+
if (r === MachineInputBase.EOF()) break;
|
|
2803
|
+
if (r >> 3 !== inst.runes[0]) break;
|
|
2804
|
+
currentPos += r & 7;
|
|
2805
|
+
currentPc = inst.out;
|
|
2806
|
+
continue;
|
|
2807
|
+
}
|
|
2808
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
2809
|
+
{
|
|
2810
|
+
const r = input.step(currentPos);
|
|
2811
|
+
if (r === MachineInputBase.EOF()) break;
|
|
2812
|
+
if (r >> 3 === 10) break;
|
|
2813
|
+
currentPos += r & 7;
|
|
2814
|
+
currentPc = inst.out;
|
|
2815
|
+
continue;
|
|
2816
|
+
}
|
|
2817
|
+
case Inst.RUNE_ANY:
|
|
2818
|
+
{
|
|
2819
|
+
const r = input.step(currentPos);
|
|
2820
|
+
if (r === MachineInputBase.EOF()) break;
|
|
2821
|
+
currentPos += r & 7;
|
|
2822
|
+
currentPc = inst.out;
|
|
2823
|
+
continue;
|
|
2824
|
+
}
|
|
2825
|
+
case Inst.CAPTURE:
|
|
2826
|
+
{
|
|
2827
|
+
if (arg) {
|
|
2828
|
+
this.cap[inst.arg] = currentPos;
|
|
2829
|
+
break;
|
|
2830
|
+
} else {
|
|
2831
|
+
if (inst.arg < this.ncap) {
|
|
2832
|
+
this.push(re2, currentPc, this.cap[inst.arg], true);
|
|
2833
|
+
this.cap[inst.arg] = currentPos;
|
|
2834
|
+
}
|
|
2835
|
+
currentPc = inst.out;
|
|
2836
|
+
continue;
|
|
2837
|
+
}
|
|
2838
|
+
}
|
|
2839
|
+
case Inst.EMPTY_WIDTH:
|
|
2840
|
+
{
|
|
2841
|
+
const flag = input.context(currentPos);
|
|
2842
|
+
if ((inst.arg & ~flag) !== 0) break;
|
|
2843
|
+
currentPc = inst.out;
|
|
2844
|
+
continue;
|
|
2845
|
+
}
|
|
2846
|
+
case Inst.NOP:
|
|
2847
|
+
{
|
|
2848
|
+
currentPc = inst.out;
|
|
2849
|
+
continue;
|
|
2850
|
+
}
|
|
2851
|
+
case Inst.MATCH:
|
|
2852
|
+
{
|
|
2853
|
+
if (anchor === RE2Flags.ANCHOR_BOTH && currentPos !== this.end) {
|
|
2854
|
+
break;
|
|
2855
|
+
}
|
|
2856
|
+
if (this.ncap === 0) return true;
|
|
2857
|
+
if (this.ncap > 1) {
|
|
2858
|
+
this.cap[1] = currentPos;
|
|
2859
|
+
}
|
|
2860
|
+
const old = this.matchcap[1];
|
|
2861
|
+
if (old === -1 || longest && currentPos > 0 && currentPos > old) {
|
|
2862
|
+
this.matchcap.set(this.cap);
|
|
2863
|
+
}
|
|
2864
|
+
if (!longest) return true;
|
|
2865
|
+
if (currentPos === this.end) return true;
|
|
2866
|
+
break;
|
|
2867
|
+
}
|
|
2868
|
+
default:
|
|
2869
|
+
{
|
|
2870
|
+
throw new RE2JSInternalException('bad inst');
|
|
2871
|
+
}
|
|
2872
|
+
}
|
|
2873
|
+
break;
|
|
2874
|
+
}
|
|
2875
|
+
}
|
|
2876
|
+
return longest && this.matchcap.length > 1 && this.matchcap[1] >= 0;
|
|
2877
|
+
}
|
|
2878
|
+
}
|
|
2879
|
+
const bitStatePool = [];
|
|
2880
|
+
class Backtracker {
|
|
2881
|
+
static shouldBacktrack(prog) {
|
|
2882
|
+
return prog.numInst() <= MAX_BACKTRACK_PROG;
|
|
2883
|
+
}
|
|
2884
|
+
static maxBitStateLen(prog) {
|
|
2885
|
+
if (!Backtracker.shouldBacktrack(prog)) {
|
|
2886
|
+
return 0;
|
|
2887
|
+
}
|
|
2888
|
+
return Math.floor(MAX_BACKTRACK_VECTOR / prog.numInst());
|
|
2889
|
+
}
|
|
2890
|
+
static execute(re2, input, pos, anchor, ncap) {
|
|
2891
|
+
const startCond = re2.cond;
|
|
2892
|
+
if (startCond === Utils.EMPTY_ALL) {
|
|
2893
|
+
return null;
|
|
2894
|
+
}
|
|
2895
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
2896
|
+
return null;
|
|
2897
|
+
}
|
|
2898
|
+
if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 && pos !== 0) {
|
|
2899
|
+
return null;
|
|
2900
|
+
}
|
|
2901
|
+
const b = bitStatePool.length > 0 ? bitStatePool.pop() : new BitState();
|
|
2902
|
+
const end = input.endPos();
|
|
2903
|
+
b.reset(re2.prog, end, ncap);
|
|
2904
|
+
let matched = false;
|
|
2905
|
+
if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 || anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) {
|
|
2906
|
+
if (b.ncap > 0) {
|
|
2907
|
+
b.cap[0] = pos;
|
|
2908
|
+
}
|
|
2909
|
+
if (b.tryBacktrack(re2, input, re2.prog.start, pos, anchor)) {
|
|
2910
|
+
matched = true;
|
|
2911
|
+
}
|
|
2912
|
+
} else {
|
|
2913
|
+
let width = -1;
|
|
2914
|
+
for (; pos <= end && width !== 0; pos += width) {
|
|
2915
|
+
if (re2.prefix.length > 0) {
|
|
2916
|
+
const advance = input.index(re2, pos);
|
|
2917
|
+
if (advance < 0) {
|
|
2918
|
+
break;
|
|
2919
|
+
}
|
|
2920
|
+
pos += advance;
|
|
2921
|
+
}
|
|
2922
|
+
if (b.ncap > 0) {
|
|
2923
|
+
b.cap[0] = pos;
|
|
2924
|
+
}
|
|
2925
|
+
if (b.tryBacktrack(re2, input, re2.prog.start, pos, anchor)) {
|
|
2926
|
+
matched = true;
|
|
2927
|
+
break;
|
|
2928
|
+
}
|
|
2929
|
+
const r = input.step(pos);
|
|
2930
|
+
width = r === MachineInputBase.EOF() ? 0 : r & 7;
|
|
2931
|
+
}
|
|
2932
|
+
}
|
|
2933
|
+
if (!matched) {
|
|
2934
|
+
bitStatePool.push(b);
|
|
2935
|
+
return null;
|
|
2936
|
+
}
|
|
2937
|
+
|
|
2938
|
+
// Must slice so we don't accidentally leak trailing arrays from previously recycled typed arrays
|
|
2939
|
+
const result = ncap === 0 ? [] : Array.from(b.matchcap.subarray(0, ncap));
|
|
2940
|
+
bitStatePool.push(b);
|
|
2941
|
+
return result;
|
|
2942
|
+
}
|
|
2943
|
+
}
|
|
2944
|
+
|
|
2945
|
+
class QueueOnePass {
|
|
2946
|
+
constructor(size) {
|
|
2947
|
+
this.sparse = new Uint32Array(size);
|
|
2948
|
+
this.dense = new Uint32Array(size);
|
|
2949
|
+
this.size = 0;
|
|
2950
|
+
this.nextIndex = 0;
|
|
2951
|
+
}
|
|
2952
|
+
empty() {
|
|
2953
|
+
return this.nextIndex >= this.size;
|
|
2954
|
+
}
|
|
2955
|
+
next() {
|
|
2956
|
+
return this.dense[this.nextIndex++];
|
|
2957
|
+
}
|
|
2958
|
+
clear() {
|
|
2959
|
+
this.size = 0;
|
|
2960
|
+
this.nextIndex = 0;
|
|
2961
|
+
}
|
|
2962
|
+
contains(u) {
|
|
2963
|
+
return u < this.sparse.length && this.sparse[u] < this.size && this.dense[this.sparse[u]] === u;
|
|
2964
|
+
}
|
|
2965
|
+
insert(u) {
|
|
2966
|
+
if (!this.contains(u)) this.insertNew(u);
|
|
2967
|
+
}
|
|
2968
|
+
insertNew(u) {
|
|
2969
|
+
if (u >= this.sparse.length) return;
|
|
2970
|
+
this.sparse[u] = this.size;
|
|
2971
|
+
this.dense[this.size] = u;
|
|
2972
|
+
this.size++;
|
|
2973
|
+
}
|
|
2974
|
+
}
|
|
2975
|
+
const mergeRuneSets = (leftRunes, rightRunes, leftPC, rightPC) => {
|
|
2976
|
+
const leftLen = leftRunes.length;
|
|
2977
|
+
const rightLen = rightRunes.length;
|
|
2978
|
+
let lx = 0,
|
|
2979
|
+
rx = 0;
|
|
2980
|
+
const merged = [];
|
|
2981
|
+
const next = [];
|
|
2982
|
+
let ok = true;
|
|
2983
|
+
let ix = -1;
|
|
2984
|
+
const extend = isLeft => {
|
|
2985
|
+
const newArray = isLeft ? leftRunes : rightRunes;
|
|
2986
|
+
const low = isLeft ? lx : rx;
|
|
2987
|
+
const pc = isLeft ? leftPC : rightPC;
|
|
2988
|
+
if (ix > 0 && newArray[low] <= merged[ix]) return false;
|
|
2989
|
+
merged.push(newArray[low], newArray[low + 1]);
|
|
2990
|
+
if (isLeft) lx += 2;else rx += 2;
|
|
2991
|
+
ix += 2;
|
|
2992
|
+
next.push(pc);
|
|
2993
|
+
return true;
|
|
2994
|
+
};
|
|
2995
|
+
while (lx < leftLen || rx < rightLen) {
|
|
2996
|
+
if (rx >= rightLen) {
|
|
2997
|
+
ok = extend(true);
|
|
2998
|
+
} else if (lx >= leftLen) {
|
|
2999
|
+
ok = extend(false);
|
|
3000
|
+
} else if (rightRunes[rx] < leftRunes[lx]) {
|
|
3001
|
+
ok = extend(false);
|
|
3002
|
+
} else {
|
|
3003
|
+
ok = extend(true);
|
|
3004
|
+
}
|
|
3005
|
+
if (!ok) return null;
|
|
3006
|
+
}
|
|
3007
|
+
return {
|
|
3008
|
+
merged,
|
|
3009
|
+
next
|
|
3010
|
+
};
|
|
3011
|
+
};
|
|
3012
|
+
class OnePassProg {
|
|
3013
|
+
constructor(prog) {
|
|
3014
|
+
this.start = prog.start;
|
|
3015
|
+
this.numCap = prog.numCap;
|
|
3016
|
+
this.inst = new Array(prog.inst.length);
|
|
3017
|
+
for (let i = 0; i < prog.inst.length; i++) {
|
|
3018
|
+
const orig = prog.inst[i];
|
|
3019
|
+
const inst = new Inst(orig.op);
|
|
3020
|
+
inst.out = orig.out;
|
|
3021
|
+
inst.arg = orig.arg;
|
|
3022
|
+
inst.runes = orig.runes ? orig.runes.slice() : [];
|
|
3023
|
+
inst.next = null;
|
|
3024
|
+
this.inst[i] = inst;
|
|
3025
|
+
}
|
|
3026
|
+
}
|
|
3027
|
+
}
|
|
3028
|
+
const onePassCopy = prog => {
|
|
3029
|
+
const p = new OnePassProg(prog);
|
|
3030
|
+
|
|
3031
|
+
// Rewrites one or more common Prog constructs that enable some otherwise
|
|
3032
|
+
// non-onepass Progs to be onepass.
|
|
3033
|
+
for (let pc = 0; pc < p.inst.length; pc++) {
|
|
3034
|
+
const inst = p.inst[pc];
|
|
3035
|
+
if (inst.op !== Inst.ALT && inst.op !== Inst.ALT_MATCH) continue;
|
|
3036
|
+
let pAOther = 'out';
|
|
3037
|
+
let pAAlt = 'arg';
|
|
3038
|
+
let instAlt = p.inst[inst[pAAlt]];
|
|
3039
|
+
if (instAlt.op !== Inst.ALT && instAlt.op !== Inst.ALT_MATCH) {
|
|
3040
|
+
pAOther = 'arg';
|
|
3041
|
+
pAAlt = 'out';
|
|
3042
|
+
instAlt = p.inst[inst[pAAlt]];
|
|
3043
|
+
if (instAlt.op !== Inst.ALT && instAlt.op !== Inst.ALT_MATCH) continue;
|
|
3044
|
+
}
|
|
3045
|
+
const instOther = p.inst[inst[pAOther]];
|
|
3046
|
+
if (instOther.op === Inst.ALT || instOther.op === Inst.ALT_MATCH) continue;
|
|
3047
|
+
let pBAlt = 'out';
|
|
3048
|
+
let pBOther = 'arg';
|
|
3049
|
+
let patch = false;
|
|
3050
|
+
if (instAlt.out === pc) {
|
|
3051
|
+
patch = true;
|
|
3052
|
+
} else if (instAlt.arg === pc) {
|
|
3053
|
+
patch = true;
|
|
3054
|
+
pBAlt = 'arg';
|
|
3055
|
+
pBOther = 'out';
|
|
3056
|
+
}
|
|
3057
|
+
if (patch) instAlt[pBAlt] = inst[pAOther];
|
|
3058
|
+
if (inst[pAOther] === instAlt[pBAlt]) inst[pAAlt] = instAlt[pBOther];
|
|
3059
|
+
}
|
|
3060
|
+
return p;
|
|
3061
|
+
};
|
|
3062
|
+
const makeOnePass = p => {
|
|
3063
|
+
if (p.inst.length >= 1000) return null;
|
|
3064
|
+
const instQueue = new QueueOnePass(p.inst.length);
|
|
3065
|
+
const visitQueue = new QueueOnePass(p.inst.length);
|
|
3066
|
+
const onePassRunes = new Array(p.inst.length);
|
|
3067
|
+
const m = new Array(p.inst.length).fill(false);
|
|
3068
|
+
const check = pc => {
|
|
3069
|
+
let ok = true;
|
|
3070
|
+
const inst = p.inst[pc];
|
|
3071
|
+
if (visitQueue.contains(pc)) return true;
|
|
3072
|
+
visitQueue.insert(pc);
|
|
3073
|
+
switch (inst.op) {
|
|
3074
|
+
case Inst.ALT:
|
|
3075
|
+
case Inst.ALT_MATCH:
|
|
3076
|
+
{
|
|
3077
|
+
ok = check(inst.out) && check(inst.arg);
|
|
3078
|
+
let matchOut = m[inst.out];
|
|
3079
|
+
let matchArg = m[inst.arg];
|
|
3080
|
+
if (matchOut && matchArg) return false;
|
|
3081
|
+
if (matchArg) {
|
|
3082
|
+
const tempOut = inst.out;
|
|
3083
|
+
inst.out = inst.arg;
|
|
3084
|
+
inst.arg = tempOut;
|
|
3085
|
+
const tempMatch = matchOut;
|
|
3086
|
+
matchOut = matchArg;
|
|
3087
|
+
matchArg = tempMatch;
|
|
3088
|
+
}
|
|
3089
|
+
if (matchOut) {
|
|
3090
|
+
m[pc] = true;
|
|
3091
|
+
inst.op = Inst.ALT_MATCH;
|
|
3092
|
+
}
|
|
3093
|
+
const leftRunes = onePassRunes[inst.out] || [];
|
|
3094
|
+
const rightRunes = onePassRunes[inst.arg] || [];
|
|
3095
|
+
const mergeRes = mergeRuneSets(leftRunes, rightRunes, inst.out, inst.arg);
|
|
3096
|
+
if (!mergeRes) return false;
|
|
3097
|
+
onePassRunes[pc] = mergeRes.merged;
|
|
3098
|
+
inst.next = new Uint32Array(mergeRes.next);
|
|
3099
|
+
break;
|
|
3100
|
+
}
|
|
3101
|
+
case Inst.CAPTURE:
|
|
3102
|
+
case Inst.EMPTY_WIDTH:
|
|
3103
|
+
case Inst.NOP:
|
|
3104
|
+
{
|
|
3105
|
+
ok = check(inst.out);
|
|
3106
|
+
m[pc] = m[inst.out];
|
|
3107
|
+
onePassRunes[pc] = onePassRunes[inst.out] ? onePassRunes[inst.out].slice() : [];
|
|
3108
|
+
inst.next = new Uint32Array(Math.floor(onePassRunes[pc].length / 2) + 1).fill(inst.out);
|
|
3109
|
+
break;
|
|
3110
|
+
}
|
|
3111
|
+
case Inst.MATCH:
|
|
3112
|
+
case Inst.FAIL:
|
|
3113
|
+
{
|
|
3114
|
+
m[pc] = inst.op === Inst.MATCH;
|
|
3115
|
+
break;
|
|
3116
|
+
}
|
|
3117
|
+
case Inst.RUNE:
|
|
3118
|
+
{
|
|
3119
|
+
m[pc] = false;
|
|
3120
|
+
if (inst.next && inst.next.length > 0) break;
|
|
3121
|
+
instQueue.insert(inst.out);
|
|
3122
|
+
if (!inst.runes || inst.runes.length === 0) {
|
|
3123
|
+
onePassRunes[pc] = [];
|
|
3124
|
+
inst.next = new Uint32Array([inst.out]);
|
|
3125
|
+
break;
|
|
3126
|
+
}
|
|
3127
|
+
let runes = [];
|
|
3128
|
+
if (inst.runes.length === 1 && (inst.arg & RE2Flags.FOLD_CASE) !== 0) {
|
|
3129
|
+
const r0 = inst.runes[0];
|
|
3130
|
+
runes.push(r0, r0);
|
|
3131
|
+
for (let r1 = Unicode.simpleFold(r0); r1 !== r0; r1 = Unicode.simpleFold(r1)) {
|
|
3132
|
+
runes.push(r1, r1);
|
|
3133
|
+
}
|
|
3134
|
+
runes.sort((a, b) => a - b);
|
|
3135
|
+
} else {
|
|
3136
|
+
runes.push(...inst.runes);
|
|
3137
|
+
}
|
|
3138
|
+
onePassRunes[pc] = runes;
|
|
3139
|
+
inst.next = new Uint32Array(Math.floor(runes.length / 2) + 1).fill(inst.out);
|
|
3140
|
+
inst.op = Inst.RUNE;
|
|
3141
|
+
break;
|
|
3142
|
+
}
|
|
3143
|
+
case Inst.RUNE1:
|
|
3144
|
+
{
|
|
3145
|
+
m[pc] = false;
|
|
3146
|
+
if (inst.next && inst.next.length > 0) break;
|
|
3147
|
+
instQueue.insert(inst.out);
|
|
3148
|
+
let runes = [];
|
|
3149
|
+
if ((inst.arg & RE2Flags.FOLD_CASE) !== 0) {
|
|
3150
|
+
const r0 = inst.runes[0];
|
|
3151
|
+
runes.push(r0, r0);
|
|
3152
|
+
for (let r1 = Unicode.simpleFold(r0); r1 !== r0; r1 = Unicode.simpleFold(r1)) {
|
|
3153
|
+
runes.push(r1, r1);
|
|
3154
|
+
}
|
|
3155
|
+
runes.sort((a, b) => a - b);
|
|
3156
|
+
} else {
|
|
3157
|
+
runes.push(inst.runes[0], inst.runes[0]);
|
|
3158
|
+
}
|
|
3159
|
+
onePassRunes[pc] = runes;
|
|
3160
|
+
inst.next = new Uint32Array(Math.floor(runes.length / 2) + 1).fill(inst.out);
|
|
3161
|
+
inst.op = Inst.RUNE;
|
|
3162
|
+
break;
|
|
3163
|
+
}
|
|
3164
|
+
case Inst.RUNE_ANY:
|
|
3165
|
+
{
|
|
3166
|
+
m[pc] = false;
|
|
3167
|
+
if (inst.next && inst.next.length > 0) break;
|
|
3168
|
+
instQueue.insert(inst.out);
|
|
3169
|
+
onePassRunes[pc] = [0, Unicode.MAX_RUNE];
|
|
3170
|
+
inst.next = new Uint32Array([inst.out]);
|
|
3171
|
+
break;
|
|
3172
|
+
}
|
|
3173
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
3174
|
+
{
|
|
3175
|
+
m[pc] = false;
|
|
3176
|
+
if (inst.next && inst.next.length > 0) break;
|
|
3177
|
+
instQueue.insert(inst.out);
|
|
3178
|
+
onePassRunes[pc] = [0, 9, 11, Unicode.MAX_RUNE]; // \n is 10
|
|
3179
|
+
inst.next = new Uint32Array(Math.floor(onePassRunes[pc].length / 2) + 1).fill(inst.out);
|
|
3180
|
+
break;
|
|
3181
|
+
}
|
|
3182
|
+
}
|
|
3183
|
+
return ok;
|
|
3184
|
+
};
|
|
3185
|
+
instQueue.clear();
|
|
3186
|
+
instQueue.insert(p.start);
|
|
3187
|
+
while (!instQueue.empty()) {
|
|
3188
|
+
visitQueue.clear();
|
|
3189
|
+
const pc = instQueue.next();
|
|
3190
|
+
if (!check(pc)) return null;
|
|
3191
|
+
}
|
|
3192
|
+
for (let i = 0; i < p.inst.length; i++) {
|
|
3193
|
+
if (onePassRunes[i]) p.inst[i].runes = onePassRunes[i];
|
|
3194
|
+
}
|
|
3195
|
+
return p;
|
|
3196
|
+
};
|
|
3197
|
+
const cleanupOnePass = (p, original) => {
|
|
3198
|
+
for (let ix = 0; ix < original.inst.length; ix++) {
|
|
3199
|
+
const instOriginal = original.inst[ix];
|
|
3200
|
+
switch (instOriginal.op) {
|
|
3201
|
+
case Inst.ALT:
|
|
3202
|
+
case Inst.ALT_MATCH:
|
|
3203
|
+
case Inst.RUNE:
|
|
3204
|
+
break;
|
|
3205
|
+
case Inst.CAPTURE:
|
|
3206
|
+
case Inst.EMPTY_WIDTH:
|
|
3207
|
+
case Inst.NOP:
|
|
3208
|
+
case Inst.MATCH:
|
|
3209
|
+
case Inst.FAIL:
|
|
3210
|
+
p.inst[ix].next = null;
|
|
3211
|
+
break;
|
|
3212
|
+
case Inst.RUNE1:
|
|
3213
|
+
case Inst.RUNE_ANY:
|
|
3214
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
3215
|
+
p.inst[ix].next = null;
|
|
3216
|
+
p.inst[ix].op = instOriginal.op;
|
|
3217
|
+
p.inst[ix].runes = instOriginal.runes ? instOriginal.runes.slice() : [];
|
|
3218
|
+
break;
|
|
3219
|
+
}
|
|
3220
|
+
}
|
|
3221
|
+
};
|
|
3222
|
+
class OnePass {
|
|
3223
|
+
static compile(prog) {
|
|
3224
|
+
if (prog.start === 0) return null;
|
|
3225
|
+
const startInst = prog.inst[prog.start];
|
|
3226
|
+
// onepass regexps must be strictly anchored
|
|
3227
|
+
if (startInst.op !== Inst.EMPTY_WIDTH || (startInst.arg & Utils.EMPTY_BEGIN_TEXT) === 0) {
|
|
3228
|
+
return null;
|
|
2279
3229
|
}
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
const key = charCode + (anchor === RE2Flags.UNANCHORED ? 0 : Unicode.MAX_RUNE + 1);
|
|
2287
|
-
state.nextMap.set(key, nextState);
|
|
3230
|
+
let hasAlt = false;
|
|
3231
|
+
for (let i = 0; i < prog.inst.length; i++) {
|
|
3232
|
+
if (prog.inst[i].op === Inst.ALT || prog.inst[i].op === Inst.ALT_MATCH) {
|
|
3233
|
+
hasAlt = true;
|
|
3234
|
+
break;
|
|
3235
|
+
}
|
|
2288
3236
|
}
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
3237
|
+
for (let i = 0; i < prog.inst.length; i++) {
|
|
3238
|
+
const inst = prog.inst[i];
|
|
3239
|
+
const opOut = prog.inst[inst.out].op;
|
|
3240
|
+
switch (inst.op) {
|
|
3241
|
+
case Inst.ALT:
|
|
3242
|
+
case Inst.ALT_MATCH:
|
|
3243
|
+
if (opOut === Inst.MATCH || prog.inst[inst.arg].op === Inst.MATCH) {
|
|
3244
|
+
return null;
|
|
3245
|
+
}
|
|
3246
|
+
break;
|
|
3247
|
+
case Inst.EMPTY_WIDTH:
|
|
3248
|
+
if (opOut === Inst.MATCH) {
|
|
3249
|
+
if ((inst.arg & Utils.EMPTY_END_TEXT) === Utils.EMPTY_END_TEXT) {
|
|
3250
|
+
continue;
|
|
3251
|
+
}
|
|
3252
|
+
return null;
|
|
3253
|
+
}
|
|
3254
|
+
break;
|
|
3255
|
+
default:
|
|
3256
|
+
if (opOut === Inst.MATCH && hasAlt) {
|
|
3257
|
+
return null;
|
|
3258
|
+
}
|
|
3259
|
+
break;
|
|
3260
|
+
}
|
|
2296
3261
|
}
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
3262
|
+
let p = onePassCopy(prog);
|
|
3263
|
+
p = makeOnePass(p);
|
|
3264
|
+
if (p !== null) {
|
|
3265
|
+
cleanupOnePass(p, prog);
|
|
2300
3266
|
}
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
3267
|
+
return p;
|
|
3268
|
+
}
|
|
3269
|
+
static next(inst, r) {
|
|
3270
|
+
const nextIdx = inst.matchRunePos(r);
|
|
3271
|
+
if (nextIdx >= 0) return inst.next[nextIdx];
|
|
3272
|
+
if (inst.op === Inst.ALT_MATCH) return inst.out;
|
|
3273
|
+
return 0; // fail
|
|
3274
|
+
}
|
|
3275
|
+
static execute(re2, input, pos, anchor, ncap) {
|
|
3276
|
+
const onepass = re2.onepass;
|
|
3277
|
+
if (!onepass) return null;
|
|
3278
|
+
const matchcap = new Int32Array(ncap).fill(-1);
|
|
3279
|
+
let matched = false;
|
|
3280
|
+
let r = input.step(pos);
|
|
3281
|
+
let rune = r >> 3;
|
|
3282
|
+
let width = r & 7;
|
|
3283
|
+
let r1 = MachineInputBase.EOF();
|
|
3284
|
+
let rune1 = -1;
|
|
3285
|
+
let width1 = 0;
|
|
3286
|
+
if (r !== MachineInputBase.EOF()) {
|
|
3287
|
+
r1 = input.step(pos + width);
|
|
3288
|
+
if (r1 !== MachineInputBase.EOF()) {
|
|
3289
|
+
rune1 = r1 >> 3;
|
|
3290
|
+
width1 = r1 & 7;
|
|
2308
3291
|
}
|
|
2309
3292
|
}
|
|
2310
|
-
let
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
|
|
3293
|
+
let flag = pos === 0 ? Utils.emptyOpContext(-1, rune) : input.context(pos);
|
|
3294
|
+
let pc = onepass.start;
|
|
3295
|
+
let inst;
|
|
3296
|
+
while (true) {
|
|
3297
|
+
inst = onepass.inst[pc];
|
|
3298
|
+
pc = inst.out;
|
|
3299
|
+
switch (inst.op) {
|
|
3300
|
+
case Inst.MATCH:
|
|
3301
|
+
{
|
|
3302
|
+
matched = true;
|
|
3303
|
+
if (matchcap.length > 0) {
|
|
3304
|
+
matchcap[0] = 0;
|
|
3305
|
+
matchcap[1] = pos;
|
|
3306
|
+
}
|
|
3307
|
+
return ncap === 0 ? [] : Array.from(matchcap);
|
|
3308
|
+
}
|
|
3309
|
+
case Inst.RUNE:
|
|
3310
|
+
if (!inst.matchRune(rune)) return null;
|
|
3311
|
+
break;
|
|
3312
|
+
case Inst.RUNE1:
|
|
3313
|
+
if (rune !== inst.runes[0]) return null;
|
|
3314
|
+
break;
|
|
3315
|
+
case Inst.RUNE_ANY:
|
|
3316
|
+
break;
|
|
3317
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
3318
|
+
if (rune === 10) return null;
|
|
3319
|
+
break;
|
|
3320
|
+
case Inst.ALT:
|
|
3321
|
+
case Inst.ALT_MATCH:
|
|
3322
|
+
pc = OnePass.next(inst, rune);
|
|
3323
|
+
continue;
|
|
3324
|
+
case Inst.FAIL:
|
|
3325
|
+
return null;
|
|
3326
|
+
case Inst.NOP:
|
|
3327
|
+
continue;
|
|
3328
|
+
case Inst.EMPTY_WIDTH:
|
|
3329
|
+
if ((inst.arg & ~flag) !== 0) return null;
|
|
3330
|
+
continue;
|
|
3331
|
+
case Inst.CAPTURE:
|
|
3332
|
+
if (inst.arg < matchcap.length) {
|
|
3333
|
+
matchcap[inst.arg] = pos;
|
|
3334
|
+
}
|
|
3335
|
+
continue;
|
|
3336
|
+
default:
|
|
3337
|
+
throw new RE2JSInternalException('bad inst');
|
|
2319
3338
|
}
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
3339
|
+
if (width === 0) break;
|
|
3340
|
+
flag = Utils.emptyOpContext(rune, rune1);
|
|
3341
|
+
pos += width;
|
|
3342
|
+
rune = rune1;
|
|
3343
|
+
width = width1;
|
|
3344
|
+
if (rune !== -1) {
|
|
3345
|
+
r1 = input.step(pos + width);
|
|
3346
|
+
if (r1 !== MachineInputBase.EOF()) {
|
|
3347
|
+
rune1 = r1 >> 3;
|
|
3348
|
+
width1 = r1 & 7;
|
|
2327
3349
|
} else {
|
|
2328
|
-
|
|
3350
|
+
rune1 = -1;
|
|
3351
|
+
width1 = 0;
|
|
2329
3352
|
}
|
|
2330
3353
|
}
|
|
2331
|
-
|
|
2332
|
-
// If we hit a dead end, and anchored, fail early
|
|
2333
|
-
if (currentState.nfaStates.length === 0) {
|
|
2334
|
-
if (anchor !== RE2Flags.UNANCHORED) return false;
|
|
2335
|
-
}
|
|
2336
|
-
i += width;
|
|
2337
3354
|
}
|
|
2338
|
-
return
|
|
3355
|
+
if (!matched) return null;
|
|
3356
|
+
return ncap === 0 ? [] : Array.from(matchcap);
|
|
2339
3357
|
}
|
|
2340
3358
|
}
|
|
2341
3359
|
|
|
@@ -2420,7 +3438,7 @@ class Regexp {
|
|
|
2420
3438
|
this.max = 0; // max for REPEAT
|
|
2421
3439
|
this.cap = 0; // capturing index, for CAPTURE
|
|
2422
3440
|
this.name = null; // capturing name, for CAPTURE
|
|
2423
|
-
this.namedGroups =
|
|
3441
|
+
this.namedGroups = Object.create(null); // map of group name -> capturing index
|
|
2424
3442
|
}
|
|
2425
3443
|
reinit() {
|
|
2426
3444
|
this.flags = 0;
|
|
@@ -2430,7 +3448,7 @@ class Regexp {
|
|
|
2430
3448
|
this.min = 0;
|
|
2431
3449
|
this.max = 0;
|
|
2432
3450
|
this.name = null;
|
|
2433
|
-
this.namedGroups =
|
|
3451
|
+
this.namedGroups = Object.create(null);
|
|
2434
3452
|
}
|
|
2435
3453
|
toString() {
|
|
2436
3454
|
return this.appendTo();
|
|
@@ -2690,6 +3708,188 @@ class Regexp {
|
|
|
2690
3708
|
}
|
|
2691
3709
|
}
|
|
2692
3710
|
|
|
3711
|
+
class Prefilter {
|
|
3712
|
+
static Type = {
|
|
3713
|
+
NONE: 0,
|
|
3714
|
+
EXACT: 1,
|
|
3715
|
+
AND: 2,
|
|
3716
|
+
OR: 3
|
|
3717
|
+
};
|
|
3718
|
+
constructor(type) {
|
|
3719
|
+
this.type = type;
|
|
3720
|
+
this.subs = [];
|
|
3721
|
+
this.str = '';
|
|
3722
|
+
this.bytes = null;
|
|
3723
|
+
}
|
|
3724
|
+
eval(input, pos) {
|
|
3725
|
+
switch (this.type) {
|
|
3726
|
+
case Prefilter.Type.NONE:
|
|
3727
|
+
return true;
|
|
3728
|
+
case Prefilter.Type.EXACT:
|
|
3729
|
+
return input.hasString(this, pos);
|
|
3730
|
+
case Prefilter.Type.AND:
|
|
3731
|
+
for (let i = 0; i < this.subs.length; i++) {
|
|
3732
|
+
if (!this.subs[i].eval(input, pos)) return false;
|
|
3733
|
+
}
|
|
3734
|
+
return true;
|
|
3735
|
+
case Prefilter.Type.OR:
|
|
3736
|
+
for (let i = 0; i < this.subs.length; i++) {
|
|
3737
|
+
if (this.subs[i].eval(input, pos)) return true;
|
|
3738
|
+
}
|
|
3739
|
+
return false;
|
|
3740
|
+
default:
|
|
3741
|
+
return true;
|
|
3742
|
+
}
|
|
3743
|
+
}
|
|
3744
|
+
}
|
|
3745
|
+
class PrefilterTree {
|
|
3746
|
+
static build(re) {
|
|
3747
|
+
const pf = PrefilterTree.fromRegexp(re);
|
|
3748
|
+
return PrefilterTree.simplify(pf);
|
|
3749
|
+
}
|
|
3750
|
+
static fromRegexp(re) {
|
|
3751
|
+
if (!re) return new Prefilter(Prefilter.Type.NONE);
|
|
3752
|
+
switch (re.op) {
|
|
3753
|
+
case Regexp.Op.NO_MATCH:
|
|
3754
|
+
case Regexp.Op.EMPTY_MATCH:
|
|
3755
|
+
case Regexp.Op.BEGIN_LINE:
|
|
3756
|
+
case Regexp.Op.END_LINE:
|
|
3757
|
+
case Regexp.Op.BEGIN_TEXT:
|
|
3758
|
+
case Regexp.Op.END_TEXT:
|
|
3759
|
+
case Regexp.Op.WORD_BOUNDARY:
|
|
3760
|
+
case Regexp.Op.NO_WORD_BOUNDARY:
|
|
3761
|
+
case Regexp.Op.CHAR_CLASS:
|
|
3762
|
+
case Regexp.Op.ANY_CHAR_NOT_NL:
|
|
3763
|
+
case Regexp.Op.ANY_CHAR:
|
|
3764
|
+
{
|
|
3765
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3766
|
+
}
|
|
3767
|
+
case Regexp.Op.LITERAL:
|
|
3768
|
+
{
|
|
3769
|
+
if (re.runes.length === 0 || (re.flags & RE2Flags.FOLD_CASE) !== 0) {
|
|
3770
|
+
// Skip case-folded literals for simplicity
|
|
3771
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3772
|
+
}
|
|
3773
|
+
const pf = new Prefilter(Prefilter.Type.EXACT);
|
|
3774
|
+
let str = '';
|
|
3775
|
+
for (let i = 0; i < re.runes.length; i++) {
|
|
3776
|
+
str += String.fromCodePoint(re.runes[i]);
|
|
3777
|
+
}
|
|
3778
|
+
pf.str = str;
|
|
3779
|
+
pf.bytes = Utils.stringToUtf8ByteArray(pf.str);
|
|
3780
|
+
return pf;
|
|
3781
|
+
}
|
|
3782
|
+
case Regexp.Op.CAPTURE:
|
|
3783
|
+
case Regexp.Op.PLUS:
|
|
3784
|
+
{
|
|
3785
|
+
return PrefilterTree.fromRegexp(re.subs[0]);
|
|
3786
|
+
}
|
|
3787
|
+
case Regexp.Op.REPEAT:
|
|
3788
|
+
{
|
|
3789
|
+
if (re.min >= 1) {
|
|
3790
|
+
return PrefilterTree.fromRegexp(re.subs[0]);
|
|
3791
|
+
}
|
|
3792
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3793
|
+
}
|
|
3794
|
+
case Regexp.Op.CONCAT:
|
|
3795
|
+
{
|
|
3796
|
+
const pf = new Prefilter(Prefilter.Type.AND);
|
|
3797
|
+
for (const sub of re.subs) {
|
|
3798
|
+
pf.subs.push(PrefilterTree.fromRegexp(sub));
|
|
3799
|
+
}
|
|
3800
|
+
return pf;
|
|
3801
|
+
}
|
|
3802
|
+
case Regexp.Op.ALTERNATE:
|
|
3803
|
+
{
|
|
3804
|
+
const pf = new Prefilter(Prefilter.Type.OR);
|
|
3805
|
+
for (const sub of re.subs) {
|
|
3806
|
+
pf.subs.push(PrefilterTree.fromRegexp(sub));
|
|
3807
|
+
}
|
|
3808
|
+
return pf;
|
|
3809
|
+
}
|
|
3810
|
+
default:
|
|
3811
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3812
|
+
}
|
|
3813
|
+
}
|
|
3814
|
+
static simplify(pf) {
|
|
3815
|
+
if (pf.type === Prefilter.Type.EXACT || pf.type === Prefilter.Type.NONE) {
|
|
3816
|
+
return pf;
|
|
3817
|
+
}
|
|
3818
|
+
if (pf.type === Prefilter.Type.AND) {
|
|
3819
|
+
const newSubs = [];
|
|
3820
|
+
for (const sub of pf.subs) {
|
|
3821
|
+
const s = PrefilterTree.simplify(sub);
|
|
3822
|
+
if (s.type !== Prefilter.Type.NONE) {
|
|
3823
|
+
if (s.type === Prefilter.Type.AND) {
|
|
3824
|
+
newSubs.push(...s.subs);
|
|
3825
|
+
} else {
|
|
3826
|
+
newSubs.push(s);
|
|
3827
|
+
}
|
|
3828
|
+
}
|
|
3829
|
+
}
|
|
3830
|
+
if (newSubs.length === 0) return new Prefilter(Prefilter.Type.NONE);
|
|
3831
|
+
if (newSubs.length === 1) return newSubs[0];
|
|
3832
|
+
pf.subs = newSubs;
|
|
3833
|
+
return pf;
|
|
3834
|
+
}
|
|
3835
|
+
if (pf.type === Prefilter.Type.OR) {
|
|
3836
|
+
const newSubs = [];
|
|
3837
|
+
for (const sub of pf.subs) {
|
|
3838
|
+
const s = PrefilterTree.simplify(sub);
|
|
3839
|
+
if (s.type === Prefilter.Type.NONE) {
|
|
3840
|
+
// If any branch of an OR has no requirements, the whole OR has no requirements
|
|
3841
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3842
|
+
}
|
|
3843
|
+
if (s.type === Prefilter.Type.OR) {
|
|
3844
|
+
newSubs.push(...s.subs);
|
|
3845
|
+
} else {
|
|
3846
|
+
newSubs.push(s);
|
|
3847
|
+
}
|
|
3848
|
+
}
|
|
3849
|
+
if (newSubs.length === 0) return new Prefilter(Prefilter.Type.NONE);
|
|
3850
|
+
if (newSubs.length === 1) return newSubs[0];
|
|
3851
|
+
|
|
3852
|
+
// De-duplicate EXACT branches
|
|
3853
|
+
const seen = new Set();
|
|
3854
|
+
const uniqueSubs = [];
|
|
3855
|
+
for (const sub of newSubs) {
|
|
3856
|
+
if (sub.type === Prefilter.Type.EXACT) {
|
|
3857
|
+
if (!seen.has(sub.str)) {
|
|
3858
|
+
seen.add(sub.str);
|
|
3859
|
+
uniqueSubs.push(sub);
|
|
3860
|
+
}
|
|
3861
|
+
} else {
|
|
3862
|
+
uniqueSubs.push(sub);
|
|
3863
|
+
}
|
|
3864
|
+
}
|
|
3865
|
+
pf.subs = uniqueSubs;
|
|
3866
|
+
return pf;
|
|
3867
|
+
}
|
|
3868
|
+
return pf;
|
|
3869
|
+
}
|
|
3870
|
+
}
|
|
3871
|
+
|
|
3872
|
+
/**
|
|
3873
|
+
* A list of instruction pointers waiting to be patched.
|
|
3874
|
+
* Tracks both `head` and `tail` to allow O(1) appending during compilation.
|
|
3875
|
+
* * Values are encoded integers, not standard memory pointers:
|
|
3876
|
+
* - Program instruction index: `l >> 1`
|
|
3877
|
+
* - Patch `.out` field if: `(l & 1) === 0`
|
|
3878
|
+
* - Patch `.arg` field if: `(l & 1) === 1`
|
|
3879
|
+
* - `0` denotes an empty list.
|
|
3880
|
+
* * @see https://swtch.com/~rsc/regexp/regexp1.html
|
|
3881
|
+
*/
|
|
3882
|
+
class PatchList {
|
|
3883
|
+
/**
|
|
3884
|
+
* @param {number} head - Encoded pointer to the start of the patch list.
|
|
3885
|
+
* @param {number} tail - Encoded pointer to the end of the patch list.
|
|
3886
|
+
*/
|
|
3887
|
+
constructor(head = 0, tail = 0) {
|
|
3888
|
+
this.head = head;
|
|
3889
|
+
this.tail = tail;
|
|
3890
|
+
}
|
|
3891
|
+
}
|
|
3892
|
+
|
|
2693
3893
|
/**
|
|
2694
3894
|
* A Prog is a compiled regular expression program.
|
|
2695
3895
|
*/
|
|
@@ -2791,39 +3991,30 @@ class Prog {
|
|
|
2791
3991
|
return i.arg;
|
|
2792
3992
|
}
|
|
2793
3993
|
patch(l, val) {
|
|
2794
|
-
|
|
2795
|
-
|
|
2796
|
-
|
|
2797
|
-
|
|
3994
|
+
let head = l.head;
|
|
3995
|
+
while (head !== 0) {
|
|
3996
|
+
const i = this.inst[head >> 1];
|
|
3997
|
+
if ((head & 1) === 0) {
|
|
3998
|
+
head = i.out;
|
|
2798
3999
|
i.out = val;
|
|
2799
4000
|
} else {
|
|
2800
|
-
|
|
4001
|
+
head = i.arg;
|
|
2801
4002
|
i.arg = val;
|
|
2802
4003
|
}
|
|
2803
4004
|
}
|
|
2804
4005
|
}
|
|
2805
4006
|
append(l1, l2) {
|
|
2806
|
-
if (l1 === 0)
|
|
2807
|
-
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
|
|
2811
|
-
|
|
2812
|
-
|
|
2813
|
-
for (;;) {
|
|
2814
|
-
const next = this.next(last);
|
|
2815
|
-
if (next === 0) {
|
|
2816
|
-
break;
|
|
2817
|
-
}
|
|
2818
|
-
last = next;
|
|
2819
|
-
}
|
|
2820
|
-
const i = this.inst[last >> 1];
|
|
2821
|
-
if ((last & 1) === 0) {
|
|
2822
|
-
i.out = l2;
|
|
4007
|
+
if (l1.head === 0) return l2;
|
|
4008
|
+
if (l2.head === 0) return l1;
|
|
4009
|
+
|
|
4010
|
+
// We know exactly where the tail is
|
|
4011
|
+
const i = this.inst[l1.tail >> 1];
|
|
4012
|
+
if ((l1.tail & 1) === 0) {
|
|
4013
|
+
i.out = l2.head;
|
|
2823
4014
|
} else {
|
|
2824
|
-
i.arg = l2;
|
|
4015
|
+
i.arg = l2.head;
|
|
2825
4016
|
}
|
|
2826
|
-
return l1;
|
|
4017
|
+
return new PatchList(l1.head, l2.tail);
|
|
2827
4018
|
}
|
|
2828
4019
|
/**
|
|
2829
4020
|
*
|
|
@@ -2852,7 +4043,7 @@ class Prog {
|
|
|
2852
4043
|
* @class
|
|
2853
4044
|
*/
|
|
2854
4045
|
class Frag {
|
|
2855
|
-
constructor(i = 0, out =
|
|
4046
|
+
constructor(i = 0, out = new PatchList(), nullable = false) {
|
|
2856
4047
|
this.i = i; // an instruction address (pc).
|
|
2857
4048
|
this.out = out; // a patch list; see explanation in Prog.js
|
|
2858
4049
|
this.nullable = nullable; // whether the fragment can match the empty string
|
|
@@ -2877,6 +4068,33 @@ class Compiler {
|
|
|
2877
4068
|
c.prog.start = f.i;
|
|
2878
4069
|
return c.prog;
|
|
2879
4070
|
}
|
|
4071
|
+
static compileSet(regexps) {
|
|
4072
|
+
const c = new Compiler();
|
|
4073
|
+
if (regexps.length === 0) {
|
|
4074
|
+
c.prog.start = c.newInst(Inst.FAIL).i;
|
|
4075
|
+
return c.prog;
|
|
4076
|
+
}
|
|
4077
|
+
let starts = [];
|
|
4078
|
+
for (let i = 0; i < regexps.length; i++) {
|
|
4079
|
+
const f = c.compile(regexps[i]);
|
|
4080
|
+
const m = c.newInst(Inst.MATCH);
|
|
4081
|
+
c.prog.getInst(m.i).arg = i; // Store the regex index
|
|
4082
|
+
c.prog.patch(f.out, m.i);
|
|
4083
|
+
starts.push(f.i);
|
|
4084
|
+
}
|
|
4085
|
+
|
|
4086
|
+
// Link starts together via ALT
|
|
4087
|
+
let start = starts[0];
|
|
4088
|
+
for (let i = 1; i < starts.length; i++) {
|
|
4089
|
+
const f = c.newInst(Inst.ALT);
|
|
4090
|
+
const inst = c.prog.getInst(f.i);
|
|
4091
|
+
inst.out = start;
|
|
4092
|
+
inst.arg = starts[i];
|
|
4093
|
+
start = f.i;
|
|
4094
|
+
}
|
|
4095
|
+
c.prog.start = start;
|
|
4096
|
+
return c.prog;
|
|
4097
|
+
}
|
|
2880
4098
|
constructor() {
|
|
2881
4099
|
this.prog = new Prog();
|
|
2882
4100
|
this.newInst(Inst.FAIL);
|
|
@@ -2889,7 +4107,7 @@ class Compiler {
|
|
|
2889
4107
|
// Returns a no-op fragment. Sometimes unavoidable.
|
|
2890
4108
|
nop() {
|
|
2891
4109
|
const f = this.newInst(Inst.NOP);
|
|
2892
|
-
f.out = f.i << 1;
|
|
4110
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2893
4111
|
return f;
|
|
2894
4112
|
}
|
|
2895
4113
|
fail() {
|
|
@@ -2900,7 +4118,7 @@ class Compiler {
|
|
|
2900
4118
|
// Given a fragment a, returns a fragment with capturing parens around a.
|
|
2901
4119
|
cap(arg) {
|
|
2902
4120
|
const f = this.newInst(Inst.CAPTURE);
|
|
2903
|
-
f.out = f.i << 1;
|
|
4121
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2904
4122
|
this.prog.getInst(f.i).arg = arg;
|
|
2905
4123
|
if (this.prog.numCap < arg + 1) {
|
|
2906
4124
|
this.prog.numCap = arg + 1;
|
|
@@ -2948,10 +4166,10 @@ class Compiler {
|
|
|
2948
4166
|
const i = this.prog.getInst(f.i);
|
|
2949
4167
|
if (nongreedy) {
|
|
2950
4168
|
i.arg = f1.i;
|
|
2951
|
-
f.out = f.i << 1;
|
|
4169
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2952
4170
|
} else {
|
|
2953
4171
|
i.out = f1.i;
|
|
2954
|
-
f.out = f.i << 1 | 1;
|
|
4172
|
+
f.out = new PatchList(f.i << 1 | 1, f.i << 1 | 1);
|
|
2955
4173
|
}
|
|
2956
4174
|
this.prog.patch(f1.out, f.i);
|
|
2957
4175
|
return f;
|
|
@@ -2963,10 +4181,10 @@ class Compiler {
|
|
|
2963
4181
|
const i = this.prog.getInst(f.i);
|
|
2964
4182
|
if (nongreedy) {
|
|
2965
4183
|
i.arg = f1.i;
|
|
2966
|
-
f.out = f.i << 1;
|
|
4184
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2967
4185
|
} else {
|
|
2968
4186
|
i.out = f1.i;
|
|
2969
|
-
f.out = f.i << 1 | 1;
|
|
4187
|
+
f.out = new PatchList(f.i << 1 | 1, f.i << 1 | 1);
|
|
2970
4188
|
}
|
|
2971
4189
|
f.out = this.prog.append(f.out, f1.out);
|
|
2972
4190
|
return f;
|
|
@@ -2989,7 +4207,7 @@ class Compiler {
|
|
|
2989
4207
|
empty(op) {
|
|
2990
4208
|
const f = this.newInst(Inst.EMPTY_WIDTH);
|
|
2991
4209
|
this.prog.getInst(f.i).arg = op;
|
|
2992
|
-
f.out = f.i << 1;
|
|
4210
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2993
4211
|
return f;
|
|
2994
4212
|
}
|
|
2995
4213
|
|
|
@@ -3004,7 +4222,7 @@ class Compiler {
|
|
|
3004
4222
|
flags &= -2;
|
|
3005
4223
|
}
|
|
3006
4224
|
i.arg = flags;
|
|
3007
|
-
f.out = f.i << 1;
|
|
4225
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
3008
4226
|
if ((flags & RE2Flags.FOLD_CASE) === 0 && runes.length === 1 || runes.length === 2 && runes[0] === runes[1]) {
|
|
3009
4227
|
i.op = Inst.RUNE1;
|
|
3010
4228
|
} else if (runes.length === 2 && runes[0] === 0 && runes[1] === Unicode.MAX_RUNE) {
|
|
@@ -3109,23 +4327,92 @@ class Simplify {
|
|
|
3109
4327
|
}
|
|
3110
4328
|
switch (re.op) {
|
|
3111
4329
|
case Regexp.Op.CAPTURE:
|
|
4330
|
+
{
|
|
4331
|
+
const sub = Simplify.simplify(re.subs[0]);
|
|
4332
|
+
if (sub !== re.subs[0]) {
|
|
4333
|
+
const nre = Regexp.fromRegexp(re);
|
|
4334
|
+
nre.runes = [];
|
|
4335
|
+
nre.subs = [sub];
|
|
4336
|
+
return nre;
|
|
4337
|
+
}
|
|
4338
|
+
return re;
|
|
4339
|
+
}
|
|
3112
4340
|
case Regexp.Op.CONCAT:
|
|
3113
4341
|
case Regexp.Op.ALTERNATE:
|
|
3114
4342
|
{
|
|
3115
|
-
|
|
4343
|
+
const newSubs = [];
|
|
4344
|
+
let changed = false;
|
|
3116
4345
|
for (let i = 0; i < re.subs.length; i++) {
|
|
3117
4346
|
const sub = re.subs[i];
|
|
3118
4347
|
const nsub = Simplify.simplify(sub);
|
|
3119
|
-
if (
|
|
3120
|
-
|
|
3121
|
-
|
|
3122
|
-
|
|
4348
|
+
if (nsub !== sub) {
|
|
4349
|
+
changed = true;
|
|
4350
|
+
}
|
|
4351
|
+
if (re.op === Regexp.Op.CONCAT) {
|
|
4352
|
+
// If any part of a CONCAT is mathematically impossible,
|
|
4353
|
+
// the entire CONCAT sequence becomes impossible.
|
|
4354
|
+
if (nsub.op === Regexp.Op.NO_MATCH) {
|
|
4355
|
+
return new Regexp(Regexp.Op.NO_MATCH);
|
|
4356
|
+
}
|
|
4357
|
+
// Drop empty 0-width match nodes entirely from sequences
|
|
4358
|
+
if (nsub.op === Regexp.Op.EMPTY_MATCH) {
|
|
4359
|
+
changed = true;
|
|
4360
|
+
continue;
|
|
4361
|
+
}
|
|
4362
|
+
// Flatten nested concatenations
|
|
4363
|
+
if (nsub.op === Regexp.Op.CONCAT) {
|
|
4364
|
+
changed = true;
|
|
4365
|
+
newSubs.push(...nsub.subs);
|
|
4366
|
+
continue;
|
|
4367
|
+
}
|
|
4368
|
+
} else if (re.op === Regexp.Op.ALTERNATE) {
|
|
4369
|
+
// Drop impossible branches from alternations
|
|
4370
|
+
if (nsub.op === Regexp.Op.NO_MATCH) {
|
|
4371
|
+
changed = true;
|
|
4372
|
+
continue;
|
|
4373
|
+
}
|
|
4374
|
+
// Flatten nested alternations
|
|
4375
|
+
if (nsub.op === Regexp.Op.ALTERNATE) {
|
|
4376
|
+
changed = true;
|
|
4377
|
+
newSubs.push(...nsub.subs);
|
|
4378
|
+
continue;
|
|
4379
|
+
}
|
|
4380
|
+
}
|
|
4381
|
+
newSubs.push(nsub);
|
|
4382
|
+
}
|
|
4383
|
+
if (changed) {
|
|
4384
|
+
// If we filtered out all nodes, return the mathematically correct fallback
|
|
4385
|
+
if (newSubs.length === 0) {
|
|
4386
|
+
return new Regexp(re.op === Regexp.Op.CONCAT ? Regexp.Op.EMPTY_MATCH : Regexp.Op.NO_MATCH);
|
|
3123
4387
|
}
|
|
3124
|
-
|
|
3125
|
-
|
|
4388
|
+
// If only 1 node remains, we don't need a CONCAT/ALT container at all
|
|
4389
|
+
if (newSubs.length === 1) {
|
|
4390
|
+
return newSubs[0];
|
|
3126
4391
|
}
|
|
4392
|
+
const nre = Regexp.fromRegexp(re);
|
|
4393
|
+
nre.runes = [];
|
|
4394
|
+
nre.subs = newSubs;
|
|
4395
|
+
return nre;
|
|
4396
|
+
}
|
|
4397
|
+
return re;
|
|
4398
|
+
}
|
|
4399
|
+
case Regexp.Op.CHAR_CLASS:
|
|
4400
|
+
{
|
|
4401
|
+
if (re.runes === null) return re;
|
|
4402
|
+
|
|
4403
|
+
// Empty character classes match nothing.
|
|
4404
|
+
if (re.runes.length === 0) {
|
|
4405
|
+
return new Regexp(Regexp.Op.NO_MATCH);
|
|
4406
|
+
}
|
|
4407
|
+
// Full character classes match everything.
|
|
4408
|
+
if (re.runes.length === 2 && re.runes[0] === 0 && re.runes[1] === Unicode.MAX_RUNE) {
|
|
4409
|
+
return new Regexp(Regexp.Op.ANY_CHAR);
|
|
4410
|
+
}
|
|
4411
|
+
// Standard catch-all except newline
|
|
4412
|
+
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) {
|
|
4413
|
+
return new Regexp(Regexp.Op.ANY_CHAR_NOT_NL);
|
|
3127
4414
|
}
|
|
3128
|
-
return
|
|
4415
|
+
return re;
|
|
3129
4416
|
}
|
|
3130
4417
|
case Regexp.Op.STAR:
|
|
3131
4418
|
case Regexp.Op.PLUS:
|
|
@@ -3162,7 +4449,9 @@ class Simplify {
|
|
|
3162
4449
|
}
|
|
3163
4450
|
subs.push(Simplify.simplify1(Regexp.Op.PLUS, re.flags, sub, null));
|
|
3164
4451
|
nre.subs = subs.slice(0);
|
|
3165
|
-
|
|
4452
|
+
|
|
4453
|
+
// Ensure newly created CONCAT is properly flattened
|
|
4454
|
+
return Simplify.simplify(nre);
|
|
3166
4455
|
}
|
|
3167
4456
|
// Special case x{0} handled above.
|
|
3168
4457
|
|
|
@@ -3200,7 +4489,8 @@ class Simplify {
|
|
|
3200
4489
|
if (prefixSubs !== null) {
|
|
3201
4490
|
const prefix = new Regexp(Regexp.Op.CONCAT);
|
|
3202
4491
|
prefix.subs = prefixSubs.slice(0);
|
|
3203
|
-
|
|
4492
|
+
// Ensure newly created CONCAT is properly flattened
|
|
4493
|
+
return Simplify.simplify(prefix);
|
|
3204
4494
|
}
|
|
3205
4495
|
|
|
3206
4496
|
// Some degenerate case like min > max or min < max < 0.
|
|
@@ -3233,6 +4523,13 @@ class Simplify {
|
|
|
3233
4523
|
return sub;
|
|
3234
4524
|
}
|
|
3235
4525
|
|
|
4526
|
+
// Handle impossible targets gracefully.
|
|
4527
|
+
// e.g. Trying to match "NO_MATCH" 0 or 1 times (QUEST/STAR) evaluates to EMPTY_MATCH.
|
|
4528
|
+
if (sub.op === Regexp.Op.NO_MATCH) {
|
|
4529
|
+
if (op === Regexp.Op.PLUS) return sub; // 1+ times is impossible
|
|
4530
|
+
return new Regexp(Regexp.Op.EMPTY_MATCH);
|
|
4531
|
+
}
|
|
4532
|
+
|
|
3236
4533
|
// The operators are idempotent if the flags match.
|
|
3237
4534
|
if (op === sub.op && (flags & RE2Flags.NON_GREEDY) === (sub.flags & RE2Flags.NON_GREEDY)) {
|
|
3238
4535
|
return sub;
|
|
@@ -3240,10 +4537,10 @@ class Simplify {
|
|
|
3240
4537
|
if (re !== null && re.op === op && (re.flags & RE2Flags.NON_GREEDY) === (flags & RE2Flags.NON_GREEDY) && sub === re.subs[0]) {
|
|
3241
4538
|
return re;
|
|
3242
4539
|
}
|
|
3243
|
-
|
|
3244
|
-
|
|
3245
|
-
|
|
3246
|
-
return
|
|
4540
|
+
const nre = new Regexp(op);
|
|
4541
|
+
nre.flags = flags;
|
|
4542
|
+
nre.subs = [sub];
|
|
4543
|
+
return nre;
|
|
3247
4544
|
}
|
|
3248
4545
|
}
|
|
3249
4546
|
|
|
@@ -3589,16 +4886,6 @@ class CharClass {
|
|
|
3589
4886
|
}
|
|
3590
4887
|
}
|
|
3591
4888
|
|
|
3592
|
-
class Pair {
|
|
3593
|
-
static of(first, second) {
|
|
3594
|
-
return new Pair(first, second);
|
|
3595
|
-
}
|
|
3596
|
-
constructor(first, second) {
|
|
3597
|
-
this.first = first;
|
|
3598
|
-
this.second = second;
|
|
3599
|
-
}
|
|
3600
|
-
}
|
|
3601
|
-
|
|
3602
4889
|
// StringIterator: a stream of runes with an opaque cursor, permitting
|
|
3603
4890
|
// rewinding. The units of the cursor are not specified beyond the
|
|
3604
4891
|
// fact that ASCII characters are single width. (Cursor positions
|
|
@@ -3745,18 +5032,59 @@ class Parser {
|
|
|
3745
5032
|
// stride).
|
|
3746
5033
|
static ANY_TABLE = new UnicodeRangeTable(new Uint32Array([0, Unicode.MAX_RUNE, 1]));
|
|
3747
5034
|
|
|
5035
|
+
// Ascii tables
|
|
5036
|
+
static ASCII_TABLE = new UnicodeRangeTable(new Uint32Array([0, 0x7f, 1]));
|
|
5037
|
+
static ASCII_FOLD_TABLE = new UnicodeRangeTable(new Uint32Array([0, 0x7f, 1, 0x017f, 0x017f, 1,
|
|
5038
|
+
// Old English long s (ſ), folds to S/s.
|
|
5039
|
+
0x212a, 0x212a, 1 // Kelvin K, folds to K/k.
|
|
5040
|
+
]));
|
|
5041
|
+
|
|
3748
5042
|
// unicodeTable() returns the Unicode RangeTable identified by name
|
|
3749
5043
|
// and the table of additional fold-equivalent code points.
|
|
3750
5044
|
// Returns null if |name| does not identify a Unicode character range.
|
|
3751
5045
|
static unicodeTable(name) {
|
|
3752
5046
|
if (name === 'Any') {
|
|
3753
|
-
return
|
|
5047
|
+
return {
|
|
5048
|
+
tab: Parser.ANY_TABLE,
|
|
5049
|
+
fold: Parser.ANY_TABLE,
|
|
5050
|
+
sign: 1
|
|
5051
|
+
};
|
|
5052
|
+
}
|
|
5053
|
+
if (name === 'Ascii') {
|
|
5054
|
+
return {
|
|
5055
|
+
tab: Parser.ASCII_TABLE,
|
|
5056
|
+
fold: Parser.ASCII_FOLD_TABLE,
|
|
5057
|
+
sign: 1
|
|
5058
|
+
};
|
|
5059
|
+
}
|
|
5060
|
+
if (name === 'Assigned') {
|
|
5061
|
+
// Assigned is the mathematical inversion of Cn (Unassigned)
|
|
5062
|
+
return {
|
|
5063
|
+
tab: UnicodeTables.CATEGORIES.get('Cn'),
|
|
5064
|
+
fold: UnicodeTables.CATEGORIES.get('Cn'),
|
|
5065
|
+
sign: -1
|
|
5066
|
+
};
|
|
5067
|
+
}
|
|
5068
|
+
if (name === 'Lc') {
|
|
5069
|
+
return {
|
|
5070
|
+
tab: UnicodeTables.CATEGORIES.get('LC'),
|
|
5071
|
+
fold: UnicodeTables.FOLD_CATEGORIES.get('LC'),
|
|
5072
|
+
sign: 1
|
|
5073
|
+
};
|
|
3754
5074
|
}
|
|
3755
5075
|
if (UnicodeTables.CATEGORIES.has(name)) {
|
|
3756
|
-
return
|
|
5076
|
+
return {
|
|
5077
|
+
tab: UnicodeTables.CATEGORIES.get(name),
|
|
5078
|
+
fold: UnicodeTables.FOLD_CATEGORIES.get(name),
|
|
5079
|
+
sign: 1
|
|
5080
|
+
};
|
|
3757
5081
|
}
|
|
3758
5082
|
if (UnicodeTables.SCRIPTS.has(name)) {
|
|
3759
|
-
return
|
|
5083
|
+
return {
|
|
5084
|
+
tab: UnicodeTables.SCRIPTS.get(name),
|
|
5085
|
+
fold: UnicodeTables.FOLD_SCRIPT.get(name),
|
|
5086
|
+
sign: 1
|
|
5087
|
+
};
|
|
3760
5088
|
}
|
|
3761
5089
|
return null;
|
|
3762
5090
|
}
|
|
@@ -4065,7 +5393,7 @@ class Parser {
|
|
|
4065
5393
|
this.flags = flags;
|
|
4066
5394
|
// number of capturing groups seen
|
|
4067
5395
|
this.numCap = 0;
|
|
4068
|
-
this.namedGroups =
|
|
5396
|
+
this.namedGroups = Object.create(null);
|
|
4069
5397
|
// Stack of parsed expressions.
|
|
4070
5398
|
this.stack = [];
|
|
4071
5399
|
this.free = null;
|
|
@@ -4476,8 +5804,9 @@ class Parser {
|
|
|
4476
5804
|
let i = 0;
|
|
4477
5805
|
for (let sub of subs) {
|
|
4478
5806
|
if (sub.op === op) {
|
|
4479
|
-
|
|
4480
|
-
|
|
5807
|
+
for (let j = 0; j < sub.subs.length; j++) {
|
|
5808
|
+
newsubs[i++] = sub.subs[j];
|
|
5809
|
+
}
|
|
4481
5810
|
this.reuse(sub);
|
|
4482
5811
|
} else {
|
|
4483
5812
|
newsubs[i++] = sub;
|
|
@@ -4908,9 +6237,11 @@ class Parser {
|
|
|
4908
6237
|
const i = lit.indexOf('\\E');
|
|
4909
6238
|
if (i >= 0) {
|
|
4910
6239
|
lit = lit.substring(0, i);
|
|
6240
|
+
t.skipString(lit);
|
|
6241
|
+
t.skipString('\\E');
|
|
6242
|
+
} else {
|
|
6243
|
+
t.skipString(lit);
|
|
4911
6244
|
}
|
|
4912
|
-
t.skipString(lit);
|
|
4913
|
-
t.skipString('\\E');
|
|
4914
6245
|
let j = 0;
|
|
4915
6246
|
while (j < lit.length) {
|
|
4916
6247
|
const codepoint = lit.codePointAt(j);
|
|
@@ -4926,6 +6257,9 @@ class Parser {
|
|
|
4926
6257
|
t.rewindTo(savedPos);
|
|
4927
6258
|
break;
|
|
4928
6259
|
}
|
|
6260
|
+
} else {
|
|
6261
|
+
// Unconditionally rewind if PERL_X is off, or if string ended abruptly
|
|
6262
|
+
t.rewindTo(savedPos);
|
|
4929
6263
|
}
|
|
4930
6264
|
const re = this.newRegexp(Regexp.Op.CHAR_CLASS);
|
|
4931
6265
|
re.flags = this.flags;
|
|
@@ -5251,8 +6585,11 @@ class Parser {
|
|
|
5251
6585
|
if (pair === null) {
|
|
5252
6586
|
throw new RE2JSSyntaxException(Parser.ERR_INVALID_CHAR_RANGE, t.from(startPos));
|
|
5253
6587
|
}
|
|
5254
|
-
|
|
5255
|
-
|
|
6588
|
+
if (pair.sign < 0) {
|
|
6589
|
+
sign = 0 - sign;
|
|
6590
|
+
}
|
|
6591
|
+
const tab = pair.tab;
|
|
6592
|
+
const fold = pair.fold; // fold-equivalent table
|
|
5256
6593
|
// Variation of CharClass.appendGroup() for tables.
|
|
5257
6594
|
if ((this.flags & RE2Flags.FOLD_CASE) === 0 || fold === null) {
|
|
5258
6595
|
cc.appendTableWithSign(tab, sign);
|
|
@@ -5396,6 +6733,7 @@ class RE2 {
|
|
|
5396
6733
|
res.prefixUTF8 = re2.prefixUTF8;
|
|
5397
6734
|
res.prefixComplete = re2.prefixComplete;
|
|
5398
6735
|
res.prefixRune = re2.prefixRune;
|
|
6736
|
+
res.prefilter = re2.prefilter;
|
|
5399
6737
|
return res;
|
|
5400
6738
|
}
|
|
5401
6739
|
|
|
@@ -5438,8 +6776,10 @@ class RE2 {
|
|
|
5438
6776
|
let re = Parser.parse(expr, mode);
|
|
5439
6777
|
const maxCap = re.maxCap();
|
|
5440
6778
|
re = Simplify.simplify(re);
|
|
6779
|
+
const prefilter = PrefilterTree.build(re);
|
|
5441
6780
|
const prog = Compiler.compileRegexp(re);
|
|
5442
6781
|
const re2 = new RE2(expr, prog, maxCap, longest);
|
|
6782
|
+
re2.prefilter = prefilter.type === Prefilter.Type.NONE ? null : prefilter;
|
|
5443
6783
|
const [prefixCompl, prefixStr] = prog.prefix();
|
|
5444
6784
|
re2.prefixComplete = prefixCompl;
|
|
5445
6785
|
re2.prefix = prefixStr;
|
|
@@ -5471,12 +6811,78 @@ class RE2 {
|
|
|
5471
6811
|
this.prefixComplete = false; // true if prefix is the entire regexp
|
|
5472
6812
|
this.prefixRune = 0; // first rune in prefix
|
|
5473
6813
|
this.pooled = new AtomicReference(); // Cache of machines for running regexp. Forms a Treiber stack.
|
|
5474
|
-
this.dfa = new DFA(prog); //
|
|
6814
|
+
this.dfa = new DFA(this.prog); // initialize Lazy DFA
|
|
6815
|
+
this.onepass = OnePass.compile(this.prog); // compile OnePass
|
|
6816
|
+
this.prefilter = null;
|
|
6817
|
+
}
|
|
6818
|
+
matchPrefixComplete(input, pos, anchor, ncap) {
|
|
6819
|
+
// If strictly anchored, execution must start at 0
|
|
6820
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
6821
|
+
return null;
|
|
6822
|
+
}
|
|
6823
|
+
let matchStart = -1;
|
|
6824
|
+
let matchEnd = -1;
|
|
6825
|
+
const pLen = input.prefixLength(this);
|
|
6826
|
+
if (anchor === RE2Flags.UNANCHORED) {
|
|
6827
|
+
const idx = input.index(this, pos);
|
|
6828
|
+
if (idx < 0) return null;
|
|
6829
|
+
matchStart = pos + idx;
|
|
6830
|
+
matchEnd = matchStart + pLen;
|
|
6831
|
+
} else if (anchor === RE2Flags.ANCHOR_BOTH) {
|
|
6832
|
+
if (input.endPos() !== pLen) return null;
|
|
6833
|
+
const idx = input.index(this, 0);
|
|
6834
|
+
if (idx !== 0) return null;
|
|
6835
|
+
matchStart = 0;
|
|
6836
|
+
matchEnd = pLen;
|
|
6837
|
+
} else if (anchor === RE2Flags.ANCHOR_START) {
|
|
6838
|
+
const idx = input.index(this, 0);
|
|
6839
|
+
if (idx !== 0) return null;
|
|
6840
|
+
matchStart = 0;
|
|
6841
|
+
matchEnd = pLen;
|
|
6842
|
+
}
|
|
6843
|
+
if (matchStart < 0) return null;
|
|
6844
|
+
|
|
6845
|
+
// If captures are requested (e.g. findSubmatch instead of test), populate bounds
|
|
6846
|
+
if (ncap > 0) {
|
|
6847
|
+
const matchcap = new Int32Array(ncap).fill(-1);
|
|
6848
|
+
matchcap[0] = matchStart;
|
|
6849
|
+
matchcap[1] = matchEnd;
|
|
6850
|
+
return Array.from(matchcap);
|
|
6851
|
+
}
|
|
6852
|
+
return []; // Matched successfully, but no capture data requested
|
|
5475
6853
|
}
|
|
5476
6854
|
executeEngine(input, pos, anchor, ncap) {
|
|
6855
|
+
// LITERAL FAST PATH
|
|
6856
|
+
// If the entire regex is just a literal string (and no nested capture boundaries are requested),
|
|
6857
|
+
// bypass all state machines and execute via V8's blistering fast native indexOf
|
|
6858
|
+
if (this.prefixComplete && (ncap === 0 || this.numSubexp === 0)) {
|
|
6859
|
+
return this.matchPrefixComplete(input, pos, anchor, ncap);
|
|
6860
|
+
}
|
|
6861
|
+
|
|
6862
|
+
// PREFILTER FAST PATH
|
|
6863
|
+
// If the unanchored query requires specific literal strings (e.g. "a.*b"),
|
|
6864
|
+
// verify those strings exist using high-speed JS string searches before waking up the state engines.
|
|
6865
|
+
if (this.prefilter !== null && anchor === RE2Flags.UNANCHORED) {
|
|
6866
|
+
if (!this.prefilter.eval(input, pos)) {
|
|
6867
|
+
return null;
|
|
6868
|
+
}
|
|
6869
|
+
}
|
|
6870
|
+
|
|
6871
|
+
// FAST PATH: OnePass DFA engine.
|
|
6872
|
+
// If compiled successfully, it perfectly supports capture groups
|
|
6873
|
+
// and is blisteringly fast since it skips thread queues completely.
|
|
6874
|
+
if (this.onepass !== null) {
|
|
6875
|
+
return OnePass.execute(this, input, pos, anchor, ncap);
|
|
6876
|
+
}
|
|
6877
|
+
|
|
5477
6878
|
// If the user wants capturing groups (ncap > 0), the DFA mathematically CANNOT do it.
|
|
5478
6879
|
// We must use the NFA.
|
|
5479
6880
|
if (ncap > 0) {
|
|
6881
|
+
// Backtracker bit-state execution bounds check
|
|
6882
|
+
if (input.endPos() <= Backtracker.maxBitStateLen(this.prog)) {
|
|
6883
|
+
return Backtracker.execute(this, input, pos, anchor, ncap);
|
|
6884
|
+
}
|
|
6885
|
+
// NFA execution
|
|
5480
6886
|
return this.doExecuteNFA(input, pos, anchor, ncap);
|
|
5481
6887
|
}
|
|
5482
6888
|
const dfaResult = this.dfa.match(input, pos, anchor);
|
|
@@ -5485,6 +6891,11 @@ class RE2 {
|
|
|
5485
6891
|
return dfaResult ? [] : null; // Return empty array to signify "matched but no captures"
|
|
5486
6892
|
}
|
|
5487
6893
|
|
|
6894
|
+
// Backtracker bit-state execution bounds check
|
|
6895
|
+
if (input.endPos() <= Backtracker.maxBitStateLen(this.prog)) {
|
|
6896
|
+
return Backtracker.execute(this, input, pos, anchor, ncap);
|
|
6897
|
+
}
|
|
6898
|
+
|
|
5488
6899
|
// Fallback to NFA
|
|
5489
6900
|
return this.doExecuteNFA(input, pos, anchor, ncap);
|
|
5490
6901
|
}
|
|
@@ -6065,6 +7476,50 @@ class RE2 {
|
|
|
6065
7476
|
}
|
|
6066
7477
|
}
|
|
6067
7478
|
|
|
7479
|
+
class RE2Set {
|
|
7480
|
+
constructor(anchor = RE2Flags.UNANCHORED, flags = RE2Flags.PERL) {
|
|
7481
|
+
this.anchor = anchor;
|
|
7482
|
+
this.flags = flags;
|
|
7483
|
+
this.regexps = [];
|
|
7484
|
+
this.prog = null;
|
|
7485
|
+
this.dfa = null;
|
|
7486
|
+
this.dummyRe2 = null;
|
|
7487
|
+
}
|
|
7488
|
+
add(pattern) {
|
|
7489
|
+
if (this.prog) {
|
|
7490
|
+
throw new RE2JSCompileException('Cannot add patterns after compile');
|
|
7491
|
+
}
|
|
7492
|
+
const re = Parser.parse(pattern, this.flags);
|
|
7493
|
+
this.regexps.push(Simplify.simplify(re));
|
|
7494
|
+
return this.regexps.length - 1;
|
|
7495
|
+
}
|
|
7496
|
+
compile() {
|
|
7497
|
+
if (this.prog) return;
|
|
7498
|
+
this.prog = Compiler.compileSet(this.regexps);
|
|
7499
|
+
this.dfa = new DFA(this.prog);
|
|
7500
|
+
this.dummyRe2 = {
|
|
7501
|
+
prog: this.prog,
|
|
7502
|
+
cond: this.prog.startCond(),
|
|
7503
|
+
prefix: '',
|
|
7504
|
+
prefixRune: 0,
|
|
7505
|
+
longest: false
|
|
7506
|
+
};
|
|
7507
|
+
}
|
|
7508
|
+
match(input) {
|
|
7509
|
+
if (!this.prog) this.compile();
|
|
7510
|
+
const machineInput = Array.isArray(input) ? MachineInput.fromUTF8(input) : MachineInput.fromUTF16(input);
|
|
7511
|
+
|
|
7512
|
+
// Fast path: Try the blistering fast DFA
|
|
7513
|
+
const dfaResult = this.dfa.matchSet(machineInput, 0, this.anchor);
|
|
7514
|
+
if (dfaResult !== null) return dfaResult;
|
|
7515
|
+
|
|
7516
|
+
// Safe Fallback: Handle boundaries (\b) or massive state explosions via NFA
|
|
7517
|
+
const machine = Machine.fromRE2(this.dummyRe2);
|
|
7518
|
+
machine.init(0);
|
|
7519
|
+
return machine.matchSet(machineInput, 0, this.anchor);
|
|
7520
|
+
}
|
|
7521
|
+
}
|
|
7522
|
+
|
|
6068
7523
|
/**
|
|
6069
7524
|
* Transform JS regex string to RE2 regex string
|
|
6070
7525
|
*/
|
|
@@ -6075,13 +7530,6 @@ class TranslateRegExpString {
|
|
|
6075
7530
|
static isHexadecimal(ch) {
|
|
6076
7531
|
return '0' <= ch && ch <= '9' || 'A' <= ch && ch <= 'F' || 'a' <= ch && ch <= 'f';
|
|
6077
7532
|
}
|
|
6078
|
-
static getUtf8CharSize(ch) {
|
|
6079
|
-
const code = ch.charCodeAt(0);
|
|
6080
|
-
if (code < 0x80) return 1; // 1-byte (ASCII)
|
|
6081
|
-
if (code < 0x800) return 2; // 2-byte
|
|
6082
|
-
if (code < 0x10000) return 3; // 3-byte
|
|
6083
|
-
return 4; // 4-byte (surrogate pairs, rare characters)
|
|
6084
|
-
}
|
|
6085
7533
|
static translate(data) {
|
|
6086
7534
|
if (typeof data !== 'string') {
|
|
6087
7535
|
return data;
|
|
@@ -6154,7 +7602,8 @@ class TranslateRegExpString {
|
|
|
6154
7602
|
default:
|
|
6155
7603
|
{
|
|
6156
7604
|
result += '\\';
|
|
6157
|
-
let
|
|
7605
|
+
let cp = data.codePointAt(i + 1);
|
|
7606
|
+
let symSize = Utils.charCount(cp);
|
|
6158
7607
|
result += data.substring(i + 1, i + 1 + symSize);
|
|
6159
7608
|
i += symSize + 1;
|
|
6160
7609
|
continue;
|
|
@@ -6174,7 +7623,8 @@ class TranslateRegExpString {
|
|
|
6174
7623
|
continue;
|
|
6175
7624
|
}
|
|
6176
7625
|
}
|
|
6177
|
-
let
|
|
7626
|
+
let cp = data.codePointAt(i);
|
|
7627
|
+
let symSize = Utils.charCount(cp);
|
|
6178
7628
|
result += data.substring(i, i + symSize);
|
|
6179
7629
|
i += symSize;
|
|
6180
7630
|
}
|
|
@@ -6537,5 +7987,7 @@ exports.RE2JSCompileException = RE2JSCompileException;
|
|
|
6537
7987
|
exports.RE2JSException = RE2JSException;
|
|
6538
7988
|
exports.RE2JSFlagsException = RE2JSFlagsException;
|
|
6539
7989
|
exports.RE2JSGroupException = RE2JSGroupException;
|
|
7990
|
+
exports.RE2JSInternalException = RE2JSInternalException;
|
|
6540
7991
|
exports.RE2JSSyntaxException = RE2JSSyntaxException;
|
|
7992
|
+
exports.RE2Set = RE2Set;
|
|
6541
7993
|
//# sourceMappingURL=index.cjs.cjs.map
|