From 8fa87db74b6153b82bd387609a44dc266bde75f5 Mon Sep 17 00:00:00 2001 From: yangyuan32 Date: Fri, 7 Jun 2024 16:44:15 +0800 Subject: [PATCH] fix CVE-2024-3651 --- backport-0001-CVE-2024-3651.patch | 2351 +++++++++++++++++++++++++++ backport-0002-CVE-2024-3651.patch | 32 + backport-0003-CVE-2024-3651.patch | 1104 +++++++++++++ backport-0004-CVE-2024-3651.patch | 899 +++++++++++ backport-0005-CVE-2024-3651.patch | 2463 +++++++++++++++++++++++++++++ python-pip.spec | 10 +- 6 files changed, 6858 insertions(+), 1 deletion(-) create mode 100644 backport-0001-CVE-2024-3651.patch create mode 100644 backport-0002-CVE-2024-3651.patch create mode 100644 backport-0003-CVE-2024-3651.patch create mode 100644 backport-0004-CVE-2024-3651.patch create mode 100644 backport-0005-CVE-2024-3651.patch diff --git a/backport-0001-CVE-2024-3651.patch b/backport-0001-CVE-2024-3651.patch new file mode 100644 index 0000000..64a2f20 --- /dev/null +++ b/backport-0001-CVE-2024-3651.patch @@ -0,0 +1,2351 @@ +From b22480c50f09b9423cfe20d53ba0fdc0045ce7b4 Mon Sep 17 00:00:00 2001 +From: Kim Davies +Date: Tue, 14 Sep 2021 13:17:10 -0700 +Subject: [PATCH] Update to Unicode 14 + +Reference:https://github.com/kjd/idna/commit/b22480c50f09b9423cfe20d53ba0fdc0045ce7b4 +Conflict:NA + +--- + src/pip/_vendor/idna/idnadata.py | 137 ++++- + src/pip/_vendor/idna/uts46data.py | 839 ++++++++++++++++++------------ + 2 files changed, 609 insertions(+), 367 deletions(-) + +diff --git a/src/pip/_vendor/idna/idnadata.py b/src/pip/_vendor/idna/idnadata.py +index b86a3e0..1b5805d 100644 +--- a/src/pip/_vendor/idna/idnadata.py ++++ b/src/pip/_vendor/idna/idnadata.py +@@ -1,6 +1,6 @@ + # This file is automatically generated by tools/idna-data + +-__version__ = '13.0.0' ++__version__ = '14.0.0' + scripts = { + 'Greek': ( + 0x37000000374, +@@ -49,12 +49,13 @@ scripts = { + 0x30210000302a, + 0x30380000303c, + 0x340000004dc0, +- 0x4e0000009ffd, ++ 0x4e000000a000, + 0xf9000000fa6e, + 0xfa700000fada, ++ 0x16fe200016fe4, + 0x16ff000016ff2, +- 0x200000002a6de, +- 0x2a7000002b735, ++ 0x200000002a6e0, ++ 0x2a7000002b739, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, +@@ -75,7 +76,7 @@ scripts = { + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, +- 0x1b0010001b11f, ++ 0x1b0010001b120, + 0x1b1500001b153, + 0x1f2000001f201, + ), +@@ -87,7 +88,11 @@ scripts = { + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, ++ 0x1aff00001aff4, ++ 0x1aff50001affc, ++ 0x1affd0001afff, + 0x1b0000001b001, ++ 0x1b1200001b123, + 0x1b1640001b168, + ), + } +@@ -405,6 +410,39 @@ joining_types = { + 0x868: 68, + 0x869: 82, + 0x86a: 82, ++ 0x870: 82, ++ 0x871: 82, ++ 0x872: 82, ++ 0x873: 82, ++ 0x874: 82, ++ 0x875: 82, ++ 0x876: 82, ++ 0x877: 82, ++ 0x878: 82, ++ 0x879: 82, ++ 0x87a: 82, ++ 0x87b: 82, ++ 0x87c: 82, ++ 0x87d: 82, ++ 0x87e: 82, ++ 0x87f: 82, ++ 0x880: 82, ++ 0x881: 82, ++ 0x882: 82, ++ 0x883: 67, ++ 0x884: 67, ++ 0x885: 67, ++ 0x886: 68, ++ 0x887: 85, ++ 0x888: 85, ++ 0x889: 68, ++ 0x88a: 68, ++ 0x88b: 68, ++ 0x88c: 68, ++ 0x88d: 68, ++ 0x88e: 82, ++ 0x890: 85, ++ 0x891: 85, + 0x8a0: 68, + 0x8a1: 68, + 0x8a2: 68, +@@ -426,6 +464,7 @@ joining_types = { + 0x8b2: 82, + 0x8b3: 68, + 0x8b4: 68, ++ 0x8b5: 68, + 0x8b6: 68, + 0x8b7: 68, + 0x8b8: 68, +@@ -444,6 +483,7 @@ joining_types = { + 0x8c5: 68, + 0x8c6: 68, + 0x8c7: 68, ++ 0x8c8: 68, + 0x8e2: 85, + 0x1806: 85, + 0x1807: 68, +@@ -768,6 +808,24 @@ joining_types = { + 0x10f52: 68, + 0x10f53: 68, + 0x10f54: 82, ++ 0x10f70: 68, ++ 0x10f71: 68, ++ 0x10f72: 68, ++ 0x10f73: 68, ++ 0x10f74: 82, ++ 0x10f75: 82, ++ 0x10f76: 68, ++ 0x10f77: 68, ++ 0x10f78: 68, ++ 0x10f79: 68, ++ 0x10f7a: 68, ++ 0x10f7b: 68, ++ 0x10f7c: 68, ++ 0x10f7d: 68, ++ 0x10f7e: 68, ++ 0x10f7f: 68, ++ 0x10f80: 68, ++ 0x10f81: 68, + 0x10fb0: 68, + 0x10fb1: 85, + 0x10fb2: 68, +@@ -1168,9 +1226,9 @@ codepoint_classes = { + 0x8000000082e, + 0x8400000085c, + 0x8600000086b, +- 0x8a0000008b5, +- 0x8b6000008c8, +- 0x8d3000008e2, ++ 0x87000000888, ++ 0x8890000088f, ++ 0x898000008e2, + 0x8e300000958, + 0x96000000964, + 0x96600000970, +@@ -1252,11 +1310,12 @@ codepoint_classes = { + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c3a, +- 0xc3d00000c45, ++ 0xc3c00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5b, ++ 0xc5d00000c5e, + 0xc6000000c64, + 0xc6600000c70, + 0xc8000000c84, +@@ -1269,7 +1328,7 @@ codepoint_classes = { + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, +- 0xcde00000cdf, ++ 0xcdd00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, +@@ -1366,9 +1425,8 @@ codepoint_classes = { + 0x16810000169b, + 0x16a0000016eb, + 0x16f1000016f9, +- 0x17000000170d, +- 0x170e00001715, +- 0x172000001735, ++ 0x170000001716, ++ 0x171f00001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, +@@ -1397,8 +1455,8 @@ codepoint_classes = { + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1ab000001abe, +- 0x1abf00001ac1, +- 0x1b0000001b4c, ++ 0x1abf00001acf, ++ 0x1b0000001b4d, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, +@@ -1413,8 +1471,7 @@ codepoint_classes = { + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, +- 0x1dc000001dfa, +- 0x1dfb00001e00, ++ 0x1dc000001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, +@@ -1563,7 +1620,7 @@ codepoint_classes = { + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, +- 0x2c3000002c5f, ++ 0x2c3000002c60, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, +@@ -1652,8 +1709,7 @@ codepoint_classes = { + 0x31a0000031c0, + 0x31f000003200, + 0x340000004dc0, +- 0x4e0000009ffd, +- 0xa0000000a48d, ++ 0x4e000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, +@@ -1766,9 +1822,16 @@ codepoint_classes = { + 0xa7bb0000a7bc, + 0xa7bd0000a7be, + 0xa7bf0000a7c0, ++ 0xa7c10000a7c2, + 0xa7c30000a7c4, + 0xa7c80000a7c9, + 0xa7ca0000a7cb, ++ 0xa7d10000a7d2, ++ 0xa7d30000a7d4, ++ 0xa7d50000a7d6, ++ 0xa7d70000a7d8, ++ 0xa7d90000a7da, ++ 0xa7f20000a7f5, + 0xa7f60000a7f8, + 0xa7fa0000a828, + 0xa82c0000a82d, +@@ -1834,9 +1897,16 @@ codepoint_classes = { + 0x104d8000104fc, + 0x1050000010528, + 0x1053000010564, ++ 0x10597000105a2, ++ 0x105a3000105b2, ++ 0x105b3000105ba, ++ 0x105bb000105bd, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, ++ 0x1078000010786, ++ 0x10787000107b1, ++ 0x107b2000107bb, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, +@@ -1876,11 +1946,13 @@ codepoint_classes = { + 0x10f0000010f1d, + 0x10f2700010f28, + 0x10f3000010f51, ++ 0x10f7000010f86, + 0x10fb000010fc5, + 0x10fe000010ff7, + 0x1100000011047, +- 0x1106600011070, ++ 0x1106600011076, + 0x1107f000110bb, ++ 0x110c2000110c3, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, +@@ -1934,6 +2006,7 @@ codepoint_classes = { + 0x117000001171b, + 0x1171d0001172c, + 0x117300001173a, ++ 0x1174000011747, + 0x118000001183b, + 0x118c0000118ea, + 0x118ff00011907, +@@ -1952,7 +2025,7 @@ codepoint_classes = { + 0x11a4700011a48, + 0x11a5000011a9a, + 0x11a9d00011a9e, +- 0x11ac000011af9, ++ 0x11ab000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, +@@ -1977,11 +2050,14 @@ codepoint_classes = { + 0x11fb000011fb1, + 0x120000001239a, + 0x1248000012544, ++ 0x12f9000012ff1, + 0x130000001342f, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, ++ 0x16a7000016abf, ++ 0x16ac000016aca, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, +@@ -1999,7 +2075,10 @@ codepoint_classes = { + 0x17000000187f8, + 0x1880000018cd6, + 0x18d0000018d09, +- 0x1b0000001b11f, ++ 0x1aff00001aff4, ++ 0x1aff50001affc, ++ 0x1affd0001afff, ++ 0x1b0000001b123, + 0x1b1500001b153, + 0x1b1640001b168, + 0x1b1700001b2fc, +@@ -2008,12 +2087,15 @@ codepoint_classes = { + 0x1bc800001bc89, + 0x1bc900001bc9a, + 0x1bc9d0001bc9f, ++ 0x1cf000001cf2e, ++ 0x1cf300001cf47, + 0x1da000001da37, + 0x1da3b0001da6d, + 0x1da750001da76, + 0x1da840001da85, + 0x1da9b0001daa0, + 0x1daa10001dab0, ++ 0x1df000001df1f, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, +@@ -2023,14 +2105,19 @@ codepoint_classes = { + 0x1e1300001e13e, + 0x1e1400001e14a, + 0x1e14e0001e14f, ++ 0x1e2900001e2af, + 0x1e2c00001e2fa, ++ 0x1e7e00001e7e7, ++ 0x1e7e80001e7ec, ++ 0x1e7ed0001e7ef, ++ 0x1e7f00001e7ff, + 0x1e8000001e8c5, + 0x1e8d00001e8d7, + 0x1e9220001e94c, + 0x1e9500001e95a, + 0x1fbf00001fbfa, +- 0x200000002a6de, +- 0x2a7000002b735, ++ 0x200000002a6e0, ++ 0x2a7000002b739, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, +diff --git a/src/pip/_vendor/idna/uts46data.py b/src/pip/_vendor/idna/uts46data.py +index f382ce3..c765248 100644 +--- a/src/pip/_vendor/idna/uts46data.py ++++ b/src/pip/_vendor/idna/uts46data.py +@@ -1,11 +1,13 @@ + # This file is automatically generated by tools/idna-data ++# vim: set fileencoding=utf-8 : + + from typing import List, Tuple, Union + ++ + """IDNA Mapping Table from UTS46.""" + + +-__version__ = '13.0.0' ++__version__ = '14.0.0' + def _seg_0(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +@@ -1053,7 +1055,7 @@ def _seg_9(): + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), +- (0x61E, 'V'), ++ (0x61D, 'V'), + ] + + def _seg_10(): +@@ -1083,11 +1085,9 @@ def _seg_10(): + (0x85F, 'X'), + (0x860, 'V'), + (0x86B, 'X'), +- (0x8A0, 'V'), +- (0x8B5, 'X'), +- (0x8B6, 'V'), +- (0x8C8, 'X'), +- (0x8D3, 'V'), ++ (0x870, 'V'), ++ (0x88F, 'X'), ++ (0x898, 'V'), + (0x8E2, 'X'), + (0x8E3, 'V'), + (0x958, 'M', 'क़'), +@@ -1159,13 +1159,13 @@ def _seg_10(): + (0xA59, 'M', 'ਖ਼'), + (0xA5A, 'M', 'ਗ਼'), + (0xA5B, 'M', 'ਜ਼'), ++ (0xA5C, 'V'), ++ (0xA5D, 'X'), + ] + + def _seg_11(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0xA5C, 'V'), +- (0xA5D, 'X'), + (0xA5E, 'M', 'ਫ਼'), + (0xA5F, 'X'), + (0xA66, 'V'), +@@ -1264,15 +1264,15 @@ def _seg_11(): + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), ++ (0xC29, 'X'), ++ (0xC2A, 'V'), + ] + + def _seg_12(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0xC29, 'X'), +- (0xC2A, 'V'), + (0xC3A, 'X'), +- (0xC3D, 'V'), ++ (0xC3C, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), +@@ -1282,6 +1282,8 @@ def _seg_12(): + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5B, 'X'), ++ (0xC5D, 'V'), ++ (0xC5E, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), +@@ -1304,7 +1306,7 @@ def _seg_12(): + (0xCCE, 'X'), + (0xCD5, 'V'), + (0xCD7, 'X'), +- (0xCDE, 'V'), ++ (0xCDD, 'V'), + (0xCDF, 'X'), + (0xCE0, 'V'), + (0xCE4, 'X'), +@@ -1502,10 +1504,8 @@ def _seg_14(): + (0x16A0, 'V'), + (0x16F9, 'X'), + (0x1700, 'V'), +- (0x170D, 'X'), +- (0x170E, 'V'), +- (0x1715, 'X'), +- (0x1720, 'V'), ++ (0x1716, 'X'), ++ (0x171F, 'V'), + (0x1737, 'X'), + (0x1740, 'V'), + (0x1754, 'X'), +@@ -1528,6 +1528,7 @@ def _seg_14(): + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), ++ (0x180F, 'I'), + (0x1810, 'V'), + (0x181A, 'X'), + (0x1820, 'V'), +@@ -1567,11 +1568,11 @@ def _seg_14(): + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1AB0, 'V'), +- (0x1AC1, 'X'), ++ (0x1ACF, 'X'), + (0x1B00, 'V'), +- (0x1B4C, 'X'), ++ (0x1B4D, 'X'), + (0x1B50, 'V'), +- (0x1B7D, 'X'), ++ (0x1B7F, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), +@@ -1579,12 +1580,12 @@ def _seg_14(): + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), ++ (0x1C80, 'M', 'в'), + ] + + def _seg_15(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x1C80, 'M', 'в'), + (0x1C81, 'M', 'д'), + (0x1C82, 'M', 'о'), + (0x1C83, 'M', 'с'), +@@ -1684,12 +1685,12 @@ def _seg_15(): + (0x1D50, 'M', 'm'), + (0x1D51, 'M', 'ŋ'), + (0x1D52, 'M', 'o'), ++ (0x1D53, 'M', 'ɔ'), + ] + + def _seg_16(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x1D53, 'M', 'ɔ'), + (0x1D54, 'M', 'ᴖ'), + (0x1D55, 'M', 'ᴗ'), + (0x1D56, 'M', 'p'), +@@ -1754,8 +1755,6 @@ def _seg_16(): + (0x1DBE, 'M', 'ʒ'), + (0x1DBF, 'M', 'θ'), + (0x1DC0, 'V'), +- (0x1DFA, 'X'), +- (0x1DFB, 'V'), + (0x1E00, 'M', 'ḁ'), + (0x1E01, 'V'), + (0x1E02, 'M', 'ḃ'), +@@ -1789,14 +1788,14 @@ def _seg_16(): + (0x1E1E, 'M', 'ḟ'), + (0x1E1F, 'V'), + (0x1E20, 'M', 'ḡ'), ++ (0x1E21, 'V'), ++ (0x1E22, 'M', 'ḣ'), ++ (0x1E23, 'V'), + ] + + def _seg_17(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x1E21, 'V'), +- (0x1E22, 'M', 'ḣ'), +- (0x1E23, 'V'), + (0x1E24, 'M', 'ḥ'), + (0x1E25, 'V'), + (0x1E26, 'M', 'ḧ'), +@@ -1894,14 +1893,14 @@ def _seg_17(): + (0x1E82, 'M', 'ẃ'), + (0x1E83, 'V'), + (0x1E84, 'M', 'ẅ'), ++ (0x1E85, 'V'), ++ (0x1E86, 'M', 'ẇ'), ++ (0x1E87, 'V'), + ] + + def _seg_18(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x1E85, 'V'), +- (0x1E86, 'M', 'ẇ'), +- (0x1E87, 'V'), + (0x1E88, 'M', 'ẉ'), + (0x1E89, 'V'), + (0x1E8A, 'M', 'ẋ'), +@@ -1999,14 +1998,14 @@ def _seg_18(): + (0x1EEB, 'V'), + (0x1EEC, 'M', 'ử'), + (0x1EED, 'V'), ++ (0x1EEE, 'M', 'ữ'), ++ (0x1EEF, 'V'), ++ (0x1EF0, 'M', 'ự'), + ] + + def _seg_19(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x1EEE, 'M', 'ữ'), +- (0x1EEF, 'V'), +- (0x1EF0, 'M', 'ự'), + (0x1EF1, 'V'), + (0x1EF2, 'M', 'ỳ'), + (0x1EF3, 'V'), +@@ -2104,14 +2103,14 @@ def _seg_19(): + (0x1F82, 'M', 'ἂι'), + (0x1F83, 'M', 'ἃι'), + (0x1F84, 'M', 'ἄι'), ++ (0x1F85, 'M', 'ἅι'), ++ (0x1F86, 'M', 'ἆι'), ++ (0x1F87, 'M', 'ἇι'), + ] + + def _seg_20(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x1F85, 'M', 'ἅι'), +- (0x1F86, 'M', 'ἆι'), +- (0x1F87, 'M', 'ἇι'), + (0x1F88, 'M', 'ἀι'), + (0x1F89, 'M', 'ἁι'), + (0x1F8A, 'M', 'ἂι'), +@@ -2209,14 +2208,14 @@ def _seg_20(): + (0x1FF0, 'X'), + (0x1FF2, 'M', 'ὼι'), + (0x1FF3, 'M', 'ωι'), ++ (0x1FF4, 'M', 'ώι'), ++ (0x1FF5, 'X'), ++ (0x1FF6, 'V'), + ] + + def _seg_21(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x1FF4, 'M', 'ώι'), +- (0x1FF5, 'X'), +- (0x1FF6, 'V'), + (0x1FF7, 'M', 'ῶι'), + (0x1FF8, 'M', 'ὸ'), + (0x1FF9, 'M', 'ό'), +@@ -2309,19 +2308,19 @@ def _seg_21(): + (0x20A0, 'V'), + (0x20A8, 'M', 'rs'), + (0x20A9, 'V'), +- (0x20C0, 'X'), ++ (0x20C1, 'X'), + (0x20D0, 'V'), + (0x20F1, 'X'), + (0x2100, '3', 'a/c'), + (0x2101, '3', 'a/s'), ++ (0x2102, 'M', 'c'), ++ (0x2103, 'M', '°c'), ++ (0x2104, 'V'), + ] + + def _seg_22(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x2102, 'M', 'c'), +- (0x2103, 'M', '°c'), +- (0x2104, 'V'), + (0x2105, '3', 'c/o'), + (0x2106, '3', 'c/u'), + (0x2107, 'M', 'ɛ'), +@@ -2419,14 +2418,14 @@ def _seg_22(): + (0x2177, 'M', 'viii'), + (0x2178, 'M', 'ix'), + (0x2179, 'M', 'x'), ++ (0x217A, 'M', 'xi'), ++ (0x217B, 'M', 'xii'), ++ (0x217C, 'M', 'l'), + ] + + def _seg_23(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x217A, 'M', 'xi'), +- (0x217B, 'M', 'xii'), +- (0x217C, 'M', 'l'), + (0x217D, 'M', 'c'), + (0x217E, 'M', 'd'), + (0x217F, 'M', 'm'), +@@ -2524,14 +2523,14 @@ def _seg_23(): + (0x24B7, 'M', 'b'), + (0x24B8, 'M', 'c'), + (0x24B9, 'M', 'd'), ++ (0x24BA, 'M', 'e'), ++ (0x24BB, 'M', 'f'), ++ (0x24BC, 'M', 'g'), + ] + + def _seg_24(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x24BA, 'M', 'e'), +- (0x24BB, 'M', 'f'), +- (0x24BC, 'M', 'g'), + (0x24BD, 'M', 'h'), + (0x24BE, 'M', 'i'), + (0x24BF, 'M', 'j'), +@@ -2629,23 +2628,22 @@ def _seg_24(): + (0x2C23, 'M', 'ⱓ'), + (0x2C24, 'M', 'ⱔ'), + (0x2C25, 'M', 'ⱕ'), ++ (0x2C26, 'M', 'ⱖ'), ++ (0x2C27, 'M', 'ⱗ'), ++ (0x2C28, 'M', 'ⱘ'), + ] + + def _seg_25(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x2C26, 'M', 'ⱖ'), +- (0x2C27, 'M', 'ⱗ'), +- (0x2C28, 'M', 'ⱘ'), + (0x2C29, 'M', 'ⱙ'), + (0x2C2A, 'M', 'ⱚ'), + (0x2C2B, 'M', 'ⱛ'), + (0x2C2C, 'M', 'ⱜ'), + (0x2C2D, 'M', 'ⱝ'), + (0x2C2E, 'M', 'ⱞ'), +- (0x2C2F, 'X'), ++ (0x2C2F, 'M', 'ⱟ'), + (0x2C30, 'V'), +- (0x2C5F, 'X'), + (0x2C60, 'M', 'ⱡ'), + (0x2C61, 'V'), + (0x2C62, 'M', 'ɫ'), +@@ -2734,15 +2732,15 @@ def _seg_25(): + (0x2CBC, 'M', 'ⲽ'), + (0x2CBD, 'V'), + (0x2CBE, 'M', 'ⲿ'), ++ (0x2CBF, 'V'), ++ (0x2CC0, 'M', 'ⳁ'), ++ (0x2CC1, 'V'), ++ (0x2CC2, 'M', 'ⳃ'), + ] + + def _seg_26(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x2CBF, 'V'), +- (0x2CC0, 'M', 'ⳁ'), +- (0x2CC1, 'V'), +- (0x2CC2, 'M', 'ⳃ'), + (0x2CC3, 'V'), + (0x2CC4, 'M', 'ⳅ'), + (0x2CC5, 'V'), +@@ -2813,7 +2811,7 @@ def _seg_26(): + (0x2DD8, 'V'), + (0x2DDF, 'X'), + (0x2DE0, 'V'), +- (0x2E53, 'X'), ++ (0x2E5E, 'X'), + (0x2E80, 'V'), + (0x2E9A, 'X'), + (0x2E9B, 'V'), +@@ -2839,15 +2837,15 @@ def _seg_26(): + (0x2F0F, 'M', '几'), + (0x2F10, 'M', '凵'), + (0x2F11, 'M', '刀'), ++ (0x2F12, 'M', '力'), ++ (0x2F13, 'M', '勹'), ++ (0x2F14, 'M', '匕'), ++ (0x2F15, 'M', '匚'), + ] + + def _seg_27(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x2F12, 'M', '力'), +- (0x2F13, 'M', '勹'), +- (0x2F14, 'M', '匕'), +- (0x2F15, 'M', '匚'), + (0x2F16, 'M', '匸'), + (0x2F17, 'M', '十'), + (0x2F18, 'M', '卜'), +@@ -2944,15 +2942,15 @@ def _seg_27(): + (0x2F73, 'M', '穴'), + (0x2F74, 'M', '立'), + (0x2F75, 'M', '竹'), ++ (0x2F76, 'M', '米'), ++ (0x2F77, 'M', '糸'), ++ (0x2F78, 'M', '缶'), ++ (0x2F79, 'M', '网'), + ] + + def _seg_28(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x2F76, 'M', '米'), +- (0x2F77, 'M', '糸'), +- (0x2F78, 'M', '缶'), +- (0x2F79, 'M', '网'), + (0x2F7A, 'M', '羊'), + (0x2F7B, 'M', '羽'), + (0x2F7C, 'M', '老'), +@@ -3049,15 +3047,15 @@ def _seg_28(): + (0x3000, '3', ' '), + (0x3001, 'V'), + (0x3002, 'M', '.'), ++ (0x3003, 'V'), ++ (0x3036, 'M', '〒'), ++ (0x3037, 'V'), ++ (0x3038, 'M', '十'), + ] + + def _seg_29(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x3003, 'V'), +- (0x3036, 'M', '〒'), +- (0x3037, 'V'), +- (0x3038, 'M', '十'), + (0x3039, 'M', '卄'), + (0x303A, 'M', '卅'), + (0x303B, 'V'), +@@ -3154,15 +3152,15 @@ def _seg_29(): + (0x317E, 'M', 'ᄶ'), + (0x317F, 'M', 'ᅀ'), + (0x3180, 'M', 'ᅇ'), ++ (0x3181, 'M', 'ᅌ'), ++ (0x3182, 'M', 'ᇱ'), ++ (0x3183, 'M', 'ᇲ'), ++ (0x3184, 'M', 'ᅗ'), + ] + + def _seg_30(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x3181, 'M', 'ᅌ'), +- (0x3182, 'M', 'ᇱ'), +- (0x3183, 'M', 'ᇲ'), +- (0x3184, 'M', 'ᅗ'), + (0x3185, 'M', 'ᅘ'), + (0x3186, 'M', 'ᅙ'), + (0x3187, 'M', 'ᆄ'), +@@ -3259,15 +3257,15 @@ def _seg_30(): + (0x3240, '3', '(祭)'), + (0x3241, '3', '(休)'), + (0x3242, '3', '(自)'), ++ (0x3243, '3', '(至)'), ++ (0x3244, 'M', '問'), ++ (0x3245, 'M', '幼'), ++ (0x3246, 'M', '文'), + ] + + def _seg_31(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x3243, '3', '(至)'), +- (0x3244, 'M', '問'), +- (0x3245, 'M', '幼'), +- (0x3246, 'M', '文'), + (0x3247, 'M', '箏'), + (0x3248, 'V'), + (0x3250, 'M', 'pte'), +@@ -3364,15 +3362,15 @@ def _seg_31(): + (0x32AB, 'M', '学'), + (0x32AC, 'M', '監'), + (0x32AD, 'M', '企'), ++ (0x32AE, 'M', '資'), ++ (0x32AF, 'M', '協'), ++ (0x32B0, 'M', '夜'), ++ (0x32B1, 'M', '36'), + ] + + def _seg_32(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x32AE, 'M', '資'), +- (0x32AF, 'M', '協'), +- (0x32B0, 'M', '夜'), +- (0x32B1, 'M', '36'), + (0x32B2, 'M', '37'), + (0x32B3, 'M', '38'), + (0x32B4, 'M', '39'), +@@ -3469,15 +3467,15 @@ def _seg_32(): + (0x330F, 'M', 'ガンマ'), + (0x3310, 'M', 'ギガ'), + (0x3311, 'M', 'ギニー'), ++ (0x3312, 'M', 'キュリー'), ++ (0x3313, 'M', 'ギルダー'), ++ (0x3314, 'M', 'キロ'), ++ (0x3315, 'M', 'キログラム'), + ] + + def _seg_33(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x3312, 'M', 'キュリー'), +- (0x3313, 'M', 'ギルダー'), +- (0x3314, 'M', 'キロ'), +- (0x3315, 'M', 'キログラム'), + (0x3316, 'M', 'キロメートル'), + (0x3317, 'M', 'キロワット'), + (0x3318, 'M', 'グラム'), +@@ -3574,15 +3572,15 @@ def _seg_33(): + (0x3373, 'M', 'au'), + (0x3374, 'M', 'bar'), + (0x3375, 'M', 'ov'), ++ (0x3376, 'M', 'pc'), ++ (0x3377, 'M', 'dm'), ++ (0x3378, 'M', 'dm2'), ++ (0x3379, 'M', 'dm3'), + ] + + def _seg_34(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x3376, 'M', 'pc'), +- (0x3377, 'M', 'dm'), +- (0x3378, 'M', 'dm2'), +- (0x3379, 'M', 'dm3'), + (0x337A, 'M', 'iu'), + (0x337B, 'M', '平成'), + (0x337C, 'M', '昭和'), +@@ -3679,15 +3677,15 @@ def _seg_34(): + (0x33D7, 'M', 'ph'), + (0x33D8, 'X'), + (0x33D9, 'M', 'ppm'), ++ (0x33DA, 'M', 'pr'), ++ (0x33DB, 'M', 'sr'), ++ (0x33DC, 'M', 'sv'), ++ (0x33DD, 'M', 'wb'), + ] + + def _seg_35(): + # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] + return [ +- (0x33DA, 'M', 'pr'), +- (0x33DB, 'M', 'sr'), +- (0x33DC, 'M', 'sv'), +- (0x33DD, 'M', 'wb'), + (0x33DE, 'M', 'v∕m'), + (0x33DF, 'M', 'a∕m'), + (0x33E0, 'M', '1日'), +@@ -3723,8 +3721,6 @@ def _seg_35(): + (0x33FE, 'M', '31日'), + (0x33FF, 'M', 'gal'), + (0x3400, 'V'), +- (0x9FFD, 'X'), +- (0xA000, 'V'), + (0xA48D, 'X'), + (0xA490, 'V'), + (0xA4C7, 'X'), +@@ -3784,17 +3780,17 @@ def _seg_35(): + (0xA685, 'V'), + (0xA686, 'M', 'ꚇ'), + (0xA687, 'V'), +- ] +- +-def _seg_36(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xA688, 'M', 'ꚉ'), + (0xA689, 'V'), + (0xA68A, 'M', 'ꚋ'), + (0xA68B, 'V'), + (0xA68C, 'M', 'ꚍ'), + (0xA68D, 'V'), ++ ] ++ ++def _seg_36(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xA68E, 'M', 'ꚏ'), + (0xA68F, 'V'), + (0xA690, 'M', 'ꚑ'), +@@ -3889,17 +3885,17 @@ def _seg_36(): + (0xA76C, 'M', 'ꝭ'), + (0xA76D, 'V'), + (0xA76E, 'M', 'ꝯ'), +- ] +- +-def _seg_37(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xA76F, 'V'), + (0xA770, 'M', 'ꝯ'), + (0xA771, 'V'), + (0xA779, 'M', 'ꝺ'), + (0xA77A, 'V'), + (0xA77B, 'M', 'ꝼ'), ++ ] ++ ++def _seg_37(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xA77C, 'V'), + (0xA77D, 'M', 'ᵹ'), + (0xA77E, 'M', 'ꝿ'), +@@ -3962,7 +3958,8 @@ def _seg_37(): + (0xA7BD, 'V'), + (0xA7BE, 'M', 'ꞿ'), + (0xA7BF, 'V'), +- (0xA7C0, 'X'), ++ (0xA7C0, 'M', 'ꟁ'), ++ (0xA7C1, 'V'), + (0xA7C2, 'M', 'ꟃ'), + (0xA7C3, 'V'), + (0xA7C4, 'M', 'ꞔ'), +@@ -3973,6 +3970,20 @@ def _seg_37(): + (0xA7C9, 'M', 'ꟊ'), + (0xA7CA, 'V'), + (0xA7CB, 'X'), ++ (0xA7D0, 'M', 'ꟑ'), ++ (0xA7D1, 'V'), ++ (0xA7D2, 'X'), ++ (0xA7D3, 'V'), ++ (0xA7D4, 'X'), ++ (0xA7D5, 'V'), ++ (0xA7D6, 'M', 'ꟗ'), ++ (0xA7D7, 'V'), ++ (0xA7D8, 'M', 'ꟙ'), ++ (0xA7D9, 'V'), ++ (0xA7DA, 'X'), ++ (0xA7F2, 'M', 'c'), ++ (0xA7F3, 'M', 'f'), ++ (0xA7F4, 'M', 'q'), + (0xA7F5, 'M', 'ꟶ'), + (0xA7F6, 'V'), + (0xA7F8, 'M', 'ħ'), +@@ -3985,6 +3996,11 @@ def _seg_37(): + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C6, 'X'), ++ ] ++ ++def _seg_38(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), +@@ -3994,11 +4010,6 @@ def _seg_37(): + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), +- ] +- +-def _seg_38(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9FF, 'X'), +@@ -4090,6 +4101,11 @@ def _seg_38(): + (0xABA8, 'M', 'Ꮨ'), + (0xABA9, 'M', 'Ꮩ'), + (0xABAA, 'M', 'Ꮪ'), ++ ] ++ ++def _seg_39(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xABAB, 'M', 'Ꮫ'), + (0xABAC, 'M', 'Ꮬ'), + (0xABAD, 'M', 'Ꮭ'), +@@ -4099,11 +4115,6 @@ def _seg_38(): + (0xABB1, 'M', 'Ꮱ'), + (0xABB2, 'M', 'Ꮲ'), + (0xABB3, 'M', 'Ꮳ'), +- ] +- +-def _seg_39(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xABB4, 'M', 'Ꮴ'), + (0xABB5, 'M', 'Ꮵ'), + (0xABB6, 'M', 'Ꮶ'), +@@ -4195,6 +4206,11 @@ def _seg_39(): + (0xF943, 'M', '弄'), + (0xF944, 'M', '籠'), + (0xF945, 'M', '聾'), ++ ] ++ ++def _seg_40(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xF946, 'M', '牢'), + (0xF947, 'M', '磊'), + (0xF948, 'M', '賂'), +@@ -4204,11 +4220,6 @@ def _seg_39(): + (0xF94C, 'M', '樓'), + (0xF94D, 'M', '淚'), + (0xF94E, 'M', '漏'), +- ] +- +-def _seg_40(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xF94F, 'M', '累'), + (0xF950, 'M', '縷'), + (0xF951, 'M', '陋'), +@@ -4300,6 +4311,11 @@ def _seg_40(): + (0xF9A7, 'M', '獵'), + (0xF9A8, 'M', '令'), + (0xF9A9, 'M', '囹'), ++ ] ++ ++def _seg_41(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xF9AA, 'M', '寧'), + (0xF9AB, 'M', '嶺'), + (0xF9AC, 'M', '怜'), +@@ -4309,11 +4325,6 @@ def _seg_40(): + (0xF9B0, 'M', '聆'), + (0xF9B1, 'M', '鈴'), + (0xF9B2, 'M', '零'), +- ] +- +-def _seg_41(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xF9B3, 'M', '靈'), + (0xF9B4, 'M', '領'), + (0xF9B5, 'M', '例'), +@@ -4405,6 +4416,11 @@ def _seg_41(): + (0xFA0B, 'M', '廓'), + (0xFA0C, 'M', '兀'), + (0xFA0D, 'M', '嗀'), ++ ] ++ ++def _seg_42(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xFA0E, 'V'), + (0xFA10, 'M', '塚'), + (0xFA11, 'V'), +@@ -4414,11 +4430,6 @@ def _seg_41(): + (0xFA16, 'M', '猪'), + (0xFA17, 'M', '益'), + (0xFA18, 'M', '礼'), +- ] +- +-def _seg_42(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xFA19, 'M', '神'), + (0xFA1A, 'M', '祥'), + (0xFA1B, 'M', '福'), +@@ -4510,6 +4521,11 @@ def _seg_42(): + (0xFA76, 'M', '勇'), + (0xFA77, 'M', '勺'), + (0xFA78, 'M', '喝'), ++ ] ++ ++def _seg_43(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xFA79, 'M', '啕'), + (0xFA7A, 'M', '喙'), + (0xFA7B, 'M', '嗢'), +@@ -4519,11 +4535,6 @@ def _seg_42(): + (0xFA7F, 'M', '奔'), + (0xFA80, 'M', '婢'), + (0xFA81, 'M', '嬨'), +- ] +- +-def _seg_43(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xFA82, 'M', '廒'), + (0xFA83, 'M', '廙'), + (0xFA84, 'M', '彩'), +@@ -4615,6 +4626,11 @@ def _seg_43(): + (0xFADA, 'X'), + (0xFB00, 'M', 'ff'), + (0xFB01, 'M', 'fi'), ++ ] ++ ++def _seg_44(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xFB02, 'M', 'fl'), + (0xFB03, 'M', 'ffi'), + (0xFB04, 'M', 'ffl'), +@@ -4624,11 +4640,6 @@ def _seg_43(): + (0xFB14, 'M', 'մե'), + (0xFB15, 'M', 'մի'), + (0xFB16, 'M', 'վն'), +- ] +- +-def _seg_44(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xFB17, 'M', 'մխ'), + (0xFB18, 'X'), + (0xFB1D, 'M', 'יִ'), +@@ -4713,13 +4724,18 @@ def _seg_44(): + (0xFBAE, 'M', 'ے'), + (0xFBB0, 'M', 'ۓ'), + (0xFBB2, 'V'), +- (0xFBC2, 'X'), ++ (0xFBC3, 'X'), + (0xFBD3, 'M', 'ڭ'), + (0xFBD7, 'M', 'ۇ'), + (0xFBD9, 'M', 'ۆ'), + (0xFBDB, 'M', 'ۈ'), + (0xFBDD, 'M', 'ۇٴ'), + (0xFBDE, 'M', 'ۋ'), ++ ] ++ ++def _seg_45(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xFBE0, 'M', 'ۅ'), + (0xFBE2, 'M', 'ۉ'), + (0xFBE4, 'M', 'ې'), +@@ -4729,11 +4745,6 @@ def _seg_44(): + (0xFBEE, 'M', 'ئو'), + (0xFBF0, 'M', 'ئۇ'), + (0xFBF2, 'M', 'ئۆ'), +- ] +- +-def _seg_45(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xFBF4, 'M', 'ئۈ'), + (0xFBF6, 'M', 'ئې'), + (0xFBF9, 'M', 'ئى'), +@@ -4825,6 +4836,11 @@ def _seg_45(): + (0xFC54, 'M', 'هي'), + (0xFC55, 'M', 'يج'), + (0xFC56, 'M', 'يح'), ++ ] ++ ++def _seg_46(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xFC57, 'M', 'يخ'), + (0xFC58, 'M', 'يم'), + (0xFC59, 'M', 'يى'), +@@ -4834,11 +4850,6 @@ def _seg_45(): + (0xFC5D, 'M', 'ىٰ'), + (0xFC5E, '3', ' ٌّ'), + (0xFC5F, '3', ' ٍّ'), +- ] +- +-def _seg_46(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xFC60, '3', ' َّ'), + (0xFC61, '3', ' ُّ'), + (0xFC62, '3', ' ِّ'), +@@ -4930,6 +4941,11 @@ def _seg_46(): + (0xFCB8, 'M', 'طح'), + (0xFCB9, 'M', 'ظم'), + (0xFCBA, 'M', 'عج'), ++ ] ++ ++def _seg_47(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xFCBB, 'M', 'عم'), + (0xFCBC, 'M', 'غج'), + (0xFCBD, 'M', 'غم'), +@@ -4939,11 +4955,6 @@ def _seg_46(): + (0xFCC1, 'M', 'فم'), + (0xFCC2, 'M', 'قح'), + (0xFCC3, 'M', 'قم'), +- ] +- +-def _seg_47(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xFCC4, 'M', 'كج'), + (0xFCC5, 'M', 'كح'), + (0xFCC6, 'M', 'كخ'), +@@ -5035,6 +5046,11 @@ def _seg_47(): + (0xFD1C, 'M', 'حي'), + (0xFD1D, 'M', 'جى'), + (0xFD1E, 'M', 'جي'), ++ ] ++ ++def _seg_48(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xFD1F, 'M', 'خى'), + (0xFD20, 'M', 'خي'), + (0xFD21, 'M', 'صى'), +@@ -5044,11 +5060,6 @@ def _seg_47(): + (0xFD25, 'M', 'شج'), + (0xFD26, 'M', 'شح'), + (0xFD27, 'M', 'شخ'), +- ] +- +-def _seg_48(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xFD28, 'M', 'شم'), + (0xFD29, 'M', 'شر'), + (0xFD2A, 'M', 'سر'), +@@ -5071,7 +5082,6 @@ def _seg_48(): + (0xFD3B, 'M', 'ظم'), + (0xFD3C, 'M', 'اً'), + (0xFD3E, 'V'), +- (0xFD40, 'X'), + (0xFD50, 'M', 'تجم'), + (0xFD51, 'M', 'تحج'), + (0xFD53, 'M', 'تحم'), +@@ -5141,6 +5151,11 @@ def _seg_48(): + (0xFDA4, 'M', 'تمى'), + (0xFDA5, 'M', 'جمي'), + (0xFDA6, 'M', 'جحى'), ++ ] ++ ++def _seg_49(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xFDA7, 'M', 'جمى'), + (0xFDA8, 'M', 'سخى'), + (0xFDA9, 'M', 'صحي'), +@@ -5149,11 +5164,6 @@ def _seg_48(): + (0xFDAC, 'M', 'لجي'), + (0xFDAD, 'M', 'لمي'), + (0xFDAE, 'M', 'يحي'), +- ] +- +-def _seg_49(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xFDAF, 'M', 'يجي'), + (0xFDB0, 'M', 'يمي'), + (0xFDB1, 'M', 'ممي'), +@@ -5180,6 +5190,8 @@ def _seg_49(): + (0xFDC6, 'M', 'سخي'), + (0xFDC7, 'M', 'نجي'), + (0xFDC8, 'X'), ++ (0xFDCF, 'V'), ++ (0xFDD0, 'X'), + (0xFDF0, 'M', 'صلے'), + (0xFDF1, 'M', 'قلے'), + (0xFDF2, 'M', 'الله'), +@@ -5194,7 +5206,6 @@ def _seg_49(): + (0xFDFB, '3', 'جل جلاله'), + (0xFDFC, 'M', 'ریال'), + (0xFDFD, 'V'), +- (0xFDFE, 'X'), + (0xFE00, 'I'), + (0xFE10, '3', ','), + (0xFE11, 'M', '、'), +@@ -5245,6 +5256,11 @@ def _seg_49(): + (0xFE5B, '3', '{'), + (0xFE5C, '3', '}'), + (0xFE5D, 'M', '〔'), ++ ] ++ ++def _seg_50(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xFE5E, 'M', '〕'), + (0xFE5F, '3', '#'), + (0xFE60, '3', '&'), +@@ -5254,11 +5270,6 @@ def _seg_49(): + (0xFE64, '3', '<'), + (0xFE65, '3', '>'), + (0xFE66, '3', '='), +- ] +- +-def _seg_50(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xFE67, 'X'), + (0xFE68, '3', '\\'), + (0xFE69, '3', '$'), +@@ -5350,6 +5361,11 @@ def _seg_50(): + (0xFF18, 'M', '8'), + (0xFF19, 'M', '9'), + (0xFF1A, '3', ':'), ++ ] ++ ++def _seg_51(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xFF1B, '3', ';'), + (0xFF1C, '3', '<'), + (0xFF1D, '3', '='), +@@ -5359,11 +5375,6 @@ def _seg_50(): + (0xFF21, 'M', 'a'), + (0xFF22, 'M', 'b'), + (0xFF23, 'M', 'c'), +- ] +- +-def _seg_51(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xFF24, 'M', 'd'), + (0xFF25, 'M', 'e'), + (0xFF26, 'M', 'f'), +@@ -5455,6 +5466,11 @@ def _seg_51(): + (0xFF7C, 'M', 'シ'), + (0xFF7D, 'M', 'ス'), + (0xFF7E, 'M', 'セ'), ++ ] ++ ++def _seg_52(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xFF7F, 'M', 'ソ'), + (0xFF80, 'M', 'タ'), + (0xFF81, 'M', 'チ'), +@@ -5464,11 +5480,6 @@ def _seg_51(): + (0xFF85, 'M', 'ナ'), + (0xFF86, 'M', 'ニ'), + (0xFF87, 'M', 'ヌ'), +- ] +- +-def _seg_52(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0xFF88, 'M', 'ネ'), + (0xFF89, 'M', 'ノ'), + (0xFF8A, 'M', 'ハ'), +@@ -5560,6 +5571,11 @@ def _seg_52(): + (0xFFE7, 'X'), + (0xFFE8, 'M', '│'), + (0xFFE9, 'M', '←'), ++ ] ++ ++def _seg_53(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0xFFEA, 'M', '↑'), + (0xFFEB, 'M', '→'), + (0xFFEC, 'M', '↓'), +@@ -5569,11 +5585,6 @@ def _seg_52(): + (0x10000, 'V'), + (0x1000C, 'X'), + (0x1000D, 'V'), +- ] +- +-def _seg_53(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x10027, 'X'), + (0x10028, 'V'), + (0x1003B, 'X'), +@@ -5665,6 +5676,11 @@ def _seg_53(): + (0x104B3, 'M', '𐓛'), + (0x104B4, 'M', '𐓜'), + (0x104B5, 'M', '𐓝'), ++ ] ++ ++def _seg_54(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x104B6, 'M', '𐓞'), + (0x104B7, 'M', '𐓟'), + (0x104B8, 'M', '𐓠'), +@@ -5674,11 +5690,6 @@ def _seg_53(): + (0x104BC, 'M', '𐓤'), + (0x104BD, 'M', '𐓥'), + (0x104BE, 'M', '𐓦'), +- ] +- +-def _seg_54(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x104BF, 'M', '𐓧'), + (0x104C0, 'M', '𐓨'), + (0x104C1, 'M', '𐓩'), +@@ -5708,13 +5719,124 @@ def _seg_54(): + (0x10530, 'V'), + (0x10564, 'X'), + (0x1056F, 'V'), +- (0x10570, 'X'), ++ (0x10570, 'M', '𐖗'), ++ (0x10571, 'M', '𐖘'), ++ (0x10572, 'M', '𐖙'), ++ (0x10573, 'M', '𐖚'), ++ (0x10574, 'M', '𐖛'), ++ (0x10575, 'M', '𐖜'), ++ (0x10576, 'M', '𐖝'), ++ (0x10577, 'M', '𐖞'), ++ (0x10578, 'M', '𐖟'), ++ (0x10579, 'M', '𐖠'), ++ (0x1057A, 'M', '𐖡'), ++ (0x1057B, 'X'), ++ (0x1057C, 'M', '𐖣'), ++ (0x1057D, 'M', '𐖤'), ++ (0x1057E, 'M', '𐖥'), ++ (0x1057F, 'M', '𐖦'), ++ (0x10580, 'M', '𐖧'), ++ (0x10581, 'M', '𐖨'), ++ (0x10582, 'M', '𐖩'), ++ (0x10583, 'M', '𐖪'), ++ (0x10584, 'M', '𐖫'), ++ (0x10585, 'M', '𐖬'), ++ (0x10586, 'M', '𐖭'), ++ (0x10587, 'M', '𐖮'), ++ (0x10588, 'M', '𐖯'), ++ (0x10589, 'M', '𐖰'), ++ (0x1058A, 'M', '𐖱'), ++ (0x1058B, 'X'), ++ (0x1058C, 'M', '𐖳'), ++ (0x1058D, 'M', '𐖴'), ++ (0x1058E, 'M', '𐖵'), ++ (0x1058F, 'M', '𐖶'), ++ (0x10590, 'M', '𐖷'), ++ (0x10591, 'M', '𐖸'), ++ (0x10592, 'M', '𐖹'), ++ (0x10593, 'X'), ++ (0x10594, 'M', '𐖻'), ++ (0x10595, 'M', '𐖼'), ++ (0x10596, 'X'), ++ (0x10597, 'V'), ++ (0x105A2, 'X'), ++ (0x105A3, 'V'), ++ (0x105B2, 'X'), ++ (0x105B3, 'V'), ++ (0x105BA, 'X'), ++ (0x105BB, 'V'), ++ (0x105BD, 'X'), + (0x10600, 'V'), + (0x10737, 'X'), + (0x10740, 'V'), + (0x10756, 'X'), + (0x10760, 'V'), + (0x10768, 'X'), ++ (0x10780, 'V'), ++ (0x10781, 'M', 'ː'), ++ (0x10782, 'M', 'ˑ'), ++ (0x10783, 'M', 'æ'), ++ (0x10784, 'M', 'ʙ'), ++ (0x10785, 'M', 'ɓ'), ++ (0x10786, 'X'), ++ (0x10787, 'M', 'ʣ'), ++ (0x10788, 'M', 'ꭦ'), ++ ] ++ ++def _seg_55(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ ++ (0x10789, 'M', 'ʥ'), ++ (0x1078A, 'M', 'ʤ'), ++ (0x1078B, 'M', 'ɖ'), ++ (0x1078C, 'M', 'ɗ'), ++ (0x1078D, 'M', 'ᶑ'), ++ (0x1078E, 'M', 'ɘ'), ++ (0x1078F, 'M', 'ɞ'), ++ (0x10790, 'M', 'ʩ'), ++ (0x10791, 'M', 'ɤ'), ++ (0x10792, 'M', 'ɢ'), ++ (0x10793, 'M', 'ɠ'), ++ (0x10794, 'M', 'ʛ'), ++ (0x10795, 'M', 'ħ'), ++ (0x10796, 'M', 'ʜ'), ++ (0x10797, 'M', 'ɧ'), ++ (0x10798, 'M', 'ʄ'), ++ (0x10799, 'M', 'ʪ'), ++ (0x1079A, 'M', 'ʫ'), ++ (0x1079B, 'M', 'ɬ'), ++ (0x1079C, 'M', '𝼄'), ++ (0x1079D, 'M', 'ꞎ'), ++ (0x1079E, 'M', 'ɮ'), ++ (0x1079F, 'M', '𝼅'), ++ (0x107A0, 'M', 'ʎ'), ++ (0x107A1, 'M', '𝼆'), ++ (0x107A2, 'M', 'ø'), ++ (0x107A3, 'M', 'ɶ'), ++ (0x107A4, 'M', 'ɷ'), ++ (0x107A5, 'M', 'q'), ++ (0x107A6, 'M', 'ɺ'), ++ (0x107A7, 'M', '𝼈'), ++ (0x107A8, 'M', 'ɽ'), ++ (0x107A9, 'M', 'ɾ'), ++ (0x107AA, 'M', 'ʀ'), ++ (0x107AB, 'M', 'ʨ'), ++ (0x107AC, 'M', 'ʦ'), ++ (0x107AD, 'M', 'ꭧ'), ++ (0x107AE, 'M', 'ʧ'), ++ (0x107AF, 'M', 'ʈ'), ++ (0x107B0, 'M', 'ⱱ'), ++ (0x107B1, 'X'), ++ (0x107B2, 'M', 'ʏ'), ++ (0x107B3, 'M', 'ʡ'), ++ (0x107B4, 'M', 'ʢ'), ++ (0x107B5, 'M', 'ʘ'), ++ (0x107B6, 'M', 'ǀ'), ++ (0x107B7, 'M', 'ǁ'), ++ (0x107B8, 'M', 'ǂ'), ++ (0x107B9, 'M', '𝼊'), ++ (0x107BA, 'M', '𝼞'), ++ (0x107BB, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), +@@ -5764,6 +5886,11 @@ def _seg_54(): + (0x10A60, 'V'), + (0x10AA0, 'X'), + (0x10AC0, 'V'), ++ ] ++ ++def _seg_56(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x10AE7, 'X'), + (0x10AEB, 'V'), + (0x10AF7, 'X'), +@@ -5779,11 +5906,6 @@ def _seg_54(): + (0x10B9D, 'X'), + (0x10BA9, 'V'), + (0x10BB0, 'X'), +- ] +- +-def _seg_55(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10C80, 'M', '𐳀'), +@@ -5856,6 +5978,8 @@ def _seg_55(): + (0x10F28, 'X'), + (0x10F30, 'V'), + (0x10F5A, 'X'), ++ (0x10F70, 'V'), ++ (0x10F8A, 'X'), + (0x10FB0, 'V'), + (0x10FCC, 'X'), + (0x10FE0, 'V'), +@@ -5863,11 +5987,16 @@ def _seg_55(): + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), +- (0x11070, 'X'), ++ (0x11076, 'X'), + (0x1107F, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), +- (0x110C2, 'X'), ++ ] ++ ++def _seg_57(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ ++ (0x110C3, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), +@@ -5884,11 +6013,6 @@ def _seg_55(): + (0x111F5, 'X'), + (0x11200, 'V'), + (0x11212, 'X'), +- ] +- +-def _seg_56(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x11213, 'V'), + (0x1123F, 'X'), + (0x11280, 'V'), +@@ -5954,7 +6078,7 @@ def _seg_56(): + (0x11660, 'V'), + (0x1166D, 'X'), + (0x11680, 'V'), +- (0x116B9, 'X'), ++ (0x116BA, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x11700, 'V'), +@@ -5962,7 +6086,7 @@ def _seg_56(): + (0x1171D, 'V'), + (0x1172C, 'X'), + (0x11730, 'V'), +- (0x11740, 'X'), ++ (0x11747, 'X'), + (0x11800, 'V'), + (0x1183C, 'X'), + (0x118A0, 'M', '𑣀'), +@@ -5972,6 +6096,11 @@ def _seg_56(): + (0x118A4, 'M', '𑣄'), + (0x118A5, 'M', '𑣅'), + (0x118A6, 'M', '𑣆'), ++ ] ++ ++def _seg_58(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x118A7, 'M', '𑣇'), + (0x118A8, 'M', '𑣈'), + (0x118A9, 'M', '𑣉'), +@@ -5989,11 +6118,6 @@ def _seg_56(): + (0x118B5, 'M', '𑣕'), + (0x118B6, 'M', '𑣖'), + (0x118B7, 'M', '𑣗'), +- ] +- +-def _seg_57(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x118B8, 'M', '𑣘'), + (0x118B9, 'M', '𑣙'), + (0x118BA, 'M', '𑣚'), +@@ -6030,7 +6154,7 @@ def _seg_57(): + (0x11A48, 'X'), + (0x11A50, 'V'), + (0x11AA3, 'X'), +- (0x11AC0, 'V'), ++ (0x11AB0, 'V'), + (0x11AF9, 'X'), + (0x11C00, 'V'), + (0x11C09, 'X'), +@@ -6077,6 +6201,11 @@ def _seg_57(): + (0x11FB0, 'V'), + (0x11FB1, 'X'), + (0x11FC0, 'V'), ++ ] ++ ++def _seg_59(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x11FF2, 'X'), + (0x11FFF, 'V'), + (0x1239A, 'X'), +@@ -6086,6 +6215,8 @@ def _seg_57(): + (0x12475, 'X'), + (0x12480, 'V'), + (0x12544, 'X'), ++ (0x12F90, 'V'), ++ (0x12FF3, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + (0x14400, 'V'), +@@ -6094,15 +6225,12 @@ def _seg_57(): + (0x16A39, 'X'), + (0x16A40, 'V'), + (0x16A5F, 'X'), +- ] +- +-def _seg_58(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x16A60, 'V'), + (0x16A6A, 'X'), + (0x16A6E, 'V'), +- (0x16A70, 'X'), ++ (0x16ABF, 'X'), ++ (0x16AC0, 'V'), ++ (0x16ACA, 'X'), + (0x16AD0, 'V'), + (0x16AEE, 'X'), + (0x16AF0, 'V'), +@@ -6167,11 +6295,22 @@ def _seg_58(): + (0x18CD6, 'X'), + (0x18D00, 'V'), + (0x18D09, 'X'), ++ (0x1AFF0, 'V'), ++ (0x1AFF4, 'X'), ++ (0x1AFF5, 'V'), ++ (0x1AFFC, 'X'), ++ (0x1AFFD, 'V'), ++ (0x1AFFF, 'X'), + (0x1B000, 'V'), +- (0x1B11F, 'X'), ++ (0x1B123, 'X'), + (0x1B150, 'V'), + (0x1B153, 'X'), + (0x1B164, 'V'), ++ ] ++ ++def _seg_60(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1B168, 'X'), + (0x1B170, 'V'), + (0x1B2FC, 'X'), +@@ -6186,6 +6325,12 @@ def _seg_58(): + (0x1BC9C, 'V'), + (0x1BCA0, 'I'), + (0x1BCA4, 'X'), ++ (0x1CF00, 'V'), ++ (0x1CF2E, 'X'), ++ (0x1CF30, 'V'), ++ (0x1CF47, 'X'), ++ (0x1CF50, 'V'), ++ (0x1CFC4, 'X'), + (0x1D000, 'V'), + (0x1D0F6, 'X'), + (0x1D100, 'V'), +@@ -6199,11 +6344,6 @@ def _seg_58(): + (0x1D163, 'M', '𝅘𝅥𝅱'), + (0x1D164, 'M', '𝅘𝅥𝅲'), + (0x1D165, 'V'), +- ] +- +-def _seg_59(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1D173, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', '𝆹𝅥'), +@@ -6213,7 +6353,7 @@ def _seg_59(): + (0x1D1BF, 'M', '𝆹𝅥𝅯'), + (0x1D1C0, 'M', '𝆺𝅥𝅯'), + (0x1D1C1, 'V'), +- (0x1D1E9, 'X'), ++ (0x1D1EB, 'X'), + (0x1D200, 'V'), + (0x1D246, 'X'), + (0x1D2E0, 'V'), +@@ -6271,6 +6411,11 @@ def _seg_59(): + (0x1D42E, 'M', 'u'), + (0x1D42F, 'M', 'v'), + (0x1D430, 'M', 'w'), ++ ] ++ ++def _seg_61(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1D431, 'M', 'x'), + (0x1D432, 'M', 'y'), + (0x1D433, 'M', 'z'), +@@ -6304,11 +6449,6 @@ def _seg_59(): + (0x1D44F, 'M', 'b'), + (0x1D450, 'M', 'c'), + (0x1D451, 'M', 'd'), +- ] +- +-def _seg_60(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1D452, 'M', 'e'), + (0x1D453, 'M', 'f'), + (0x1D454, 'M', 'g'), +@@ -6376,6 +6516,11 @@ def _seg_60(): + (0x1D492, 'M', 'q'), + (0x1D493, 'M', 'r'), + (0x1D494, 'M', 's'), ++ ] ++ ++def _seg_62(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1D495, 'M', 't'), + (0x1D496, 'M', 'u'), + (0x1D497, 'M', 'v'), +@@ -6409,11 +6554,6 @@ def _seg_60(): + (0x1D4B6, 'M', 'a'), + (0x1D4B7, 'M', 'b'), + (0x1D4B8, 'M', 'c'), +- ] +- +-def _seg_61(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1D4B9, 'M', 'd'), + (0x1D4BA, 'X'), + (0x1D4BB, 'M', 'f'), +@@ -6481,6 +6621,11 @@ def _seg_61(): + (0x1D4F9, 'M', 'p'), + (0x1D4FA, 'M', 'q'), + (0x1D4FB, 'M', 'r'), ++ ] ++ ++def _seg_63(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1D4FC, 'M', 's'), + (0x1D4FD, 'M', 't'), + (0x1D4FE, 'M', 'u'), +@@ -6514,11 +6659,6 @@ def _seg_61(): + (0x1D51B, 'M', 'x'), + (0x1D51C, 'M', 'y'), + (0x1D51D, 'X'), +- ] +- +-def _seg_62(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1D51E, 'M', 'a'), + (0x1D51F, 'M', 'b'), + (0x1D520, 'M', 'c'), +@@ -6586,6 +6726,11 @@ def _seg_62(): + (0x1D560, 'M', 'o'), + (0x1D561, 'M', 'p'), + (0x1D562, 'M', 'q'), ++ ] ++ ++def _seg_64(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1D563, 'M', 'r'), + (0x1D564, 'M', 's'), + (0x1D565, 'M', 't'), +@@ -6619,11 +6764,6 @@ def _seg_62(): + (0x1D581, 'M', 'v'), + (0x1D582, 'M', 'w'), + (0x1D583, 'M', 'x'), +- ] +- +-def _seg_63(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1D584, 'M', 'y'), + (0x1D585, 'M', 'z'), + (0x1D586, 'M', 'a'), +@@ -6691,6 +6831,11 @@ def _seg_63(): + (0x1D5C4, 'M', 'k'), + (0x1D5C5, 'M', 'l'), + (0x1D5C6, 'M', 'm'), ++ ] ++ ++def _seg_65(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1D5C7, 'M', 'n'), + (0x1D5C8, 'M', 'o'), + (0x1D5C9, 'M', 'p'), +@@ -6724,11 +6869,6 @@ def _seg_63(): + (0x1D5E5, 'M', 'r'), + (0x1D5E6, 'M', 's'), + (0x1D5E7, 'M', 't'), +- ] +- +-def _seg_64(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1D5E8, 'M', 'u'), + (0x1D5E9, 'M', 'v'), + (0x1D5EA, 'M', 'w'), +@@ -6796,6 +6936,11 @@ def _seg_64(): + (0x1D628, 'M', 'g'), + (0x1D629, 'M', 'h'), + (0x1D62A, 'M', 'i'), ++ ] ++ ++def _seg_66(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1D62B, 'M', 'j'), + (0x1D62C, 'M', 'k'), + (0x1D62D, 'M', 'l'), +@@ -6829,11 +6974,6 @@ def _seg_64(): + (0x1D649, 'M', 'n'), + (0x1D64A, 'M', 'o'), + (0x1D64B, 'M', 'p'), +- ] +- +-def _seg_65(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1D64C, 'M', 'q'), + (0x1D64D, 'M', 'r'), + (0x1D64E, 'M', 's'), +@@ -6901,6 +7041,11 @@ def _seg_65(): + (0x1D68C, 'M', 'c'), + (0x1D68D, 'M', 'd'), + (0x1D68E, 'M', 'e'), ++ ] ++ ++def _seg_67(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1D68F, 'M', 'f'), + (0x1D690, 'M', 'g'), + (0x1D691, 'M', 'h'), +@@ -6934,11 +7079,6 @@ def _seg_65(): + (0x1D6AE, 'M', 'η'), + (0x1D6AF, 'M', 'θ'), + (0x1D6B0, 'M', 'ι'), +- ] +- +-def _seg_66(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1D6B1, 'M', 'κ'), + (0x1D6B2, 'M', 'λ'), + (0x1D6B3, 'M', 'μ'), +@@ -7006,6 +7146,11 @@ def _seg_66(): + (0x1D6F2, 'M', 'ρ'), + (0x1D6F3, 'M', 'θ'), + (0x1D6F4, 'M', 'σ'), ++ ] ++ ++def _seg_68(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1D6F5, 'M', 'τ'), + (0x1D6F6, 'M', 'υ'), + (0x1D6F7, 'M', 'φ'), +@@ -7039,11 +7184,6 @@ def _seg_66(): + (0x1D714, 'M', 'ω'), + (0x1D715, 'M', '∂'), + (0x1D716, 'M', 'ε'), +- ] +- +-def _seg_67(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1D717, 'M', 'θ'), + (0x1D718, 'M', 'κ'), + (0x1D719, 'M', 'φ'), +@@ -7111,6 +7251,11 @@ def _seg_67(): + (0x1D758, 'M', 'γ'), + (0x1D759, 'M', 'δ'), + (0x1D75A, 'M', 'ε'), ++ ] ++ ++def _seg_69(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1D75B, 'M', 'ζ'), + (0x1D75C, 'M', 'η'), + (0x1D75D, 'M', 'θ'), +@@ -7144,11 +7289,6 @@ def _seg_67(): + (0x1D779, 'M', 'κ'), + (0x1D77A, 'M', 'λ'), + (0x1D77B, 'M', 'μ'), +- ] +- +-def _seg_68(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1D77C, 'M', 'ν'), + (0x1D77D, 'M', 'ξ'), + (0x1D77E, 'M', 'ο'), +@@ -7216,6 +7356,11 @@ def _seg_68(): + (0x1D7BE, 'M', 'υ'), + (0x1D7BF, 'M', 'φ'), + (0x1D7C0, 'M', 'χ'), ++ ] ++ ++def _seg_70(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1D7C1, 'M', 'ψ'), + (0x1D7C2, 'M', 'ω'), + (0x1D7C3, 'M', '∂'), +@@ -7249,11 +7394,6 @@ def _seg_68(): + (0x1D7E1, 'M', '9'), + (0x1D7E2, 'M', '0'), + (0x1D7E3, 'M', '1'), +- ] +- +-def _seg_69(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1D7E4, 'M', '2'), + (0x1D7E5, 'M', '3'), + (0x1D7E6, 'M', '4'), +@@ -7288,6 +7428,8 @@ def _seg_69(): + (0x1DAA0, 'X'), + (0x1DAA1, 'V'), + (0x1DAB0, 'X'), ++ (0x1DF00, 'V'), ++ (0x1DF1F, 'X'), + (0x1E000, 'V'), + (0x1E007, 'X'), + (0x1E008, 'V'), +@@ -7306,10 +7448,25 @@ def _seg_69(): + (0x1E14A, 'X'), + (0x1E14E, 'V'), + (0x1E150, 'X'), ++ (0x1E290, 'V'), ++ (0x1E2AF, 'X'), + (0x1E2C0, 'V'), + (0x1E2FA, 'X'), + (0x1E2FF, 'V'), + (0x1E300, 'X'), ++ (0x1E7E0, 'V'), ++ (0x1E7E7, 'X'), ++ (0x1E7E8, 'V'), ++ (0x1E7EC, 'X'), ++ (0x1E7ED, 'V'), ++ (0x1E7EF, 'X'), ++ (0x1E7F0, 'V'), ++ ] ++ ++def _seg_71(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ ++ (0x1E7FF, 'X'), + (0x1E800, 'V'), + (0x1E8C5, 'X'), + (0x1E8C7, 'V'), +@@ -7354,11 +7511,6 @@ def _seg_69(): + (0x1E95A, 'X'), + (0x1E95E, 'V'), + (0x1E960, 'X'), +- ] +- +-def _seg_70(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1EC71, 'V'), + (0x1ECB5, 'X'), + (0x1ED01, 'V'), +@@ -7414,6 +7566,11 @@ def _seg_70(): + (0x1EE31, 'M', 'ص'), + (0x1EE32, 'M', 'ق'), + (0x1EE33, 'X'), ++ ] ++ ++def _seg_72(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1EE34, 'M', 'ش'), + (0x1EE35, 'M', 'ت'), + (0x1EE36, 'M', 'ث'), +@@ -7459,11 +7616,6 @@ def _seg_70(): + (0x1EE68, 'M', 'ط'), + (0x1EE69, 'M', 'ي'), + (0x1EE6A, 'M', 'ك'), +- ] +- +-def _seg_71(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1EE6B, 'X'), + (0x1EE6C, 'M', 'م'), + (0x1EE6D, 'M', 'ن'), +@@ -7519,6 +7671,11 @@ def _seg_71(): + (0x1EEA3, 'M', 'د'), + (0x1EEA4, 'X'), + (0x1EEA5, 'M', 'و'), ++ ] ++ ++def _seg_73(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1EEA6, 'M', 'ز'), + (0x1EEA7, 'M', 'ح'), + (0x1EEA8, 'M', 'ط'), +@@ -7564,11 +7721,6 @@ def _seg_71(): + (0x1F106, '3', '5,'), + (0x1F107, '3', '6,'), + (0x1F108, '3', '7,'), +- ] +- +-def _seg_72(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1F109, '3', '8,'), + (0x1F10A, '3', '9,'), + (0x1F10B, 'V'), +@@ -7624,6 +7776,11 @@ def _seg_72(): + (0x1F141, 'M', 'r'), + (0x1F142, 'M', 's'), + (0x1F143, 'M', 't'), ++ ] ++ ++def _seg_74(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1F144, 'M', 'u'), + (0x1F145, 'M', 'v'), + (0x1F146, 'M', 'w'), +@@ -7669,11 +7826,6 @@ def _seg_72(): + (0x1F221, 'M', '終'), + (0x1F222, 'M', '生'), + (0x1F223, 'M', '販'), +- ] +- +-def _seg_73(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1F224, 'M', '声'), + (0x1F225, 'M', '吹'), + (0x1F226, 'M', '演'), +@@ -7716,7 +7868,7 @@ def _seg_73(): + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D8, 'X'), +- (0x1F6E0, 'V'), ++ (0x1F6DD, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6FD, 'X'), +@@ -7726,7 +7878,14 @@ def _seg_73(): + (0x1F7D9, 'X'), + (0x1F7E0, 'V'), + (0x1F7EC, 'X'), ++ (0x1F7F0, 'V'), ++ (0x1F7F1, 'X'), + (0x1F800, 'V'), ++ ] ++ ++def _seg_75(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x1F80C, 'X'), + (0x1F810, 'V'), + (0x1F848, 'X'), +@@ -7739,27 +7898,27 @@ def _seg_73(): + (0x1F8B0, 'V'), + (0x1F8B2, 'X'), + (0x1F900, 'V'), +- (0x1F979, 'X'), +- (0x1F97A, 'V'), +- (0x1F9CC, 'X'), +- (0x1F9CD, 'V'), + (0x1FA54, 'X'), + (0x1FA60, 'V'), + (0x1FA6E, 'X'), + (0x1FA70, 'V'), + (0x1FA75, 'X'), + (0x1FA78, 'V'), +- (0x1FA7B, 'X'), ++ (0x1FA7D, 'X'), + (0x1FA80, 'V'), + (0x1FA87, 'X'), + (0x1FA90, 'V'), +- (0x1FAA9, 'X'), ++ (0x1FAAD, 'X'), + (0x1FAB0, 'V'), +- (0x1FAB7, 'X'), ++ (0x1FABB, 'X'), + (0x1FAC0, 'V'), +- (0x1FAC3, 'X'), ++ (0x1FAC6, 'X'), + (0x1FAD0, 'V'), +- (0x1FAD7, 'X'), ++ (0x1FADA, 'X'), ++ (0x1FAE0, 'V'), ++ (0x1FAE8, 'X'), ++ (0x1FAF0, 'V'), ++ (0x1FAF7, 'X'), + (0x1FB00, 'V'), + (0x1FB93, 'X'), + (0x1FB94, 'V'), +@@ -7774,16 +7933,11 @@ def _seg_73(): + (0x1FBF7, 'M', '7'), + (0x1FBF8, 'M', '8'), + (0x1FBF9, 'M', '9'), +- ] +- +-def _seg_74(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x1FBFA, 'X'), + (0x20000, 'V'), +- (0x2A6DE, 'X'), ++ (0x2A6E0, 'X'), + (0x2A700, 'V'), +- (0x2B735, 'X'), ++ (0x2B739, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2B820, 'V'), +@@ -7832,6 +7986,11 @@ def _seg_74(): + (0x2F827, 'M', '勤'), + (0x2F828, 'M', '勺'), + (0x2F829, 'M', '包'), ++ ] ++ ++def _seg_76(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x2F82A, 'M', '匆'), + (0x2F82B, 'M', '北'), + (0x2F82C, 'M', '卉'), +@@ -7879,11 +8038,6 @@ def _seg_74(): + (0x2F859, 'M', '𡓤'), + (0x2F85A, 'M', '売'), + (0x2F85B, 'M', '壷'), +- ] +- +-def _seg_75(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x2F85C, 'M', '夆'), + (0x2F85D, 'M', '多'), + (0x2F85E, 'M', '夢'), +@@ -7937,6 +8091,11 @@ def _seg_75(): + (0x2F88F, 'M', '𪎒'), + (0x2F890, 'M', '廾'), + (0x2F891, 'M', '𢌱'), ++ ] ++ ++def _seg_77(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x2F893, 'M', '舁'), + (0x2F894, 'M', '弢'), + (0x2F896, 'M', '㣇'), +@@ -7984,11 +8143,6 @@ def _seg_75(): + (0x2F8C0, 'M', '揅'), + (0x2F8C1, 'M', '掩'), + (0x2F8C2, 'M', '㨮'), +- ] +- +-def _seg_76(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x2F8C3, 'M', '摩'), + (0x2F8C4, 'M', '摾'), + (0x2F8C5, 'M', '撝'), +@@ -8042,6 +8196,11 @@ def _seg_76(): + (0x2F8F5, 'M', '殺'), + (0x2F8F6, 'M', '殻'), + (0x2F8F7, 'M', '𣪍'), ++ ] ++ ++def _seg_78(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x2F8F8, 'M', '𡴋'), + (0x2F8F9, 'M', '𣫺'), + (0x2F8FA, 'M', '汎'), +@@ -8089,11 +8248,6 @@ def _seg_76(): + (0x2F924, 'M', '犀'), + (0x2F925, 'M', '犕'), + (0x2F926, 'M', '𤜵'), +- ] +- +-def _seg_77(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x2F927, 'M', '𤠔'), + (0x2F928, 'M', '獺'), + (0x2F929, 'M', '王'), +@@ -8147,6 +8301,11 @@ def _seg_77(): + (0x2F95B, 'M', '穏'), + (0x2F95C, 'M', '𥥼'), + (0x2F95D, 'M', '𥪧'), ++ ] ++ ++def _seg_79(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x2F95F, 'X'), + (0x2F960, 'M', '䈂'), + (0x2F961, 'M', '𥮫'), +@@ -8194,11 +8353,6 @@ def _seg_77(): + (0x2F98B, 'M', '舁'), + (0x2F98C, 'M', '舄'), + (0x2F98D, 'M', '辞'), +- ] +- +-def _seg_78(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x2F98E, 'M', '䑫'), + (0x2F98F, 'M', '芑'), + (0x2F990, 'M', '芋'), +@@ -8252,6 +8406,11 @@ def _seg_78(): + (0x2F9C0, 'M', '蟡'), + (0x2F9C1, 'M', '蠁'), + (0x2F9C2, 'M', '䗹'), ++ ] ++ ++def _seg_80(): ++ # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++ return [ + (0x2F9C3, 'M', '衠'), + (0x2F9C4, 'M', '衣'), + (0x2F9C5, 'M', '𧙧'), +@@ -8299,11 +8458,6 @@ def _seg_78(): + (0x2F9EF, 'M', '䦕'), + (0x2F9F0, 'M', '閷'), + (0x2F9F1, 'M', '𨵷'), +- ] +- +-def _seg_79(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] +- return [ + (0x2F9F2, 'M', '䧦'), + (0x2F9F3, 'M', '雃'), + (0x2F9F4, 'M', '嶲'), +@@ -8435,4 +8589,5 @@ uts46data = tuple( + + _seg_77() + + _seg_78() + + _seg_79() ++ + _seg_80() + ) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] + diff --git a/backport-0002-CVE-2024-3651.patch b/backport-0002-CVE-2024-3651.patch new file mode 100644 index 0000000..444ad68 --- /dev/null +++ b/backport-0002-CVE-2024-3651.patch @@ -0,0 +1,32 @@ +From f50df5120f3584c3375f1a42e413826fe9411a53 Mon Sep 17 00:00:00 2001 +From: Kim Davies +Date: Sun, 3 Oct 2021 07:45:11 -0700 +Subject: [PATCH] Raise IDNAError on non-ASCII A-Label (fixes #108) + +Reference:https://github.com/kjd/idna/commit/f50df5120f3584c3375f1a42e413826fe9411a53 +Conflict:NA + + +--- + src/pip/_vendor/idna/core.py | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/src/pip/_vendor/idna/core.py b/src/pip/_vendor/idna/core.py +index d605129..871ebd3 100644 +--- a/src/pip/_vendor/idna/core.py ++++ b/src/pip/_vendor/idna/core.py +@@ -383,8 +383,11 @@ def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): + + def decode(s, strict=False, uts46=False, std3_rules=False): + # type: (Union[str, bytes, bytearray], bool, bool, bool) -> str +- if isinstance(s, (bytes, bytearray)): +- s = s.decode('ascii') ++ try: ++ if isinstance(s, (bytes, bytearray)): ++ s = s.decode('ascii') ++ except UnicodeDecodeError: ++ raise IDNAError('Invalid ASCII in A-label') + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + diff --git a/backport-0003-CVE-2024-3651.patch b/backport-0003-CVE-2024-3651.patch new file mode 100644 index 0000000..f2fe3fa --- /dev/null +++ b/backport-0003-CVE-2024-3651.patch @@ -0,0 +1,1104 @@ +From 8bbb873421dd565af69541844a61a4d0fbf6aa60 Mon Sep 17 00:00:00 2001 +From: Kim Davies +Date: Sun, 3 Oct 2021 08:38:24 -0700 +Subject: [PATCH] Resync type annotations with master + +Reference:https://github.com/kjd/idna/commit/8bbb873421dd565af69541844a61a4d0fbf6aa60 +Conflict:NA + + +--- + src/pip/_vendor/idna/codec.py | 15 +- + src/pip/_vendor/idna/compat.py | 9 +- + src/pip/_vendor/idna/core.py | 54 +++---- + src/pip/_vendor/idna/intranges.py | 12 +- + src/pip/_vendor/idna/uts46data.py | 243 ++++++++++-------------------- + 5 files changed, 111 insertions(+), 222 deletions(-) + +diff --git a/src/pip/_vendor/idna/codec.py b/src/pip/_vendor/idna/codec.py +index 080f22a..1ca9ba6 100644 +--- a/src/pip/_vendor/idna/codec.py ++++ b/src/pip/_vendor/idna/codec.py +@@ -7,8 +7,7 @@ _unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]') + + class Codec(codecs.Codec): + +- def encode(self, data, errors='strict'): +- # type: (str, str) -> Tuple[bytes, int] ++ def encode(self, data: str, errors: str = 'strict') -> Tuple[bytes, int]: + if errors != 'strict': + raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + +@@ -17,8 +16,7 @@ class Codec(codecs.Codec): + + return encode(data), len(data) + +- def decode(self, data, errors='strict'): +- # type: (bytes, str) -> Tuple[str, int] ++ def decode(self, data: bytes, errors: str = 'strict') -> Tuple[str, int]: + if errors != 'strict': + raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + +@@ -28,8 +26,7 @@ class Codec(codecs.Codec): + return decode(data), len(data) + + class IncrementalEncoder(codecs.BufferedIncrementalEncoder): +- def _buffer_encode(self, data, errors, final): # type: ignore +- # type: (str, str, bool) -> Tuple[str, int] ++ def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore + if errors != 'strict': + raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + +@@ -62,8 +59,7 @@ class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + return result_str, size + + class IncrementalDecoder(codecs.BufferedIncrementalDecoder): +- def _buffer_decode(self, data, errors, final): # type: ignore +- # type: (str, str, bool) -> Tuple[str, int] ++ def _buffer_decode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore + if errors != 'strict': + raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + +@@ -103,8 +99,7 @@ class StreamReader(Codec, codecs.StreamReader): + pass + + +-def getregentry(): +- # type: () -> codecs.CodecInfo ++def getregentry() -> codecs.CodecInfo: + # Compatibility as a search_function for codecs.register() + return codecs.CodecInfo( + name='idna', +diff --git a/src/pip/_vendor/idna/compat.py b/src/pip/_vendor/idna/compat.py +index dc896c7..786e6bd 100644 +--- a/src/pip/_vendor/idna/compat.py ++++ b/src/pip/_vendor/idna/compat.py +@@ -2,15 +2,12 @@ from .core import * + from .codec import * + from typing import Any, Union + +-def ToASCII(label): +- # type: (str) -> bytes ++def ToASCII(label: str) -> bytes: + return encode(label) + +-def ToUnicode(label): +- # type: (Union[bytes, bytearray]) -> str ++def ToUnicode(label: Union[bytes, bytearray]) -> str: + return decode(label) + +-def nameprep(s): +- # type: (Any) -> None ++def nameprep(s: Any) -> None: + raise NotImplementedError('IDNA 2008 does not utilise nameprep protocol') + +diff --git a/src/pip/_vendor/idna/core.py b/src/pip/_vendor/idna/core.py +index 871ebd3..20f2b63 100644 +--- a/src/pip/_vendor/idna/core.py ++++ b/src/pip/_vendor/idna/core.py +@@ -29,43 +29,36 @@ class InvalidCodepointContext(IDNAError): + pass + + +-def _combining_class(cp): +- # type: (int) -> int ++def _combining_class(cp: int) -> int: + v = unicodedata.combining(chr(cp)) + if v == 0: + if not unicodedata.name(chr(cp)): + raise ValueError('Unknown character in unicodedata') + return v + +-def _is_script(cp, script): +- # type: (str, str) -> bool ++def _is_script(cp: str, script: str) -> bool: + return intranges_contain(ord(cp), idnadata.scripts[script]) + +-def _punycode(s): +- # type: (str) -> bytes ++def _punycode(s: str) -> bytes: + return s.encode('punycode') + +-def _unot(s): +- # type: (int) -> str ++def _unot(s: int) -> str: + return 'U+{:04X}'.format(s) + + +-def valid_label_length(label): +- # type: (Union[bytes, str]) -> bool ++def valid_label_length(label: Union[bytes, str]) -> bool: + if len(label) > 63: + return False + return True + + +-def valid_string_length(label, trailing_dot): +- # type: (Union[bytes, str], bool) -> bool ++def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool: + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +-def check_bidi(label, check_ltr=False): +- # type: (str, bool) -> bool ++def check_bidi(label: str, check_ltr: bool = False) -> bool: + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for (idx, cp) in enumerate(label, 1): +@@ -124,15 +117,13 @@ def check_bidi(label, check_ltr=False): + return True + + +-def check_initial_combiner(label): +- # type: (str) -> bool ++def check_initial_combiner(label: str) -> bool: + if unicodedata.category(label[0])[0] == 'M': + raise IDNAError('Label begins with an illegal combining character') + return True + + +-def check_hyphen_ok(label): +- # type: (str) -> bool ++def check_hyphen_ok(label: str) -> bool: + if label[2:4] == '--': + raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') + if label[0] == '-' or label[-1] == '-': +@@ -140,14 +131,12 @@ def check_hyphen_ok(label): + return True + + +-def check_nfc(label): +- # type: (str) -> None ++def check_nfc(label: str) -> None: + if unicodedata.normalize('NFC', label) != label: + raise IDNAError('Label must be in Normalization Form C') + + +-def valid_contextj(label, pos): +- # type: (str, int) -> bool ++def valid_contextj(label: str, pos: int) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x200c: +@@ -190,8 +179,7 @@ def valid_contextj(label, pos): + return False + + +-def valid_contexto(label, pos, exception=False): +- # type: (str, int, bool) -> bool ++def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x00b7: +@@ -233,8 +221,7 @@ def valid_contexto(label, pos, exception=False): + return False + + +-def check_label(label): +- # type: (Union[str, bytes, bytearray]) -> None ++def check_label(label: Union[str, bytes, bytearray]) -> None: + if isinstance(label, (bytes, bytearray)): + label = label.decode('utf-8') + if len(label) == 0: +@@ -265,8 +252,7 @@ def check_label(label): + check_bidi(label) + + +-def alabel(label): +- # type: (str) -> bytes ++def alabel(label: str) -> bytes: + try: + label_bytes = label.encode('ascii') + ulabel(label_bytes) +@@ -290,8 +276,7 @@ def alabel(label): + return label_bytes + + +-def ulabel(label): +- # type: (Union[str, bytes, bytearray]) -> str ++def ulabel(label: Union[str, bytes, bytearray]) -> str: + if not isinstance(label, (bytes, bytearray)): + try: + label_bytes = label.encode('ascii') +@@ -317,8 +302,7 @@ def ulabel(label): + return label + + +-def uts46_remap(domain, std3_rules=True, transitional=False): +- # type: (str, bool, bool) -> str ++def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str: + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + output = '' +@@ -350,8 +334,7 @@ def uts46_remap(domain, std3_rules=True, transitional=False): + return unicodedata.normalize('NFC', output) + + +-def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): +- # type: (Union[str, bytes, bytearray], bool, bool, bool, bool) -> bytes ++def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False, transitional: bool = False) -> bytes: + if isinstance(s, (bytes, bytearray)): + s = s.decode('ascii') + if uts46: +@@ -381,8 +364,7 @@ def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): + return s + + +-def decode(s, strict=False, uts46=False, std3_rules=False): +- # type: (Union[str, bytes, bytearray], bool, bool, bool) -> str ++def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False) -> str: + try: + if isinstance(s, (bytes, bytearray)): + s = s.decode('ascii') +diff --git a/src/pip/_vendor/idna/intranges.py b/src/pip/_vendor/idna/intranges.py +index ee364a9..6a43b04 100644 +--- a/src/pip/_vendor/idna/intranges.py ++++ b/src/pip/_vendor/idna/intranges.py +@@ -8,8 +8,7 @@ in the original list?" in time O(log(# runs)). + import bisect + from typing import List, Tuple + +-def intranges_from_list(list_): +- # type: (List[int]) -> Tuple[int, ...] ++def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. +@@ -30,17 +29,14 @@ def intranges_from_list(list_): + + return tuple(ranges) + +-def _encode_range(start, end): +- # type: (int, int) -> int ++def _encode_range(start: int, end: int) -> int: + return (start << 32) | end + +-def _decode_range(r): +- # type: (int) -> Tuple[int, int] ++def _decode_range(r: int) -> Tuple[int, int]: + return (r >> 32), (r & ((1 << 32) - 1)) + + +-def intranges_contain(int_, ranges): +- # type: (int, Tuple[int, ...]) -> bool ++def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) +diff --git a/src/pip/_vendor/idna/uts46data.py b/src/pip/_vendor/idna/uts46data.py +index c765248..8f65705 100644 +--- a/src/pip/_vendor/idna/uts46data.py ++++ b/src/pip/_vendor/idna/uts46data.py +@@ -8,8 +8,7 @@ from typing import List, Tuple, Union + + + __version__ = '14.0.0' +-def _seg_0(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x0, '3'), + (0x1, '3'), +@@ -113,8 +112,7 @@ def _seg_0(): + (0x63, 'V'), + ] + +-def _seg_1(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x64, 'V'), + (0x65, 'V'), +@@ -218,8 +216,7 @@ def _seg_1(): + (0xC7, 'M', 'ç'), + ] + +-def _seg_2(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC8, 'M', 'è'), + (0xC9, 'M', 'é'), +@@ -323,8 +320,7 @@ def _seg_2(): + (0x12B, 'V'), + ] + +-def _seg_3(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x12C, 'M', 'ĭ'), + (0x12D, 'V'), +@@ -428,8 +424,7 @@ def _seg_3(): + (0x193, 'M', 'ɠ'), + ] + +-def _seg_4(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x194, 'M', 'ɣ'), + (0x195, 'V'), +@@ -533,8 +528,7 @@ def _seg_4(): + (0x20C, 'M', 'ȍ'), + ] + +-def _seg_5(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x20D, 'V'), + (0x20E, 'M', 'ȏ'), +@@ -638,8 +632,7 @@ def _seg_5(): + (0x377, 'V'), + ] + +-def _seg_6(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x378, 'X'), + (0x37A, '3', ' ι'), +@@ -743,8 +736,7 @@ def _seg_6(): + (0x402, 'M', 'ђ'), + ] + +-def _seg_7(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x403, 'M', 'ѓ'), + (0x404, 'M', 'є'), +@@ -848,8 +840,7 @@ def _seg_7(): + (0x49D, 'V'), + ] + +-def _seg_8(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x49E, 'M', 'ҟ'), + (0x49F, 'V'), +@@ -953,8 +944,7 @@ def _seg_8(): + (0x502, 'M', 'ԃ'), + ] + +-def _seg_9(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x503, 'V'), + (0x504, 'M', 'ԅ'), +@@ -1058,8 +1048,7 @@ def _seg_9(): + (0x61D, 'V'), + ] + +-def _seg_10(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x675, 'M', 'اٴ'), + (0x676, 'M', 'وٴ'), +@@ -1163,8 +1152,7 @@ def _seg_10(): + (0xA5D, 'X'), + ] + +-def _seg_11(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA5E, 'M', 'ਫ਼'), + (0xA5F, 'X'), +@@ -1268,8 +1256,7 @@ def _seg_11(): + (0xC2A, 'V'), + ] + +-def _seg_12(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC3A, 'X'), + (0xC3C, 'V'), +@@ -1373,8 +1360,7 @@ def _seg_12(): + (0xEB4, 'V'), + ] + +-def _seg_13(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xEBE, 'X'), + (0xEC0, 'V'), +@@ -1478,8 +1464,7 @@ def _seg_13(): + (0x1312, 'V'), + ] + +-def _seg_14(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1316, 'X'), + (0x1318, 'V'), +@@ -1583,8 +1568,7 @@ def _seg_14(): + (0x1C80, 'M', 'в'), + ] + +-def _seg_15(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1C81, 'M', 'д'), + (0x1C82, 'M', 'о'), +@@ -1688,8 +1672,7 @@ def _seg_15(): + (0x1D53, 'M', 'ɔ'), + ] + +-def _seg_16(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D54, 'M', 'ᴖ'), + (0x1D55, 'M', 'ᴗ'), +@@ -1793,8 +1776,7 @@ def _seg_16(): + (0x1E23, 'V'), + ] + +-def _seg_17(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E24, 'M', 'ḥ'), + (0x1E25, 'V'), +@@ -1898,8 +1880,7 @@ def _seg_17(): + (0x1E87, 'V'), + ] + +-def _seg_18(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E88, 'M', 'ẉ'), + (0x1E89, 'V'), +@@ -2003,8 +1984,7 @@ def _seg_18(): + (0x1EF0, 'M', 'ự'), + ] + +-def _seg_19(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EF1, 'V'), + (0x1EF2, 'M', 'ỳ'), +@@ -2108,8 +2088,7 @@ def _seg_19(): + (0x1F87, 'M', 'ἇι'), + ] + +-def _seg_20(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F88, 'M', 'ἀι'), + (0x1F89, 'M', 'ἁι'), +@@ -2213,8 +2192,7 @@ def _seg_20(): + (0x1FF6, 'V'), + ] + +-def _seg_21(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FF7, 'M', 'ῶι'), + (0x1FF8, 'M', 'ὸ'), +@@ -2318,8 +2296,7 @@ def _seg_21(): + (0x2104, 'V'), + ] + +-def _seg_22(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2105, '3', 'c/o'), + (0x2106, '3', 'c/u'), +@@ -2423,8 +2400,7 @@ def _seg_22(): + (0x217C, 'M', 'l'), + ] + +-def _seg_23(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x217D, 'M', 'c'), + (0x217E, 'M', 'd'), +@@ -2528,8 +2504,7 @@ def _seg_23(): + (0x24BC, 'M', 'g'), + ] + +-def _seg_24(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x24BD, 'M', 'h'), + (0x24BE, 'M', 'i'), +@@ -2633,8 +2608,7 @@ def _seg_24(): + (0x2C28, 'M', 'ⱘ'), + ] + +-def _seg_25(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2C29, 'M', 'ⱙ'), + (0x2C2A, 'M', 'ⱚ'), +@@ -2738,8 +2712,7 @@ def _seg_25(): + (0x2CC2, 'M', 'ⳃ'), + ] + +-def _seg_26(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2CC3, 'V'), + (0x2CC4, 'M', 'ⳅ'), +@@ -2843,8 +2816,7 @@ def _seg_26(): + (0x2F15, 'M', '匚'), + ] + +-def _seg_27(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F16, 'M', '匸'), + (0x2F17, 'M', '十'), +@@ -2948,8 +2920,7 @@ def _seg_27(): + (0x2F79, 'M', '网'), + ] + +-def _seg_28(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F7A, 'M', '羊'), + (0x2F7B, 'M', '羽'), +@@ -3053,8 +3024,7 @@ def _seg_28(): + (0x3038, 'M', '十'), + ] + +-def _seg_29(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3039, 'M', '卄'), + (0x303A, 'M', '卅'), +@@ -3158,8 +3128,7 @@ def _seg_29(): + (0x3184, 'M', 'ᅗ'), + ] + +-def _seg_30(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3185, 'M', 'ᅘ'), + (0x3186, 'M', 'ᅙ'), +@@ -3263,8 +3232,7 @@ def _seg_30(): + (0x3246, 'M', '文'), + ] + +-def _seg_31(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3247, 'M', '箏'), + (0x3248, 'V'), +@@ -3368,8 +3336,7 @@ def _seg_31(): + (0x32B1, 'M', '36'), + ] + +-def _seg_32(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x32B2, 'M', '37'), + (0x32B3, 'M', '38'), +@@ -3473,8 +3440,7 @@ def _seg_32(): + (0x3315, 'M', 'キログラム'), + ] + +-def _seg_33(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3316, 'M', 'キロメートル'), + (0x3317, 'M', 'キロワット'), +@@ -3578,8 +3544,7 @@ def _seg_33(): + (0x3379, 'M', 'dm3'), + ] + +-def _seg_34(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x337A, 'M', 'iu'), + (0x337B, 'M', '平成'), +@@ -3683,8 +3648,7 @@ def _seg_34(): + (0x33DD, 'M', 'wb'), + ] + +-def _seg_35(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x33DE, 'M', 'v∕m'), + (0x33DF, 'M', 'a∕m'), +@@ -3788,8 +3752,7 @@ def _seg_35(): + (0xA68D, 'V'), + ] + +-def _seg_36(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA68E, 'M', 'ꚏ'), + (0xA68F, 'V'), +@@ -3893,8 +3856,7 @@ def _seg_36(): + (0xA77B, 'M', 'ꝼ'), + ] + +-def _seg_37(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA77C, 'V'), + (0xA77D, 'M', 'ᵹ'), +@@ -3998,8 +3960,7 @@ def _seg_37(): + (0xA8C6, 'X'), + ] + +-def _seg_38(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA8CE, 'V'), + (0xA8DA, 'X'), +@@ -4103,8 +4064,7 @@ def _seg_38(): + (0xABAA, 'M', 'Ꮪ'), + ] + +-def _seg_39(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xABAB, 'M', 'Ꮫ'), + (0xABAC, 'M', 'Ꮬ'), +@@ -4208,8 +4168,7 @@ def _seg_39(): + (0xF945, 'M', '聾'), + ] + +-def _seg_40(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF946, 'M', '牢'), + (0xF947, 'M', '磊'), +@@ -4313,8 +4272,7 @@ def _seg_40(): + (0xF9A9, 'M', '囹'), + ] + +-def _seg_41(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF9AA, 'M', '寧'), + (0xF9AB, 'M', '嶺'), +@@ -4418,8 +4376,7 @@ def _seg_41(): + (0xFA0D, 'M', '嗀'), + ] + +-def _seg_42(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFA0E, 'V'), + (0xFA10, 'M', '塚'), +@@ -4523,8 +4480,7 @@ def _seg_42(): + (0xFA78, 'M', '喝'), + ] + +-def _seg_43(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFA79, 'M', '啕'), + (0xFA7A, 'M', '喙'), +@@ -4628,8 +4584,7 @@ def _seg_43(): + (0xFB01, 'M', 'fi'), + ] + +-def _seg_44(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFB02, 'M', 'fl'), + (0xFB03, 'M', 'ffi'), +@@ -4733,8 +4688,7 @@ def _seg_44(): + (0xFBDE, 'M', 'ۋ'), + ] + +-def _seg_45(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFBE0, 'M', 'ۅ'), + (0xFBE2, 'M', 'ۉ'), +@@ -4838,8 +4792,7 @@ def _seg_45(): + (0xFC56, 'M', 'يح'), + ] + +-def _seg_46(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFC57, 'M', 'يخ'), + (0xFC58, 'M', 'يم'), +@@ -4943,8 +4896,7 @@ def _seg_46(): + (0xFCBA, 'M', 'عج'), + ] + +-def _seg_47(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFCBB, 'M', 'عم'), + (0xFCBC, 'M', 'غج'), +@@ -5048,8 +5000,7 @@ def _seg_47(): + (0xFD1E, 'M', 'جي'), + ] + +-def _seg_48(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFD1F, 'M', 'خى'), + (0xFD20, 'M', 'خي'), +@@ -5153,8 +5104,7 @@ def _seg_48(): + (0xFDA6, 'M', 'جحى'), + ] + +-def _seg_49(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFDA7, 'M', 'جمى'), + (0xFDA8, 'M', 'سخى'), +@@ -5258,8 +5208,7 @@ def _seg_49(): + (0xFE5D, 'M', '〔'), + ] + +-def _seg_50(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFE5E, 'M', '〕'), + (0xFE5F, '3', '#'), +@@ -5363,8 +5312,7 @@ def _seg_50(): + (0xFF1A, '3', ':'), + ] + +-def _seg_51(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF1B, '3', ';'), + (0xFF1C, '3', '<'), +@@ -5468,8 +5416,7 @@ def _seg_51(): + (0xFF7E, 'M', 'セ'), + ] + +-def _seg_52(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF7F, 'M', 'ソ'), + (0xFF80, 'M', 'タ'), +@@ -5573,8 +5520,7 @@ def _seg_52(): + (0xFFE9, 'M', '←'), + ] + +-def _seg_53(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFFEA, 'M', '↑'), + (0xFFEB, 'M', '→'), +@@ -5678,8 +5624,7 @@ def _seg_53(): + (0x104B5, 'M', '𐓝'), + ] + +-def _seg_54(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x104B6, 'M', '𐓞'), + (0x104B7, 'M', '𐓟'), +@@ -5783,8 +5728,7 @@ def _seg_54(): + (0x10788, 'M', 'ꭦ'), + ] + +-def _seg_55(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10789, 'M', 'ʥ'), + (0x1078A, 'M', 'ʤ'), +@@ -5888,8 +5832,7 @@ def _seg_55(): + (0x10AC0, 'V'), + ] + +-def _seg_56(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10AE7, 'X'), + (0x10AEB, 'V'), +@@ -5993,8 +5936,7 @@ def _seg_56(): + (0x110BE, 'V'), + ] + +-def _seg_57(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x110C3, 'X'), + (0x110D0, 'V'), +@@ -6098,8 +6040,7 @@ def _seg_57(): + (0x118A6, 'M', '𑣆'), + ] + +-def _seg_58(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x118A7, 'M', '𑣇'), + (0x118A8, 'M', '𑣈'), +@@ -6203,8 +6144,7 @@ def _seg_58(): + (0x11FC0, 'V'), + ] + +-def _seg_59(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x11FF2, 'X'), + (0x11FFF, 'V'), +@@ -6308,8 +6248,7 @@ def _seg_59(): + (0x1B164, 'V'), + ] + +-def _seg_60(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1B168, 'X'), + (0x1B170, 'V'), +@@ -6413,8 +6352,7 @@ def _seg_60(): + (0x1D430, 'M', 'w'), + ] + +-def _seg_61(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D431, 'M', 'x'), + (0x1D432, 'M', 'y'), +@@ -6518,8 +6456,7 @@ def _seg_61(): + (0x1D494, 'M', 's'), + ] + +-def _seg_62(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D495, 'M', 't'), + (0x1D496, 'M', 'u'), +@@ -6623,8 +6560,7 @@ def _seg_62(): + (0x1D4FB, 'M', 'r'), + ] + +-def _seg_63(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D4FC, 'M', 's'), + (0x1D4FD, 'M', 't'), +@@ -6728,8 +6664,7 @@ def _seg_63(): + (0x1D562, 'M', 'q'), + ] + +-def _seg_64(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D563, 'M', 'r'), + (0x1D564, 'M', 's'), +@@ -6833,8 +6768,7 @@ def _seg_64(): + (0x1D5C6, 'M', 'm'), + ] + +-def _seg_65(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D5C7, 'M', 'n'), + (0x1D5C8, 'M', 'o'), +@@ -6938,8 +6872,7 @@ def _seg_65(): + (0x1D62A, 'M', 'i'), + ] + +-def _seg_66(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D62B, 'M', 'j'), + (0x1D62C, 'M', 'k'), +@@ -7043,8 +6976,7 @@ def _seg_66(): + (0x1D68E, 'M', 'e'), + ] + +-def _seg_67(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D68F, 'M', 'f'), + (0x1D690, 'M', 'g'), +@@ -7148,8 +7080,7 @@ def _seg_67(): + (0x1D6F4, 'M', 'σ'), + ] + +-def _seg_68(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D6F5, 'M', 'τ'), + (0x1D6F6, 'M', 'υ'), +@@ -7253,8 +7184,7 @@ def _seg_68(): + (0x1D75A, 'M', 'ε'), + ] + +-def _seg_69(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D75B, 'M', 'ζ'), + (0x1D75C, 'M', 'η'), +@@ -7358,8 +7288,7 @@ def _seg_69(): + (0x1D7C0, 'M', 'χ'), + ] + +-def _seg_70(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D7C1, 'M', 'ψ'), + (0x1D7C2, 'M', 'ω'), +@@ -7463,8 +7392,7 @@ def _seg_70(): + (0x1E7F0, 'V'), + ] + +-def _seg_71(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E7FF, 'X'), + (0x1E800, 'V'), +@@ -7568,8 +7496,7 @@ def _seg_71(): + (0x1EE33, 'X'), + ] + +-def _seg_72(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EE34, 'M', 'ش'), + (0x1EE35, 'M', 'ت'), +@@ -7673,8 +7600,7 @@ def _seg_72(): + (0x1EEA5, 'M', 'و'), + ] + +-def _seg_73(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EEA6, 'M', 'ز'), + (0x1EEA7, 'M', 'ح'), +@@ -7778,8 +7704,7 @@ def _seg_73(): + (0x1F143, 'M', 't'), + ] + +-def _seg_74(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F144, 'M', 'u'), + (0x1F145, 'M', 'v'), +@@ -7883,8 +7808,7 @@ def _seg_74(): + (0x1F800, 'V'), + ] + +-def _seg_75(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F80C, 'X'), + (0x1F810, 'V'), +@@ -7988,8 +7912,7 @@ def _seg_75(): + (0x2F829, 'M', '包'), + ] + +-def _seg_76(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F82A, 'M', '匆'), + (0x2F82B, 'M', '北'), +@@ -8093,8 +8016,7 @@ def _seg_76(): + (0x2F891, 'M', '𢌱'), + ] + +-def _seg_77(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F893, 'M', '舁'), + (0x2F894, 'M', '弢'), +@@ -8198,8 +8120,7 @@ def _seg_77(): + (0x2F8F7, 'M', '𣪍'), + ] + +-def _seg_78(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F8F8, 'M', '𡴋'), + (0x2F8F9, 'M', '𣫺'), +@@ -8303,8 +8224,7 @@ def _seg_78(): + (0x2F95D, 'M', '𥪧'), + ] + +-def _seg_79(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F95F, 'X'), + (0x2F960, 'M', '䈂'), +@@ -8408,8 +8328,7 @@ def _seg_79(): + (0x2F9C2, 'M', '䗹'), + ] + +-def _seg_80(): +- # type: () -> List[Union[Tuple[int, str], Tuple[int, str, str]]] ++def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F9C3, 'M', '衠'), + (0x2F9C4, 'M', '衣'), + diff --git a/backport-0004-CVE-2024-3651.patch b/backport-0004-CVE-2024-3651.patch new file mode 100644 index 0000000..f2d2a9d --- /dev/null +++ b/backport-0004-CVE-2024-3651.patch @@ -0,0 +1,899 @@ +From 527fa86d555490f13fda85133e8fe3a918f8bece Mon Sep 17 00:00:00 2001 +From: Kim Davies +Date: Tue, 13 Sep 2022 09:30:44 +0800 +Subject: [PATCH] Update to Unicode 15 + +Reference:https://github.com/kjd/idna/commit/527fa86d555490f13fda85133e8fe3a918f8bece +Conflict:NA + + +--- + src/pip/_vendor/idna/idnadata.py | 34 +++- + src/pip/_vendor/idna/uts46data.py | 306 +++++++++++++++++++----------- + 2 files changed, 221 insertions(+), 119 deletions(-) + +diff --git a/src/pip/_vendor/idna/idnadata.py b/src/pip/_vendor/idna/idnadata.py +index 1b5805d..67db462 100644 +--- a/src/pip/_vendor/idna/idnadata.py ++++ b/src/pip/_vendor/idna/idnadata.py +@@ -1,6 +1,6 @@ + # This file is automatically generated by tools/idna-data + +-__version__ = '14.0.0' ++__version__ = '15.0.0' + scripts = { + 'Greek': ( + 0x37000000374, +@@ -55,12 +55,13 @@ scripts = { + 0x16fe200016fe4, + 0x16ff000016ff2, + 0x200000002a6e0, +- 0x2a7000002b739, ++ 0x2a7000002b73a, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x2f8000002fa1e, + 0x300000003134b, ++ 0x31350000323b0, + ), + 'Hebrew': ( + 0x591000005c8, +@@ -77,6 +78,7 @@ scripts = { + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b120, ++ 0x1b1320001b133, + 0x1b1500001b153, + 0x1f2000001f201, + ), +@@ -93,6 +95,7 @@ scripts = { + 0x1affd0001afff, + 0x1b0000001b001, + 0x1b1200001b123, ++ 0x1b1550001b156, + 0x1b1640001b168, + ), + } +@@ -1331,7 +1334,7 @@ codepoint_classes = { + 0xcdd00000cdf, + 0xce000000ce4, + 0xce600000cf0, +- 0xcf100000cf3, ++ 0xcf100000cf4, + 0xd0000000d0d, + 0xd0e00000d11, + 0xd1200000d45, +@@ -1366,7 +1369,7 @@ codepoint_classes = { + 0xeb400000ebe, + 0xec000000ec5, + 0xec600000ec7, +- 0xec800000ece, ++ 0xec800000ecf, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, +@@ -1859,7 +1862,7 @@ codepoint_classes = { + 0xab200000ab27, + 0xab280000ab2f, + 0xab300000ab5b, +- 0xab600000ab6a, ++ 0xab600000ab69, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, +@@ -1943,7 +1946,7 @@ codepoint_classes = { + 0x10e8000010eaa, + 0x10eab00010ead, + 0x10eb000010eb2, +- 0x10f0000010f1d, ++ 0x10efd00010f1d, + 0x10f2700010f28, + 0x10f3000010f51, + 0x10f7000010f86, +@@ -1966,7 +1969,7 @@ codepoint_classes = { + 0x111dc000111dd, + 0x1120000011212, + 0x1121300011238, +- 0x1123e0001123f, ++ 0x1123e00011242, + 0x1128000011287, + 0x1128800011289, + 0x1128a0001128e, +@@ -2047,11 +2050,16 @@ codepoint_classes = { + 0x11d9300011d99, + 0x11da000011daa, + 0x11ee000011ef7, ++ 0x11f0000011f11, ++ 0x11f1200011f3b, ++ 0x11f3e00011f43, ++ 0x11f5000011f5a, + 0x11fb000011fb1, + 0x120000001239a, + 0x1248000012544, + 0x12f9000012ff1, +- 0x130000001342f, ++ 0x1300000013430, ++ 0x1344000013456, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, +@@ -2079,7 +2087,9 @@ codepoint_classes = { + 0x1aff50001affc, + 0x1affd0001afff, + 0x1b0000001b123, ++ 0x1b1320001b133, + 0x1b1500001b153, ++ 0x1b1550001b156, + 0x1b1640001b168, + 0x1b1700001b2fc, + 0x1bc000001bc6b, +@@ -2096,17 +2106,21 @@ codepoint_classes = { + 0x1da9b0001daa0, + 0x1daa10001dab0, + 0x1df000001df1f, ++ 0x1df250001df2b, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, ++ 0x1e0300001e06e, ++ 0x1e08f0001e090, + 0x1e1000001e12d, + 0x1e1300001e13e, + 0x1e1400001e14a, + 0x1e14e0001e14f, + 0x1e2900001e2af, + 0x1e2c00001e2fa, ++ 0x1e4d00001e4fa, + 0x1e7e00001e7e7, + 0x1e7e80001e7ec, + 0x1e7ed0001e7ef, +@@ -2115,13 +2129,13 @@ codepoint_classes = { + 0x1e8d00001e8d7, + 0x1e9220001e94c, + 0x1e9500001e95a, +- 0x1fbf00001fbfa, + 0x200000002a6e0, +- 0x2a7000002b739, ++ 0x2a7000002b73a, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x300000003134b, ++ 0x31350000323b0, + ), + 'CONTEXTJ': ( + 0x200c0000200e, +diff --git a/src/pip/_vendor/idna/uts46data.py b/src/pip/_vendor/idna/uts46data.py +index 8f65705..186796c 100644 +--- a/src/pip/_vendor/idna/uts46data.py ++++ b/src/pip/_vendor/idna/uts46data.py +@@ -7,7 +7,7 @@ from typing import List, Tuple, Union + """IDNA Mapping Table from UTS46.""" + + +-__version__ = '14.0.0' ++__version__ = '15.0.0' + def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x0, '3'), +@@ -1300,7 +1300,7 @@ def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0xCE6, 'V'), + (0xCF0, 'X'), + (0xCF1, 'V'), +- (0xCF3, 'X'), ++ (0xCF4, 'X'), + (0xD00, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), +@@ -1368,7 +1368,7 @@ def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0xEC6, 'V'), + (0xEC7, 'X'), + (0xEC8, 'V'), +- (0xECE, 'X'), ++ (0xECF, 'X'), + (0xED0, 'V'), + (0xEDA, 'X'), + (0xEDC, 'M', 'ຫນ'), +@@ -5917,7 +5917,7 @@ def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x10EAE, 'X'), + (0x10EB0, 'V'), + (0x10EB2, 'X'), +- (0x10F00, 'V'), ++ (0x10EFD, 'V'), + (0x10F28, 'X'), + (0x10F30, 'V'), + (0x10F5A, 'X'), +@@ -5956,7 +5956,7 @@ def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x11200, 'V'), + (0x11212, 'X'), + (0x11213, 'V'), +- (0x1123F, 'X'), ++ (0x11242, 'X'), + (0x11280, 'V'), + (0x11287, 'X'), + (0x11288, 'V'), +@@ -6097,6 +6097,8 @@ def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x11AA3, 'X'), + (0x11AB0, 'V'), + (0x11AF9, 'X'), ++ (0x11B00, 'V'), ++ (0x11B0A, 'X'), + (0x11C00, 'V'), + (0x11C09, 'X'), + (0x11C0A, 'V'), +@@ -6139,13 +6141,19 @@ def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x11DAA, 'X'), + (0x11EE0, 'V'), + (0x11EF9, 'X'), +- (0x11FB0, 'V'), +- (0x11FB1, 'X'), +- (0x11FC0, 'V'), ++ (0x11F00, 'V'), + ] + + def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ ++ (0x11F11, 'X'), ++ (0x11F12, 'V'), ++ (0x11F3B, 'X'), ++ (0x11F3E, 'V'), ++ (0x11F5A, 'X'), ++ (0x11FB0, 'V'), ++ (0x11FB1, 'X'), ++ (0x11FC0, 'V'), + (0x11FF2, 'X'), + (0x11FFF, 'V'), + (0x1239A, 'X'), +@@ -6158,7 +6166,9 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x12F90, 'V'), + (0x12FF3, 'X'), + (0x13000, 'V'), +- (0x1342F, 'X'), ++ (0x13430, 'X'), ++ (0x13440, 'V'), ++ (0x13456, 'X'), + (0x14400, 'V'), + (0x14647, 'X'), + (0x16800, 'V'), +@@ -6236,6 +6246,10 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x18D00, 'V'), + (0x18D09, 'X'), + (0x1AFF0, 'V'), ++ ] ++ ++def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1AFF4, 'X'), + (0x1AFF5, 'V'), + (0x1AFFC, 'X'), +@@ -6243,13 +6257,13 @@ def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1AFFF, 'X'), + (0x1B000, 'V'), + (0x1B123, 'X'), ++ (0x1B132, 'V'), ++ (0x1B133, 'X'), + (0x1B150, 'V'), + (0x1B153, 'X'), ++ (0x1B155, 'V'), ++ (0x1B156, 'X'), + (0x1B164, 'V'), +- ] +- +-def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1B168, 'X'), + (0x1B170, 'V'), + (0x1B2FC, 'X'), +@@ -6295,6 +6309,8 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D1EB, 'X'), + (0x1D200, 'V'), + (0x1D246, 'X'), ++ (0x1D2C0, 'V'), ++ (0x1D2D4, 'X'), + (0x1D2E0, 'V'), + (0x1D2F4, 'X'), + (0x1D300, 'V'), +@@ -6334,6 +6350,10 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D41E, 'M', 'e'), + (0x1D41F, 'M', 'f'), + (0x1D420, 'M', 'g'), ++ ] ++ ++def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1D421, 'M', 'h'), + (0x1D422, 'M', 'i'), + (0x1D423, 'M', 'j'), +@@ -6350,10 +6370,6 @@ def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D42E, 'M', 'u'), + (0x1D42F, 'M', 'v'), + (0x1D430, 'M', 'w'), +- ] +- +-def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1D431, 'M', 'x'), + (0x1D432, 'M', 'y'), + (0x1D433, 'M', 'z'), +@@ -6438,6 +6454,10 @@ def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D482, 'M', 'a'), + (0x1D483, 'M', 'b'), + (0x1D484, 'M', 'c'), ++ ] ++ ++def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1D485, 'M', 'd'), + (0x1D486, 'M', 'e'), + (0x1D487, 'M', 'f'), +@@ -6454,10 +6474,6 @@ def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D492, 'M', 'q'), + (0x1D493, 'M', 'r'), + (0x1D494, 'M', 's'), +- ] +- +-def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1D495, 'M', 't'), + (0x1D496, 'M', 'u'), + (0x1D497, 'M', 'v'), +@@ -6542,6 +6558,10 @@ def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D4E9, 'M', 'z'), + (0x1D4EA, 'M', 'a'), + (0x1D4EB, 'M', 'b'), ++ ] ++ ++def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1D4EC, 'M', 'c'), + (0x1D4ED, 'M', 'd'), + (0x1D4EE, 'M', 'e'), +@@ -6558,10 +6578,6 @@ def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D4F9, 'M', 'p'), + (0x1D4FA, 'M', 'q'), + (0x1D4FB, 'M', 'r'), +- ] +- +-def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1D4FC, 'M', 's'), + (0x1D4FD, 'M', 't'), + (0x1D4FE, 'M', 'u'), +@@ -6646,6 +6662,10 @@ def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D550, 'M', 'y'), + (0x1D551, 'X'), + (0x1D552, 'M', 'a'), ++ ] ++ ++def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1D553, 'M', 'b'), + (0x1D554, 'M', 'c'), + (0x1D555, 'M', 'd'), +@@ -6662,10 +6682,6 @@ def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D560, 'M', 'o'), + (0x1D561, 'M', 'p'), + (0x1D562, 'M', 'q'), +- ] +- +-def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1D563, 'M', 'r'), + (0x1D564, 'M', 's'), + (0x1D565, 'M', 't'), +@@ -6750,6 +6766,10 @@ def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D5B4, 'M', 'u'), + (0x1D5B5, 'M', 'v'), + (0x1D5B6, 'M', 'w'), ++ ] ++ ++def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1D5B7, 'M', 'x'), + (0x1D5B8, 'M', 'y'), + (0x1D5B9, 'M', 'z'), +@@ -6766,10 +6786,6 @@ def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D5C4, 'M', 'k'), + (0x1D5C5, 'M', 'l'), + (0x1D5C6, 'M', 'm'), +- ] +- +-def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1D5C7, 'M', 'n'), + (0x1D5C8, 'M', 'o'), + (0x1D5C9, 'M', 'p'), +@@ -6854,6 +6870,10 @@ def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D618, 'M', 'q'), + (0x1D619, 'M', 'r'), + (0x1D61A, 'M', 's'), ++ ] ++ ++def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1D61B, 'M', 't'), + (0x1D61C, 'M', 'u'), + (0x1D61D, 'M', 'v'), +@@ -6870,10 +6890,6 @@ def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D628, 'M', 'g'), + (0x1D629, 'M', 'h'), + (0x1D62A, 'M', 'i'), +- ] +- +-def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1D62B, 'M', 'j'), + (0x1D62C, 'M', 'k'), + (0x1D62D, 'M', 'l'), +@@ -6958,6 +6974,10 @@ def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D67C, 'M', 'm'), + (0x1D67D, 'M', 'n'), + (0x1D67E, 'M', 'o'), ++ ] ++ ++def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1D67F, 'M', 'p'), + (0x1D680, 'M', 'q'), + (0x1D681, 'M', 'r'), +@@ -6974,10 +6994,6 @@ def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D68C, 'M', 'c'), + (0x1D68D, 'M', 'd'), + (0x1D68E, 'M', 'e'), +- ] +- +-def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1D68F, 'M', 'f'), + (0x1D690, 'M', 'g'), + (0x1D691, 'M', 'h'), +@@ -7062,6 +7078,10 @@ def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D6E2, 'M', 'α'), + (0x1D6E3, 'M', 'β'), + (0x1D6E4, 'M', 'γ'), ++ ] ++ ++def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1D6E5, 'M', 'δ'), + (0x1D6E6, 'M', 'ε'), + (0x1D6E7, 'M', 'ζ'), +@@ -7078,10 +7098,6 @@ def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D6F2, 'M', 'ρ'), + (0x1D6F3, 'M', 'θ'), + (0x1D6F4, 'M', 'σ'), +- ] +- +-def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1D6F5, 'M', 'τ'), + (0x1D6F6, 'M', 'υ'), + (0x1D6F7, 'M', 'φ'), +@@ -7166,6 +7182,10 @@ def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D747, 'M', 'σ'), + (0x1D749, 'M', 'τ'), + (0x1D74A, 'M', 'υ'), ++ ] ++ ++def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1D74B, 'M', 'φ'), + (0x1D74C, 'M', 'χ'), + (0x1D74D, 'M', 'ψ'), +@@ -7182,10 +7202,6 @@ def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D758, 'M', 'γ'), + (0x1D759, 'M', 'δ'), + (0x1D75A, 'M', 'ε'), +- ] +- +-def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1D75B, 'M', 'ζ'), + (0x1D75C, 'M', 'η'), + (0x1D75D, 'M', 'θ'), +@@ -7270,6 +7286,10 @@ def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D7AD, 'M', 'δ'), + (0x1D7AE, 'M', 'ε'), + (0x1D7AF, 'M', 'ζ'), ++ ] ++ ++def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1D7B0, 'M', 'η'), + (0x1D7B1, 'M', 'θ'), + (0x1D7B2, 'M', 'ι'), +@@ -7286,10 +7306,6 @@ def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1D7BE, 'M', 'υ'), + (0x1D7BF, 'M', 'φ'), + (0x1D7C0, 'M', 'χ'), +- ] +- +-def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1D7C1, 'M', 'ψ'), + (0x1D7C2, 'M', 'ω'), + (0x1D7C3, 'M', '∂'), +@@ -7359,6 +7375,8 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1DAB0, 'X'), + (0x1DF00, 'V'), + (0x1DF1F, 'X'), ++ (0x1DF25, 'V'), ++ (0x1DF2B, 'X'), + (0x1E000, 'V'), + (0x1E007, 'X'), + (0x1E008, 'V'), +@@ -7369,6 +7387,75 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1E025, 'X'), + (0x1E026, 'V'), + (0x1E02B, 'X'), ++ (0x1E030, 'M', 'а'), ++ (0x1E031, 'M', 'б'), ++ (0x1E032, 'M', 'в'), ++ ] ++ ++def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ ++ (0x1E033, 'M', 'г'), ++ (0x1E034, 'M', 'д'), ++ (0x1E035, 'M', 'е'), ++ (0x1E036, 'M', 'ж'), ++ (0x1E037, 'M', 'з'), ++ (0x1E038, 'M', 'и'), ++ (0x1E039, 'M', 'к'), ++ (0x1E03A, 'M', 'л'), ++ (0x1E03B, 'M', 'м'), ++ (0x1E03C, 'M', 'о'), ++ (0x1E03D, 'M', 'п'), ++ (0x1E03E, 'M', 'р'), ++ (0x1E03F, 'M', 'с'), ++ (0x1E040, 'M', 'т'), ++ (0x1E041, 'M', 'у'), ++ (0x1E042, 'M', 'ф'), ++ (0x1E043, 'M', 'х'), ++ (0x1E044, 'M', 'ц'), ++ (0x1E045, 'M', 'ч'), ++ (0x1E046, 'M', 'ш'), ++ (0x1E047, 'M', 'ы'), ++ (0x1E048, 'M', 'э'), ++ (0x1E049, 'M', 'ю'), ++ (0x1E04A, 'M', 'ꚉ'), ++ (0x1E04B, 'M', 'ә'), ++ (0x1E04C, 'M', 'і'), ++ (0x1E04D, 'M', 'ј'), ++ (0x1E04E, 'M', 'ө'), ++ (0x1E04F, 'M', 'ү'), ++ (0x1E050, 'M', 'ӏ'), ++ (0x1E051, 'M', 'а'), ++ (0x1E052, 'M', 'б'), ++ (0x1E053, 'M', 'в'), ++ (0x1E054, 'M', 'г'), ++ (0x1E055, 'M', 'д'), ++ (0x1E056, 'M', 'е'), ++ (0x1E057, 'M', 'ж'), ++ (0x1E058, 'M', 'з'), ++ (0x1E059, 'M', 'и'), ++ (0x1E05A, 'M', 'к'), ++ (0x1E05B, 'M', 'л'), ++ (0x1E05C, 'M', 'о'), ++ (0x1E05D, 'M', 'п'), ++ (0x1E05E, 'M', 'с'), ++ (0x1E05F, 'M', 'у'), ++ (0x1E060, 'M', 'ф'), ++ (0x1E061, 'M', 'х'), ++ (0x1E062, 'M', 'ц'), ++ (0x1E063, 'M', 'ч'), ++ (0x1E064, 'M', 'ш'), ++ (0x1E065, 'M', 'ъ'), ++ (0x1E066, 'M', 'ы'), ++ (0x1E067, 'M', 'ґ'), ++ (0x1E068, 'M', 'і'), ++ (0x1E069, 'M', 'ѕ'), ++ (0x1E06A, 'M', 'џ'), ++ (0x1E06B, 'M', 'ҫ'), ++ (0x1E06C, 'M', 'ꙑ'), ++ (0x1E06D, 'M', 'ұ'), ++ (0x1E06E, 'X'), ++ (0x1E08F, 'V'), ++ (0x1E090, 'X'), + (0x1E100, 'V'), + (0x1E12D, 'X'), + (0x1E130, 'V'), +@@ -7383,6 +7470,8 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1E2FA, 'X'), + (0x1E2FF, 'V'), + (0x1E300, 'X'), ++ (0x1E4D0, 'V'), ++ (0x1E4FA, 'X'), + (0x1E7E0, 'V'), + (0x1E7E7, 'X'), + (0x1E7E8, 'V'), +@@ -7390,10 +7479,6 @@ def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1E7ED, 'V'), + (0x1E7EF, 'X'), + (0x1E7F0, 'V'), +- ] +- +-def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1E7FF, 'X'), + (0x1E800, 'V'), + (0x1E8C5, 'X'), +@@ -7409,6 +7494,10 @@ def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1E907, 'M', '𞤩'), + (0x1E908, 'M', '𞤪'), + (0x1E909, 'M', '𞤫'), ++ ] ++ ++def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1E90A, 'M', '𞤬'), + (0x1E90B, 'M', '𞤭'), + (0x1E90C, 'M', '𞤮'), +@@ -7494,10 +7583,6 @@ def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1EE31, 'M', 'ص'), + (0x1EE32, 'M', 'ق'), + (0x1EE33, 'X'), +- ] +- +-def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1EE34, 'M', 'ش'), + (0x1EE35, 'M', 'ت'), + (0x1EE36, 'M', 'ث'), +@@ -7513,6 +7598,10 @@ def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1EE48, 'X'), + (0x1EE49, 'M', 'ي'), + (0x1EE4A, 'X'), ++ ] ++ ++def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1EE4B, 'M', 'ل'), + (0x1EE4C, 'X'), + (0x1EE4D, 'M', 'ن'), +@@ -7598,10 +7687,6 @@ def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1EEA3, 'M', 'د'), + (0x1EEA4, 'X'), + (0x1EEA5, 'M', 'و'), +- ] +- +-def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1EEA6, 'M', 'ز'), + (0x1EEA7, 'M', 'ح'), + (0x1EEA8, 'M', 'ط'), +@@ -7617,6 +7702,10 @@ def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1EEB2, 'M', 'ق'), + (0x1EEB3, 'M', 'ر'), + (0x1EEB4, 'M', 'ش'), ++ ] ++ ++def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1EEB5, 'M', 'ت'), + (0x1EEB6, 'M', 'ث'), + (0x1EEB7, 'M', 'خ'), +@@ -7702,10 +7791,6 @@ def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1F141, 'M', 'r'), + (0x1F142, 'M', 's'), + (0x1F143, 'M', 't'), +- ] +- +-def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1F144, 'M', 'u'), + (0x1F145, 'M', 'v'), + (0x1F146, 'M', 'w'), +@@ -7721,6 +7806,10 @@ def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1F150, 'V'), + (0x1F16A, 'M', 'mc'), + (0x1F16B, 'M', 'md'), ++ ] ++ ++def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1F16C, 'M', 'mr'), + (0x1F16D, 'V'), + (0x1F190, 'M', 'dj'), +@@ -7793,23 +7882,19 @@ def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D8, 'X'), +- (0x1F6DD, 'V'), ++ (0x1F6DC, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6FD, 'X'), + (0x1F700, 'V'), +- (0x1F774, 'X'), +- (0x1F780, 'V'), +- (0x1F7D9, 'X'), ++ (0x1F777, 'X'), ++ (0x1F77B, 'V'), ++ (0x1F7DA, 'X'), + (0x1F7E0, 'V'), + (0x1F7EC, 'X'), + (0x1F7F0, 'V'), + (0x1F7F1, 'X'), + (0x1F800, 'V'), +- ] +- +-def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x1F80C, 'X'), + (0x1F810, 'V'), + (0x1F848, 'X'), +@@ -7825,24 +7910,24 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x1FA54, 'X'), + (0x1FA60, 'V'), + (0x1FA6E, 'X'), ++ ] ++ ++def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x1FA70, 'V'), +- (0x1FA75, 'X'), +- (0x1FA78, 'V'), + (0x1FA7D, 'X'), + (0x1FA80, 'V'), +- (0x1FA87, 'X'), ++ (0x1FA89, 'X'), + (0x1FA90, 'V'), +- (0x1FAAD, 'X'), +- (0x1FAB0, 'V'), +- (0x1FABB, 'X'), +- (0x1FAC0, 'V'), ++ (0x1FABE, 'X'), ++ (0x1FABF, 'V'), + (0x1FAC6, 'X'), +- (0x1FAD0, 'V'), +- (0x1FADA, 'X'), ++ (0x1FACE, 'V'), ++ (0x1FADC, 'X'), + (0x1FAE0, 'V'), +- (0x1FAE8, 'X'), ++ (0x1FAE9, 'X'), + (0x1FAF0, 'V'), +- (0x1FAF7, 'X'), ++ (0x1FAF9, 'X'), + (0x1FB00, 'V'), + (0x1FB93, 'X'), + (0x1FB94, 'V'), +@@ -7861,7 +7946,7 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x20000, 'V'), + (0x2A6E0, 'X'), + (0x2A700, 'V'), +- (0x2B739, 'X'), ++ (0x2B73A, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2B820, 'V'), +@@ -7910,10 +7995,6 @@ def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x2F827, 'M', '勤'), + (0x2F828, 'M', '勺'), + (0x2F829, 'M', '包'), +- ] +- +-def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x2F82A, 'M', '匆'), + (0x2F82B, 'M', '北'), + (0x2F82C, 'M', '卉'), +@@ -7933,6 +8014,10 @@ def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x2F83C, 'M', '咞'), + (0x2F83D, 'M', '吸'), + (0x2F83E, 'M', '呈'), ++ ] ++ ++def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x2F83F, 'M', '周'), + (0x2F840, 'M', '咢'), + (0x2F841, 'M', '哶'), +@@ -8014,10 +8099,6 @@ def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x2F88F, 'M', '𪎒'), + (0x2F890, 'M', '廾'), + (0x2F891, 'M', '𢌱'), +- ] +- +-def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x2F893, 'M', '舁'), + (0x2F894, 'M', '弢'), + (0x2F896, 'M', '㣇'), +@@ -8037,6 +8118,10 @@ def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x2F8A4, 'M', '𢛔'), + (0x2F8A5, 'M', '惇'), + (0x2F8A6, 'M', '慈'), ++ ] ++ ++def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x2F8A7, 'M', '慌'), + (0x2F8A8, 'M', '慎'), + (0x2F8A9, 'M', '慌'), +@@ -8118,10 +8203,6 @@ def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x2F8F5, 'M', '殺'), + (0x2F8F6, 'M', '殻'), + (0x2F8F7, 'M', '𣪍'), +- ] +- +-def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x2F8F8, 'M', '𡴋'), + (0x2F8F9, 'M', '𣫺'), + (0x2F8FA, 'M', '汎'), +@@ -8141,6 +8222,10 @@ def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x2F908, 'M', '港'), + (0x2F909, 'M', '湮'), + (0x2F90A, 'M', '㴳'), ++ ] ++ ++def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x2F90B, 'M', '滋'), + (0x2F90C, 'M', '滇'), + (0x2F90D, 'M', '𣻑'), +@@ -8222,10 +8307,6 @@ def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x2F95B, 'M', '穏'), + (0x2F95C, 'M', '𥥼'), + (0x2F95D, 'M', '𥪧'), +- ] +- +-def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x2F95F, 'X'), + (0x2F960, 'M', '䈂'), + (0x2F961, 'M', '𥮫'), +@@ -8245,6 +8326,10 @@ def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x2F96F, 'M', '縂'), + (0x2F970, 'M', '繅'), + (0x2F971, 'M', '䌴'), ++ ] ++ ++def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x2F972, 'M', '𦈨'), + (0x2F973, 'M', '𦉇'), + (0x2F974, 'M', '䍙'), +@@ -8326,10 +8411,6 @@ def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x2F9C0, 'M', '蟡'), + (0x2F9C1, 'M', '蠁'), + (0x2F9C2, 'M', '䗹'), +- ] +- +-def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: +- return [ + (0x2F9C3, 'M', '衠'), + (0x2F9C4, 'M', '衣'), + (0x2F9C5, 'M', '𧙧'), +@@ -8349,6 +8430,10 @@ def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x2F9D3, 'M', '𧲨'), + (0x2F9D4, 'M', '貫'), + (0x2F9D5, 'M', '賁'), ++ ] ++ ++def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: ++ return [ + (0x2F9D6, 'M', '贛'), + (0x2F9D7, 'M', '起'), + (0x2F9D8, 'M', '𧼯'), +@@ -8423,6 +8508,8 @@ def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + (0x2FA1E, 'X'), + (0x30000, 'V'), + (0x3134B, 'X'), ++ (0x31350, 'V'), ++ (0x323B0, 'X'), + (0xE0100, 'I'), + (0xE01F0, 'X'), + ] +@@ -8509,4 +8596,5 @@ uts46data = tuple( + + _seg_78() + + _seg_79() + + _seg_80() ++ + _seg_81() + ) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] + \ No newline at end of file diff --git a/backport-0005-CVE-2024-3651.patch b/backport-0005-CVE-2024-3651.patch new file mode 100644 index 0000000..4d51368 --- /dev/null +++ b/backport-0005-CVE-2024-3651.patch @@ -0,0 +1,2463 @@ +From 5beb28b9dd77912c0dd656d8b0fdba3eb80222e7 Mon Sep 17 00:00:00 2001 +From: Kim Davies +Date: Mon, 1 Apr 2024 20:24:57 -0700 +Subject: [PATCH] More efficient resolution of joiner contexts + +In some pathological cases, this would out eligibility under +CONTEXTJ rules much faster. + +Reference:https://github.com/kjd/idna/commit/5beb28b9dd77912c0dd656d8b0fdba3eb80222e7 +Conflict:NA + +--- + src/pip/_vendor/idna/core.py | 16 +- + src/pip/_vendor/idna/idnadata.py | 2197 +++++++++++++++++++++++++++++- + 2 files changed, 2154 insertions(+), 59 deletions(-) + +diff --git a/src/pip/_vendor/idna/core.py b/src/pip/_vendor/idna/core.py +index 20f2b63..1a59c4e 100644 +--- a/src/pip/_vendor/idna/core.py ++++ b/src/pip/_vendor/idna/core.py +@@ -150,9 +150,11 @@ def valid_contextj(label: str, pos: int) -> bool: + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue +- if joining_type in [ord('L'), ord('D')]: ++ elif joining_type in [ord('L'), ord('D')]: + ok = True + break ++ else: ++ break + + if not ok: + return False +@@ -162,9 +164,11 @@ def valid_contextj(label: str, pos: int) -> bool: + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue +- if joining_type in [ord('R'), ord('D')]: ++ elif joining_type in [ord('R'), ord('D')]: + ok = True + break ++ else: ++ break + return ok + + if cp_value == 0x200d: +@@ -236,12 +240,8 @@ def check_label(label: Union[str, bytes, bytearray]) -> None: + if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): +- try: +- if not valid_contextj(label, pos): +- raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format( +- _unot(cp_value), pos+1, repr(label))) +- except ValueError: +- raise IDNAError('Unknown codepoint adjacent to joiner {} at position {} in {}'.format( ++ if not valid_contextj(label, pos): ++ raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format( + _unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): +diff --git a/src/pip/_vendor/idna/idnadata.py b/src/pip/_vendor/idna/idnadata.py +index 67db462..5b5e02a 100644 +--- a/src/pip/_vendor/idna/idnadata.py ++++ b/src/pip/_vendor/idna/idnadata.py +@@ -100,16 +100,190 @@ scripts = { + ), + } + joining_types = { +- 0x600: 85, +- 0x601: 85, +- 0x602: 85, +- 0x603: 85, +- 0x604: 85, +- 0x605: 85, +- 0x608: 85, +- 0x60b: 85, ++ 0xad: 84, ++ 0x300: 84, ++ 0x301: 84, ++ 0x302: 84, ++ 0x303: 84, ++ 0x304: 84, ++ 0x305: 84, ++ 0x306: 84, ++ 0x307: 84, ++ 0x308: 84, ++ 0x309: 84, ++ 0x30a: 84, ++ 0x30b: 84, ++ 0x30c: 84, ++ 0x30d: 84, ++ 0x30e: 84, ++ 0x30f: 84, ++ 0x310: 84, ++ 0x311: 84, ++ 0x312: 84, ++ 0x313: 84, ++ 0x314: 84, ++ 0x315: 84, ++ 0x316: 84, ++ 0x317: 84, ++ 0x318: 84, ++ 0x319: 84, ++ 0x31a: 84, ++ 0x31b: 84, ++ 0x31c: 84, ++ 0x31d: 84, ++ 0x31e: 84, ++ 0x31f: 84, ++ 0x320: 84, ++ 0x321: 84, ++ 0x322: 84, ++ 0x323: 84, ++ 0x324: 84, ++ 0x325: 84, ++ 0x326: 84, ++ 0x327: 84, ++ 0x328: 84, ++ 0x329: 84, ++ 0x32a: 84, ++ 0x32b: 84, ++ 0x32c: 84, ++ 0x32d: 84, ++ 0x32e: 84, ++ 0x32f: 84, ++ 0x330: 84, ++ 0x331: 84, ++ 0x332: 84, ++ 0x333: 84, ++ 0x334: 84, ++ 0x335: 84, ++ 0x336: 84, ++ 0x337: 84, ++ 0x338: 84, ++ 0x339: 84, ++ 0x33a: 84, ++ 0x33b: 84, ++ 0x33c: 84, ++ 0x33d: 84, ++ 0x33e: 84, ++ 0x33f: 84, ++ 0x340: 84, ++ 0x341: 84, ++ 0x342: 84, ++ 0x343: 84, ++ 0x344: 84, ++ 0x345: 84, ++ 0x346: 84, ++ 0x347: 84, ++ 0x348: 84, ++ 0x349: 84, ++ 0x34a: 84, ++ 0x34b: 84, ++ 0x34c: 84, ++ 0x34d: 84, ++ 0x34e: 84, ++ 0x34f: 84, ++ 0x350: 84, ++ 0x351: 84, ++ 0x352: 84, ++ 0x353: 84, ++ 0x354: 84, ++ 0x355: 84, ++ 0x356: 84, ++ 0x357: 84, ++ 0x358: 84, ++ 0x359: 84, ++ 0x35a: 84, ++ 0x35b: 84, ++ 0x35c: 84, ++ 0x35d: 84, ++ 0x35e: 84, ++ 0x35f: 84, ++ 0x360: 84, ++ 0x361: 84, ++ 0x362: 84, ++ 0x363: 84, ++ 0x364: 84, ++ 0x365: 84, ++ 0x366: 84, ++ 0x367: 84, ++ 0x368: 84, ++ 0x369: 84, ++ 0x36a: 84, ++ 0x36b: 84, ++ 0x36c: 84, ++ 0x36d: 84, ++ 0x36e: 84, ++ 0x36f: 84, ++ 0x483: 84, ++ 0x484: 84, ++ 0x485: 84, ++ 0x486: 84, ++ 0x487: 84, ++ 0x488: 84, ++ 0x489: 84, ++ 0x591: 84, ++ 0x592: 84, ++ 0x593: 84, ++ 0x594: 84, ++ 0x595: 84, ++ 0x596: 84, ++ 0x597: 84, ++ 0x598: 84, ++ 0x599: 84, ++ 0x59a: 84, ++ 0x59b: 84, ++ 0x59c: 84, ++ 0x59d: 84, ++ 0x59e: 84, ++ 0x59f: 84, ++ 0x5a0: 84, ++ 0x5a1: 84, ++ 0x5a2: 84, ++ 0x5a3: 84, ++ 0x5a4: 84, ++ 0x5a5: 84, ++ 0x5a6: 84, ++ 0x5a7: 84, ++ 0x5a8: 84, ++ 0x5a9: 84, ++ 0x5aa: 84, ++ 0x5ab: 84, ++ 0x5ac: 84, ++ 0x5ad: 84, ++ 0x5ae: 84, ++ 0x5af: 84, ++ 0x5b0: 84, ++ 0x5b1: 84, ++ 0x5b2: 84, ++ 0x5b3: 84, ++ 0x5b4: 84, ++ 0x5b5: 84, ++ 0x5b6: 84, ++ 0x5b7: 84, ++ 0x5b8: 84, ++ 0x5b9: 84, ++ 0x5ba: 84, ++ 0x5bb: 84, ++ 0x5bc: 84, ++ 0x5bd: 84, ++ 0x5bf: 84, ++ 0x5c1: 84, ++ 0x5c2: 84, ++ 0x5c4: 84, ++ 0x5c5: 84, ++ 0x5c7: 84, ++ 0x610: 84, ++ 0x611: 84, ++ 0x612: 84, ++ 0x613: 84, ++ 0x614: 84, ++ 0x615: 84, ++ 0x616: 84, ++ 0x617: 84, ++ 0x618: 84, ++ 0x619: 84, ++ 0x61a: 84, ++ 0x61c: 84, + 0x620: 68, +- 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, +@@ -151,12 +325,33 @@ joining_types = { + 0x648: 82, + 0x649: 68, + 0x64a: 68, ++ 0x64b: 84, ++ 0x64c: 84, ++ 0x64d: 84, ++ 0x64e: 84, ++ 0x64f: 84, ++ 0x650: 84, ++ 0x651: 84, ++ 0x652: 84, ++ 0x653: 84, ++ 0x654: 84, ++ 0x655: 84, ++ 0x656: 84, ++ 0x657: 84, ++ 0x658: 84, ++ 0x659: 84, ++ 0x65a: 84, ++ 0x65b: 84, ++ 0x65c: 84, ++ 0x65d: 84, ++ 0x65e: 84, ++ 0x65f: 84, + 0x66e: 68, + 0x66f: 68, ++ 0x670: 84, + 0x671: 82, + 0x672: 82, + 0x673: 82, +- 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, +@@ -253,7 +448,25 @@ joining_types = { + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, +- 0x6dd: 85, ++ 0x6d6: 84, ++ 0x6d7: 84, ++ 0x6d8: 84, ++ 0x6d9: 84, ++ 0x6da: 84, ++ 0x6db: 84, ++ 0x6dc: 84, ++ 0x6df: 84, ++ 0x6e0: 84, ++ 0x6e1: 84, ++ 0x6e2: 84, ++ 0x6e3: 84, ++ 0x6e4: 84, ++ 0x6e7: 84, ++ 0x6e8: 84, ++ 0x6ea: 84, ++ 0x6eb: 84, ++ 0x6ec: 84, ++ 0x6ed: 84, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, +@@ -262,6 +475,7 @@ joining_types = { + 0x6ff: 68, + 0x70f: 84, + 0x710: 82, ++ 0x711: 84, + 0x712: 68, + 0x713: 68, + 0x714: 68, +@@ -292,6 +506,33 @@ joining_types = { + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, ++ 0x730: 84, ++ 0x731: 84, ++ 0x732: 84, ++ 0x733: 84, ++ 0x734: 84, ++ 0x735: 84, ++ 0x736: 84, ++ 0x737: 84, ++ 0x738: 84, ++ 0x739: 84, ++ 0x73a: 84, ++ 0x73b: 84, ++ 0x73c: 84, ++ 0x73d: 84, ++ 0x73e: 84, ++ 0x73f: 84, ++ 0x740: 84, ++ 0x741: 84, ++ 0x742: 84, ++ 0x743: 84, ++ 0x744: 84, ++ 0x745: 84, ++ 0x746: 84, ++ 0x747: 84, ++ 0x748: 84, ++ 0x749: 84, ++ 0x74a: 84, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, +@@ -343,6 +584,17 @@ joining_types = { + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, ++ 0x7a6: 84, ++ 0x7a7: 84, ++ 0x7a8: 84, ++ 0x7a9: 84, ++ 0x7aa: 84, ++ 0x7ab: 84, ++ 0x7ac: 84, ++ 0x7ad: 84, ++ 0x7ae: 84, ++ 0x7af: 84, ++ 0x7b0: 84, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, +@@ -376,7 +628,38 @@ joining_types = { + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, ++ 0x7eb: 84, ++ 0x7ec: 84, ++ 0x7ed: 84, ++ 0x7ee: 84, ++ 0x7ef: 84, ++ 0x7f0: 84, ++ 0x7f1: 84, ++ 0x7f2: 84, ++ 0x7f3: 84, + 0x7fa: 67, ++ 0x7fd: 84, ++ 0x816: 84, ++ 0x817: 84, ++ 0x818: 84, ++ 0x819: 84, ++ 0x81b: 84, ++ 0x81c: 84, ++ 0x81d: 84, ++ 0x81e: 84, ++ 0x81f: 84, ++ 0x820: 84, ++ 0x821: 84, ++ 0x822: 84, ++ 0x823: 84, ++ 0x825: 84, ++ 0x826: 84, ++ 0x827: 84, ++ 0x829: 84, ++ 0x82a: 84, ++ 0x82b: 84, ++ 0x82c: 84, ++ 0x82d: 84, + 0x840: 82, + 0x841: 68, + 0x842: 68, +@@ -402,13 +685,14 @@ joining_types = { + 0x856: 82, + 0x857: 82, + 0x858: 82, ++ 0x859: 84, ++ 0x85a: 84, ++ 0x85b: 84, + 0x860: 68, +- 0x861: 85, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, +- 0x866: 85, + 0x867: 82, + 0x868: 68, + 0x869: 82, +@@ -436,16 +720,20 @@ joining_types = { + 0x884: 67, + 0x885: 67, + 0x886: 68, +- 0x887: 85, +- 0x888: 85, + 0x889: 68, + 0x88a: 68, + 0x88b: 68, + 0x88c: 68, + 0x88d: 68, + 0x88e: 82, +- 0x890: 85, +- 0x891: 85, ++ 0x898: 84, ++ 0x899: 84, ++ 0x89a: 84, ++ 0x89b: 84, ++ 0x89c: 84, ++ 0x89d: 84, ++ 0x89e: 84, ++ 0x89f: 84, + 0x8a0: 68, + 0x8a1: 68, + 0x8a2: 68, +@@ -459,7 +747,6 @@ joining_types = { + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, +- 0x8ad: 85, + 0x8ae: 82, + 0x8af: 68, + 0x8b0: 68, +@@ -487,11 +774,357 @@ joining_types = { + 0x8c6: 68, + 0x8c7: 68, + 0x8c8: 68, +- 0x8e2: 85, +- 0x1806: 85, ++ 0x8ca: 84, ++ 0x8cb: 84, ++ 0x8cc: 84, ++ 0x8cd: 84, ++ 0x8ce: 84, ++ 0x8cf: 84, ++ 0x8d0: 84, ++ 0x8d1: 84, ++ 0x8d2: 84, ++ 0x8d3: 84, ++ 0x8d4: 84, ++ 0x8d5: 84, ++ 0x8d6: 84, ++ 0x8d7: 84, ++ 0x8d8: 84, ++ 0x8d9: 84, ++ 0x8da: 84, ++ 0x8db: 84, ++ 0x8dc: 84, ++ 0x8dd: 84, ++ 0x8de: 84, ++ 0x8df: 84, ++ 0x8e0: 84, ++ 0x8e1: 84, ++ 0x8e3: 84, ++ 0x8e4: 84, ++ 0x8e5: 84, ++ 0x8e6: 84, ++ 0x8e7: 84, ++ 0x8e8: 84, ++ 0x8e9: 84, ++ 0x8ea: 84, ++ 0x8eb: 84, ++ 0x8ec: 84, ++ 0x8ed: 84, ++ 0x8ee: 84, ++ 0x8ef: 84, ++ 0x8f0: 84, ++ 0x8f1: 84, ++ 0x8f2: 84, ++ 0x8f3: 84, ++ 0x8f4: 84, ++ 0x8f5: 84, ++ 0x8f6: 84, ++ 0x8f7: 84, ++ 0x8f8: 84, ++ 0x8f9: 84, ++ 0x8fa: 84, ++ 0x8fb: 84, ++ 0x8fc: 84, ++ 0x8fd: 84, ++ 0x8fe: 84, ++ 0x8ff: 84, ++ 0x900: 84, ++ 0x901: 84, ++ 0x902: 84, ++ 0x93a: 84, ++ 0x93c: 84, ++ 0x941: 84, ++ 0x942: 84, ++ 0x943: 84, ++ 0x944: 84, ++ 0x945: 84, ++ 0x946: 84, ++ 0x947: 84, ++ 0x948: 84, ++ 0x94d: 84, ++ 0x951: 84, ++ 0x952: 84, ++ 0x953: 84, ++ 0x954: 84, ++ 0x955: 84, ++ 0x956: 84, ++ 0x957: 84, ++ 0x962: 84, ++ 0x963: 84, ++ 0x981: 84, ++ 0x9bc: 84, ++ 0x9c1: 84, ++ 0x9c2: 84, ++ 0x9c3: 84, ++ 0x9c4: 84, ++ 0x9cd: 84, ++ 0x9e2: 84, ++ 0x9e3: 84, ++ 0x9fe: 84, ++ 0xa01: 84, ++ 0xa02: 84, ++ 0xa3c: 84, ++ 0xa41: 84, ++ 0xa42: 84, ++ 0xa47: 84, ++ 0xa48: 84, ++ 0xa4b: 84, ++ 0xa4c: 84, ++ 0xa4d: 84, ++ 0xa51: 84, ++ 0xa70: 84, ++ 0xa71: 84, ++ 0xa75: 84, ++ 0xa81: 84, ++ 0xa82: 84, ++ 0xabc: 84, ++ 0xac1: 84, ++ 0xac2: 84, ++ 0xac3: 84, ++ 0xac4: 84, ++ 0xac5: 84, ++ 0xac7: 84, ++ 0xac8: 84, ++ 0xacd: 84, ++ 0xae2: 84, ++ 0xae3: 84, ++ 0xafa: 84, ++ 0xafb: 84, ++ 0xafc: 84, ++ 0xafd: 84, ++ 0xafe: 84, ++ 0xaff: 84, ++ 0xb01: 84, ++ 0xb3c: 84, ++ 0xb3f: 84, ++ 0xb41: 84, ++ 0xb42: 84, ++ 0xb43: 84, ++ 0xb44: 84, ++ 0xb4d: 84, ++ 0xb55: 84, ++ 0xb56: 84, ++ 0xb62: 84, ++ 0xb63: 84, ++ 0xb82: 84, ++ 0xbc0: 84, ++ 0xbcd: 84, ++ 0xc00: 84, ++ 0xc04: 84, ++ 0xc3c: 84, ++ 0xc3e: 84, ++ 0xc3f: 84, ++ 0xc40: 84, ++ 0xc46: 84, ++ 0xc47: 84, ++ 0xc48: 84, ++ 0xc4a: 84, ++ 0xc4b: 84, ++ 0xc4c: 84, ++ 0xc4d: 84, ++ 0xc55: 84, ++ 0xc56: 84, ++ 0xc62: 84, ++ 0xc63: 84, ++ 0xc81: 84, ++ 0xcbc: 84, ++ 0xcbf: 84, ++ 0xcc6: 84, ++ 0xccc: 84, ++ 0xccd: 84, ++ 0xce2: 84, ++ 0xce3: 84, ++ 0xd00: 84, ++ 0xd01: 84, ++ 0xd3b: 84, ++ 0xd3c: 84, ++ 0xd41: 84, ++ 0xd42: 84, ++ 0xd43: 84, ++ 0xd44: 84, ++ 0xd4d: 84, ++ 0xd62: 84, ++ 0xd63: 84, ++ 0xd81: 84, ++ 0xdca: 84, ++ 0xdd2: 84, ++ 0xdd3: 84, ++ 0xdd4: 84, ++ 0xdd6: 84, ++ 0xe31: 84, ++ 0xe34: 84, ++ 0xe35: 84, ++ 0xe36: 84, ++ 0xe37: 84, ++ 0xe38: 84, ++ 0xe39: 84, ++ 0xe3a: 84, ++ 0xe47: 84, ++ 0xe48: 84, ++ 0xe49: 84, ++ 0xe4a: 84, ++ 0xe4b: 84, ++ 0xe4c: 84, ++ 0xe4d: 84, ++ 0xe4e: 84, ++ 0xeb1: 84, ++ 0xeb4: 84, ++ 0xeb5: 84, ++ 0xeb6: 84, ++ 0xeb7: 84, ++ 0xeb8: 84, ++ 0xeb9: 84, ++ 0xeba: 84, ++ 0xebb: 84, ++ 0xebc: 84, ++ 0xec8: 84, ++ 0xec9: 84, ++ 0xeca: 84, ++ 0xecb: 84, ++ 0xecc: 84, ++ 0xecd: 84, ++ 0xece: 84, ++ 0xf18: 84, ++ 0xf19: 84, ++ 0xf35: 84, ++ 0xf37: 84, ++ 0xf39: 84, ++ 0xf71: 84, ++ 0xf72: 84, ++ 0xf73: 84, ++ 0xf74: 84, ++ 0xf75: 84, ++ 0xf76: 84, ++ 0xf77: 84, ++ 0xf78: 84, ++ 0xf79: 84, ++ 0xf7a: 84, ++ 0xf7b: 84, ++ 0xf7c: 84, ++ 0xf7d: 84, ++ 0xf7e: 84, ++ 0xf80: 84, ++ 0xf81: 84, ++ 0xf82: 84, ++ 0xf83: 84, ++ 0xf84: 84, ++ 0xf86: 84, ++ 0xf87: 84, ++ 0xf8d: 84, ++ 0xf8e: 84, ++ 0xf8f: 84, ++ 0xf90: 84, ++ 0xf91: 84, ++ 0xf92: 84, ++ 0xf93: 84, ++ 0xf94: 84, ++ 0xf95: 84, ++ 0xf96: 84, ++ 0xf97: 84, ++ 0xf99: 84, ++ 0xf9a: 84, ++ 0xf9b: 84, ++ 0xf9c: 84, ++ 0xf9d: 84, ++ 0xf9e: 84, ++ 0xf9f: 84, ++ 0xfa0: 84, ++ 0xfa1: 84, ++ 0xfa2: 84, ++ 0xfa3: 84, ++ 0xfa4: 84, ++ 0xfa5: 84, ++ 0xfa6: 84, ++ 0xfa7: 84, ++ 0xfa8: 84, ++ 0xfa9: 84, ++ 0xfaa: 84, ++ 0xfab: 84, ++ 0xfac: 84, ++ 0xfad: 84, ++ 0xfae: 84, ++ 0xfaf: 84, ++ 0xfb0: 84, ++ 0xfb1: 84, ++ 0xfb2: 84, ++ 0xfb3: 84, ++ 0xfb4: 84, ++ 0xfb5: 84, ++ 0xfb6: 84, ++ 0xfb7: 84, ++ 0xfb8: 84, ++ 0xfb9: 84, ++ 0xfba: 84, ++ 0xfbb: 84, ++ 0xfbc: 84, ++ 0xfc6: 84, ++ 0x102d: 84, ++ 0x102e: 84, ++ 0x102f: 84, ++ 0x1030: 84, ++ 0x1032: 84, ++ 0x1033: 84, ++ 0x1034: 84, ++ 0x1035: 84, ++ 0x1036: 84, ++ 0x1037: 84, ++ 0x1039: 84, ++ 0x103a: 84, ++ 0x103d: 84, ++ 0x103e: 84, ++ 0x1058: 84, ++ 0x1059: 84, ++ 0x105e: 84, ++ 0x105f: 84, ++ 0x1060: 84, ++ 0x1071: 84, ++ 0x1072: 84, ++ 0x1073: 84, ++ 0x1074: 84, ++ 0x1082: 84, ++ 0x1085: 84, ++ 0x1086: 84, ++ 0x108d: 84, ++ 0x109d: 84, ++ 0x135d: 84, ++ 0x135e: 84, ++ 0x135f: 84, ++ 0x1712: 84, ++ 0x1713: 84, ++ 0x1714: 84, ++ 0x1732: 84, ++ 0x1733: 84, ++ 0x1752: 84, ++ 0x1753: 84, ++ 0x1772: 84, ++ 0x1773: 84, ++ 0x17b4: 84, ++ 0x17b5: 84, ++ 0x17b7: 84, ++ 0x17b8: 84, ++ 0x17b9: 84, ++ 0x17ba: 84, ++ 0x17bb: 84, ++ 0x17bc: 84, ++ 0x17bd: 84, ++ 0x17c6: 84, ++ 0x17c9: 84, ++ 0x17ca: 84, ++ 0x17cb: 84, ++ 0x17cc: 84, ++ 0x17cd: 84, ++ 0x17ce: 84, ++ 0x17cf: 84, ++ 0x17d0: 84, ++ 0x17d1: 84, ++ 0x17d2: 84, ++ 0x17d3: 84, ++ 0x17dd: 84, + 0x1807: 68, + 0x180a: 67, +- 0x180e: 85, ++ 0x180b: 84, ++ 0x180c: 84, ++ 0x180d: 84, ++ 0x180f: 84, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, +@@ -581,11 +1214,6 @@ joining_types = { + 0x1876: 68, + 0x1877: 68, + 0x1878: 68, +- 0x1880: 85, +- 0x1881: 85, +- 0x1882: 85, +- 0x1883: 85, +- 0x1884: 85, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, +@@ -622,14 +1250,339 @@ joining_types = { + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, ++ 0x18a9: 84, + 0x18aa: 68, +- 0x200c: 85, ++ 0x1920: 84, ++ 0x1921: 84, ++ 0x1922: 84, ++ 0x1927: 84, ++ 0x1928: 84, ++ 0x1932: 84, ++ 0x1939: 84, ++ 0x193a: 84, ++ 0x193b: 84, ++ 0x1a17: 84, ++ 0x1a18: 84, ++ 0x1a1b: 84, ++ 0x1a56: 84, ++ 0x1a58: 84, ++ 0x1a59: 84, ++ 0x1a5a: 84, ++ 0x1a5b: 84, ++ 0x1a5c: 84, ++ 0x1a5d: 84, ++ 0x1a5e: 84, ++ 0x1a60: 84, ++ 0x1a62: 84, ++ 0x1a65: 84, ++ 0x1a66: 84, ++ 0x1a67: 84, ++ 0x1a68: 84, ++ 0x1a69: 84, ++ 0x1a6a: 84, ++ 0x1a6b: 84, ++ 0x1a6c: 84, ++ 0x1a73: 84, ++ 0x1a74: 84, ++ 0x1a75: 84, ++ 0x1a76: 84, ++ 0x1a77: 84, ++ 0x1a78: 84, ++ 0x1a79: 84, ++ 0x1a7a: 84, ++ 0x1a7b: 84, ++ 0x1a7c: 84, ++ 0x1a7f: 84, ++ 0x1ab0: 84, ++ 0x1ab1: 84, ++ 0x1ab2: 84, ++ 0x1ab3: 84, ++ 0x1ab4: 84, ++ 0x1ab5: 84, ++ 0x1ab6: 84, ++ 0x1ab7: 84, ++ 0x1ab8: 84, ++ 0x1ab9: 84, ++ 0x1aba: 84, ++ 0x1abb: 84, ++ 0x1abc: 84, ++ 0x1abd: 84, ++ 0x1abe: 84, ++ 0x1abf: 84, ++ 0x1ac0: 84, ++ 0x1ac1: 84, ++ 0x1ac2: 84, ++ 0x1ac3: 84, ++ 0x1ac4: 84, ++ 0x1ac5: 84, ++ 0x1ac6: 84, ++ 0x1ac7: 84, ++ 0x1ac8: 84, ++ 0x1ac9: 84, ++ 0x1aca: 84, ++ 0x1acb: 84, ++ 0x1acc: 84, ++ 0x1acd: 84, ++ 0x1ace: 84, ++ 0x1b00: 84, ++ 0x1b01: 84, ++ 0x1b02: 84, ++ 0x1b03: 84, ++ 0x1b34: 84, ++ 0x1b36: 84, ++ 0x1b37: 84, ++ 0x1b38: 84, ++ 0x1b39: 84, ++ 0x1b3a: 84, ++ 0x1b3c: 84, ++ 0x1b42: 84, ++ 0x1b6b: 84, ++ 0x1b6c: 84, ++ 0x1b6d: 84, ++ 0x1b6e: 84, ++ 0x1b6f: 84, ++ 0x1b70: 84, ++ 0x1b71: 84, ++ 0x1b72: 84, ++ 0x1b73: 84, ++ 0x1b80: 84, ++ 0x1b81: 84, ++ 0x1ba2: 84, ++ 0x1ba3: 84, ++ 0x1ba4: 84, ++ 0x1ba5: 84, ++ 0x1ba8: 84, ++ 0x1ba9: 84, ++ 0x1bab: 84, ++ 0x1bac: 84, ++ 0x1bad: 84, ++ 0x1be6: 84, ++ 0x1be8: 84, ++ 0x1be9: 84, ++ 0x1bed: 84, ++ 0x1bef: 84, ++ 0x1bf0: 84, ++ 0x1bf1: 84, ++ 0x1c2c: 84, ++ 0x1c2d: 84, ++ 0x1c2e: 84, ++ 0x1c2f: 84, ++ 0x1c30: 84, ++ 0x1c31: 84, ++ 0x1c32: 84, ++ 0x1c33: 84, ++ 0x1c36: 84, ++ 0x1c37: 84, ++ 0x1cd0: 84, ++ 0x1cd1: 84, ++ 0x1cd2: 84, ++ 0x1cd4: 84, ++ 0x1cd5: 84, ++ 0x1cd6: 84, ++ 0x1cd7: 84, ++ 0x1cd8: 84, ++ 0x1cd9: 84, ++ 0x1cda: 84, ++ 0x1cdb: 84, ++ 0x1cdc: 84, ++ 0x1cdd: 84, ++ 0x1cde: 84, ++ 0x1cdf: 84, ++ 0x1ce0: 84, ++ 0x1ce2: 84, ++ 0x1ce3: 84, ++ 0x1ce4: 84, ++ 0x1ce5: 84, ++ 0x1ce6: 84, ++ 0x1ce7: 84, ++ 0x1ce8: 84, ++ 0x1ced: 84, ++ 0x1cf4: 84, ++ 0x1cf8: 84, ++ 0x1cf9: 84, ++ 0x1dc0: 84, ++ 0x1dc1: 84, ++ 0x1dc2: 84, ++ 0x1dc3: 84, ++ 0x1dc4: 84, ++ 0x1dc5: 84, ++ 0x1dc6: 84, ++ 0x1dc7: 84, ++ 0x1dc8: 84, ++ 0x1dc9: 84, ++ 0x1dca: 84, ++ 0x1dcb: 84, ++ 0x1dcc: 84, ++ 0x1dcd: 84, ++ 0x1dce: 84, ++ 0x1dcf: 84, ++ 0x1dd0: 84, ++ 0x1dd1: 84, ++ 0x1dd2: 84, ++ 0x1dd3: 84, ++ 0x1dd4: 84, ++ 0x1dd5: 84, ++ 0x1dd6: 84, ++ 0x1dd7: 84, ++ 0x1dd8: 84, ++ 0x1dd9: 84, ++ 0x1dda: 84, ++ 0x1ddb: 84, ++ 0x1ddc: 84, ++ 0x1ddd: 84, ++ 0x1dde: 84, ++ 0x1ddf: 84, ++ 0x1de0: 84, ++ 0x1de1: 84, ++ 0x1de2: 84, ++ 0x1de3: 84, ++ 0x1de4: 84, ++ 0x1de5: 84, ++ 0x1de6: 84, ++ 0x1de7: 84, ++ 0x1de8: 84, ++ 0x1de9: 84, ++ 0x1dea: 84, ++ 0x1deb: 84, ++ 0x1dec: 84, ++ 0x1ded: 84, ++ 0x1dee: 84, ++ 0x1def: 84, ++ 0x1df0: 84, ++ 0x1df1: 84, ++ 0x1df2: 84, ++ 0x1df3: 84, ++ 0x1df4: 84, ++ 0x1df5: 84, ++ 0x1df6: 84, ++ 0x1df7: 84, ++ 0x1df8: 84, ++ 0x1df9: 84, ++ 0x1dfa: 84, ++ 0x1dfb: 84, ++ 0x1dfc: 84, ++ 0x1dfd: 84, ++ 0x1dfe: 84, ++ 0x1dff: 84, ++ 0x200b: 84, + 0x200d: 67, +- 0x202f: 85, +- 0x2066: 85, +- 0x2067: 85, +- 0x2068: 85, +- 0x2069: 85, ++ 0x200e: 84, ++ 0x200f: 84, ++ 0x202a: 84, ++ 0x202b: 84, ++ 0x202c: 84, ++ 0x202d: 84, ++ 0x202e: 84, ++ 0x2060: 84, ++ 0x2061: 84, ++ 0x2062: 84, ++ 0x2063: 84, ++ 0x2064: 84, ++ 0x206a: 84, ++ 0x206b: 84, ++ 0x206c: 84, ++ 0x206d: 84, ++ 0x206e: 84, ++ 0x206f: 84, ++ 0x20d0: 84, ++ 0x20d1: 84, ++ 0x20d2: 84, ++ 0x20d3: 84, ++ 0x20d4: 84, ++ 0x20d5: 84, ++ 0x20d6: 84, ++ 0x20d7: 84, ++ 0x20d8: 84, ++ 0x20d9: 84, ++ 0x20da: 84, ++ 0x20db: 84, ++ 0x20dc: 84, ++ 0x20dd: 84, ++ 0x20de: 84, ++ 0x20df: 84, ++ 0x20e0: 84, ++ 0x20e1: 84, ++ 0x20e2: 84, ++ 0x20e3: 84, ++ 0x20e4: 84, ++ 0x20e5: 84, ++ 0x20e6: 84, ++ 0x20e7: 84, ++ 0x20e8: 84, ++ 0x20e9: 84, ++ 0x20ea: 84, ++ 0x20eb: 84, ++ 0x20ec: 84, ++ 0x20ed: 84, ++ 0x20ee: 84, ++ 0x20ef: 84, ++ 0x20f0: 84, ++ 0x2cef: 84, ++ 0x2cf0: 84, ++ 0x2cf1: 84, ++ 0x2d7f: 84, ++ 0x2de0: 84, ++ 0x2de1: 84, ++ 0x2de2: 84, ++ 0x2de3: 84, ++ 0x2de4: 84, ++ 0x2de5: 84, ++ 0x2de6: 84, ++ 0x2de7: 84, ++ 0x2de8: 84, ++ 0x2de9: 84, ++ 0x2dea: 84, ++ 0x2deb: 84, ++ 0x2dec: 84, ++ 0x2ded: 84, ++ 0x2dee: 84, ++ 0x2def: 84, ++ 0x2df0: 84, ++ 0x2df1: 84, ++ 0x2df2: 84, ++ 0x2df3: 84, ++ 0x2df4: 84, ++ 0x2df5: 84, ++ 0x2df6: 84, ++ 0x2df7: 84, ++ 0x2df8: 84, ++ 0x2df9: 84, ++ 0x2dfa: 84, ++ 0x2dfb: 84, ++ 0x2dfc: 84, ++ 0x2dfd: 84, ++ 0x2dfe: 84, ++ 0x2dff: 84, ++ 0x302a: 84, ++ 0x302b: 84, ++ 0x302c: 84, ++ 0x302d: 84, ++ 0x3099: 84, ++ 0x309a: 84, ++ 0xa66f: 84, ++ 0xa670: 84, ++ 0xa671: 84, ++ 0xa672: 84, ++ 0xa674: 84, ++ 0xa675: 84, ++ 0xa676: 84, ++ 0xa677: 84, ++ 0xa678: 84, ++ 0xa679: 84, ++ 0xa67a: 84, ++ 0xa67b: 84, ++ 0xa67c: 84, ++ 0xa67d: 84, ++ 0xa69e: 84, ++ 0xa69f: 84, ++ 0xa6f0: 84, ++ 0xa6f1: 84, ++ 0xa802: 84, ++ 0xa806: 84, ++ 0xa80b: 84, ++ 0xa825: 84, ++ 0xa826: 84, ++ 0xa82c: 84, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, +@@ -681,20 +1634,151 @@ joining_types = { + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, +- 0xa873: 85, ++ 0xa8c4: 84, ++ 0xa8c5: 84, ++ 0xa8e0: 84, ++ 0xa8e1: 84, ++ 0xa8e2: 84, ++ 0xa8e3: 84, ++ 0xa8e4: 84, ++ 0xa8e5: 84, ++ 0xa8e6: 84, ++ 0xa8e7: 84, ++ 0xa8e8: 84, ++ 0xa8e9: 84, ++ 0xa8ea: 84, ++ 0xa8eb: 84, ++ 0xa8ec: 84, ++ 0xa8ed: 84, ++ 0xa8ee: 84, ++ 0xa8ef: 84, ++ 0xa8f0: 84, ++ 0xa8f1: 84, ++ 0xa8ff: 84, ++ 0xa926: 84, ++ 0xa927: 84, ++ 0xa928: 84, ++ 0xa929: 84, ++ 0xa92a: 84, ++ 0xa92b: 84, ++ 0xa92c: 84, ++ 0xa92d: 84, ++ 0xa947: 84, ++ 0xa948: 84, ++ 0xa949: 84, ++ 0xa94a: 84, ++ 0xa94b: 84, ++ 0xa94c: 84, ++ 0xa94d: 84, ++ 0xa94e: 84, ++ 0xa94f: 84, ++ 0xa950: 84, ++ 0xa951: 84, ++ 0xa980: 84, ++ 0xa981: 84, ++ 0xa982: 84, ++ 0xa9b3: 84, ++ 0xa9b6: 84, ++ 0xa9b7: 84, ++ 0xa9b8: 84, ++ 0xa9b9: 84, ++ 0xa9bc: 84, ++ 0xa9bd: 84, ++ 0xa9e5: 84, ++ 0xaa29: 84, ++ 0xaa2a: 84, ++ 0xaa2b: 84, ++ 0xaa2c: 84, ++ 0xaa2d: 84, ++ 0xaa2e: 84, ++ 0xaa31: 84, ++ 0xaa32: 84, ++ 0xaa35: 84, ++ 0xaa36: 84, ++ 0xaa43: 84, ++ 0xaa4c: 84, ++ 0xaa7c: 84, ++ 0xaab0: 84, ++ 0xaab2: 84, ++ 0xaab3: 84, ++ 0xaab4: 84, ++ 0xaab7: 84, ++ 0xaab8: 84, ++ 0xaabe: 84, ++ 0xaabf: 84, ++ 0xaac1: 84, ++ 0xaaec: 84, ++ 0xaaed: 84, ++ 0xaaf6: 84, ++ 0xabe5: 84, ++ 0xabe8: 84, ++ 0xabed: 84, ++ 0xfb1e: 84, ++ 0xfe00: 84, ++ 0xfe01: 84, ++ 0xfe02: 84, ++ 0xfe03: 84, ++ 0xfe04: 84, ++ 0xfe05: 84, ++ 0xfe06: 84, ++ 0xfe07: 84, ++ 0xfe08: 84, ++ 0xfe09: 84, ++ 0xfe0a: 84, ++ 0xfe0b: 84, ++ 0xfe0c: 84, ++ 0xfe0d: 84, ++ 0xfe0e: 84, ++ 0xfe0f: 84, ++ 0xfe20: 84, ++ 0xfe21: 84, ++ 0xfe22: 84, ++ 0xfe23: 84, ++ 0xfe24: 84, ++ 0xfe25: 84, ++ 0xfe26: 84, ++ 0xfe27: 84, ++ 0xfe28: 84, ++ 0xfe29: 84, ++ 0xfe2a: 84, ++ 0xfe2b: 84, ++ 0xfe2c: 84, ++ 0xfe2d: 84, ++ 0xfe2e: 84, ++ 0xfe2f: 84, ++ 0xfeff: 84, ++ 0xfff9: 84, ++ 0xfffa: 84, ++ 0xfffb: 84, ++ 0x101fd: 84, ++ 0x102e0: 84, ++ 0x10376: 84, ++ 0x10377: 84, ++ 0x10378: 84, ++ 0x10379: 84, ++ 0x1037a: 84, ++ 0x10a01: 84, ++ 0x10a02: 84, ++ 0x10a03: 84, ++ 0x10a05: 84, ++ 0x10a06: 84, ++ 0x10a0c: 84, ++ 0x10a0d: 84, ++ 0x10a0e: 84, ++ 0x10a0f: 84, ++ 0x10a38: 84, ++ 0x10a39: 84, ++ 0x10a3a: 84, ++ 0x10a3f: 84, + 0x10ac0: 68, + 0x10ac1: 68, + 0x10ac2: 68, + 0x10ac3: 68, + 0x10ac4: 68, + 0x10ac5: 82, +- 0x10ac6: 85, + 0x10ac7: 82, +- 0x10ac8: 85, + 0x10ac9: 82, + 0x10aca: 82, +- 0x10acb: 85, +- 0x10acc: 85, + 0x10acd: 76, + 0x10ace: 82, + 0x10acf: 82, +@@ -716,9 +1800,9 @@ joining_types = { + 0x10adf: 68, + 0x10ae0: 68, + 0x10ae1: 82, +- 0x10ae2: 85, +- 0x10ae3: 85, + 0x10ae4: 82, ++ 0x10ae5: 84, ++ 0x10ae6: 84, + 0x10aeb: 68, + 0x10aec: 68, + 0x10aed: 68, +@@ -748,7 +1832,6 @@ joining_types = { + 0x10bac: 82, + 0x10bad: 68, + 0x10bae: 68, +- 0x10baf: 85, + 0x10d00: 76, + 0x10d01: 68, + 0x10d02: 68, +@@ -785,6 +1868,15 @@ joining_types = { + 0x10d21: 68, + 0x10d22: 82, + 0x10d23: 68, ++ 0x10d24: 84, ++ 0x10d25: 84, ++ 0x10d26: 84, ++ 0x10d27: 84, ++ 0x10eab: 84, ++ 0x10eac: 84, ++ 0x10efd: 84, ++ 0x10efe: 84, ++ 0x10eff: 84, + 0x10f30: 68, + 0x10f31: 68, + 0x10f32: 68, +@@ -806,7 +1898,17 @@ joining_types = { + 0x10f42: 68, + 0x10f43: 68, + 0x10f44: 68, +- 0x10f45: 85, ++ 0x10f46: 84, ++ 0x10f47: 84, ++ 0x10f48: 84, ++ 0x10f49: 84, ++ 0x10f4a: 84, ++ 0x10f4b: 84, ++ 0x10f4c: 84, ++ 0x10f4d: 84, ++ 0x10f4e: 84, ++ 0x10f4f: 84, ++ 0x10f50: 84, + 0x10f51: 68, + 0x10f52: 68, + 0x10f53: 68, +@@ -829,14 +1931,16 @@ joining_types = { + 0x10f7f: 68, + 0x10f80: 68, + 0x10f81: 68, ++ 0x10f82: 84, ++ 0x10f83: 84, ++ 0x10f84: 84, ++ 0x10f85: 84, + 0x10fb0: 68, +- 0x10fb1: 85, + 0x10fb2: 68, + 0x10fb3: 68, + 0x10fb4: 82, + 0x10fb5: 82, + 0x10fb6: 82, +- 0x10fb7: 85, + 0x10fb8: 68, + 0x10fb9: 82, + 0x10fba: 82, +@@ -845,20 +1949,668 @@ joining_types = { + 0x10fbd: 82, + 0x10fbe: 68, + 0x10fbf: 68, +- 0x10fc0: 85, + 0x10fc1: 68, + 0x10fc2: 82, + 0x10fc3: 82, + 0x10fc4: 68, +- 0x10fc5: 85, +- 0x10fc6: 85, +- 0x10fc7: 85, +- 0x10fc8: 85, + 0x10fc9: 82, + 0x10fca: 68, + 0x10fcb: 76, +- 0x110bd: 85, +- 0x110cd: 85, ++ 0x11001: 84, ++ 0x11038: 84, ++ 0x11039: 84, ++ 0x1103a: 84, ++ 0x1103b: 84, ++ 0x1103c: 84, ++ 0x1103d: 84, ++ 0x1103e: 84, ++ 0x1103f: 84, ++ 0x11040: 84, ++ 0x11041: 84, ++ 0x11042: 84, ++ 0x11043: 84, ++ 0x11044: 84, ++ 0x11045: 84, ++ 0x11046: 84, ++ 0x11070: 84, ++ 0x11073: 84, ++ 0x11074: 84, ++ 0x1107f: 84, ++ 0x11080: 84, ++ 0x11081: 84, ++ 0x110b3: 84, ++ 0x110b4: 84, ++ 0x110b5: 84, ++ 0x110b6: 84, ++ 0x110b9: 84, ++ 0x110ba: 84, ++ 0x110c2: 84, ++ 0x11100: 84, ++ 0x11101: 84, ++ 0x11102: 84, ++ 0x11127: 84, ++ 0x11128: 84, ++ 0x11129: 84, ++ 0x1112a: 84, ++ 0x1112b: 84, ++ 0x1112d: 84, ++ 0x1112e: 84, ++ 0x1112f: 84, ++ 0x11130: 84, ++ 0x11131: 84, ++ 0x11132: 84, ++ 0x11133: 84, ++ 0x11134: 84, ++ 0x11173: 84, ++ 0x11180: 84, ++ 0x11181: 84, ++ 0x111b6: 84, ++ 0x111b7: 84, ++ 0x111b8: 84, ++ 0x111b9: 84, ++ 0x111ba: 84, ++ 0x111bb: 84, ++ 0x111bc: 84, ++ 0x111bd: 84, ++ 0x111be: 84, ++ 0x111c9: 84, ++ 0x111ca: 84, ++ 0x111cb: 84, ++ 0x111cc: 84, ++ 0x111cf: 84, ++ 0x1122f: 84, ++ 0x11230: 84, ++ 0x11231: 84, ++ 0x11234: 84, ++ 0x11236: 84, ++ 0x11237: 84, ++ 0x1123e: 84, ++ 0x11241: 84, ++ 0x112df: 84, ++ 0x112e3: 84, ++ 0x112e4: 84, ++ 0x112e5: 84, ++ 0x112e6: 84, ++ 0x112e7: 84, ++ 0x112e8: 84, ++ 0x112e9: 84, ++ 0x112ea: 84, ++ 0x11300: 84, ++ 0x11301: 84, ++ 0x1133b: 84, ++ 0x1133c: 84, ++ 0x11340: 84, ++ 0x11366: 84, ++ 0x11367: 84, ++ 0x11368: 84, ++ 0x11369: 84, ++ 0x1136a: 84, ++ 0x1136b: 84, ++ 0x1136c: 84, ++ 0x11370: 84, ++ 0x11371: 84, ++ 0x11372: 84, ++ 0x11373: 84, ++ 0x11374: 84, ++ 0x11438: 84, ++ 0x11439: 84, ++ 0x1143a: 84, ++ 0x1143b: 84, ++ 0x1143c: 84, ++ 0x1143d: 84, ++ 0x1143e: 84, ++ 0x1143f: 84, ++ 0x11442: 84, ++ 0x11443: 84, ++ 0x11444: 84, ++ 0x11446: 84, ++ 0x1145e: 84, ++ 0x114b3: 84, ++ 0x114b4: 84, ++ 0x114b5: 84, ++ 0x114b6: 84, ++ 0x114b7: 84, ++ 0x114b8: 84, ++ 0x114ba: 84, ++ 0x114bf: 84, ++ 0x114c0: 84, ++ 0x114c2: 84, ++ 0x114c3: 84, ++ 0x115b2: 84, ++ 0x115b3: 84, ++ 0x115b4: 84, ++ 0x115b5: 84, ++ 0x115bc: 84, ++ 0x115bd: 84, ++ 0x115bf: 84, ++ 0x115c0: 84, ++ 0x115dc: 84, ++ 0x115dd: 84, ++ 0x11633: 84, ++ 0x11634: 84, ++ 0x11635: 84, ++ 0x11636: 84, ++ 0x11637: 84, ++ 0x11638: 84, ++ 0x11639: 84, ++ 0x1163a: 84, ++ 0x1163d: 84, ++ 0x1163f: 84, ++ 0x11640: 84, ++ 0x116ab: 84, ++ 0x116ad: 84, ++ 0x116b0: 84, ++ 0x116b1: 84, ++ 0x116b2: 84, ++ 0x116b3: 84, ++ 0x116b4: 84, ++ 0x116b5: 84, ++ 0x116b7: 84, ++ 0x1171d: 84, ++ 0x1171e: 84, ++ 0x1171f: 84, ++ 0x11722: 84, ++ 0x11723: 84, ++ 0x11724: 84, ++ 0x11725: 84, ++ 0x11727: 84, ++ 0x11728: 84, ++ 0x11729: 84, ++ 0x1172a: 84, ++ 0x1172b: 84, ++ 0x1182f: 84, ++ 0x11830: 84, ++ 0x11831: 84, ++ 0x11832: 84, ++ 0x11833: 84, ++ 0x11834: 84, ++ 0x11835: 84, ++ 0x11836: 84, ++ 0x11837: 84, ++ 0x11839: 84, ++ 0x1183a: 84, ++ 0x1193b: 84, ++ 0x1193c: 84, ++ 0x1193e: 84, ++ 0x11943: 84, ++ 0x119d4: 84, ++ 0x119d5: 84, ++ 0x119d6: 84, ++ 0x119d7: 84, ++ 0x119da: 84, ++ 0x119db: 84, ++ 0x119e0: 84, ++ 0x11a01: 84, ++ 0x11a02: 84, ++ 0x11a03: 84, ++ 0x11a04: 84, ++ 0x11a05: 84, ++ 0x11a06: 84, ++ 0x11a07: 84, ++ 0x11a08: 84, ++ 0x11a09: 84, ++ 0x11a0a: 84, ++ 0x11a33: 84, ++ 0x11a34: 84, ++ 0x11a35: 84, ++ 0x11a36: 84, ++ 0x11a37: 84, ++ 0x11a38: 84, ++ 0x11a3b: 84, ++ 0x11a3c: 84, ++ 0x11a3d: 84, ++ 0x11a3e: 84, ++ 0x11a47: 84, ++ 0x11a51: 84, ++ 0x11a52: 84, ++ 0x11a53: 84, ++ 0x11a54: 84, ++ 0x11a55: 84, ++ 0x11a56: 84, ++ 0x11a59: 84, ++ 0x11a5a: 84, ++ 0x11a5b: 84, ++ 0x11a8a: 84, ++ 0x11a8b: 84, ++ 0x11a8c: 84, ++ 0x11a8d: 84, ++ 0x11a8e: 84, ++ 0x11a8f: 84, ++ 0x11a90: 84, ++ 0x11a91: 84, ++ 0x11a92: 84, ++ 0x11a93: 84, ++ 0x11a94: 84, ++ 0x11a95: 84, ++ 0x11a96: 84, ++ 0x11a98: 84, ++ 0x11a99: 84, ++ 0x11c30: 84, ++ 0x11c31: 84, ++ 0x11c32: 84, ++ 0x11c33: 84, ++ 0x11c34: 84, ++ 0x11c35: 84, ++ 0x11c36: 84, ++ 0x11c38: 84, ++ 0x11c39: 84, ++ 0x11c3a: 84, ++ 0x11c3b: 84, ++ 0x11c3c: 84, ++ 0x11c3d: 84, ++ 0x11c3f: 84, ++ 0x11c92: 84, ++ 0x11c93: 84, ++ 0x11c94: 84, ++ 0x11c95: 84, ++ 0x11c96: 84, ++ 0x11c97: 84, ++ 0x11c98: 84, ++ 0x11c99: 84, ++ 0x11c9a: 84, ++ 0x11c9b: 84, ++ 0x11c9c: 84, ++ 0x11c9d: 84, ++ 0x11c9e: 84, ++ 0x11c9f: 84, ++ 0x11ca0: 84, ++ 0x11ca1: 84, ++ 0x11ca2: 84, ++ 0x11ca3: 84, ++ 0x11ca4: 84, ++ 0x11ca5: 84, ++ 0x11ca6: 84, ++ 0x11ca7: 84, ++ 0x11caa: 84, ++ 0x11cab: 84, ++ 0x11cac: 84, ++ 0x11cad: 84, ++ 0x11cae: 84, ++ 0x11caf: 84, ++ 0x11cb0: 84, ++ 0x11cb2: 84, ++ 0x11cb3: 84, ++ 0x11cb5: 84, ++ 0x11cb6: 84, ++ 0x11d31: 84, ++ 0x11d32: 84, ++ 0x11d33: 84, ++ 0x11d34: 84, ++ 0x11d35: 84, ++ 0x11d36: 84, ++ 0x11d3a: 84, ++ 0x11d3c: 84, ++ 0x11d3d: 84, ++ 0x11d3f: 84, ++ 0x11d40: 84, ++ 0x11d41: 84, ++ 0x11d42: 84, ++ 0x11d43: 84, ++ 0x11d44: 84, ++ 0x11d45: 84, ++ 0x11d47: 84, ++ 0x11d90: 84, ++ 0x11d91: 84, ++ 0x11d95: 84, ++ 0x11d97: 84, ++ 0x11ef3: 84, ++ 0x11ef4: 84, ++ 0x11f00: 84, ++ 0x11f01: 84, ++ 0x11f36: 84, ++ 0x11f37: 84, ++ 0x11f38: 84, ++ 0x11f39: 84, ++ 0x11f3a: 84, ++ 0x11f40: 84, ++ 0x11f42: 84, ++ 0x13430: 84, ++ 0x13431: 84, ++ 0x13432: 84, ++ 0x13433: 84, ++ 0x13434: 84, ++ 0x13435: 84, ++ 0x13436: 84, ++ 0x13437: 84, ++ 0x13438: 84, ++ 0x13439: 84, ++ 0x1343a: 84, ++ 0x1343b: 84, ++ 0x1343c: 84, ++ 0x1343d: 84, ++ 0x1343e: 84, ++ 0x1343f: 84, ++ 0x13440: 84, ++ 0x13447: 84, ++ 0x13448: 84, ++ 0x13449: 84, ++ 0x1344a: 84, ++ 0x1344b: 84, ++ 0x1344c: 84, ++ 0x1344d: 84, ++ 0x1344e: 84, ++ 0x1344f: 84, ++ 0x13450: 84, ++ 0x13451: 84, ++ 0x13452: 84, ++ 0x13453: 84, ++ 0x13454: 84, ++ 0x13455: 84, ++ 0x16af0: 84, ++ 0x16af1: 84, ++ 0x16af2: 84, ++ 0x16af3: 84, ++ 0x16af4: 84, ++ 0x16b30: 84, ++ 0x16b31: 84, ++ 0x16b32: 84, ++ 0x16b33: 84, ++ 0x16b34: 84, ++ 0x16b35: 84, ++ 0x16b36: 84, ++ 0x16f4f: 84, ++ 0x16f8f: 84, ++ 0x16f90: 84, ++ 0x16f91: 84, ++ 0x16f92: 84, ++ 0x16fe4: 84, ++ 0x1bc9d: 84, ++ 0x1bc9e: 84, ++ 0x1bca0: 84, ++ 0x1bca1: 84, ++ 0x1bca2: 84, ++ 0x1bca3: 84, ++ 0x1cf00: 84, ++ 0x1cf01: 84, ++ 0x1cf02: 84, ++ 0x1cf03: 84, ++ 0x1cf04: 84, ++ 0x1cf05: 84, ++ 0x1cf06: 84, ++ 0x1cf07: 84, ++ 0x1cf08: 84, ++ 0x1cf09: 84, ++ 0x1cf0a: 84, ++ 0x1cf0b: 84, ++ 0x1cf0c: 84, ++ 0x1cf0d: 84, ++ 0x1cf0e: 84, ++ 0x1cf0f: 84, ++ 0x1cf10: 84, ++ 0x1cf11: 84, ++ 0x1cf12: 84, ++ 0x1cf13: 84, ++ 0x1cf14: 84, ++ 0x1cf15: 84, ++ 0x1cf16: 84, ++ 0x1cf17: 84, ++ 0x1cf18: 84, ++ 0x1cf19: 84, ++ 0x1cf1a: 84, ++ 0x1cf1b: 84, ++ 0x1cf1c: 84, ++ 0x1cf1d: 84, ++ 0x1cf1e: 84, ++ 0x1cf1f: 84, ++ 0x1cf20: 84, ++ 0x1cf21: 84, ++ 0x1cf22: 84, ++ 0x1cf23: 84, ++ 0x1cf24: 84, ++ 0x1cf25: 84, ++ 0x1cf26: 84, ++ 0x1cf27: 84, ++ 0x1cf28: 84, ++ 0x1cf29: 84, ++ 0x1cf2a: 84, ++ 0x1cf2b: 84, ++ 0x1cf2c: 84, ++ 0x1cf2d: 84, ++ 0x1cf30: 84, ++ 0x1cf31: 84, ++ 0x1cf32: 84, ++ 0x1cf33: 84, ++ 0x1cf34: 84, ++ 0x1cf35: 84, ++ 0x1cf36: 84, ++ 0x1cf37: 84, ++ 0x1cf38: 84, ++ 0x1cf39: 84, ++ 0x1cf3a: 84, ++ 0x1cf3b: 84, ++ 0x1cf3c: 84, ++ 0x1cf3d: 84, ++ 0x1cf3e: 84, ++ 0x1cf3f: 84, ++ 0x1cf40: 84, ++ 0x1cf41: 84, ++ 0x1cf42: 84, ++ 0x1cf43: 84, ++ 0x1cf44: 84, ++ 0x1cf45: 84, ++ 0x1cf46: 84, ++ 0x1d167: 84, ++ 0x1d168: 84, ++ 0x1d169: 84, ++ 0x1d173: 84, ++ 0x1d174: 84, ++ 0x1d175: 84, ++ 0x1d176: 84, ++ 0x1d177: 84, ++ 0x1d178: 84, ++ 0x1d179: 84, ++ 0x1d17a: 84, ++ 0x1d17b: 84, ++ 0x1d17c: 84, ++ 0x1d17d: 84, ++ 0x1d17e: 84, ++ 0x1d17f: 84, ++ 0x1d180: 84, ++ 0x1d181: 84, ++ 0x1d182: 84, ++ 0x1d185: 84, ++ 0x1d186: 84, ++ 0x1d187: 84, ++ 0x1d188: 84, ++ 0x1d189: 84, ++ 0x1d18a: 84, ++ 0x1d18b: 84, ++ 0x1d1aa: 84, ++ 0x1d1ab: 84, ++ 0x1d1ac: 84, ++ 0x1d1ad: 84, ++ 0x1d242: 84, ++ 0x1d243: 84, ++ 0x1d244: 84, ++ 0x1da00: 84, ++ 0x1da01: 84, ++ 0x1da02: 84, ++ 0x1da03: 84, ++ 0x1da04: 84, ++ 0x1da05: 84, ++ 0x1da06: 84, ++ 0x1da07: 84, ++ 0x1da08: 84, ++ 0x1da09: 84, ++ 0x1da0a: 84, ++ 0x1da0b: 84, ++ 0x1da0c: 84, ++ 0x1da0d: 84, ++ 0x1da0e: 84, ++ 0x1da0f: 84, ++ 0x1da10: 84, ++ 0x1da11: 84, ++ 0x1da12: 84, ++ 0x1da13: 84, ++ 0x1da14: 84, ++ 0x1da15: 84, ++ 0x1da16: 84, ++ 0x1da17: 84, ++ 0x1da18: 84, ++ 0x1da19: 84, ++ 0x1da1a: 84, ++ 0x1da1b: 84, ++ 0x1da1c: 84, ++ 0x1da1d: 84, ++ 0x1da1e: 84, ++ 0x1da1f: 84, ++ 0x1da20: 84, ++ 0x1da21: 84, ++ 0x1da22: 84, ++ 0x1da23: 84, ++ 0x1da24: 84, ++ 0x1da25: 84, ++ 0x1da26: 84, ++ 0x1da27: 84, ++ 0x1da28: 84, ++ 0x1da29: 84, ++ 0x1da2a: 84, ++ 0x1da2b: 84, ++ 0x1da2c: 84, ++ 0x1da2d: 84, ++ 0x1da2e: 84, ++ 0x1da2f: 84, ++ 0x1da30: 84, ++ 0x1da31: 84, ++ 0x1da32: 84, ++ 0x1da33: 84, ++ 0x1da34: 84, ++ 0x1da35: 84, ++ 0x1da36: 84, ++ 0x1da3b: 84, ++ 0x1da3c: 84, ++ 0x1da3d: 84, ++ 0x1da3e: 84, ++ 0x1da3f: 84, ++ 0x1da40: 84, ++ 0x1da41: 84, ++ 0x1da42: 84, ++ 0x1da43: 84, ++ 0x1da44: 84, ++ 0x1da45: 84, ++ 0x1da46: 84, ++ 0x1da47: 84, ++ 0x1da48: 84, ++ 0x1da49: 84, ++ 0x1da4a: 84, ++ 0x1da4b: 84, ++ 0x1da4c: 84, ++ 0x1da4d: 84, ++ 0x1da4e: 84, ++ 0x1da4f: 84, ++ 0x1da50: 84, ++ 0x1da51: 84, ++ 0x1da52: 84, ++ 0x1da53: 84, ++ 0x1da54: 84, ++ 0x1da55: 84, ++ 0x1da56: 84, ++ 0x1da57: 84, ++ 0x1da58: 84, ++ 0x1da59: 84, ++ 0x1da5a: 84, ++ 0x1da5b: 84, ++ 0x1da5c: 84, ++ 0x1da5d: 84, ++ 0x1da5e: 84, ++ 0x1da5f: 84, ++ 0x1da60: 84, ++ 0x1da61: 84, ++ 0x1da62: 84, ++ 0x1da63: 84, ++ 0x1da64: 84, ++ 0x1da65: 84, ++ 0x1da66: 84, ++ 0x1da67: 84, ++ 0x1da68: 84, ++ 0x1da69: 84, ++ 0x1da6a: 84, ++ 0x1da6b: 84, ++ 0x1da6c: 84, ++ 0x1da75: 84, ++ 0x1da84: 84, ++ 0x1da9b: 84, ++ 0x1da9c: 84, ++ 0x1da9d: 84, ++ 0x1da9e: 84, ++ 0x1da9f: 84, ++ 0x1daa1: 84, ++ 0x1daa2: 84, ++ 0x1daa3: 84, ++ 0x1daa4: 84, ++ 0x1daa5: 84, ++ 0x1daa6: 84, ++ 0x1daa7: 84, ++ 0x1daa8: 84, ++ 0x1daa9: 84, ++ 0x1daaa: 84, ++ 0x1daab: 84, ++ 0x1daac: 84, ++ 0x1daad: 84, ++ 0x1daae: 84, ++ 0x1daaf: 84, ++ 0x1e000: 84, ++ 0x1e001: 84, ++ 0x1e002: 84, ++ 0x1e003: 84, ++ 0x1e004: 84, ++ 0x1e005: 84, ++ 0x1e006: 84, ++ 0x1e008: 84, ++ 0x1e009: 84, ++ 0x1e00a: 84, ++ 0x1e00b: 84, ++ 0x1e00c: 84, ++ 0x1e00d: 84, ++ 0x1e00e: 84, ++ 0x1e00f: 84, ++ 0x1e010: 84, ++ 0x1e011: 84, ++ 0x1e012: 84, ++ 0x1e013: 84, ++ 0x1e014: 84, ++ 0x1e015: 84, ++ 0x1e016: 84, ++ 0x1e017: 84, ++ 0x1e018: 84, ++ 0x1e01b: 84, ++ 0x1e01c: 84, ++ 0x1e01d: 84, ++ 0x1e01e: 84, ++ 0x1e01f: 84, ++ 0x1e020: 84, ++ 0x1e021: 84, ++ 0x1e023: 84, ++ 0x1e024: 84, ++ 0x1e026: 84, ++ 0x1e027: 84, ++ 0x1e028: 84, ++ 0x1e029: 84, ++ 0x1e02a: 84, ++ 0x1e08f: 84, ++ 0x1e130: 84, ++ 0x1e131: 84, ++ 0x1e132: 84, ++ 0x1e133: 84, ++ 0x1e134: 84, ++ 0x1e135: 84, ++ 0x1e136: 84, ++ 0x1e2ae: 84, ++ 0x1e2ec: 84, ++ 0x1e2ed: 84, ++ 0x1e2ee: 84, ++ 0x1e2ef: 84, ++ 0x1e4ec: 84, ++ 0x1e4ed: 84, ++ 0x1e4ee: 84, ++ 0x1e4ef: 84, ++ 0x1e8d0: 84, ++ 0x1e8d1: 84, ++ 0x1e8d2: 84, ++ 0x1e8d3: 84, ++ 0x1e8d4: 84, ++ 0x1e8d5: 84, ++ 0x1e8d6: 84, + 0x1e900: 68, + 0x1e901: 68, + 0x1e902: 68, +@@ -927,7 +2679,351 @@ joining_types = { + 0x1e941: 68, + 0x1e942: 68, + 0x1e943: 68, ++ 0x1e944: 84, ++ 0x1e945: 84, ++ 0x1e946: 84, ++ 0x1e947: 84, ++ 0x1e948: 84, ++ 0x1e949: 84, ++ 0x1e94a: 84, + 0x1e94b: 84, ++ 0xe0001: 84, ++ 0xe0020: 84, ++ 0xe0021: 84, ++ 0xe0022: 84, ++ 0xe0023: 84, ++ 0xe0024: 84, ++ 0xe0025: 84, ++ 0xe0026: 84, ++ 0xe0027: 84, ++ 0xe0028: 84, ++ 0xe0029: 84, ++ 0xe002a: 84, ++ 0xe002b: 84, ++ 0xe002c: 84, ++ 0xe002d: 84, ++ 0xe002e: 84, ++ 0xe002f: 84, ++ 0xe0030: 84, ++ 0xe0031: 84, ++ 0xe0032: 84, ++ 0xe0033: 84, ++ 0xe0034: 84, ++ 0xe0035: 84, ++ 0xe0036: 84, ++ 0xe0037: 84, ++ 0xe0038: 84, ++ 0xe0039: 84, ++ 0xe003a: 84, ++ 0xe003b: 84, ++ 0xe003c: 84, ++ 0xe003d: 84, ++ 0xe003e: 84, ++ 0xe003f: 84, ++ 0xe0040: 84, ++ 0xe0041: 84, ++ 0xe0042: 84, ++ 0xe0043: 84, ++ 0xe0044: 84, ++ 0xe0045: 84, ++ 0xe0046: 84, ++ 0xe0047: 84, ++ 0xe0048: 84, ++ 0xe0049: 84, ++ 0xe004a: 84, ++ 0xe004b: 84, ++ 0xe004c: 84, ++ 0xe004d: 84, ++ 0xe004e: 84, ++ 0xe004f: 84, ++ 0xe0050: 84, ++ 0xe0051: 84, ++ 0xe0052: 84, ++ 0xe0053: 84, ++ 0xe0054: 84, ++ 0xe0055: 84, ++ 0xe0056: 84, ++ 0xe0057: 84, ++ 0xe0058: 84, ++ 0xe0059: 84, ++ 0xe005a: 84, ++ 0xe005b: 84, ++ 0xe005c: 84, ++ 0xe005d: 84, ++ 0xe005e: 84, ++ 0xe005f: 84, ++ 0xe0060: 84, ++ 0xe0061: 84, ++ 0xe0062: 84, ++ 0xe0063: 84, ++ 0xe0064: 84, ++ 0xe0065: 84, ++ 0xe0066: 84, ++ 0xe0067: 84, ++ 0xe0068: 84, ++ 0xe0069: 84, ++ 0xe006a: 84, ++ 0xe006b: 84, ++ 0xe006c: 84, ++ 0xe006d: 84, ++ 0xe006e: 84, ++ 0xe006f: 84, ++ 0xe0070: 84, ++ 0xe0071: 84, ++ 0xe0072: 84, ++ 0xe0073: 84, ++ 0xe0074: 84, ++ 0xe0075: 84, ++ 0xe0076: 84, ++ 0xe0077: 84, ++ 0xe0078: 84, ++ 0xe0079: 84, ++ 0xe007a: 84, ++ 0xe007b: 84, ++ 0xe007c: 84, ++ 0xe007d: 84, ++ 0xe007e: 84, ++ 0xe007f: 84, ++ 0xe0100: 84, ++ 0xe0101: 84, ++ 0xe0102: 84, ++ 0xe0103: 84, ++ 0xe0104: 84, ++ 0xe0105: 84, ++ 0xe0106: 84, ++ 0xe0107: 84, ++ 0xe0108: 84, ++ 0xe0109: 84, ++ 0xe010a: 84, ++ 0xe010b: 84, ++ 0xe010c: 84, ++ 0xe010d: 84, ++ 0xe010e: 84, ++ 0xe010f: 84, ++ 0xe0110: 84, ++ 0xe0111: 84, ++ 0xe0112: 84, ++ 0xe0113: 84, ++ 0xe0114: 84, ++ 0xe0115: 84, ++ 0xe0116: 84, ++ 0xe0117: 84, ++ 0xe0118: 84, ++ 0xe0119: 84, ++ 0xe011a: 84, ++ 0xe011b: 84, ++ 0xe011c: 84, ++ 0xe011d: 84, ++ 0xe011e: 84, ++ 0xe011f: 84, ++ 0xe0120: 84, ++ 0xe0121: 84, ++ 0xe0122: 84, ++ 0xe0123: 84, ++ 0xe0124: 84, ++ 0xe0125: 84, ++ 0xe0126: 84, ++ 0xe0127: 84, ++ 0xe0128: 84, ++ 0xe0129: 84, ++ 0xe012a: 84, ++ 0xe012b: 84, ++ 0xe012c: 84, ++ 0xe012d: 84, ++ 0xe012e: 84, ++ 0xe012f: 84, ++ 0xe0130: 84, ++ 0xe0131: 84, ++ 0xe0132: 84, ++ 0xe0133: 84, ++ 0xe0134: 84, ++ 0xe0135: 84, ++ 0xe0136: 84, ++ 0xe0137: 84, ++ 0xe0138: 84, ++ 0xe0139: 84, ++ 0xe013a: 84, ++ 0xe013b: 84, ++ 0xe013c: 84, ++ 0xe013d: 84, ++ 0xe013e: 84, ++ 0xe013f: 84, ++ 0xe0140: 84, ++ 0xe0141: 84, ++ 0xe0142: 84, ++ 0xe0143: 84, ++ 0xe0144: 84, ++ 0xe0145: 84, ++ 0xe0146: 84, ++ 0xe0147: 84, ++ 0xe0148: 84, ++ 0xe0149: 84, ++ 0xe014a: 84, ++ 0xe014b: 84, ++ 0xe014c: 84, ++ 0xe014d: 84, ++ 0xe014e: 84, ++ 0xe014f: 84, ++ 0xe0150: 84, ++ 0xe0151: 84, ++ 0xe0152: 84, ++ 0xe0153: 84, ++ 0xe0154: 84, ++ 0xe0155: 84, ++ 0xe0156: 84, ++ 0xe0157: 84, ++ 0xe0158: 84, ++ 0xe0159: 84, ++ 0xe015a: 84, ++ 0xe015b: 84, ++ 0xe015c: 84, ++ 0xe015d: 84, ++ 0xe015e: 84, ++ 0xe015f: 84, ++ 0xe0160: 84, ++ 0xe0161: 84, ++ 0xe0162: 84, ++ 0xe0163: 84, ++ 0xe0164: 84, ++ 0xe0165: 84, ++ 0xe0166: 84, ++ 0xe0167: 84, ++ 0xe0168: 84, ++ 0xe0169: 84, ++ 0xe016a: 84, ++ 0xe016b: 84, ++ 0xe016c: 84, ++ 0xe016d: 84, ++ 0xe016e: 84, ++ 0xe016f: 84, ++ 0xe0170: 84, ++ 0xe0171: 84, ++ 0xe0172: 84, ++ 0xe0173: 84, ++ 0xe0174: 84, ++ 0xe0175: 84, ++ 0xe0176: 84, ++ 0xe0177: 84, ++ 0xe0178: 84, ++ 0xe0179: 84, ++ 0xe017a: 84, ++ 0xe017b: 84, ++ 0xe017c: 84, ++ 0xe017d: 84, ++ 0xe017e: 84, ++ 0xe017f: 84, ++ 0xe0180: 84, ++ 0xe0181: 84, ++ 0xe0182: 84, ++ 0xe0183: 84, ++ 0xe0184: 84, ++ 0xe0185: 84, ++ 0xe0186: 84, ++ 0xe0187: 84, ++ 0xe0188: 84, ++ 0xe0189: 84, ++ 0xe018a: 84, ++ 0xe018b: 84, ++ 0xe018c: 84, ++ 0xe018d: 84, ++ 0xe018e: 84, ++ 0xe018f: 84, ++ 0xe0190: 84, ++ 0xe0191: 84, ++ 0xe0192: 84, ++ 0xe0193: 84, ++ 0xe0194: 84, ++ 0xe0195: 84, ++ 0xe0196: 84, ++ 0xe0197: 84, ++ 0xe0198: 84, ++ 0xe0199: 84, ++ 0xe019a: 84, ++ 0xe019b: 84, ++ 0xe019c: 84, ++ 0xe019d: 84, ++ 0xe019e: 84, ++ 0xe019f: 84, ++ 0xe01a0: 84, ++ 0xe01a1: 84, ++ 0xe01a2: 84, ++ 0xe01a3: 84, ++ 0xe01a4: 84, ++ 0xe01a5: 84, ++ 0xe01a6: 84, ++ 0xe01a7: 84, ++ 0xe01a8: 84, ++ 0xe01a9: 84, ++ 0xe01aa: 84, ++ 0xe01ab: 84, ++ 0xe01ac: 84, ++ 0xe01ad: 84, ++ 0xe01ae: 84, ++ 0xe01af: 84, ++ 0xe01b0: 84, ++ 0xe01b1: 84, ++ 0xe01b2: 84, ++ 0xe01b3: 84, ++ 0xe01b4: 84, ++ 0xe01b5: 84, ++ 0xe01b6: 84, ++ 0xe01b7: 84, ++ 0xe01b8: 84, ++ 0xe01b9: 84, ++ 0xe01ba: 84, ++ 0xe01bb: 84, ++ 0xe01bc: 84, ++ 0xe01bd: 84, ++ 0xe01be: 84, ++ 0xe01bf: 84, ++ 0xe01c0: 84, ++ 0xe01c1: 84, ++ 0xe01c2: 84, ++ 0xe01c3: 84, ++ 0xe01c4: 84, ++ 0xe01c5: 84, ++ 0xe01c6: 84, ++ 0xe01c7: 84, ++ 0xe01c8: 84, ++ 0xe01c9: 84, ++ 0xe01ca: 84, ++ 0xe01cb: 84, ++ 0xe01cc: 84, ++ 0xe01cd: 84, ++ 0xe01ce: 84, ++ 0xe01cf: 84, ++ 0xe01d0: 84, ++ 0xe01d1: 84, ++ 0xe01d2: 84, ++ 0xe01d3: 84, ++ 0xe01d4: 84, ++ 0xe01d5: 84, ++ 0xe01d6: 84, ++ 0xe01d7: 84, ++ 0xe01d8: 84, ++ 0xe01d9: 84, ++ 0xe01da: 84, ++ 0xe01db: 84, ++ 0xe01dc: 84, ++ 0xe01dd: 84, ++ 0xe01de: 84, ++ 0xe01df: 84, ++ 0xe01e0: 84, ++ 0xe01e1: 84, ++ 0xe01e2: 84, ++ 0xe01e3: 84, ++ 0xe01e4: 84, ++ 0xe01e5: 84, ++ 0xe01e6: 84, ++ 0xe01e7: 84, ++ 0xe01e8: 84, ++ 0xe01e9: 84, ++ 0xe01ea: 84, ++ 0xe01eb: 84, ++ 0xe01ec: 84, ++ 0xe01ed: 84, ++ 0xe01ee: 84, ++ 0xe01ef: 84, + } + codepoint_classes = { + 'PVALID': ( +@@ -2112,7 +4208,6 @@ codepoint_classes = { + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, +- 0x1e0300001e06e, + 0x1e08f0001e090, + 0x1e1000001e12d, + 0x1e1300001e13e, + diff --git a/python-pip.spec b/python-pip.spec index 3a71527..d6d48f9 100644 --- a/python-pip.spec +++ b/python-pip.spec @@ -6,7 +6,7 @@ pip is the package installer for Python. You can use pip to install packages fro %global bashcompdir %(b=$(pkg-config --variable=completionsdir bash-completion 2>/dev/null); echo ${b:-%{_sysconfdir}/bash_completion.d}) Name: python-%{srcname} Version: 21.3.1 -Release: 5 +Release: 6 Summary: A tool for installing and managing Python packages License: MIT and Python and ASL 2.0 and BSD and ISC and LGPLv2 and MPLv2.0 and (ASL 2.0 or BSD) URL: http://www.pip-installer.org @@ -18,6 +18,11 @@ Patch2: emit-a-warning-when-running-with-root-privileges.patch Patch3: remove-existing-dist-only-if-path-conflicts.patch Patch6000: dummy-certifi.patch Patch6001: backport-fix-vulnerable-regex.patch +Patch6002: backport-0001-CVE-2024-3651.patch +Patch6003: backport-0002-CVE-2024-3651.patch +Patch6004: backport-0003-CVE-2024-3651.patch +Patch6005: backport-0004-CVE-2024-3651.patch +Patch6006: backport-0005-CVE-2024-3651.patch Source10: pip-allow-older-versions.patch @@ -127,6 +132,9 @@ install -D -m0644 %{SOURCE1} %{buildroot}%{_sysconfdir}/pip.conf %{python_wheeldir}/%{python_wheelname} %changelog +* Fri Jun 7 2024 yangyuan - 21.3.1-6 +- fix CVE-2024-3651 + * Wed Dec 13 2023 yanglongkang - 21.3.1-5 - Fix vulnerable regex -- Gitee