How to use name method in testing-library-react-hooks

Best JavaScript code snippet using testing-library-react-hooks

glyphdata.py

Source:glyphdata.py Github

copy

Full Screen

1desired_glyph_data = \2[3 {4 "name": "NULL", 5 "unicode": 0, 6 "contours": [7 08 ]9 }, 10 {11 "name": "uni2001", 12 "unicode": 8193, 13 "contours": [14 015 ]16 }, 17 {18 "name": "enspace", 19 "unicode": 8194, 20 "contours": [21 022 ]23 }, 24 {25 "name": "emspace", 26 "unicode": 8195, 27 "contours": [28 029 ]30 }, 31 {32 "name": "uni2004", 33 "unicode": 8196, 34 "contours": [35 036 ]37 }, 38 {39 "name": "uni2005", 40 "unicode": 8197, 41 "contours": [42 043 ]44 }, 45 {46 "name": "uni2006", 47 "unicode": 8198, 48 "contours": [49 050 ]51 }, 52 {53 "name": "uni2007", 54 "unicode": 8199, 55 "contours": [56 057 ]58 }, 59 {60 "name": "uni2008", 61 "unicode": 8200, 62 "contours": [63 064 ]65 }, 66 {67 "name": "uni2009", 68 "unicode": 8201, 69 "contours": [70 071 ]72 }, 73 {74 "name": "uni200A", 75 "unicode": 8202, 76 "contours": [77 078 ]79 }, 80 {81 "name": "uni200B", 82 "unicode": 8203, 83 "contours": [84 085 ]86 }, 87 {88 "name": "uni200C", 89 "unicode": 8204, 90 "contours": [91 192 ]93 }, 94 {95 "name": "nonmarkingreturn", 96 "unicode": 13, 97 "contours": [98 099 ]100 }, 101 {102 "name": "uni2010", 103 "unicode": 8208, 104 "contours": [105 1106 ]107 }, 108 {109 "name": "uni2011", 110 "unicode": 8209, 111 "contours": [112 1113 ]114 }, 115 {116 "name": "figuredash", 117 "unicode": 8210, 118 "contours": [119 1120 ]121 }, 122 {123 "name": "endash", 124 "unicode": 8211, 125 "contours": [126 1127 ]128 }, 129 {130 "name": "emdash", 131 "unicode": 8212, 132 "contours": [133 1134 ]135 }, 136 {137 "name": "uni2015", 138 "unicode": 8213, 139 "contours": [140 1141 ]142 }, 143 {144 "name": "uni2016", 145 "unicode": 8214, 146 "contours": [147 2148 ]149 }, 150 {151 "name": "underscoredbl", 152 "unicode": 8215, 153 "contours": [154 2155 ]156 }, 157 {158 "name": "quoteleft", 159 "unicode": 8216, 160 "contours": [161 1162 ]163 }, 164 {165 "name": "quoteright", 166 "unicode": 8217, 167 "contours": [168 1169 ]170 }, 171 {172 "name": "quotesinglbase", 173 "unicode": 8218, 174 "contours": [175 1176 ]177 }, 178 {179 "name": "quotereversed", 180 "unicode": 8219, 181 "contours": [182 1183 ]184 }, 185 {186 "name": "quotedblleft", 187 "unicode": 8220, 188 "contours": [189 2190 ]191 }, 192 {193 "name": "quotedblright", 194 "unicode": 8221, 195 "contours": [196 2197 ]198 }, 199 {200 "name": "quotedblbase", 201 "unicode": 8222, 202 "contours": [203 2204 ]205 }, 206 {207 "name": "uni201F", 208 "unicode": 8223, 209 "contours": [210 2211 ]212 }, 213 {214 "name": "space", 215 "unicode": 32, 216 "contours": [217 0218 ]219 }, 220 {221 "name": "daggerdbl", 222 "unicode": 8225, 223 "contours": [224 1, 225 3226 ]227 }, 228 {229 "name": "bullet", 230 "unicode": 8226, 231 "contours": [232 1233 ]234 }, 235 {236 "name": "numbersign", 237 "unicode": 35, 238 "contours": [239 2240 ]241 }, 242 {243 "name": "dollar", 244 "unicode": 36, 245 "contours": [246 1, 247 3248 ]249 }, 250 {251 "name": "twodotenleader", 252 "unicode": 8229, 253 "contours": [254 2255 ]256 }, 257 {258 "name": "ampersand", 259 "unicode": 38, 260 "contours": [261 1, 262 2, 263 3264 ]265 }, 266 {267 "name": "quotesingle", 268 "unicode": 39, 269 "contours": [270 1271 ]272 }, 273 {274 "name": "parenleft", 275 "unicode": 40, 276 "contours": [277 1278 ]279 }, 280 {281 "name": "parenright", 282 "unicode": 41, 283 "contours": [284 1285 ]286 }, 287 {288 "name": "asterisk", 289 "unicode": 42, 290 "contours": [291 1, 292 4293 ]294 }, 295 {296 "name": "plus", 297 "unicode": 43, 298 "contours": [299 1300 ]301 }, 302 {303 "name": "comma", 304 "unicode": 44, 305 "contours": [306 1307 ]308 }, 309 {310 "name": "hyphen", 311 "unicode": 45, 312 "contours": [313 1314 ]315 }, 316 {317 "name": "period", 318 "unicode": 46, 319 "contours": [320 1321 ]322 }, 323 {324 "name": "slash", 325 "unicode": 47, 326 "contours": [327 1328 ]329 }, 330 {331 "name": "zero", 332 "unicode": 48, 333 "contours": [334 2, 335 3336 ]337 }, 338 {339 "name": "one", 340 "unicode": 49, 341 "contours": [342 1343 ]344 }, 345 {346 "name": "two", 347 "unicode": 50, 348 "contours": [349 1350 ]351 }, 352 {353 "name": "three", 354 "unicode": 51, 355 "contours": [356 1357 ]358 }, 359 {360 "name": "four", 361 "unicode": 52, 362 "contours": [363 1, 364 2365 ]366 }, 367 {368 "name": "five", 369 "unicode": 53, 370 "contours": [371 1372 ]373 }, 374 {375 "name": "six", 376 "unicode": 54, 377 "contours": [378 1, 379 2380 ]381 }, 382 {383 "name": "seven", 384 "unicode": 55, 385 "contours": [386 1387 ]388 }, 389 {390 "name": "eight", 391 "unicode": 56, 392 "contours": [393 3394 ]395 }, 396 {397 "name": "guilsinglleft", 398 "unicode": 8249, 399 "contours": [400 1401 ]402 }, 403 {404 "name": "guilsinglright", 405 "unicode": 8250, 406 "contours": [407 1408 ]409 }, 410 {411 "name": "semicolon", 412 "unicode": 59, 413 "contours": [414 2415 ]416 }, 417 {418 "name": "exclamdbl", 419 "unicode": 8252, 420 "contours": [421 4422 ]423 }, 424 {425 "name": "equal", 426 "unicode": 61, 427 "contours": [428 2429 ]430 }, 431 {432 "name": "greater", 433 "unicode": 62, 434 "contours": [435 1436 ]437 }, 438 {439 "name": "question", 440 "unicode": 63, 441 "contours": [442 2443 ]444 }, 445 {446 "name": "at", 447 "unicode": 64, 448 "contours": [449 2450 ]451 }, 452 {453 "name": "A", 454 "unicode": 65, 455 "contours": [456 2457 ]458 }, 459 {460 "name": "B", 461 "unicode": 66, 462 "contours": [463 2, 464 3465 ]466 }, 467 {468 "name": "C", 469 "unicode": 67, 470 "contours": [471 1472 ]473 }, 474 {475 "name": "D", 476 "unicode": 68, 477 "contours": [478 2479 ]480 }, 481 {482 "name": "E", 483 "unicode": 69, 484 "contours": [485 1486 ]487 }, 488 {489 "name": "F", 490 "unicode": 70, 491 "contours": [492 1493 ]494 }, 495 {496 "name": "G", 497 "unicode": 71, 498 "contours": [499 1500 ]501 }, 502 {503 "name": "uni2048", 504 "unicode": 8264, 505 "contours": [506 4507 ]508 }, 509 {510 "name": "uni2049", 511 "unicode": 8265, 512 "contours": [513 4514 ]515 }, 516 {517 "name": "J", 518 "unicode": 74, 519 "contours": [520 1521 ]522 }, 523 {524 "name": "K", 525 "unicode": 75, 526 "contours": [527 1, 528 2529 ]530 }, 531 {532 "name": "L", 533 "unicode": 76, 534 "contours": [535 1536 ]537 }, 538 {539 "name": "M", 540 "unicode": 77, 541 "contours": [542 1543 ]544 }, 545 {546 "name": "N", 547 "unicode": 78, 548 "contours": [549 1550 ]551 }, 552 {553 "name": "O", 554 "unicode": 79, 555 "contours": [556 2557 ]558 }, 559 {560 "name": "P", 561 "unicode": 80, 562 "contours": [563 1, 564 2565 ]566 }, 567 {568 "name": "Q", 569 "unicode": 81, 570 "contours": [571 2572 ]573 }, 574 {575 "name": "R", 576 "unicode": 82, 577 "contours": [578 1, 579 2580 ]581 }, 582 {583 "name": "S", 584 "unicode": 83, 585 "contours": [586 1587 ]588 }, 589 {590 "name": "T", 591 "unicode": 84, 592 "contours": [593 1594 ]595 }, 596 {597 "name": "U", 598 "unicode": 85, 599 "contours": [600 1601 ]602 }, 603 {604 "name": "V", 605 "unicode": 86, 606 "contours": [607 1608 ]609 }, 610 {611 "name": "W", 612 "unicode": 87, 613 "contours": [614 1, 615 2616 ]617 }, 618 {619 "name": "X", 620 "unicode": 88, 621 "contours": [622 1623 ]624 }, 625 {626 "name": "Y", 627 "unicode": 89, 628 "contours": [629 1630 ]631 }, 632 {633 "name": "Z", 634 "unicode": 90, 635 "contours": [636 1637 ]638 }, 639 {640 "name": "bracketleft", 641 "unicode": 91, 642 "contours": [643 1644 ]645 }, 646 {647 "name": "backslash", 648 "unicode": 92, 649 "contours": [650 1651 ]652 }, 653 {654 "name": "bracketright", 655 "unicode": 93, 656 "contours": [657 1658 ]659 }, 660 {661 "name": "asciicircum", 662 "unicode": 94, 663 "contours": [664 1665 ]666 }, 667 {668 "name": "underscore", 669 "unicode": 95, 670 "contours": [671 1672 ]673 }, 674 {675 "name": "grave", 676 "unicode": 96, 677 "contours": [678 1679 ]680 }, 681 {682 "name": "a", 683 "unicode": 97, 684 "contours": [685 2686 ]687 }, 688 {689 "name": "b", 690 "unicode": 98, 691 "contours": [692 2693 ]694 }, 695 {696 "name": "c", 697 "unicode": 99, 698 "contours": [699 1700 ]701 }, 702 {703 "name": "d", 704 "unicode": 100, 705 "contours": [706 2707 ]708 }, 709 {710 "name": "e", 711 "unicode": 101, 712 "contours": [713 2714 ]715 }, 716 {717 "name": "f", 718 "unicode": 102, 719 "contours": [720 1721 ]722 }, 723 {724 "name": "g", 725 "unicode": 103, 726 "contours": [727 2, 728 3729 ]730 }, 731 {732 "name": "h", 733 "unicode": 104, 734 "contours": [735 1736 ]737 }, 738 {739 "name": "i", 740 "unicode": 105, 741 "contours": [742 2743 ]744 }, 745 {746 "name": "j", 747 "unicode": 106, 748 "contours": [749 2750 ]751 }, 752 {753 "name": "k", 754 "unicode": 107, 755 "contours": [756 1, 757 2758 ]759 }, 760 {761 "name": "l", 762 "unicode": 108, 763 "contours": [764 1765 ]766 }, 767 {768 "name": "m", 769 "unicode": 109, 770 "contours": [771 1772 ]773 }, 774 {775 "name": "n", 776 "unicode": 110, 777 "contours": [778 1779 ]780 }, 781 {782 "name": "o", 783 "unicode": 111, 784 "contours": [785 2786 ]787 }, 788 {789 "name": "zero.sups", 790 "unicode": 8304, 791 "contours": [792 2, 793 3794 ]795 }, 796 {797 "name": "q", 798 "unicode": 113, 799 "contours": [800 2801 ]802 }, 803 {804 "name": "r", 805 "unicode": 114, 806 "contours": [807 1808 ]809 }, 810 {811 "name": "s", 812 "unicode": 115, 813 "contours": [814 1815 ]816 }, 817 {818 "name": "t", 819 "unicode": 116, 820 "contours": [821 1822 ]823 }, 824 {825 "name": "u", 826 "unicode": 117, 827 "contours": [828 1829 ]830 }, 831 {832 "name": "v", 833 "unicode": 118, 834 "contours": [835 1836 ]837 }, 838 {839 "name": "seven.sups", 840 "unicode": 8311, 841 "contours": [842 1843 ]844 }, 845 {846 "name": "x", 847 "unicode": 120, 848 "contours": [849 1850 ]851 }, 852 {853 "name": "nine.sups", 854 "unicode": 8313, 855 "contours": [856 2857 ]858 }, 859 {860 "name": "z", 861 "unicode": 122, 862 "contours": [863 1864 ]865 }, 866 {867 "name": "braceleft", 868 "unicode": 123, 869 "contours": [870 1871 ]872 }, 873 {874 "name": "bar", 875 "unicode": 124, 876 "contours": [877 1878 ]879 }, 880 {881 "name": "braceright", 882 "unicode": 125, 883 "contours": [884 1885 ]886 }, 887 {888 "name": "asciitilde", 889 "unicode": 126, 890 "contours": [891 1892 ]893 }, 894 {895 "name": "n.sups", 896 "unicode": 8319, 897 "contours": [898 1899 ]900 }, 901 {902 "name": "zero.subs", 903 "unicode": 8320, 904 "contours": [905 2, 906 3907 ]908 }, 909 {910 "name": "one.subs", 911 "unicode": 8321, 912 "contours": [913 1914 ]915 }, 916 {917 "name": "two.subs", 918 "unicode": 8322, 919 "contours": [920 1921 ]922 }, 923 {924 "name": "three.subs", 925 "unicode": 8323, 926 "contours": [927 1928 ]929 }, 930 {931 "name": "four.subs", 932 "unicode": 8324, 933 "contours": [934 1, 935 2936 ]937 }, 938 {939 "name": "five.subs", 940 "unicode": 8325, 941 "contours": [942 1943 ]944 }, 945 {946 "name": "six.subs", 947 "unicode": 8326, 948 "contours": [949 2950 ]951 }, 952 {953 "name": "seven.subs", 954 "unicode": 8327, 955 "contours": [956 1957 ]958 }, 959 {960 "name": "eight.subs", 961 "unicode": 8328, 962 "contours": [963 3964 ]965 }, 966 {967 "name": "nine.subs", 968 "unicode": 8329, 969 "contours": [970 2971 ]972 }, 973 {974 "name": "uni208A", 975 "unicode": 8330, 976 "contours": [977 1978 ]979 }, 980 {981 "name": "uni208B", 982 "unicode": 8331, 983 "contours": [984 1985 ]986 }, 987 {988 "name": "uni208C", 989 "unicode": 8332, 990 "contours": [991 2992 ]993 }, 994 {995 "name": "parenleft.subs", 996 "unicode": 8333, 997 "contours": [998 1999 ]1000 }, 1001 {1002 "name": "parenright.subs", 1003 "unicode": 8334, 1004 "contours": [1005 11006 ]1007 }, 1008 {1009 "name": "uni00A0", 1010 "unicode": 160, 1011 "contours": [1012 01013 ]1014 }, 1015 {1016 "name": "colonmonetary", 1017 "unicode": 8353, 1018 "contours": [1019 1, 1020 31021 ]1022 }, 1023 {1024 "name": "cent", 1025 "unicode": 162, 1026 "contours": [1027 1, 1028 21029 ]1030 }, 1031 {1032 "name": "sterling", 1033 "unicode": 163, 1034 "contours": [1035 1, 1036 21037 ]1038 }, 1039 {1040 "name": "currency", 1041 "unicode": 164, 1042 "contours": [1043 21044 ]1045 }, 1046 {1047 "name": "yen", 1048 "unicode": 165, 1049 "contours": [1050 1, 1051 21052 ]1053 }, 1054 {1055 "name": "uni20A6", 1056 "unicode": 8358, 1057 "contours": [1058 1, 1059 3, 1060 51061 ]1062 }, 1063 {1064 "name": "peseta", 1065 "unicode": 8359, 1066 "contours": [1067 2, 1068 3, 1069 41070 ]1071 }, 1072 {1073 "name": "dieresis", 1074 "unicode": 168, 1075 "contours": [1076 21077 ]1078 }, 1079 {1080 "name": "uni20A9", 1081 "unicode": 8361, 1082 "contours": [1083 1, 1084 3, 1085 4, 1086 71087 ]1088 }, 1089 {1090 "name": "ordfeminine", 1091 "unicode": 170, 1092 "contours": [1093 2, 1094 31095 ]1096 }, 1097 {1098 "name": "guillemotleft", 1099 "unicode": 171, 1100 "contours": [1101 21102 ]1103 }, 1104 {1105 "name": "Euro", 1106 "unicode": 8364, 1107 "contours": [1108 1, 1109 21110 ]1111 }, 1112 {1113 "name": "uni00AD", 1114 "unicode": 173, 1115 "contours": [1116 11117 ]1118 }, 1119 {1120 "name": "uni20AE", 1121 "unicode": 8366, 1122 "contours": [1123 11124 ]1125 }, 1126 {1127 "name": "macron", 1128 "unicode": 175, 1129 "contours": [1130 11131 ]1132 }, 1133 {1134 "name": "degree", 1135 "unicode": 176, 1136 "contours": [1137 21138 ]1139 }, 1140 {1141 "name": "plusminus", 1142 "unicode": 177, 1143 "contours": [1144 1, 1145 21146 ]1147 }, 1148 {1149 "name": "uni20B2", 1150 "unicode": 8370, 1151 "contours": [1152 1, 1153 2, 1154 31155 ]1156 }, 1157 {1158 "name": "three.sups", 1159 "unicode": 179, 1160 "contours": [1161 11162 ]1163 }, 1164 {1165 "name": "uni20B4", 1166 "unicode": 8372, 1167 "contours": [1168 1, 1169 21170 ]1171 }, 1172 {1173 "name": "uni20B5", 1174 "unicode": 8373, 1175 "contours": [1176 1, 1177 21178 ]1179 }, 1180 {1181 "name": "paragraph", 1182 "unicode": 182, 1183 "contours": [1184 1, 1185 2, 1186 31187 ]1188 }, 1189 {1190 "name": "periodcentered", 1191 "unicode": 183, 1192 "contours": [1193 11194 ]1195 }, 1196 {1197 "name": "uni20B8", 1198 "unicode": 8376, 1199 "contours": [1200 21201 ]1202 }, 1203 {1204 "name": "one.sups", 1205 "unicode": 185, 1206 "contours": [1207 11208 ]1209 }, 1210 {1211 "name": "uni20BA", 1212 "unicode": 8378, 1213 "contours": [1214 11215 ]1216 }, 1217 {1218 "name": "guillemotright", 1219 "unicode": 187, 1220 "contours": [1221 21222 ]1223 }, 1224 {1225 "name": "onequarter", 1226 "unicode": 188, 1227 "contours": [1228 3, 1229 41230 ]1231 }, 1232 {1233 "name": "uni20BD", 1234 "unicode": 8381, 1235 "contours": [1236 21237 ]1238 }, 1239 {1240 "name": "threequarters", 1241 "unicode": 190, 1242 "contours": [1243 3, 1244 41245 ]1246 }, 1247 {1248 "name": "uni20BF", 1249 "unicode": 8383, 1250 "contours": [1251 31252 ]1253 }, 1254 {1255 "name": "Agrave", 1256 "unicode": 192, 1257 "contours": [1258 31259 ]1260 }, 1261 {1262 "name": "dagger", 1263 "unicode": 8224, 1264 "contours": [1265 1, 1266 21267 ]1268 }, 1269 {1270 "name": "Acircumflex", 1271 "unicode": 194, 1272 "contours": [1273 31274 ]1275 }, 1276 {1277 "name": "Atilde", 1278 "unicode": 195, 1279 "contours": [1280 31281 ]1282 }, 1283 {1284 "name": "Adieresis", 1285 "unicode": 196, 1286 "contours": [1287 41288 ]1289 }, 1290 {1291 "name": "Aring", 1292 "unicode": 197, 1293 "contours": [1294 3, 1295 41296 ]1297 }, 1298 {1299 "name": "AE", 1300 "unicode": 198, 1301 "contours": [1302 21303 ]1304 }, 1305 {1306 "name": "Ccedilla", 1307 "unicode": 199, 1308 "contours": [1309 1, 1310 21311 ]1312 }, 1313 {1314 "name": "Egrave", 1315 "unicode": 200, 1316 "contours": [1317 21318 ]1319 }, 1320 {1321 "name": "Eacute", 1322 "unicode": 201, 1323 "contours": [1324 21325 ]1326 }, 1327 {1328 "name": "Ecircumflex", 1329 "unicode": 202, 1330 "contours": [1331 21332 ]1333 }, 1334 {1335 "name": "Edieresis", 1336 "unicode": 203, 1337 "contours": [1338 31339 ]1340 }, 1341 {1342 "name": "Igrave", 1343 "unicode": 204, 1344 "contours": [1345 21346 ]1347 }, 1348 {1349 "name": "Iacute", 1350 "unicode": 205, 1351 "contours": [1352 21353 ]1354 }, 1355 {1356 "name": "Icircumflex", 1357 "unicode": 206, 1358 "contours": [1359 21360 ]1361 }, 1362 {1363 "name": "Idieresis", 1364 "unicode": 207, 1365 "contours": [1366 31367 ]1368 }, 1369 {1370 "name": "Eth", 1371 "unicode": 208, 1372 "contours": [1373 21374 ]1375 }, 1376 {1377 "name": "Ntilde", 1378 "unicode": 209, 1379 "contours": [1380 21381 ]1382 }, 1383 {1384 "name": "Ograve", 1385 "unicode": 210, 1386 "contours": [1387 31388 ]1389 }, 1390 {1391 "name": "Oacute", 1392 "unicode": 211, 1393 "contours": [1394 31395 ]1396 }, 1397 {1398 "name": "Ocircumflex", 1399 "unicode": 212, 1400 "contours": [1401 31402 ]1403 }, 1404 {1405 "name": "Otilde", 1406 "unicode": 213, 1407 "contours": [1408 31409 ]1410 }, 1411 {1412 "name": "Odieresis", 1413 "unicode": 214, 1414 "contours": [1415 41416 ]1417 }, 1418 {1419 "name": "multiply", 1420 "unicode": 215, 1421 "contours": [1422 11423 ]1424 }, 1425 {1426 "name": "Oslash", 1427 "unicode": 216, 1428 "contours": [1429 31430 ]1431 }, 1432 {1433 "name": "Ugrave", 1434 "unicode": 217, 1435 "contours": [1436 21437 ]1438 }, 1439 {1440 "name": "Uacute", 1441 "unicode": 218, 1442 "contours": [1443 21444 ]1445 }, 1446 {1447 "name": "Ucircumflex", 1448 "unicode": 219, 1449 "contours": [1450 21451 ]1452 }, 1453 {1454 "name": "Udieresis", 1455 "unicode": 220, 1456 "contours": [1457 31458 ]1459 }, 1460 {1461 "name": "Yacute", 1462 "unicode": 221, 1463 "contours": [1464 21465 ]1466 }, 1467 {1468 "name": "Thorn", 1469 "unicode": 222, 1470 "contours": [1471 1, 1472 21473 ]1474 }, 1475 {1476 "name": "germandbls", 1477 "unicode": 223, 1478 "contours": [1479 11480 ]1481 }, 1482 {1483 "name": "agrave", 1484 "unicode": 224, 1485 "contours": [1486 31487 ]1488 }, 1489 {1490 "name": "aacute", 1491 "unicode": 225, 1492 "contours": [1493 31494 ]1495 }, 1496 {1497 "name": "acircumflex", 1498 "unicode": 226, 1499 "contours": [1500 31501 ]1502 }, 1503 {1504 "name": "atilde", 1505 "unicode": 227, 1506 "contours": [1507 31508 ]1509 }, 1510 {1511 "name": "adieresis", 1512 "unicode": 228, 1513 "contours": [1514 41515 ]1516 }, 1517 {1518 "name": "aring", 1519 "unicode": 229, 1520 "contours": [1521 41522 ]1523 }, 1524 {1525 "name": "ae", 1526 "unicode": 230, 1527 "contours": [1528 31529 ]1530 }, 1531 {1532 "name": "ccedilla", 1533 "unicode": 231, 1534 "contours": [1535 1, 1536 21537 ]1538 }, 1539 {1540 "name": "egrave", 1541 "unicode": 232, 1542 "contours": [1543 31544 ]1545 }, 1546 {1547 "name": "eacute", 1548 "unicode": 233, 1549 "contours": [1550 31551 ]1552 }, 1553 {1554 "name": "ecircumflex", 1555 "unicode": 234, 1556 "contours": [1557 31558 ]1559 }, 1560 {1561 "name": "edieresis", 1562 "unicode": 235, 1563 "contours": [1564 41565 ]1566 }, 1567 {1568 "name": "igrave", 1569 "unicode": 236, 1570 "contours": [1571 21572 ]1573 }, 1574 {1575 "name": "iacute", 1576 "unicode": 237, 1577 "contours": [1578 21579 ]1580 }, 1581 {1582 "name": "icircumflex", 1583 "unicode": 238, 1584 "contours": [1585 21586 ]1587 }, 1588 {1589 "name": "idieresis", 1590 "unicode": 239, 1591 "contours": [1592 31593 ]1594 }, 1595 {1596 "name": "eth", 1597 "unicode": 240, 1598 "contours": [1599 21600 ]1601 }, 1602 {1603 "name": "ntilde", 1604 "unicode": 241, 1605 "contours": [1606 21607 ]1608 }, 1609 {1610 "name": "ograve", 1611 "unicode": 242, 1612 "contours": [1613 31614 ]1615 }, 1616 {1617 "name": "oacute", 1618 "unicode": 243, 1619 "contours": [1620 31621 ]1622 }, 1623 {1624 "name": "ocircumflex", 1625 "unicode": 244, 1626 "contours": [1627 31628 ]1629 }, 1630 {1631 "name": "otilde", 1632 "unicode": 245, 1633 "contours": [1634 31635 ]1636 }, 1637 {1638 "name": "odieresis", 1639 "unicode": 246, 1640 "contours": [1641 41642 ]1643 }, 1644 {1645 "name": "divide", 1646 "unicode": 247, 1647 "contours": [1648 31649 ]1650 }, 1651 {1652 "name": "oslash", 1653 "unicode": 248, 1654 "contours": [1655 31656 ]1657 }, 1658 {1659 "name": "ugrave", 1660 "unicode": 249, 1661 "contours": [1662 21663 ]1664 }, 1665 {1666 "name": "uacute", 1667 "unicode": 250, 1668 "contours": [1669 21670 ]1671 }, 1672 {1673 "name": "ucircumflex", 1674 "unicode": 251, 1675 "contours": [1676 21677 ]1678 }, 1679 {1680 "name": "udieresis", 1681 "unicode": 252, 1682 "contours": [1683 31684 ]1685 }, 1686 {1687 "name": "yacute", 1688 "unicode": 253, 1689 "contours": [1690 21691 ]1692 }, 1693 {1694 "name": "thorn", 1695 "unicode": 254, 1696 "contours": [1697 21698 ]1699 }, 1700 {1701 "name": "ydieresis", 1702 "unicode": 255, 1703 "contours": [1704 31705 ]1706 }, 1707 {1708 "name": "Amacron", 1709 "unicode": 256, 1710 "contours": [1711 31712 ]1713 }, 1714 {1715 "name": "amacron", 1716 "unicode": 257, 1717 "contours": [1718 31719 ]1720 }, 1721 {1722 "name": "Abreve", 1723 "unicode": 258, 1724 "contours": [1725 31726 ]1727 }, 1728 {1729 "name": "abreve", 1730 "unicode": 259, 1731 "contours": [1732 31733 ]1734 }, 1735 {1736 "name": "Aogonek", 1737 "unicode": 260, 1738 "contours": [1739 2, 1740 31741 ]1742 }, 1743 {1744 "name": "aogonek", 1745 "unicode": 261, 1746 "contours": [1747 21748 ]1749 }, 1750 {1751 "name": "Cacute", 1752 "unicode": 262, 1753 "contours": [1754 21755 ]1756 }, 1757 {1758 "name": "cacute", 1759 "unicode": 263, 1760 "contours": [1761 21762 ]1763 }, 1764 {1765 "name": "Ccircumflex", 1766 "unicode": 264, 1767 "contours": [1768 21769 ]1770 }, 1771 {1772 "name": "ccircumflex", 1773 "unicode": 265, 1774 "contours": [1775 21776 ]1777 }, 1778 {1779 "name": "Cdotaccent", 1780 "unicode": 266, 1781 "contours": [1782 21783 ]1784 }, 1785 {1786 "name": "cdotaccent", 1787 "unicode": 267, 1788 "contours": [1789 21790 ]1791 }, 1792 {1793 "name": "Ccaron", 1794 "unicode": 268, 1795 "contours": [1796 21797 ]1798 }, 1799 {1800 "name": "ccaron", 1801 "unicode": 269, 1802 "contours": [1803 21804 ]1805 }, 1806 {1807 "name": "Dcaron", 1808 "unicode": 270, 1809 "contours": [1810 31811 ]1812 }, 1813 {1814 "name": "dcaron", 1815 "unicode": 271, 1816 "contours": [1817 31818 ]1819 }, 1820 {1821 "name": "Dcroat", 1822 "unicode": 272, 1823 "contours": [1824 21825 ]1826 }, 1827 {1828 "name": "dcroat", 1829 "unicode": 273, 1830 "contours": [1831 21832 ]1833 }, 1834 {1835 "name": "Emacron", 1836 "unicode": 274, 1837 "contours": [1838 21839 ]1840 }, 1841 {1842 "name": "uni2113", 1843 "unicode": 8467, 1844 "contours": [1845 21846 ]1847 }, 1848 {1849 "name": "Ebreve", 1850 "unicode": 276, 1851 "contours": [1852 21853 ]1854 }, 1855 {1856 "name": "ebreve", 1857 "unicode": 277, 1858 "contours": [1859 31860 ]1861 }, 1862 {1863 "name": "uni2116", 1864 "unicode": 8470, 1865 "contours": [1866 3, 1867 41868 ]1869 }, 1870 {1871 "name": "edotaccent", 1872 "unicode": 279, 1873 "contours": [1874 31875 ]1876 }, 1877 {1878 "name": "Eogonek", 1879 "unicode": 280, 1880 "contours": [1881 1, 1882 21883 ]1884 }, 1885 {1886 "name": "eogonek", 1887 "unicode": 281, 1888 "contours": [1889 21890 ]1891 }, 1892 {1893 "name": "Ecaron", 1894 "unicode": 282, 1895 "contours": [1896 21897 ]1898 }, 1899 {1900 "name": "ecaron", 1901 "unicode": 283, 1902 "contours": [1903 31904 ]1905 }, 1906 {1907 "name": "Gcircumflex", 1908 "unicode": 284, 1909 "contours": [1910 21911 ]1912 }, 1913 {1914 "name": "gcircumflex", 1915 "unicode": 285, 1916 "contours": [1917 3, 1918 41919 ]1920 }, 1921 {1922 "name": "Gbreve", 1923 "unicode": 286, 1924 "contours": [1925 21926 ]1927 }, 1928 {1929 "name": "gbreve", 1930 "unicode": 287, 1931 "contours": [1932 3, 1933 41934 ]1935 }, 1936 {1937 "name": "uni2120", 1938 "unicode": 8480, 1939 "contours": [1940 21941 ]1942 }, 1943 {1944 "name": "gdotaccent", 1945 "unicode": 289, 1946 "contours": [1947 3, 1948 41949 ]1950 }, 1951 {1952 "name": "uni0122", 1953 "unicode": 290, 1954 "contours": [1955 21956 ]1957 }, 1958 {1959 "name": "uni0123", 1960 "unicode": 291, 1961 "contours": [1962 3, 1963 41964 ]1965 }, 1966 {1967 "name": "Hcircumflex", 1968 "unicode": 292, 1969 "contours": [1970 21971 ]1972 }, 1973 {1974 "name": "hcircumflex", 1975 "unicode": 293, 1976 "contours": [1977 21978 ]1979 }, 1980 {1981 "name": "uni2126", 1982 "unicode": 8486, 1983 "contours": [1984 11985 ]1986 }, 1987 {1988 "name": "hbar", 1989 "unicode": 295, 1990 "contours": [1991 11992 ]1993 }, 1994 {1995 "name": "Itilde", 1996 "unicode": 296, 1997 "contours": [1998 21999 ]2000 }, 2001 {2002 "name": "itilde", 2003 "unicode": 297, 2004 "contours": [2005 22006 ]2007 }, 2008 {2009 "name": "Imacron", 2010 "unicode": 298, 2011 "contours": [2012 22013 ]2014 }, 2015 {2016 "name": "imacron", 2017 "unicode": 299, 2018 "contours": [2019 22020 ]2021 }, 2022 {2023 "name": "Ibreve", 2024 "unicode": 300, 2025 "contours": [2026 22027 ]2028 }, 2029 {2030 "name": "uni2032", 2031 "unicode": 8242, 2032 "contours": [2033 12034 ]2035 }, 2036 {2037 "name": "estimated", 2038 "unicode": 8494, 2039 "contours": [2040 22041 ]2042 }, 2043 {2044 "name": "iogonek", 2045 "unicode": 303, 2046 "contours": [2047 2, 2048 32049 ]2050 }, 2051 {2052 "name": "Idotaccent", 2053 "unicode": 304, 2054 "contours": [2055 22056 ]2057 }, 2058 {2059 "name": "dotlessi", 2060 "unicode": 305, 2061 "contours": [2062 12063 ]2064 }, 2065 {2066 "name": "IJ", 2067 "unicode": 306, 2068 "contours": [2069 1, 2070 22071 ]2072 }, 2073 {2074 "name": "uni2033", 2075 "unicode": 8243, 2076 "contours": [2077 22078 ]2079 }, 2080 {2081 "name": "Jcircumflex", 2082 "unicode": 308, 2083 "contours": [2084 22085 ]2086 }, 2087 {2088 "name": "jcircumflex", 2089 "unicode": 309, 2090 "contours": [2091 22092 ]2093 }, 2094 {2095 "name": "uni0136", 2096 "unicode": 310, 2097 "contours": [2098 2, 2099 32100 ]2101 }, 2102 {2103 "name": "uni0137", 2104 "unicode": 311, 2105 "contours": [2106 2, 2107 32108 ]2109 }, 2110 {2111 "name": "kgreenlandic", 2112 "unicode": 312, 2113 "contours": [2114 1, 2115 22116 ]2117 }, 2118 {2119 "name": "Lacute", 2120 "unicode": 313, 2121 "contours": [2122 22123 ]2124 }, 2125 {2126 "name": "lacute", 2127 "unicode": 314, 2128 "contours": [2129 22130 ]2131 }, 2132 {2133 "name": "uni013B", 2134 "unicode": 315, 2135 "contours": [2136 22137 ]2138 }, 2139 {2140 "name": "uni013C", 2141 "unicode": 316, 2142 "contours": [2143 22144 ]2145 }, 2146 {2147 "name": "Lcaron", 2148 "unicode": 317, 2149 "contours": [2150 22151 ]2152 }, 2153 {2154 "name": "lcaron", 2155 "unicode": 318, 2156 "contours": [2157 22158 ]2159 }, 2160 {2161 "name": "Ldot", 2162 "unicode": 319, 2163 "contours": [2164 22165 ]2166 }, 2167 {2168 "name": "ldot", 2169 "unicode": 320, 2170 "contours": [2171 22172 ]2173 }, 2174 {2175 "name": "Lslash", 2176 "unicode": 321, 2177 "contours": [2178 12179 ]2180 }, 2181 {2182 "name": "lslash", 2183 "unicode": 322, 2184 "contours": [2185 12186 ]2187 }, 2188 {2189 "name": "Nacute", 2190 "unicode": 323, 2191 "contours": [2192 22193 ]2194 }, 2195 {2196 "name": "nacute", 2197 "unicode": 324, 2198 "contours": [2199 22200 ]2201 }, 2202 {2203 "name": "uni0145", 2204 "unicode": 325, 2205 "contours": [2206 22207 ]2208 }, 2209 {2210 "name": "uni0146", 2211 "unicode": 326, 2212 "contours": [2213 22214 ]2215 }, 2216 {2217 "name": "Ncaron", 2218 "unicode": 327, 2219 "contours": [2220 22221 ]2222 }, 2223 {2224 "name": "ncaron", 2225 "unicode": 328, 2226 "contours": [2227 22228 ]2229 }, 2230 {2231 "name": "napostrophe", 2232 "unicode": 329, 2233 "contours": [2234 22235 ]2236 }, 2237 {2238 "name": "Eng", 2239 "unicode": 330, 2240 "contours": [2241 12242 ]2243 }, 2244 {2245 "name": "eng", 2246 "unicode": 331, 2247 "contours": [2248 12249 ]2250 }, 2251 {2252 "name": "Omacron", 2253 "unicode": 332, 2254 "contours": [2255 32256 ]2257 }, 2258 {2259 "name": "omacron", 2260 "unicode": 333, 2261 "contours": [2262 32263 ]2264 }, 2265 {2266 "name": "uni014E", 2267 "unicode": 334, 2268 "contours": [2269 32270 ]2271 }, 2272 {2273 "name": "uni014F", 2274 "unicode": 335, 2275 "contours": [2276 32277 ]2278 }, 2279 {2280 "name": "Ohungarumlaut", 2281 "unicode": 336, 2282 "contours": [2283 42284 ]2285 }, 2286 {2287 "name": "ohungarumlaut", 2288 "unicode": 337, 2289 "contours": [2290 42291 ]2292 }, 2293 {2294 "name": "OE", 2295 "unicode": 338, 2296 "contours": [2297 22298 ]2299 }, 2300 {2301 "name": "onethird", 2302 "unicode": 8531, 2303 "contours": [2304 32305 ]2306 }, 2307 {2308 "name": "twothirds", 2309 "unicode": 8532, 2310 "contours": [2311 1, 2312 32313 ]2314 }, 2315 {2316 "name": "racute", 2317 "unicode": 341, 2318 "contours": [2319 22320 ]2321 }, 2322 {2323 "name": "uni0156", 2324 "unicode": 342, 2325 "contours": [2326 32327 ]2328 }, 2329 {2330 "name": "uni0157", 2331 "unicode": 343, 2332 "contours": [2333 22334 ]2335 }, 2336 {2337 "name": "Rcaron", 2338 "unicode": 344, 2339 "contours": [2340 32341 ]2342 }, 2343 {2344 "name": "rcaron", 2345 "unicode": 345, 2346 "contours": [2347 22348 ]2349 }, 2350 {2351 "name": "Sacute", 2352 "unicode": 346, 2353 "contours": [2354 22355 ]2356 }, 2357 {2358 "name": "oneeighth", 2359 "unicode": 8539, 2360 "contours": [2361 52362 ]2363 }, 2364 {2365 "name": "Scircumflex", 2366 "unicode": 348, 2367 "contours": [2368 22369 ]2370 }, 2371 {2372 "name": "scircumflex", 2373 "unicode": 349, 2374 "contours": [2375 22376 ]2377 }, 2378 {2379 "name": "uni015E", 2380 "unicode": 350, 2381 "contours": [2382 1, 2383 22384 ]2385 }, 2386 {2387 "name": "uni015F", 2388 "unicode": 351, 2389 "contours": [2390 1, 2391 22392 ]2393 }, 2394 {2395 "name": "Scaron", 2396 "unicode": 352, 2397 "contours": [2398 22399 ]2400 }, 2401 {2402 "name": "scaron", 2403 "unicode": 353, 2404 "contours": [2405 22406 ]2407 }, 2408 {2409 "name": "uni0162", 2410 "unicode": 354, 2411 "contours": [2412 1, 2413 22414 ]2415 }, 2416 {2417 "name": "uni0163", 2418 "unicode": 355, 2419 "contours": [2420 1, 2421 22422 ]2423 }, 2424 {2425 "name": "Tcaron", 2426 "unicode": 356, 2427 "contours": [2428 22429 ]2430 }, 2431 {2432 "name": "tcaron", 2433 "unicode": 357, 2434 "contours": [2435 22436 ]2437 }, 2438 {2439 "name": "Tbar", 2440 "unicode": 358, 2441 "contours": [2442 12443 ]2444 }, 2445 {2446 "name": "tbar", 2447 "unicode": 359, 2448 "contours": [2449 12450 ]2451 }, 2452 {2453 "name": "Utilde", 2454 "unicode": 360, 2455 "contours": [2456 22457 ]2458 }, 2459 {2460 "name": "less", 2461 "unicode": 60, 2462 "contours": [2463 12464 ]2465 }, 2466 {2467 "name": "Umacron", 2468 "unicode": 362, 2469 "contours": [2470 22471 ]2472 }, 2473 {2474 "name": "umacron", 2475 "unicode": 363, 2476 "contours": [2477 22478 ]2479 }, 2480 {2481 "name": "Ubreve", 2482 "unicode": 364, 2483 "contours": [2484 22485 ]2486 }, 2487 {2488 "name": "ubreve", 2489 "unicode": 365, 2490 "contours": [2491 22492 ]2493 }, 2494 {2495 "name": "Uring", 2496 "unicode": 366, 2497 "contours": [2498 32499 ]2500 }, 2501 {2502 "name": "uring", 2503 "unicode": 367, 2504 "contours": [2505 32506 ]2507 }, 2508 {2509 "name": "Uhungarumlaut", 2510 "unicode": 368, 2511 "contours": [2512 32513 ]2514 }, 2515 {2516 "name": "uhungarumlaut", 2517 "unicode": 369, 2518 "contours": [2519 32520 ]2521 }, 2522 {2523 "name": "Uogonek", 2524 "unicode": 370, 2525 "contours": [2526 12527 ]2528 }, 2529 {2530 "name": "uogonek", 2531 "unicode": 371, 2532 "contours": [2533 12534 ]2535 }, 2536 {2537 "name": "Wcircumflex", 2538 "unicode": 372, 2539 "contours": [2540 22541 ]2542 }, 2543 {2544 "name": "wcircumflex", 2545 "unicode": 373, 2546 "contours": [2547 22548 ]2549 }, 2550 {2551 "name": "Ycircumflex", 2552 "unicode": 374, 2553 "contours": [2554 22555 ]2556 }, 2557 {2558 "name": "ycircumflex", 2559 "unicode": 375, 2560 "contours": [2561 22562 ]2563 }, 2564 {2565 "name": "Ydieresis", 2566 "unicode": 376, 2567 "contours": [2568 32569 ]2570 }, 2571 {2572 "name": "Zacute", 2573 "unicode": 377, 2574 "contours": [2575 22576 ]2577 }, 2578 {2579 "name": "zacute", 2580 "unicode": 378, 2581 "contours": [2582 22583 ]2584 }, 2585 {2586 "name": "Zdotaccent", 2587 "unicode": 379, 2588 "contours": [2589 22590 ]2591 }, 2592 {2593 "name": "zdotaccent", 2594 "unicode": 380, 2595 "contours": [2596 22597 ]2598 }, 2599 {2600 "name": "Zcaron", 2601 "unicode": 381, 2602 "contours": [2603 22604 ]2605 }, 2606 {2607 "name": "zcaron", 2608 "unicode": 382, 2609 "contours": [2610 22611 ]2612 }, 2613 {2614 "name": "longs", 2615 "unicode": 383, 2616 "contours": [2617 12618 ]2619 }, 2620 {2621 "name": "uni0180", 2622 "unicode": 384, 2623 "contours": [2624 22625 ]2626 }, 2627 {2628 "name": "uni0181", 2629 "unicode": 385, 2630 "contours": [2631 32632 ]2633 }, 2634 {2635 "name": "uni0182", 2636 "unicode": 386, 2637 "contours": [2638 22639 ]2640 }, 2641 {2642 "name": "uni0183", 2643 "unicode": 387, 2644 "contours": [2645 22646 ]2647 }, 2648 {2649 "name": "uni0184", 2650 "unicode": 388, 2651 "contours": [2652 22653 ]2654 }, 2655 {2656 "name": "uni0185", 2657 "unicode": 389, 2658 "contours": [2659 22660 ]2661 }, 2662 {2663 "name": "uni0186", 2664 "unicode": 390, 2665 "contours": [2666 12667 ]2668 }, 2669 {2670 "name": "uni0187", 2671 "unicode": 391, 2672 "contours": [2673 12674 ]2675 }, 2676 {2677 "name": "uni0188", 2678 "unicode": 392, 2679 "contours": [2680 12681 ]2682 }, 2683 {2684 "name": "uni0189", 2685 "unicode": 393, 2686 "contours": [2687 22688 ]2689 }, 2690 {2691 "name": "uni018A", 2692 "unicode": 394, 2693 "contours": [2694 22695 ]2696 }, 2697 {2698 "name": "uni018B", 2699 "unicode": 395, 2700 "contours": [2701 22702 ]2703 }, 2704 {2705 "name": "uni018C", 2706 "unicode": 396, 2707 "contours": [2708 22709 ]2710 }, 2711 {2712 "name": "uni018D", 2713 "unicode": 397, 2714 "contours": [2715 22716 ]2717 }, 2718 {2719 "name": "uni018E", 2720 "unicode": 398, 2721 "contours": [2722 12723 ]2724 }, 2725 {2726 "name": "uni018F", 2727 "unicode": 399, 2728 "contours": [2729 22730 ]2731 }, 2732 {2733 "name": "uni2190", 2734 "unicode": 8592, 2735 "contours": [2736 12737 ]2738 }, 2739 {2740 "name": "arrowup", 2741 "unicode": 8593, 2742 "contours": [2743 12744 ]2745 }, 2746 {2747 "name": "uni2192", 2748 "unicode": 8594, 2749 "contours": [2750 12751 ]2752 }, 2753 {2754 "name": "arrowdown", 2755 "unicode": 8595, 2756 "contours": [2757 12758 ]2759 }, 2760 {2761 "name": "arrowboth", 2762 "unicode": 8596, 2763 "contours": [2764 12765 ]2766 }, 2767 {2768 "name": "arrowupdn", 2769 "unicode": 8597, 2770 "contours": [2771 12772 ]2773 }, 2774 {2775 "name": "uni2196", 2776 "unicode": 8598, 2777 "contours": [2778 12779 ]2780 }, 2781 {2782 "name": "uni2197", 2783 "unicode": 8599, 2784 "contours": [2785 12786 ]2787 }, 2788 {2789 "name": "uni2198", 2790 "unicode": 8600, 2791 "contours": [2792 12793 ]2794 }, 2795 {2796 "name": "uni0199", 2797 "unicode": 409, 2798 "contours": [2799 12800 ]2801 }, 2802 {2803 "name": "uni019A", 2804 "unicode": 410, 2805 "contours": [2806 12807 ]2808 }, 2809 {2810 "name": "uni019B", 2811 "unicode": 411, 2812 "contours": [2813 12814 ]2815 }, 2816 {2817 "name": "uni019C", 2818 "unicode": 412, 2819 "contours": [2820 12821 ]2822 }, 2823 {2824 "name": "uni019D", 2825 "unicode": 413, 2826 "contours": [2827 12828 ]2829 }, 2830 {2831 "name": "uni019E", 2832 "unicode": 414, 2833 "contours": [2834 12835 ]2836 }, 2837 {2838 "name": "uni019F", 2839 "unicode": 415, 2840 "contours": [2841 32842 ]2843 }, 2844 {2845 "name": "Ohorn", 2846 "unicode": 416, 2847 "contours": [2848 2, 2849 32850 ]2851 }, 2852 {2853 "name": "ohorn", 2854 "unicode": 417, 2855 "contours": [2856 22857 ]2858 }, 2859 {2860 "name": "uni01A2", 2861 "unicode": 418, 2862 "contours": [2863 22864 ]2865 }, 2866 {2867 "name": "uni01A3", 2868 "unicode": 419, 2869 "contours": [2870 22871 ]2872 }, 2873 {2874 "name": "uni01A4", 2875 "unicode": 420, 2876 "contours": [2877 22878 ]2879 }, 2880 {2881 "name": "uni01A5", 2882 "unicode": 421, 2883 "contours": [2884 22885 ]2886 }, 2887 {2888 "name": "uni01A6", 2889 "unicode": 422, 2890 "contours": [2891 22892 ]2893 }, 2894 {2895 "name": "uni01A7", 2896 "unicode": 423, 2897 "contours": [2898 12899 ]2900 }, 2901 {2902 "name": "uni01A8", 2903 "unicode": 424, 2904 "contours": [2905 12906 ]2907 }, 2908 {2909 "name": "uni01A9", 2910 "unicode": 425, 2911 "contours": [2912 12913 ]2914 }, 2915 {2916 "name": "uni01AA", 2917 "unicode": 426, 2918 "contours": [2919 22920 ]2921 }, 2922 {2923 "name": "uni2047", 2924 "unicode": 8263, 2925 "contours": [2926 42927 ]2928 }, 2929 {2930 "name": "uni01AC", 2931 "unicode": 428, 2932 "contours": [2933 12934 ]2935 }, 2936 {2937 "name": "uni01AD", 2938 "unicode": 429, 2939 "contours": [2940 12941 ]2942 }, 2943 {2944 "name": "uni01AE", 2945 "unicode": 430, 2946 "contours": [2947 12948 ]2949 }, 2950 {2951 "name": "Uhorn", 2952 "unicode": 431, 2953 "contours": [2954 12955 ]2956 }, 2957 {2958 "name": "uhorn", 2959 "unicode": 432, 2960 "contours": [2961 12962 ]2963 }, 2964 {2965 "name": "H", 2966 "unicode": 72, 2967 "contours": [2968 12969 ]2970 }, 2971 {2972 "name": "uni01B2", 2973 "unicode": 434, 2974 "contours": [2975 12976 ]2977 }, 2978 {2979 "name": "uni01B3", 2980 "unicode": 435, 2981 "contours": [2982 12983 ]2984 }, 2985 {2986 "name": "uni01B4", 2987 "unicode": 436, 2988 "contours": [2989 12990 ]2991 }, 2992 {2993 "name": "uni01B5", 2994 "unicode": 437, 2995 "contours": [2996 12997 ]2998 }, 2999 {3000 "name": "uni01B6", 3001 "unicode": 438, 3002 "contours": [3003 13004 ]3005 }, 3006 {3007 "name": "uni01B7", 3008 "unicode": 439, 3009 "contours": [3010 13011 ]3012 }, 3013 {3014 "name": "uni01B8", 3015 "unicode": 440, 3016 "contours": [3017 13018 ]3019 }, 3020 {3021 "name": "uni01B9", 3022 "unicode": 441, 3023 "contours": [3024 13025 ]3026 }, 3027 {3028 "name": "uni01BA", 3029 "unicode": 442, 3030 "contours": [3031 13032 ]3033 }, 3034 {3035 "name": "uni01BB", 3036 "unicode": 443, 3037 "contours": [3038 13039 ]3040 }, 3041 {3042 "name": "uni01BC", 3043 "unicode": 444, 3044 "contours": [3045 13046 ]3047 }, 3048 {3049 "name": "uni01BD", 3050 "unicode": 445, 3051 "contours": [3052 13053 ]3054 }, 3055 {3056 "name": "uni01BE", 3057 "unicode": 446, 3058 "contours": [3059 13060 ]3061 }, 3062 {3063 "name": "uni01BF", 3064 "unicode": 447, 3065 "contours": [3066 23067 ]3068 }, 3069 {3070 "name": "uni01C0", 3071 "unicode": 448, 3072 "contours": [3073 13074 ]3075 }, 3076 {3077 "name": "uni01C1", 3078 "unicode": 449, 3079 "contours": [3080 23081 ]3082 }, 3083 {3084 "name": "uni01C2", 3085 "unicode": 450, 3086 "contours": [3087 13088 ]3089 }, 3090 {3091 "name": "uni01C3", 3092 "unicode": 451, 3093 "contours": [3094 23095 ]3096 }, 3097 {3098 "name": "uni01C4", 3099 "unicode": 452, 3100 "contours": [3101 43102 ]3103 }, 3104 {3105 "name": "uni01C5", 3106 "unicode": 453, 3107 "contours": [3108 43109 ]3110 }, 3111 {3112 "name": "uni01C6", 3113 "unicode": 454, 3114 "contours": [3115 43116 ]3117 }, 3118 {3119 "name": "uni01C7", 3120 "unicode": 455, 3121 "contours": [3122 23123 ]3124 }, 3125 {3126 "name": "uni01C8", 3127 "unicode": 456, 3128 "contours": [3129 33130 ]3131 }, 3132 {3133 "name": "uni01C9", 3134 "unicode": 457, 3135 "contours": [3136 33137 ]3138 }, 3139 {3140 "name": "uni01CA", 3141 "unicode": 458, 3142 "contours": [3143 23144 ]3145 }, 3146 {3147 "name": "uni01CB", 3148 "unicode": 459, 3149 "contours": [3150 33151 ]3152 }, 3153 {3154 "name": "uni01CC", 3155 "unicode": 460, 3156 "contours": [3157 33158 ]3159 }, 3160 {3161 "name": "uni01CD", 3162 "unicode": 461, 3163 "contours": [3164 33165 ]3166 }, 3167 {3168 "name": "uni01CE", 3169 "unicode": 462, 3170 "contours": [3171 33172 ]3173 }, 3174 {3175 "name": "uni01CF", 3176 "unicode": 463, 3177 "contours": [3178 23179 ]3180 }, 3181 {3182 "name": "uni01D0", 3183 "unicode": 464, 3184 "contours": [3185 23186 ]3187 }, 3188 {3189 "name": "uni01D1", 3190 "unicode": 465, 3191 "contours": [3192 33193 ]3194 }, 3195 {3196 "name": "uni01D2", 3197 "unicode": 466, 3198 "contours": [3199 33200 ]3201 }, 3202 {3203 "name": "uni01D3", 3204 "unicode": 467, 3205 "contours": [3206 23207 ]3208 }, 3209 {3210 "name": "uni01D4", 3211 "unicode": 468, 3212 "contours": [3213 23214 ]3215 }, 3216 {3217 "name": "uni01D5", 3218 "unicode": 469, 3219 "contours": [3220 43221 ]3222 }, 3223 {3224 "name": "uni01D6", 3225 "unicode": 470, 3226 "contours": [3227 43228 ]3229 }, 3230 {3231 "name": "uni01D7", 3232 "unicode": 471, 3233 "contours": [3234 43235 ]3236 }, 3237 {3238 "name": "uni01D8", 3239 "unicode": 472, 3240 "contours": [3241 43242 ]3243 }, 3244 {3245 "name": "uni01D9", 3246 "unicode": 473, 3247 "contours": [3248 43249 ]3250 }, 3251 {3252 "name": "uni01DA", 3253 "unicode": 474, 3254 "contours": [3255 43256 ]3257 }, 3258 {3259 "name": "uni01DB", 3260 "unicode": 475, 3261 "contours": [3262 43263 ]3264 }, 3265 {3266 "name": "uni01DC", 3267 "unicode": 476, 3268 "contours": [3269 43270 ]3271 }, 3272 {3273 "name": "uni01DD", 3274 "unicode": 477, 3275 "contours": [3276 23277 ]3278 }, 3279 {3280 "name": "uni01DE", 3281 "unicode": 478, 3282 "contours": [3283 53284 ]3285 }, 3286 {3287 "name": "uni01DF", 3288 "unicode": 479, 3289 "contours": [3290 53291 ]3292 }, 3293 {3294 "name": "uni01E0", 3295 "unicode": 480, 3296 "contours": [3297 43298 ]3299 }, 3300 {3301 "name": "uni01E1", 3302 "unicode": 481, 3303 "contours": [3304 43305 ]3306 }, 3307 {3308 "name": "uni01E2", 3309 "unicode": 482, 3310 "contours": [3311 33312 ]3313 }, 3314 {3315 "name": "uni01E3", 3316 "unicode": 483, 3317 "contours": [3318 43319 ]3320 }, 3321 {3322 "name": "uni01E4", 3323 "unicode": 484, 3324 "contours": [3325 13326 ]3327 }, 3328 {3329 "name": "uni01E5", 3330 "unicode": 485, 3331 "contours": [3332 23333 ]3334 }, 3335 {3336 "name": "Gcaron", 3337 "unicode": 486, 3338 "contours": [3339 23340 ]3341 }, 3342 {3343 "name": "gcaron", 3344 "unicode": 487, 3345 "contours": [3346 3, 3347 43348 ]3349 }, 3350 {3351 "name": "uni01E8", 3352 "unicode": 488, 3353 "contours": [3354 23355 ]3356 }, 3357 {3358 "name": "uni01E9", 3359 "unicode": 489, 3360 "contours": [3361 23362 ]3363 }, 3364 {3365 "name": "Oogonek", 3366 "unicode": 490, 3367 "contours": [3368 23369 ]3370 }, 3371 {3372 "name": "oogonek", 3373 "unicode": 491, 3374 "contours": [3375 23376 ]3377 }, 3378 {3379 "name": "uni01EC", 3380 "unicode": 492, 3381 "contours": [3382 33383 ]3384 }, 3385 {3386 "name": "uni01ED", 3387 "unicode": 493, 3388 "contours": [3389 33390 ]3391 }, 3392 {3393 "name": "uni01EE", 3394 "unicode": 494, 3395 "contours": [3396 23397 ]3398 }, 3399 {3400 "name": "uni01EF", 3401 "unicode": 495, 3402 "contours": [3403 23404 ]3405 }, 3406 {3407 "name": "uni01F0", 3408 "unicode": 496, 3409 "contours": [3410 23411 ]3412 }, 3413 {3414 "name": "uni01F1", 3415 "unicode": 497, 3416 "contours": [3417 33418 ]3419 }, 3420 {3421 "name": "uni01F2", 3422 "unicode": 498, 3423 "contours": [3424 33425 ]3426 }, 3427 {3428 "name": "uni01F3", 3429 "unicode": 499, 3430 "contours": [3431 33432 ]3433 }, 3434 {3435 "name": "Gacute", 3436 "unicode": 500, 3437 "contours": [3438 23439 ]3440 }, 3441 {3442 "name": "gacute", 3443 "unicode": 501, 3444 "contours": [3445 33446 ]3447 }, 3448 {3449 "name": "uni01F6", 3450 "unicode": 502, 3451 "contours": [3452 13453 ]3454 }, 3455 {3456 "name": "uni01F7", 3457 "unicode": 503, 3458 "contours": [3459 23460 ]3461 }, 3462 {3463 "name": "uni01F8", 3464 "unicode": 504, 3465 "contours": [3466 23467 ]3468 }, 3469 {3470 "name": "uni01F9", 3471 "unicode": 505, 3472 "contours": [3473 23474 ]3475 }, 3476 {3477 "name": "Aringacute", 3478 "unicode": 506, 3479 "contours": [3480 3, 3481 4, 3482 53483 ]3484 }, 3485 {3486 "name": "aringacute", 3487 "unicode": 507, 3488 "contours": [3489 4, 3490 53491 ]3492 }, 3493 {3494 "name": "AEacute", 3495 "unicode": 508, 3496 "contours": [3497 33498 ]3499 }, 3500 {3501 "name": "aeacute", 3502 "unicode": 509, 3503 "contours": [3504 43505 ]3506 }, 3507 {3508 "name": "Oslashacute", 3509 "unicode": 510, 3510 "contours": [3511 43512 ]3513 }, 3514 {3515 "name": "oslashacute", 3516 "unicode": 511, 3517 "contours": [3518 43519 ]3520 }, 3521 {3522 "name": "Adblgrave", 3523 "unicode": 512, 3524 "contours": [3525 43526 ]3527 }, 3528 {3529 "name": "adblgrave", 3530 "unicode": 513, 3531 "contours": [3532 43533 ]3534 }, 3535 {3536 "name": "partialdiff", 3537 "unicode": 8706, 3538 "contours": [3539 23540 ]3541 }, 3542 {3543 "name": "ainvertedbreve", 3544 "unicode": 515, 3545 "contours": [3546 33547 ]3548 }, 3549 {3550 "name": "Edblgrave", 3551 "unicode": 516, 3552 "contours": [3553 33554 ]3555 }, 3556 {3557 "name": "edblgrave", 3558 "unicode": 517, 3559 "contours": [3560 43561 ]3562 }, 3563 {3564 "name": "uni2206", 3565 "unicode": 8710, 3566 "contours": [3567 23568 ]3569 }, 3570 {3571 "name": "einvertedbreve", 3572 "unicode": 519, 3573 "contours": [3574 33575 ]3576 }, 3577 {3578 "name": "Idblgrave", 3579 "unicode": 520, 3580 "contours": [3581 33582 ]3583 }, 3584 {3585 "name": "idblgrave", 3586 "unicode": 521, 3587 "contours": [3588 33589 ]3590 }, 3591 {3592 "name": "Iinvertedbreve", 3593 "unicode": 522, 3594 "contours": [3595 23596 ]3597 }, 3598 {3599 "name": "iinvertedbreve", 3600 "unicode": 523, 3601 "contours": [3602 23603 ]3604 }, 3605 {3606 "name": "Odblgrave", 3607 "unicode": 524, 3608 "contours": [3609 43610 ]3611 }, 3612 {3613 "name": "odblgrave", 3614 "unicode": 525, 3615 "contours": [3616 43617 ]3618 }, 3619 {3620 "name": "Oinvertedbreve", 3621 "unicode": 526, 3622 "contours": [3623 33624 ]3625 }, 3626 {3627 "name": "product", 3628 "unicode": 8719, 3629 "contours": [3630 13631 ]3632 }, 3633 {3634 "name": "Rdblgrave", 3635 "unicode": 528, 3636 "contours": [3637 43638 ]3639 }, 3640 {3641 "name": "summation", 3642 "unicode": 8721, 3643 "contours": [3644 13645 ]3646 }, 3647 {3648 "name": "minus", 3649 "unicode": 8722, 3650 "contours": [3651 13652 ]3653 }, 3654 {3655 "name": "rinvertedbreve", 3656 "unicode": 531, 3657 "contours": [3658 23659 ]3660 }, 3661 {3662 "name": "Udblgrave", 3663 "unicode": 532, 3664 "contours": [3665 33666 ]3667 }, 3668 {3669 "name": "uni2215", 3670 "unicode": 8725, 3671 "contours": [3672 13673 ]3674 }, 3675 {3676 "name": "Uinvertedbreve", 3677 "unicode": 534, 3678 "contours": [3679 23680 ]3681 }, 3682 {3683 "name": "uinvertedbreve", 3684 "unicode": 535, 3685 "contours": [3686 23687 ]3688 }, 3689 {3690 "name": "uni0218", 3691 "unicode": 536, 3692 "contours": [3693 23694 ]3695 }, 3696 {3697 "name": "uni2219", 3698 "unicode": 8729, 3699 "contours": [3700 13701 ]3702 }, 3703 {3704 "name": "uni021A", 3705 "unicode": 538, 3706 "contours": [3707 23708 ]3709 }, 3710 {3711 "name": "uni021B", 3712 "unicode": 539, 3713 "contours": [3714 23715 ]3716 }, 3717 {3718 "name": "uni021C", 3719 "unicode": 540, 3720 "contours": [3721 13722 ]3723 }, 3724 {3725 "name": "uni021D", 3726 "unicode": 541, 3727 "contours": [3728 13729 ]3730 }, 3731 {3732 "name": "infinity", 3733 "unicode": 8734, 3734 "contours": [3735 33736 ]3737 }, 3738 {3739 "name": "uni021F", 3740 "unicode": 543, 3741 "contours": [3742 23743 ]3744 }, 3745 {3746 "name": "uni0220", 3747 "unicode": 544, 3748 "contours": [3749 13750 ]3751 }, 3752 {3753 "name": "uni0221", 3754 "unicode": 545, 3755 "contours": [3756 33757 ]3758 }, 3759 {3760 "name": "uni0222", 3761 "unicode": 546, 3762 "contours": [3763 23764 ]3765 }, 3766 {3767 "name": "uni0223", 3768 "unicode": 547, 3769 "contours": [3770 23771 ]3772 }, 3773 {3774 "name": "uni0224", 3775 "unicode": 548, 3776 "contours": [3777 13778 ]3779 }, 3780 {3781 "name": "uni0225", 3782 "unicode": 549, 3783 "contours": [3784 13785 ]3786 }, 3787 {3788 "name": "uni0226", 3789 "unicode": 550, 3790 "contours": [3791 33792 ]3793 }, 3794 {3795 "name": "uni0227", 3796 "unicode": 551, 3797 "contours": [3798 33799 ]3800 }, 3801 {3802 "name": "uni0228", 3803 "unicode": 552, 3804 "contours": [3805 13806 ]3807 }, 3808 {3809 "name": "uni0229", 3810 "unicode": 553, 3811 "contours": [3812 23813 ]3814 }, 3815 {3816 "name": "uni022A", 3817 "unicode": 554, 3818 "contours": [3819 53820 ]3821 }, 3822 {3823 "name": "integral", 3824 "unicode": 8747, 3825 "contours": [3826 13827 ]3828 }, 3829 {3830 "name": "uni022C", 3831 "unicode": 556, 3832 "contours": [3833 43834 ]3835 }, 3836 {3837 "name": "uni022D", 3838 "unicode": 557, 3839 "contours": [3840 43841 ]3842 }, 3843 {3844 "name": "uni022E", 3845 "unicode": 558, 3846 "contours": [3847 33848 ]3849 }, 3850 {3851 "name": "uni022F", 3852 "unicode": 559, 3853 "contours": [3854 33855 ]3856 }, 3857 {3858 "name": "uni0230", 3859 "unicode": 560, 3860 "contours": [3861 43862 ]3863 }, 3864 {3865 "name": "uni0231", 3866 "unicode": 561, 3867 "contours": [3868 43869 ]3870 }, 3871 {3872 "name": "uni0232", 3873 "unicode": 562, 3874 "contours": [3875 23876 ]3877 }, 3878 {3879 "name": "uni0233", 3880 "unicode": 563, 3881 "contours": [3882 23883 ]3884 }, 3885 {3886 "name": "uni0234", 3887 "unicode": 564, 3888 "contours": [3889 23890 ]3891 }, 3892 {3893 "name": "uni0235", 3894 "unicode": 565, 3895 "contours": [3896 23897 ]3898 }, 3899 {3900 "name": "uni0236", 3901 "unicode": 566, 3902 "contours": [3903 23904 ]3905 }, 3906 {3907 "name": "uni0237", 3908 "unicode": 567, 3909 "contours": [3910 13911 ]3912 }, 3913 {3914 "name": "uni0238", 3915 "unicode": 568, 3916 "contours": [3917 33918 ]3919 }, 3920 {3921 "name": "uni0239", 3922 "unicode": 569, 3923 "contours": [3924 33925 ]3926 }, 3927 {3928 "name": "uni023A", 3929 "unicode": 570, 3930 "contours": [3931 33932 ]3933 }, 3934 {3935 "name": "uni023B", 3936 "unicode": 571, 3937 "contours": [3938 23939 ]3940 }, 3941 {3942 "name": "uni023C", 3943 "unicode": 572, 3944 "contours": [3945 23946 ]3947 }, 3948 {3949 "name": "uni023D", 3950 "unicode": 573, 3951 "contours": [3952 13953 ]3954 }, 3955 {3956 "name": "uni023E", 3957 "unicode": 574, 3958 "contours": [3959 23960 ]3961 }, 3962 {3963 "name": "uni023F", 3964 "unicode": 575, 3965 "contours": [3966 13967 ]3968 }, 3969 {3970 "name": "uni0240", 3971 "unicode": 576, 3972 "contours": [3973 13974 ]3975 }, 3976 {3977 "name": "uni0241", 3978 "unicode": 577, 3979 "contours": [3980 13981 ]3982 }, 3983 {3984 "name": "uni0242", 3985 "unicode": 578, 3986 "contours": [3987 13988 ]3989 }, 3990 {3991 "name": "uni0243", 3992 "unicode": 579, 3993 "contours": [3994 33995 ]3996 }, 3997 {3998 "name": "uni0244", 3999 "unicode": 580, 4000 "contours": [4001 24002 ]4003 }, 4004 {4005 "name": "uni0245", 4006 "unicode": 581, 4007 "contours": [4008 14009 ]4010 }, 4011 {4012 "name": "uni0246", 4013 "unicode": 582, 4014 "contours": [4015 34016 ]4017 }, 4018 {4019 "name": "uni0247", 4020 "unicode": 583, 4021 "contours": [4022 44023 ]4024 }, 4025 {4026 "name": "approxequal", 4027 "unicode": 8776, 4028 "contours": [4029 24030 ]4031 }, 4032 {4033 "name": "uni0249", 4034 "unicode": 585, 4035 "contours": [4036 24037 ]4038 }, 4039 {4040 "name": "uni024A", 4041 "unicode": 586, 4042 "contours": [4043 24044 ]4045 }, 4046 {4047 "name": "uni024B", 4048 "unicode": 587, 4049 "contours": [4050 24051 ]4052 }, 4053 {4054 "name": "uni024C", 4055 "unicode": 588, 4056 "contours": [4057 24058 ]4059 }, 4060 {4061 "name": "uni024D", 4062 "unicode": 589, 4063 "contours": [4064 14065 ]4066 }, 4067 {4068 "name": "uni024E", 4069 "unicode": 590, 4070 "contours": [4071 24072 ]4073 }, 4074 {4075 "name": "uni024F", 4076 "unicode": 591, 4077 "contours": [4078 24079 ]4080 }, 4081 {4082 "name": "uni0251", 4083 "unicode": 593, 4084 "contours": [4085 24086 ]4087 }, 4088 {4089 "name": "uni2254", 4090 "unicode": 8788, 4091 "contours": [4092 44093 ]4094 }, 4095 {4096 "name": "uni0259", 4097 "unicode": 601, 4098 "contours": [4099 24100 ]4101 }, 4102 {4103 "name": "uni225C", 4104 "unicode": 8796, 4105 "contours": [4106 44107 ]4108 }, 4109 {4110 "name": "notequal", 4111 "unicode": 8800, 4112 "contours": [4113 14114 ]4115 }, 4116 {4117 "name": "uni0261", 4118 "unicode": 609, 4119 "contours": [4120 24121 ]4122 }, 4123 {4124 "name": "uni2262", 4125 "unicode": 8802, 4126 "contours": [4127 14128 ]4129 }, 4130 {4131 "name": "uni2263", 4132 "unicode": 8803, 4133 "contours": [4134 44135 ]4136 }, 4137 {4138 "name": "lessequal", 4139 "unicode": 8804, 4140 "contours": [4141 24142 ]4143 }, 4144 {4145 "name": "greaterequal", 4146 "unicode": 8805, 4147 "contours": [4148 24149 ]4150 }, 4151 {4152 "name": "uni226A", 4153 "unicode": 8810, 4154 "contours": [4155 24156 ]4157 }, 4158 {4159 "name": "uni226B", 4160 "unicode": 8811, 4161 "contours": [4162 24163 ]4164 }, 4165 {4166 "name": "uni2270", 4167 "unicode": 8816, 4168 "contours": [4169 24170 ]4171 }, 4172 {4173 "name": "uni2271", 4174 "unicode": 8817, 4175 "contours": [4176 24177 ]4178 }, 4179 {4180 "name": "uni0272", 4181 "unicode": 626, 4182 "contours": [4183 14184 ]4185 }, 4186 {4187 "name": "uni211D", 4188 "unicode": 8477, 4189 "contours": [4190 34191 ]4192 }, 4193 {4194 "name": "propersubset", 4195 "unicode": 8834, 4196 "contours": [4197 14198 ]4199 }, 4200 {4201 "name": "propersuperset", 4202 "unicode": 8835, 4203 "contours": [4204 14205 ]4206 }, 4207 {4208 "name": "notsubset", 4209 "unicode": 8836, 4210 "contours": [4211 24212 ]4213 }, 4214 {4215 "name": "uni2285", 4216 "unicode": 8837, 4217 "contours": [4218 24219 ]4220 }, 4221 {4222 "name": "reflexsubset", 4223 "unicode": 8838, 4224 "contours": [4225 24226 ]4227 }, 4228 {4229 "name": "reflexsuperset", 4230 "unicode": 8839, 4231 "contours": [4232 24233 ]4234 }, 4235 {4236 "name": "uni2288", 4237 "unicode": 8840, 4238 "contours": [4239 24240 ]4241 }, 4242 {4243 "name": "uni2289", 4244 "unicode": 8841, 4245 "contours": [4246 24247 ]4248 }, 4249 {4250 "name": "uni200D", 4251 "unicode": 8205, 4252 "contours": [4253 14254 ]4255 }, 4256 {4257 "name": "uni0292", 4258 "unicode": 658, 4259 "contours": [4260 14261 ]4262 }, 4263 {4264 "name": "circleplus", 4265 "unicode": 8853, 4266 "contours": [4267 34268 ]4269 }, 4270 {4271 "name": "p", 4272 "unicode": 112, 4273 "contours": [4274 24275 ]4276 }, 4277 {4278 "name": "i.sups", 4279 "unicode": 8305, 4280 "contours": [4281 24282 ]4283 }, 4284 {4285 "name": "h.sups", 4286 "unicode": 688, 4287 "contours": [4288 14289 ]4290 }, 4291 {4292 "name": "j.sups", 4293 "unicode": 690, 4294 "contours": [4295 24296 ]4297 }, 4298 {4299 "name": "r.sups", 4300 "unicode": 691, 4301 "contours": [4302 14303 ]4304 }, 4305 {4306 "name": "w.sups", 4307 "unicode": 695, 4308 "contours": [4309 14310 ]4311 }, 4312 {4313 "name": "y.sups", 4314 "unicode": 696, 4315 "contours": [4316 14317 ]4318 }, 4319 {4320 "name": "four.sups", 4321 "unicode": 8308, 4322 "contours": [4323 1, 4324 24325 ]4326 }, 4327 {4328 "name": "uni02BA", 4329 "unicode": 698, 4330 "contours": [4331 24332 ]4333 }, 4334 {4335 "name": "uni02BB", 4336 "unicode": 699, 4337 "contours": [4338 14339 ]4340 }, 4341 {4342 "name": "uni02BC", 4343 "unicode": 700, 4344 "contours": [4345 14346 ]4347 }, 4348 {4349 "name": "uni02BE", 4350 "unicode": 702, 4351 "contours": [4352 14353 ]4354 }, 4355 {4356 "name": "five.sups", 4357 "unicode": 8309, 4358 "contours": [4359 14360 ]4361 }, 4362 {4363 "name": "six.sups", 4364 "unicode": 8310, 4365 "contours": [4366 24367 ]4368 }, 4369 {4370 "name": "circumflex", 4371 "unicode": 710, 4372 "contours": [4373 14374 ]4375 }, 4376 {4377 "name": "caron", 4378 "unicode": 711, 4379 "contours": [4380 14381 ]4382 }, 4383 {4384 "name": "uni02C8", 4385 "unicode": 712, 4386 "contours": [4387 14388 ]4389 }, 4390 {4391 "name": "uni02C9", 4392 "unicode": 713, 4393 "contours": [4394 14395 ]4396 }, 4397 {4398 "name": "uni02CA", 4399 "unicode": 714, 4400 "contours": [4401 14402 ]4403 }, 4404 {4405 "name": "uni02CB", 4406 "unicode": 715, 4407 "contours": [4408 14409 ]4410 }, 4411 {4412 "name": "uni02CC", 4413 "unicode": 716, 4414 "contours": [4415 14416 ]4417 }, 4418 {4419 "name": "eight.sups", 4420 "unicode": 8312, 4421 "contours": [4422 34423 ]4424 }, 4425 {4426 "name": "y", 4427 "unicode": 121, 4428 "contours": [4429 14430 ]4431 }, 4432 {4433 "name": "breve", 4434 "unicode": 728, 4435 "contours": [4436 14437 ]4438 }, 4439 {4440 "name": "dotaccent", 4441 "unicode": 729, 4442 "contours": [4443 14444 ]4445 }, 4446 {4447 "name": "ring", 4448 "unicode": 730, 4449 "contours": [4450 24451 ]4452 }, 4453 {4454 "name": "ogonek", 4455 "unicode": 731, 4456 "contours": [4457 14458 ]4459 }, 4460 {4461 "name": "tilde", 4462 "unicode": 732, 4463 "contours": [4464 14465 ]4466 }, 4467 {4468 "name": "hungarumlaut", 4469 "unicode": 733, 4470 "contours": [4471 24472 ]4473 }, 4474 {4475 "name": "l.sups", 4476 "unicode": 737, 4477 "contours": [4478 14479 ]4480 }, 4481 {4482 "name": "s.sups", 4483 "unicode": 738, 4484 "contours": [4485 14486 ]4487 }, 4488 {4489 "name": "x.sups", 4490 "unicode": 739, 4491 "contours": [4492 14493 ]4494 }, 4495 {4496 "name": "uni207C", 4497 "unicode": 8316, 4498 "contours": [4499 24500 ]4501 }, 4502 {4503 "name": "parenleft.sups", 4504 "unicode": 8317, 4505 "contours": [4506 14507 ]4508 }, 4509 {4510 "name": "uni02F3", 4511 "unicode": 755, 4512 "contours": [4513 24514 ]4515 }, 4516 {4517 "name": "parenright.sups", 4518 "unicode": 8318, 4519 "contours": [4520 14521 ]4522 }, 4523 {4524 "name": "uni0300", 4525 "unicode": 768, 4526 "contours": [4527 14528 ]4529 }, 4530 {4531 "name": "uni0301", 4532 "unicode": 769, 4533 "contours": [4534 14535 ]4536 }, 4537 {4538 "name": "uni0302", 4539 "unicode": 770, 4540 "contours": [4541 14542 ]4543 }, 4544 {4545 "name": "uni0303", 4546 "unicode": 771, 4547 "contours": [4548 14549 ]4550 }, 4551 {4552 "name": "uni0304", 4553 "unicode": 772, 4554 "contours": [4555 14556 ]4557 }, 4558 {4559 "name": "uni0306", 4560 "unicode": 774, 4561 "contours": [4562 14563 ]4564 }, 4565 {4566 "name": "uni0307", 4567 "unicode": 775, 4568 "contours": [4569 14570 ]4571 }, 4572 {4573 "name": "uni0308", 4574 "unicode": 776, 4575 "contours": [4576 24577 ]4578 }, 4579 {4580 "name": "uni0309", 4581 "unicode": 777, 4582 "contours": [4583 14584 ]4585 }, 4586 {4587 "name": "uni030A", 4588 "unicode": 778, 4589 "contours": [4590 24591 ]4592 }, 4593 {4594 "name": "uni030B", 4595 "unicode": 779, 4596 "contours": [4597 24598 ]4599 }, 4600 {4601 "name": "uni030C", 4602 "unicode": 780, 4603 "contours": [4604 14605 ]4606 }, 4607 {4608 "name": "uni030F", 4609 "unicode": 783, 4610 "contours": [4611 24612 ]4613 }, 4614 {4615 "name": "uni0311", 4616 "unicode": 785, 4617 "contours": [4618 14619 ]4620 }, 4621 {4622 "name": "uni0312", 4623 "unicode": 786, 4624 "contours": [4625 14626 ]4627 }, 4628 {4629 "name": "uni0313", 4630 "unicode": 787, 4631 "contours": [4632 14633 ]4634 }, 4635 {4636 "name": "uni031B", 4637 "unicode": 795, 4638 "contours": [4639 14640 ]4641 }, 4642 {4643 "name": "uni0323", 4644 "unicode": 803, 4645 "contours": [4646 14647 ]4648 }, 4649 {4650 "name": "uni0324", 4651 "unicode": 804, 4652 "contours": [4653 24654 ]4655 }, 4656 {4657 "name": "uni0325", 4658 "unicode": 805, 4659 "contours": [4660 24661 ]4662 }, 4663 {4664 "name": "uni0326", 4665 "unicode": 806, 4666 "contours": [4667 14668 ]4669 }, 4670 {4671 "name": "uni0327", 4672 "unicode": 807, 4673 "contours": [4674 14675 ]4676 }, 4677 {4678 "name": "uni0328", 4679 "unicode": 808, 4680 "contours": [4681 14682 ]4683 }, 4684 {4685 "name": "uni0329", 4686 "unicode": 809, 4687 "contours": [4688 14689 ]4690 }, 4691 {4692 "name": "uni032E", 4693 "unicode": 814, 4694 "contours": [4695 14696 ]4697 }, 4698 {4699 "name": "uni0331", 4700 "unicode": 817, 4701 "contours": [4702 14703 ]4704 }, 4705 {4706 "name": "tildeoverlaycomb", 4707 "unicode": 820, 4708 "contours": [4709 14710 ]4711 }, 4712 {4713 "name": "uni0335", 4714 "unicode": 821, 4715 "contours": [4716 14717 ]4718 }, 4719 {4720 "name": "uni0336", 4721 "unicode": 822, 4722 "contours": [4723 14724 ]4725 }, 4726 {4727 "name": "uni0337", 4728 "unicode": 823, 4729 "contours": [4730 14731 ]4732 }, 4733 {4734 "name": "uni0338", 4735 "unicode": 824, 4736 "contours": [4737 14738 ]4739 }, 4740 {4741 "name": "uni0342", 4742 "unicode": 834, 4743 "contours": [4744 14745 ]4746 }, 4747 {4748 "name": "uni0343", 4749 "unicode": 835, 4750 "contours": [4751 14752 ]4753 }, 4754 {4755 "name": "uni0344", 4756 "unicode": 836, 4757 "contours": [4758 34759 ]4760 }, 4761 {4762 "name": "uni0345", 4763 "unicode": 837, 4764 "contours": [4765 14766 ]4767 }, 4768 {4769 "name": ".null", 4770 "unicode": 29, 4771 "contours": [4772 04773 ]4774 }, 4775 {4776 "name": "uni0374", 4777 "unicode": 884, 4778 "contours": [4779 14780 ]4781 }, 4782 {4783 "name": "uni0375", 4784 "unicode": 885, 4785 "contours": [4786 14787 ]4788 }, 4789 {4790 "name": "uni037A", 4791 "unicode": 890, 4792 "contours": [4793 14794 ]4795 }, 4796 {4797 "name": "uni037E", 4798 "unicode": 894, 4799 "contours": [4800 24801 ]4802 }, 4803 {4804 "name": "tonos", 4805 "unicode": 900, 4806 "contours": [4807 14808 ]4809 }, 4810 {4811 "name": "dieresistonos", 4812 "unicode": 901, 4813 "contours": [4814 34815 ]4816 }, 4817 {4818 "name": "Alphatonos", 4819 "unicode": 902, 4820 "contours": [4821 34822 ]4823 }, 4824 {4825 "name": "anoteleia", 4826 "unicode": 903, 4827 "contours": [4828 14829 ]4830 }, 4831 {4832 "name": "Epsilontonos", 4833 "unicode": 904, 4834 "contours": [4835 24836 ]4837 }, 4838 {4839 "name": "Etatonos", 4840 "unicode": 905, 4841 "contours": [4842 24843 ]4844 }, 4845 {4846 "name": "Iotatonos", 4847 "unicode": 906, 4848 "contours": [4849 24850 ]4851 }, 4852 {4853 "name": "Omicrontonos", 4854 "unicode": 908, 4855 "contours": [4856 34857 ]4858 }, 4859 {4860 "name": "Upsilontonos", 4861 "unicode": 910, 4862 "contours": [4863 24864 ]4865 }, 4866 {4867 "name": "Omegatonos", 4868 "unicode": 911, 4869 "contours": [4870 24871 ]4872 }, 4873 {4874 "name": "iotadieresistonos", 4875 "unicode": 912, 4876 "contours": [4877 44878 ]4879 }, 4880 {4881 "name": "Alpha", 4882 "unicode": 913, 4883 "contours": [4884 24885 ]4886 }, 4887 {4888 "name": "Beta", 4889 "unicode": 914, 4890 "contours": [4891 34892 ]4893 }, 4894 {4895 "name": "Gamma", 4896 "unicode": 915, 4897 "contours": [4898 14899 ]4900 }, 4901 {4902 "name": "uni0394", 4903 "unicode": 916, 4904 "contours": [4905 24906 ]4907 }, 4908 {4909 "name": "Epsilon", 4910 "unicode": 917, 4911 "contours": [4912 14913 ]4914 }, 4915 {4916 "name": "Zeta", 4917 "unicode": 918, 4918 "contours": [4919 14920 ]4921 }, 4922 {4923 "name": "Eta", 4924 "unicode": 919, 4925 "contours": [4926 14927 ]4928 }, 4929 {4930 "name": "Theta", 4931 "unicode": 920, 4932 "contours": [4933 34934 ]4935 }, 4936 {4937 "name": "Iota", 4938 "unicode": 921, 4939 "contours": [4940 14941 ]4942 }, 4943 {4944 "name": "Kappa", 4945 "unicode": 922, 4946 "contours": [4947 14948 ]4949 }, 4950 {4951 "name": "Lambda", 4952 "unicode": 923, 4953 "contours": [4954 14955 ]4956 }, 4957 {4958 "name": "Mu", 4959 "unicode": 924, 4960 "contours": [4961 14962 ]4963 }, 4964 {4965 "name": "Nu", 4966 "unicode": 925, 4967 "contours": [4968 14969 ]4970 }, 4971 {4972 "name": "Xi", 4973 "unicode": 926, 4974 "contours": [4975 1, 4976 34977 ]4978 }, 4979 {4980 "name": "Omicron", 4981 "unicode": 927, 4982 "contours": [4983 24984 ]4985 }, 4986 {4987 "name": "Pi", 4988 "unicode": 928, 4989 "contours": [4990 14991 ]4992 }, 4993 {4994 "name": "Rho", 4995 "unicode": 929, 4996 "contours": [4997 1, 4998 24999 ]5000 }, 5001 {5002 "name": "Sigma", 5003 "unicode": 931, 5004 "contours": [5005 15006 ]5007 }, 5008 {5009 "name": "Tau", 5010 "unicode": 932, 5011 "contours": [5012 15013 ]5014 }, 5015 {5016 "name": "Upsilon", 5017 "unicode": 933, 5018 "contours": [5019 15020 ]5021 }, 5022 {5023 "name": "Phi", 5024 "unicode": 934, 5025 "contours": [5026 35027 ]5028 }, 5029 {5030 "name": "Chi", 5031 "unicode": 935, 5032 "contours": [5033 15034 ]5035 }, 5036 {5037 "name": "Psi", 5038 "unicode": 936, 5039 "contours": [5040 15041 ]5042 }, 5043 {5044 "name": "uni03A9", 5045 "unicode": 937, 5046 "contours": [5047 15048 ]5049 }, 5050 {5051 "name": "Iotadieresis", 5052 "unicode": 938, 5053 "contours": [5054 35055 ]5056 }, 5057 {5058 "name": "Upsilondieresis", 5059 "unicode": 939, 5060 "contours": [5061 35062 ]5063 }, 5064 {5065 "name": "alphatonos", 5066 "unicode": 940, 5067 "contours": [5068 35069 ]5070 }, 5071 {5072 "name": "epsilontonos", 5073 "unicode": 941, 5074 "contours": [5075 25076 ]5077 }, 5078 {5079 "name": "etatonos", 5080 "unicode": 942, 5081 "contours": [5082 25083 ]5084 }, 5085 {5086 "name": "iotatonos", 5087 "unicode": 943, 5088 "contours": [5089 25090 ]5091 }, 5092 {5093 "name": "upsilondieresistonos", 5094 "unicode": 944, 5095 "contours": [5096 45097 ]5098 }, 5099 {5100 "name": "alpha", 5101 "unicode": 945, 5102 "contours": [5103 25104 ]5105 }, 5106 {5107 "name": "beta", 5108 "unicode": 946, 5109 "contours": [5110 25111 ]5112 }, 5113 {5114 "name": "gamma", 5115 "unicode": 947, 5116 "contours": [5117 1, 5118 25119 ]5120 }, 5121 {5122 "name": "delta", 5123 "unicode": 948, 5124 "contours": [5125 25126 ]5127 }, 5128 {5129 "name": "epsilon", 5130 "unicode": 949, 5131 "contours": [5132 15133 ]5134 }, 5135 {5136 "name": "zeta", 5137 "unicode": 950, 5138 "contours": [5139 15140 ]5141 }, 5142 {5143 "name": "eta", 5144 "unicode": 951, 5145 "contours": [5146 15147 ]5148 }, 5149 {5150 "name": "theta", 5151 "unicode": 952, 5152 "contours": [5153 35154 ]5155 }, 5156 {5157 "name": "iota", 5158 "unicode": 953, 5159 "contours": [5160 15161 ]5162 }, 5163 {5164 "name": "kappa", 5165 "unicode": 954, 5166 "contours": [5167 15168 ]5169 }, 5170 {5171 "name": "lambda", 5172 "unicode": 955, 5173 "contours": [5174 15175 ]5176 }, 5177 {5178 "name": "uni03BC", 5179 "unicode": 956, 5180 "contours": [5181 15182 ]5183 }, 5184 {5185 "name": "nu", 5186 "unicode": 957, 5187 "contours": [5188 15189 ]5190 }, 5191 {5192 "name": "xi", 5193 "unicode": 958, 5194 "contours": [5195 15196 ]5197 }, 5198 {5199 "name": "omicron", 5200 "unicode": 959, 5201 "contours": [5202 25203 ]5204 }, 5205 {5206 "name": "pi", 5207 "unicode": 960, 5208 "contours": [5209 15210 ]5211 }, 5212 {5213 "name": "rho", 5214 "unicode": 961, 5215 "contours": [5216 25217 ]5218 }, 5219 {5220 "name": "uni03C2", 5221 "unicode": 962, 5222 "contours": [5223 15224 ]5225 }, 5226 {5227 "name": "sigma", 5228 "unicode": 963, 5229 "contours": [5230 25231 ]5232 }, 5233 {5234 "name": "tau", 5235 "unicode": 964, 5236 "contours": [5237 15238 ]5239 }, 5240 {5241 "name": "upsilon", 5242 "unicode": 965, 5243 "contours": [5244 15245 ]5246 }, 5247 {5248 "name": "phi", 5249 "unicode": 966, 5250 "contours": [5251 2, 5252 35253 ]5254 }, 5255 {5256 "name": "exclamdown", 5257 "unicode": 161, 5258 "contours": [5259 25260 ]5261 }, 5262 {5263 "name": "psi", 5264 "unicode": 968, 5265 "contours": [5266 15267 ]5268 }, 5269 {5270 "name": "omega", 5271 "unicode": 969, 5272 "contours": [5273 15274 ]5275 }, 5276 {5277 "name": "iotadieresis", 5278 "unicode": 970, 5279 "contours": [5280 35281 ]5282 }, 5283 {5284 "name": "upsilondieresis", 5285 "unicode": 971, 5286 "contours": [5287 35288 ]5289 }, 5290 {5291 "name": "omicrontonos", 5292 "unicode": 972, 5293 "contours": [5294 35295 ]5296 }, 5297 {5298 "name": "upsilontonos", 5299 "unicode": 973, 5300 "contours": [5301 25302 ]5303 }, 5304 {5305 "name": "omegatonos", 5306 "unicode": 974, 5307 "contours": [5308 25309 ]5310 }, 5311 {5312 "name": "uni03CF", 5313 "unicode": 975, 5314 "contours": [5315 15316 ]5317 }, 5318 {5319 "name": "theta1", 5320 "unicode": 977, 5321 "contours": [5322 25323 ]5324 }, 5325 {5326 "name": "Upsilon1", 5327 "unicode": 978, 5328 "contours": [5329 15330 ]5331 }, 5332 {5333 "name": "franc", 5334 "unicode": 8355, 5335 "contours": [5336 1, 5337 25338 ]5339 }, 5340 {5341 "name": "omega1", 5342 "unicode": 982, 5343 "contours": [5344 25345 ]5346 }, 5347 {5348 "name": "uni03D7", 5349 "unicode": 983, 5350 "contours": [5351 15352 ]5353 }, 5354 {5355 "name": "uni03D9", 5356 "unicode": 985, 5357 "contours": [5358 25359 ]5360 }, 5361 {5362 "name": "uni03DB", 5363 "unicode": 987, 5364 "contours": [5365 15366 ]5367 }, 5368 {5369 "name": "uni03DD", 5370 "unicode": 989, 5371 "contours": [5372 15373 ]5374 }, 5375 {5376 "name": "uni23DE", 5377 "unicode": 9182, 5378 "contours": [5379 15380 ]5381 }, 5382 {5383 "name": "uni23DF", 5384 "unicode": 9183, 5385 "contours": [5386 15387 ]5388 }, 5389 {5390 "name": "uni03E1", 5391 "unicode": 993, 5392 "contours": [5393 15394 ]5395 }, 5396 {5397 "name": "exclam", 5398 "unicode": 33, 5399 "contours": [5400 25401 ]5402 }, 5403 {5404 "name": "section", 5405 "unicode": 167, 5406 "contours": [5407 25408 ]5409 }, 5410 {5411 "name": "rupee", 5412 "unicode": 8360, 5413 "contours": [5414 35415 ]5416 }, 5417 {5418 "name": "copyright", 5419 "unicode": 169, 5420 "contours": [5421 35422 ]5423 }, 5424 {5425 "name": "uni20AA", 5426 "unicode": 8362, 5427 "contours": [5428 25429 ]5430 }, 5431 {5432 "name": "uni0400", 5433 "unicode": 1024, 5434 "contours": [5435 25436 ]5437 }, 5438 {5439 "name": "uni0401", 5440 "unicode": 1025, 5441 "contours": [5442 35443 ]5444 }, 5445 {5446 "name": "uni0402", 5447 "unicode": 1026, 5448 "contours": [5449 15450 ]5451 }, 5452 {5453 "name": "uni0403", 5454 "unicode": 1027, 5455 "contours": [5456 25457 ]5458 }, 5459 {5460 "name": "uni0404", 5461 "unicode": 1028, 5462 "contours": [5463 15464 ]5465 }, 5466 {5467 "name": "uni0405", 5468 "unicode": 1029, 5469 "contours": [5470 15471 ]5472 }, 5473 {5474 "name": "uni0406", 5475 "unicode": 1030, 5476 "contours": [5477 15478 ]5479 }, 5480 {5481 "name": "uni0407", 5482 "unicode": 1031, 5483 "contours": [5484 35485 ]5486 }, 5487 {5488 "name": "uni0408", 5489 "unicode": 1032, 5490 "contours": [5491 15492 ]5493 }, 5494 {5495 "name": "uni0409", 5496 "unicode": 1033, 5497 "contours": [5498 25499 ]5500 }, 5501 {5502 "name": "uni040A", 5503 "unicode": 1034, 5504 "contours": [5505 25506 ]5507 }, 5508 {5509 "name": "uni040B", 5510 "unicode": 1035, 5511 "contours": [5512 15513 ]5514 }, 5515 {5516 "name": "uni040C", 5517 "unicode": 1036, 5518 "contours": [5519 25520 ]5521 }, 5522 {5523 "name": "uni040D", 5524 "unicode": 1037, 5525 "contours": [5526 25527 ]5528 }, 5529 {5530 "name": "uni040E", 5531 "unicode": 1038, 5532 "contours": [5533 25534 ]5535 }, 5536 {5537 "name": "uni040F", 5538 "unicode": 1039, 5539 "contours": [5540 15541 ]5542 }, 5543 {5544 "name": "uni0410", 5545 "unicode": 1040, 5546 "contours": [5547 25548 ]5549 }, 5550 {5551 "name": "uni0411", 5552 "unicode": 1041, 5553 "contours": [5554 25555 ]5556 }, 5557 {5558 "name": "uni0412", 5559 "unicode": 1042, 5560 "contours": [5561 35562 ]5563 }, 5564 {5565 "name": "uni0413", 5566 "unicode": 1043, 5567 "contours": [5568 15569 ]5570 }, 5571 {5572 "name": "uni0414", 5573 "unicode": 1044, 5574 "contours": [5575 25576 ]5577 }, 5578 {5579 "name": "uni0415", 5580 "unicode": 1045, 5581 "contours": [5582 15583 ]5584 }, 5585 {5586 "name": "uni0416", 5587 "unicode": 1046, 5588 "contours": [5589 15590 ]5591 }, 5592 {5593 "name": "uni0417", 5594 "unicode": 1047, 5595 "contours": [5596 15597 ]5598 }, 5599 {5600 "name": "uni0418", 5601 "unicode": 1048, 5602 "contours": [5603 15604 ]5605 }, 5606 {5607 "name": "uni0419", 5608 "unicode": 1049, 5609 "contours": [5610 25611 ]5612 }, 5613 {5614 "name": "uni041A", 5615 "unicode": 1050, 5616 "contours": [5617 15618 ]5619 }, 5620 {5621 "name": "uni041B", 5622 "unicode": 1051, 5623 "contours": [5624 15625 ]5626 }, 5627 {5628 "name": "uni041C", 5629 "unicode": 1052, 5630 "contours": [5631 15632 ]5633 }, 5634 {5635 "name": "uni041D", 5636 "unicode": 1053, 5637 "contours": [5638 15639 ]5640 }, 5641 {5642 "name": "uni041E", 5643 "unicode": 1054, 5644 "contours": [5645 25646 ]5647 }, 5648 {5649 "name": "uni041F", 5650 "unicode": 1055, 5651 "contours": [5652 15653 ]5654 }, 5655 {5656 "name": "uni0420", 5657 "unicode": 1056, 5658 "contours": [5659 1, 5660 25661 ]5662 }, 5663 {5664 "name": "uni0421", 5665 "unicode": 1057, 5666 "contours": [5667 15668 ]5669 }, 5670 {5671 "name": "uni0422", 5672 "unicode": 1058, 5673 "contours": [5674 15675 ]5676 }, 5677 {5678 "name": "uni0423", 5679 "unicode": 1059, 5680 "contours": [5681 15682 ]5683 }, 5684 {5685 "name": "uni0424", 5686 "unicode": 1060, 5687 "contours": [5688 35689 ]5690 }, 5691 {5692 "name": "uni0425", 5693 "unicode": 1061, 5694 "contours": [5695 15696 ]5697 }, 5698 {5699 "name": "uni0426", 5700 "unicode": 1062, 5701 "contours": [5702 15703 ]5704 }, 5705 {5706 "name": "uni20B1", 5707 "unicode": 8369, 5708 "contours": [5709 1, 5710 2, 5711 45712 ]5713 }, 5714 {5715 "name": "uni0428", 5716 "unicode": 1064, 5717 "contours": [5718 15719 ]5720 }, 5721 {5722 "name": "uni0429", 5723 "unicode": 1065, 5724 "contours": [5725 15726 ]5727 }, 5728 {5729 "name": "uni042A", 5730 "unicode": 1066, 5731 "contours": [5732 25733 ]5734 }, 5735 {5736 "name": "uni042B", 5737 "unicode": 1067, 5738 "contours": [5739 35740 ]5741 }, 5742 {5743 "name": "uni042C", 5744 "unicode": 1068, 5745 "contours": [5746 25747 ]5748 }, 5749 {5750 "name": "uni042D", 5751 "unicode": 1069, 5752 "contours": [5753 15754 ]5755 }, 5756 {5757 "name": "uni042E", 5758 "unicode": 1070, 5759 "contours": [5760 25761 ]5762 }, 5763 {5764 "name": "uni042F", 5765 "unicode": 1071, 5766 "contours": [5767 25768 ]5769 }, 5770 {5771 "name": "uni0430", 5772 "unicode": 1072, 5773 "contours": [5774 25775 ]5776 }, 5777 {5778 "name": "uni0431", 5779 "unicode": 1073, 5780 "contours": [5781 25782 ]5783 }, 5784 {5785 "name": "uni0432", 5786 "unicode": 1074, 5787 "contours": [5788 35789 ]5790 }, 5791 {5792 "name": "uni0433", 5793 "unicode": 1075, 5794 "contours": [5795 15796 ]5797 }, 5798 {5799 "name": "uni0434", 5800 "unicode": 1076, 5801 "contours": [5802 25803 ]5804 }, 5805 {5806 "name": "uni0435", 5807 "unicode": 1077, 5808 "contours": [5809 25810 ]5811 }, 5812 {5813 "name": "uni0436", 5814 "unicode": 1078, 5815 "contours": [5816 15817 ]5818 }, 5819 {5820 "name": "uni0437", 5821 "unicode": 1079, 5822 "contours": [5823 15824 ]5825 }, 5826 {5827 "name": "uni0438", 5828 "unicode": 1080, 5829 "contours": [5830 15831 ]5832 }, 5833 {5834 "name": "uni0439", 5835 "unicode": 1081, 5836 "contours": [5837 25838 ]5839 }, 5840 {5841 "name": "uni043A", 5842 "unicode": 1082, 5843 "contours": [5844 15845 ]5846 }, 5847 {5848 "name": "uni043B", 5849 "unicode": 1083, 5850 "contours": [5851 15852 ]5853 }, 5854 {5855 "name": "uni043C", 5856 "unicode": 1084, 5857 "contours": [5858 15859 ]5860 }, 5861 {5862 "name": "uni043D", 5863 "unicode": 1085, 5864 "contours": [5865 15866 ]5867 }, 5868 {5869 "name": "uni043E", 5870 "unicode": 1086, 5871 "contours": [5872 25873 ]5874 }, 5875 {5876 "name": "uni043F", 5877 "unicode": 1087, 5878 "contours": [5879 15880 ]5881 }, 5882 {5883 "name": "uni0440", 5884 "unicode": 1088, 5885 "contours": [5886 25887 ]5888 }, 5889 {5890 "name": "uni0441", 5891 "unicode": 1089, 5892 "contours": [5893 15894 ]5895 }, 5896 {5897 "name": "uni0442", 5898 "unicode": 1090, 5899 "contours": [5900 15901 ]5902 }, 5903 {5904 "name": "uni0443", 5905 "unicode": 1091, 5906 "contours": [5907 15908 ]5909 }, 5910 {5911 "name": "uni0444", 5912 "unicode": 1092, 5913 "contours": [5914 35915 ]5916 }, 5917 {5918 "name": "uni0445", 5919 "unicode": 1093, 5920 "contours": [5921 15922 ]5923 }, 5924 {5925 "name": "uni0446", 5926 "unicode": 1094, 5927 "contours": [5928 15929 ]5930 }, 5931 {5932 "name": "uni0447", 5933 "unicode": 1095, 5934 "contours": [5935 15936 ]5937 }, 5938 {5939 "name": "uni0448", 5940 "unicode": 1096, 5941 "contours": [5942 15943 ]5944 }, 5945 {5946 "name": "uni0449", 5947 "unicode": 1097, 5948 "contours": [5949 15950 ]5951 }, 5952 {5953 "name": "uni044A", 5954 "unicode": 1098, 5955 "contours": [5956 25957 ]5958 }, 5959 {5960 "name": "uni044B", 5961 "unicode": 1099, 5962 "contours": [5963 35964 ]5965 }, 5966 {5967 "name": "uni044C", 5968 "unicode": 1100, 5969 "contours": [5970 25971 ]5972 }, 5973 {5974 "name": "uni044D", 5975 "unicode": 1101, 5976 "contours": [5977 15978 ]5979 }, 5980 {5981 "name": "uni044E", 5982 "unicode": 1102, 5983 "contours": [5984 25985 ]5986 }, 5987 {5988 "name": "uni044F", 5989 "unicode": 1103, 5990 "contours": [5991 25992 ]5993 }, 5994 {5995 "name": "uni0450", 5996 "unicode": 1104, 5997 "contours": [5998 35999 ]6000 }, 6001 {6002 "name": "uni0451", 6003 "unicode": 1105, 6004 "contours": [6005 46006 ]6007 }, 6008 {6009 "name": "uni0452", 6010 "unicode": 1106, 6011 "contours": [6012 16013 ]6014 }, 6015 {6016 "name": "uni0453", 6017 "unicode": 1107, 6018 "contours": [6019 26020 ]6021 }, 6022 {6023 "name": "uni0454", 6024 "unicode": 1108, 6025 "contours": [6026 16027 ]6028 }, 6029 {6030 "name": "uni0455", 6031 "unicode": 1109, 6032 "contours": [6033 16034 ]6035 }, 6036 {6037 "name": "uni0456", 6038 "unicode": 1110, 6039 "contours": [6040 26041 ]6042 }, 6043 {6044 "name": "uni0457", 6045 "unicode": 1111, 6046 "contours": [6047 36048 ]6049 }, 6050 {6051 "name": "uni0458", 6052 "unicode": 1112, 6053 "contours": [6054 26055 ]6056 }, 6057 {6058 "name": "uni0459", 6059 "unicode": 1113, 6060 "contours": [6061 26062 ]6063 }, 6064 {6065 "name": "uni045A", 6066 "unicode": 1114, 6067 "contours": [6068 26069 ]6070 }, 6071 {6072 "name": "uni045B", 6073 "unicode": 1115, 6074 "contours": [6075 16076 ]6077 }, 6078 {6079 "name": "uni045C", 6080 "unicode": 1116, 6081 "contours": [6082 26083 ]6084 }, 6085 {6086 "name": "uni045D", 6087 "unicode": 1117, 6088 "contours": [6089 26090 ]6091 }, 6092 {6093 "name": "uni045E", 6094 "unicode": 1118, 6095 "contours": [6096 26097 ]6098 }, 6099 {6100 "name": "uni045F", 6101 "unicode": 1119, 6102 "contours": [6103 1, 6104 26105 ]6106 }, 6107 {6108 "name": "uni0460", 6109 "unicode": 1120, 6110 "contours": [6111 16112 ]6113 }, 6114 {6115 "name": "uni0461", 6116 "unicode": 1121, 6117 "contours": [6118 16119 ]6120 }, 6121 {6122 "name": "uni0462", 6123 "unicode": 1122, 6124 "contours": [6125 26126 ]6127 }, 6128 {6129 "name": "uni0463", 6130 "unicode": 1123, 6131 "contours": [6132 26133 ]6134 }, 6135 {6136 "name": "uni0464", 6137 "unicode": 1124, 6138 "contours": [6139 16140 ]6141 }, 6142 {6143 "name": "uni0465", 6144 "unicode": 1125, 6145 "contours": [6146 16147 ]6148 }, 6149 {6150 "name": "uni0466", 6151 "unicode": 1126, 6152 "contours": [6153 26154 ]6155 }, 6156 {6157 "name": "uni0467", 6158 "unicode": 1127, 6159 "contours": [6160 26161 ]6162 }, 6163 {6164 "name": "uni0468", 6165 "unicode": 1128, 6166 "contours": [6167 26168 ]6169 }, 6170 {6171 "name": "uni20BC", 6172 "unicode": 8380, 6173 "contours": [6174 16175 ]6176 }, 6177 {6178 "name": "uni046A", 6179 "unicode": 1130, 6180 "contours": [6181 26182 ]6183 }, 6184 {6185 "name": "uni046B", 6186 "unicode": 1131, 6187 "contours": [6188 26189 ]6190 }, 6191 {6192 "name": "uni046C", 6193 "unicode": 1132, 6194 "contours": [6195 26196 ]6197 }, 6198 {6199 "name": "uni046D", 6200 "unicode": 1133, 6201 "contours": [6202 26203 ]6204 }, 6205 {6206 "name": "uni046E", 6207 "unicode": 1134, 6208 "contours": [6209 26210 ]6211 }, 6212 {6213 "name": "onehalf", 6214 "unicode": 189, 6215 "contours": [6216 36217 ]6218 }, 6219 {6220 "name": "uni0470", 6221 "unicode": 1136, 6222 "contours": [6223 16224 ]6225 }, 6226 {6227 "name": "uni0471", 6228 "unicode": 1137, 6229 "contours": [6230 16231 ]6232 }, 6233 {6234 "name": "uni0472", 6235 "unicode": 1138, 6236 "contours": [6237 36238 ]6239 }, 6240 {6241 "name": "uni0473", 6242 "unicode": 1139, 6243 "contours": [6244 36245 ]6246 }, 6247 {6248 "name": "uni0474", 6249 "unicode": 1140, 6250 "contours": [6251 16252 ]6253 }, 6254 {6255 "name": "uni0475", 6256 "unicode": 1141, 6257 "contours": [6258 16259 ]6260 }, 6261 {6262 "name": "uni0476", 6263 "unicode": 1142, 6264 "contours": [6265 36266 ]6267 }, 6268 {6269 "name": "uni0477", 6270 "unicode": 1143, 6271 "contours": [6272 36273 ]6274 }, 6275 {6276 "name": "uni0478", 6277 "unicode": 1144, 6278 "contours": [6279 36280 ]6281 }, 6282 {6283 "name": "uni0479", 6284 "unicode": 1145, 6285 "contours": [6286 36287 ]6288 }, 6289 {6290 "name": "uni047A", 6291 "unicode": 1146, 6292 "contours": [6293 26294 ]6295 }, 6296 {6297 "name": "questiondown", 6298 "unicode": 191, 6299 "contours": [6300 26301 ]6302 }, 6303 {6304 "name": "uni047C", 6305 "unicode": 1148, 6306 "contours": [6307 36308 ]6309 }, 6310 {6311 "name": "uni047D", 6312 "unicode": 1149, 6313 "contours": [6314 36315 ]6316 }, 6317 {6318 "name": "uni047E", 6319 "unicode": 1150, 6320 "contours": [6321 26322 ]6323 }, 6324 {6325 "name": "uni047F", 6326 "unicode": 1151, 6327 "contours": [6328 26329 ]6330 }, 6331 {6332 "name": "uni0480", 6333 "unicode": 1152, 6334 "contours": [6335 16336 ]6337 }, 6338 {6339 "name": "uni0481", 6340 "unicode": 1153, 6341 "contours": [6342 16343 ]6344 }, 6345 {6346 "name": "uni0482", 6347 "unicode": 1154, 6348 "contours": [6349 16350 ]6351 }, 6352 {6353 "name": "uni0483", 6354 "unicode": 1155, 6355 "contours": [6356 16357 ]6358 }, 6359 {6360 "name": "uni0484", 6361 "unicode": 1156, 6362 "contours": [6363 16364 ]6365 }, 6366 {6367 "name": "uni0485", 6368 "unicode": 1157, 6369 "contours": [6370 16371 ]6372 }, 6373 {6374 "name": "uni0486", 6375 "unicode": 1158, 6376 "contours": [6377 16378 ]6379 }, 6380 {6381 "name": "Aacute", 6382 "unicode": 193, 6383 "contours": [6384 36385 ]6386 }, 6387 {6388 "name": "uni0488", 6389 "unicode": 1160, 6390 "contours": [6391 86392 ]6393 }, 6394 {6395 "name": "uni0489", 6396 "unicode": 1161, 6397 "contours": [6398 86399 ]6400 }, 6401 {6402 "name": "uni048A", 6403 "unicode": 1162, 6404 "contours": [6405 2, 6406 36407 ]6408 }, 6409 {6410 "name": "uni048B", 6411 "unicode": 1163, 6412 "contours": [6413 2, 6414 36415 ]6416 }, 6417 {6418 "name": "uni048C", 6419 "unicode": 1164, 6420 "contours": [6421 26422 ]6423 }, 6424 {6425 "name": "uni048D", 6426 "unicode": 1165, 6427 "contours": [6428 26429 ]6430 }, 6431 {6432 "name": "uni048E", 6433 "unicode": 1166, 6434 "contours": [6435 1, 6436 26437 ]6438 }, 6439 {6440 "name": "uni048F", 6441 "unicode": 1167, 6442 "contours": [6443 26444 ]6445 }, 6446 {6447 "name": "uni0490", 6448 "unicode": 1168, 6449 "contours": [6450 16451 ]6452 }, 6453 {6454 "name": "uni0491", 6455 "unicode": 1169, 6456 "contours": [6457 16458 ]6459 }, 6460 {6461 "name": "uni0492", 6462 "unicode": 1170, 6463 "contours": [6464 16465 ]6466 }, 6467 {6468 "name": "uni0493", 6469 "unicode": 1171, 6470 "contours": [6471 16472 ]6473 }, 6474 {6475 "name": "uni0494", 6476 "unicode": 1172, 6477 "contours": [6478 16479 ]6480 }, 6481 {6482 "name": "uni0495", 6483 "unicode": 1173, 6484 "contours": [6485 16486 ]6487 }, 6488 {6489 "name": "uni0496", 6490 "unicode": 1174, 6491 "contours": [6492 1, 6493 26494 ]6495 }, 6496 {6497 "name": "uni0497", 6498 "unicode": 1175, 6499 "contours": [6500 1, 6501 26502 ]6503 }, 6504 {6505 "name": "uni0498", 6506 "unicode": 1176, 6507 "contours": [6508 1, 6509 26510 ]6511 }, 6512 {6513 "name": "uni0499", 6514 "unicode": 1177, 6515 "contours": [6516 1, 6517 26518 ]6519 }, 6520 {6521 "name": "uni049A", 6522 "unicode": 1178, 6523 "contours": [6524 1, 6525 26526 ]6527 }, 6528 {6529 "name": "uni049B", 6530 "unicode": 1179, 6531 "contours": [6532 1, 6533 26534 ]6535 }, 6536 {6537 "name": "uni049C", 6538 "unicode": 1180, 6539 "contours": [6540 16541 ]6542 }, 6543 {6544 "name": "uni049D", 6545 "unicode": 1181, 6546 "contours": [6547 16548 ]6549 }, 6550 {6551 "name": "uni049E", 6552 "unicode": 1182, 6553 "contours": [6554 16555 ]6556 }, 6557 {6558 "name": "uni049F", 6559 "unicode": 1183, 6560 "contours": [6561 1, 6562 26563 ]6564 }, 6565 {6566 "name": "uni04A0", 6567 "unicode": 1184, 6568 "contours": [6569 16570 ]6571 }, 6572 {6573 "name": "uni04A1", 6574 "unicode": 1185, 6575 "contours": [6576 16577 ]6578 }, 6579 {6580 "name": "uni04A2", 6581 "unicode": 1186, 6582 "contours": [6583 1, 6584 26585 ]6586 }, 6587 {6588 "name": "uni04A3", 6589 "unicode": 1187, 6590 "contours": [6591 1, 6592 26593 ]6594 }, 6595 {6596 "name": "uni04A4", 6597 "unicode": 1188, 6598 "contours": [6599 16600 ]6601 }, 6602 {6603 "name": "uni04A5", 6604 "unicode": 1189, 6605 "contours": [6606 16607 ]6608 }, 6609 {6610 "name": "uni04A6", 6611 "unicode": 1190, 6612 "contours": [6613 16614 ]6615 }, 6616 {6617 "name": "uni04A7", 6618 "unicode": 1191, 6619 "contours": [6620 16621 ]6622 }, 6623 {6624 "name": "uni04A8", 6625 "unicode": 1192, 6626 "contours": [6627 26628 ]6629 }, 6630 {6631 "name": "uni04A9", 6632 "unicode": 1193, 6633 "contours": [6634 26635 ]6636 }, 6637 {6638 "name": "uni04AA", 6639 "unicode": 1194, 6640 "contours": [6641 1, 6642 26643 ]6644 }, 6645 {6646 "name": "uni04AB", 6647 "unicode": 1195, 6648 "contours": [6649 1, 6650 26651 ]6652 }, 6653 {6654 "name": "uni04AC", 6655 "unicode": 1196, 6656 "contours": [6657 1, 6658 26659 ]6660 }, 6661 {6662 "name": "uni04AD", 6663 "unicode": 1197, 6664 "contours": [6665 1, 6666 26667 ]6668 }, 6669 {6670 "name": "uni04AE", 6671 "unicode": 1198, 6672 "contours": [6673 16674 ]6675 }, 6676 {6677 "name": "uni04AF", 6678 "unicode": 1199, 6679 "contours": [6680 16681 ]6682 }, 6683 {6684 "name": "uni04B0", 6685 "unicode": 1200, 6686 "contours": [6687 16688 ]6689 }, 6690 {6691 "name": "uni04B1", 6692 "unicode": 1201, 6693 "contours": [6694 16695 ]6696 }, 6697 {6698 "name": "uni04B2", 6699 "unicode": 1202, 6700 "contours": [6701 1, 6702 26703 ]6704 }, 6705 {6706 "name": "uni04B3", 6707 "unicode": 1203, 6708 "contours": [6709 1, 6710 26711 ]6712 }, 6713 {6714 "name": "uni04B4", 6715 "unicode": 1204, 6716 "contours": [6717 16718 ]6719 }, 6720 {6721 "name": "uni04B5", 6722 "unicode": 1205, 6723 "contours": [6724 16725 ]6726 }, 6727 {6728 "name": "uni04B6", 6729 "unicode": 1206, 6730 "contours": [6731 1, 6732 26733 ]6734 }, 6735 {6736 "name": "uni04B7", 6737 "unicode": 1207, 6738 "contours": [6739 1, 6740 26741 ]6742 }, 6743 {6744 "name": "uni04B8", 6745 "unicode": 1208, 6746 "contours": [6747 16748 ]6749 }, 6750 {6751 "name": "uni04B9", 6752 "unicode": 1209, 6753 "contours": [6754 16755 ]6756 }, 6757 {6758 "name": "uni04BA", 6759 "unicode": 1210, 6760 "contours": [6761 16762 ]6763 }, 6764 {6765 "name": "uni04BB", 6766 "unicode": 1211, 6767 "contours": [6768 16769 ]6770 }, 6771 {6772 "name": "uni04BC", 6773 "unicode": 1212, 6774 "contours": [6775 26776 ]6777 }, 6778 {6779 "name": "uni04BD", 6780 "unicode": 1213, 6781 "contours": [6782 26783 ]6784 }, 6785 {6786 "name": "uni04BE", 6787 "unicode": 1214, 6788 "contours": [6789 2, 6790 36791 ]6792 }, 6793 {6794 "name": "uni04BF", 6795 "unicode": 1215, 6796 "contours": [6797 2, 6798 36799 ]6800 }, 6801 {6802 "name": "uni04C0", 6803 "unicode": 1216, 6804 "contours": [6805 16806 ]6807 }, 6808 {6809 "name": "uni04C1", 6810 "unicode": 1217, 6811 "contours": [6812 26813 ]6814 }, 6815 {6816 "name": "uni04C2", 6817 "unicode": 1218, 6818 "contours": [6819 26820 ]6821 }, 6822 {6823 "name": "uni04C3", 6824 "unicode": 1219, 6825 "contours": [6826 16827 ]6828 }, 6829 {6830 "name": "uni04C4", 6831 "unicode": 1220, 6832 "contours": [6833 16834 ]6835 }, 6836 {6837 "name": "uni04C5", 6838 "unicode": 1221, 6839 "contours": [6840 1, 6841 26842 ]6843 }, 6844 {6845 "name": "uni04C6", 6846 "unicode": 1222, 6847 "contours": [6848 1, 6849 26850 ]6851 }, 6852 {6853 "name": "uni04C7", 6854 "unicode": 1223, 6855 "contours": [6856 16857 ]6858 }, 6859 {6860 "name": "uni04C8", 6861 "unicode": 1224, 6862 "contours": [6863 16864 ]6865 }, 6866 {6867 "name": "uni04C9", 6868 "unicode": 1225, 6869 "contours": [6870 1, 6871 26872 ]6873 }, 6874 {6875 "name": "uni04CA", 6876 "unicode": 1226, 6877 "contours": [6878 1, 6879 26880 ]6881 }, 6882 {6883 "name": "uni04CB", 6884 "unicode": 1227, 6885 "contours": [6886 1, 6887 26888 ]6889 }, 6890 {6891 "name": "uni04CC", 6892 "unicode": 1228, 6893 "contours": [6894 1, 6895 26896 ]6897 }, 6898 {6899 "name": "uni04CD", 6900 "unicode": 1229, 6901 "contours": [6902 1, 6903 26904 ]6905 }, 6906 {6907 "name": "uni04CE", 6908 "unicode": 1230, 6909 "contours": [6910 1, 6911 26912 ]6913 }, 6914 {6915 "name": "uni04CF", 6916 "unicode": 1231, 6917 "contours": [6918 16919 ]6920 }, 6921 {6922 "name": "uni04D0", 6923 "unicode": 1232, 6924 "contours": [6925 36926 ]6927 }, 6928 {6929 "name": "uni04D1", 6930 "unicode": 1233, 6931 "contours": [6932 36933 ]6934 }, 6935 {6936 "name": "uni04D2", 6937 "unicode": 1234, 6938 "contours": [6939 46940 ]6941 }, 6942 {6943 "name": "uni04D3", 6944 "unicode": 1235, 6945 "contours": [6946 46947 ]6948 }, 6949 {6950 "name": "uni04D4", 6951 "unicode": 1236, 6952 "contours": [6953 26954 ]6955 }, 6956 {6957 "name": "uni04D5", 6958 "unicode": 1237, 6959 "contours": [6960 36961 ]6962 }, 6963 {6964 "name": "uni04D6", 6965 "unicode": 1238, 6966 "contours": [6967 26968 ]6969 }, 6970 {6971 "name": "uni04D7", 6972 "unicode": 1239, 6973 "contours": [6974 36975 ]6976 }, 6977 {6978 "name": "uni04D8", 6979 "unicode": 1240, 6980 "contours": [6981 26982 ]6983 }, 6984 {6985 "name": "uni04D9", 6986 "unicode": 1241, 6987 "contours": [6988 26989 ]6990 }, 6991 {6992 "name": "uni04DA", 6993 "unicode": 1242, 6994 "contours": [6995 46996 ]6997 }, 6998 {6999 "name": "uni04DB", 7000 "unicode": 1243, 7001 "contours": [7002 47003 ]7004 }, 7005 {7006 "name": "uni04DC", 7007 "unicode": 1244, 7008 "contours": [7009 37010 ]7011 }, 7012 {7013 "name": "uni04DD", 7014 "unicode": 1245, 7015 "contours": [7016 37017 ]7018 }, 7019 {7020 "name": "uni04DE", 7021 "unicode": 1246, 7022 "contours": [7023 37024 ]7025 }, 7026 {7027 "name": "uni04DF", 7028 "unicode": 1247, 7029 "contours": [7030 37031 ]7032 }, 7033 {7034 "name": "uni04E0", 7035 "unicode": 1248, 7036 "contours": [7037 17038 ]7039 }, 7040 {7041 "name": "uni04E1", 7042 "unicode": 1249, 7043 "contours": [7044 17045 ]7046 }, 7047 {7048 "name": "uni04E2", 7049 "unicode": 1250, 7050 "contours": [7051 27052 ]7053 }, 7054 {7055 "name": "uni04E3", 7056 "unicode": 1251, 7057 "contours": [7058 27059 ]7060 }, 7061 {7062 "name": "uni04E4", 7063 "unicode": 1252, 7064 "contours": [7065 37066 ]7067 }, 7068 {7069 "name": "uni04E5", 7070 "unicode": 1253, 7071 "contours": [7072 37073 ]7074 }, 7075 {7076 "name": "uni04E6", 7077 "unicode": 1254, 7078 "contours": [7079 47080 ]7081 }, 7082 {7083 "name": "uni04E7", 7084 "unicode": 1255, 7085 "contours": [7086 47087 ]7088 }, 7089 {7090 "name": "uni04E8", 7091 "unicode": 1256, 7092 "contours": [7093 37094 ]7095 }, 7096 {7097 "name": "uni04E9", 7098 "unicode": 1257, 7099 "contours": [7100 37101 ]7102 }, 7103 {7104 "name": "uni04EA", 7105 "unicode": 1258, 7106 "contours": [7107 57108 ]7109 }, 7110 {7111 "name": "uni04EB", 7112 "unicode": 1259, 7113 "contours": [7114 57115 ]7116 }, 7117 {7118 "name": "uni04EC", 7119 "unicode": 1260, 7120 "contours": [7121 37122 ]7123 }, 7124 {7125 "name": "uni04ED", 7126 "unicode": 1261, 7127 "contours": [7128 37129 ]7130 }, 7131 {7132 "name": "uni04EE", 7133 "unicode": 1262, 7134 "contours": [7135 27136 ]7137 }, 7138 {7139 "name": "uni04EF", 7140 "unicode": 1263, 7141 "contours": [7142 27143 ]7144 }, 7145 {7146 "name": "uni04F0", 7147 "unicode": 1264, 7148 "contours": [7149 37150 ]7151 }, 7152 {7153 "name": "uni04F1", 7154 "unicode": 1265, 7155 "contours": [7156 37157 ]7158 }, 7159 {7160 "name": "uni04F2", 7161 "unicode": 1266, 7162 "contours": [7163 37164 ]7165 }, 7166 {7167 "name": "uni04F3", 7168 "unicode": 1267, 7169 "contours": [7170 37171 ]7172 }, 7173 {7174 "name": "uni04F4", 7175 "unicode": 1268, 7176 "contours": [7177 37178 ]7179 }, 7180 {7181 "name": "uni04F5", 7182 "unicode": 1269, 7183 "contours": [7184 37185 ]7186 }, 7187 {7188 "name": "uni04F6", 7189 "unicode": 1270, 7190 "contours": [7191 1, 7192 27193 ]7194 }, 7195 {7196 "name": "uni04F7", 7197 "unicode": 1271, 7198 "contours": [7199 1, 7200 27201 ]7202 }, 7203 {7204 "name": "uni04F8", 7205 "unicode": 1272, 7206 "contours": [7207 57208 ]7209 }, 7210 {7211 "name": "uni04F9", 7212 "unicode": 1273, 7213 "contours": [7214 57215 ]7216 }, 7217 {7218 "name": "uni04FA", 7219 "unicode": 1274, 7220 "contours": [7221 1, 7222 37223 ]7224 }, 7225 {7226 "name": "uni04FB", 7227 "unicode": 1275, 7228 "contours": [7229 1, 7230 37231 ]7232 }, 7233 {7234 "name": "uni04FC", 7235 "unicode": 1276, 7236 "contours": [7237 1, 7238 27239 ]7240 }, 7241 {7242 "name": "uni04FD", 7243 "unicode": 1277, 7244 "contours": [7245 1, 7246 27247 ]7248 }, 7249 {7250 "name": "uni04FE", 7251 "unicode": 1278, 7252 "contours": [7253 17254 ]7255 }, 7256 {7257 "name": "uni04FF", 7258 "unicode": 1279, 7259 "contours": [7260 17261 ]7262 }, 7263 {7264 "name": "SF100000", 7265 "unicode": 9472, 7266 "contours": [7267 17268 ]7269 }, 7270 {7271 "name": "uni0501", 7272 "unicode": 1281, 7273 "contours": [7274 27275 ]7276 }, 7277 {7278 "name": "SF110000", 7279 "unicode": 9474, 7280 "contours": [7281 17282 ]7283 }, 7284 {7285 "name": "uni0503", 7286 "unicode": 1283, 7287 "contours": [7288 27289 ]7290 }, 7291 {7292 "name": "uni0504", 7293 "unicode": 1284, 7294 "contours": [7295 17296 ]7297 }, 7298 {7299 "name": "uni0505", 7300 "unicode": 1285, 7301 "contours": [7302 17303 ]7304 }, 7305 {7306 "name": "uni0506", 7307 "unicode": 1286, 7308 "contours": [7309 17310 ]7311 }, 7312 {7313 "name": "uni0507", 7314 "unicode": 1287, 7315 "contours": [7316 17317 ]7318 }, 7319 {7320 "name": "uni0508", 7321 "unicode": 1288, 7322 "contours": [7323 17324 ]7325 }, 7326 {7327 "name": "uni0509", 7328 "unicode": 1289, 7329 "contours": [7330 17331 ]7332 }, 7333 {7334 "name": "uni050A", 7335 "unicode": 1290, 7336 "contours": [7337 17338 ]7339 }, 7340 {7341 "name": "uni050B", 7342 "unicode": 1291, 7343 "contours": [7344 17345 ]7346 }, 7347 {7348 "name": "SF010000", 7349 "unicode": 9484, 7350 "contours": [7351 17352 ]7353 }, 7354 {7355 "name": "uni050D", 7356 "unicode": 1293, 7357 "contours": [7358 17359 ]7360 }, 7361 {7362 "name": "uni050E", 7363 "unicode": 1294, 7364 "contours": [7365 17366 ]7367 }, 7368 {7369 "name": "uni050F", 7370 "unicode": 1295, 7371 "contours": [7372 17373 ]7374 }, 7375 {7376 "name": "uni0510", 7377 "unicode": 1296, 7378 "contours": [7379 17380 ]7381 }, 7382 {7383 "name": "uni0511", 7384 "unicode": 1297, 7385 "contours": [7386 17387 ]7388 }, 7389 {7390 "name": "uni0512", 7391 "unicode": 1298, 7392 "contours": [7393 1, 7394 27395 ]7396 }, 7397 {7398 "name": "uni0513", 7399 "unicode": 1299, 7400 "contours": [7401 1, 7402 27403 ]7404 }, 7405 {7406 "name": "SF020000", 7407 "unicode": 9492, 7408 "contours": [7409 17410 ]7411 }, 7412 {7413 "name": "SF040000", 7414 "unicode": 9496, 7415 "contours": [7416 17417 ]7418 }, 7419 {7420 "name": "uni051A", 7421 "unicode": 1306, 7422 "contours": [7423 27424 ]7425 }, 7426 {7427 "name": "uni051B", 7428 "unicode": 1307, 7429 "contours": [7430 27431 ]7432 }, 7433 {7434 "name": "uni051C", 7435 "unicode": 1308, 7436 "contours": [7437 17438 ]7439 }, 7440 {7441 "name": "uni051D", 7442 "unicode": 1309, 7443 "contours": [7444 17445 ]7446 }, 7447 {7448 "name": "uni2023", 7449 "unicode": 8227, 7450 "contours": [7451 17452 ]7453 }, 7454 {7455 "name": "uni0524", 7456 "unicode": 1316, 7457 "contours": [7458 17459 ]7460 }, 7461 {7462 "name": "uni0525", 7463 "unicode": 1317, 7464 "contours": [7465 17466 ]7467 }, 7468 {7469 "name": "uni0526", 7470 "unicode": 1318, 7471 "contours": [7472 17473 ]7474 }, 7475 {7476 "name": "uni0527", 7477 "unicode": 1319, 7478 "contours": [7479 17480 ]7481 }, 7482 {7483 "name": "uni0528", 7484 "unicode": 1320, 7485 "contours": [7486 17487 ]7488 }, 7489 {7490 "name": "uni0529", 7491 "unicode": 1321, 7492 "contours": [7493 17494 ]7495 }, 7496 {7497 "name": "SF060000", 7498 "unicode": 9516, 7499 "contours": [7500 17501 ]7502 }, 7503 {7504 "name": "uni052E", 7505 "unicode": 1326, 7506 "contours": [7507 17508 ]7509 }, 7510 {7511 "name": "uni052F", 7512 "unicode": 1327, 7513 "contours": [7514 17515 ]7516 }, 7517 {7518 "name": "SF070000", 7519 "unicode": 9524, 7520 "contours": [7521 17522 ]7523 }, 7524 {7525 "name": "SF050000", 7526 "unicode": 9532, 7527 "contours": [7528 17529 ]7530 }, 7531 {7532 "name": "onedotenleader", 7533 "unicode": 8228, 7534 "contours": [7535 17536 ]7537 }, 7538 {7539 "name": "SF430000", 7540 "unicode": 9552, 7541 "contours": [7542 27543 ]7544 }, 7545 {7546 "name": "SF240000", 7547 "unicode": 9553, 7548 "contours": [7549 27550 ]7551 }, 7552 {7553 "name": "SF510000", 7554 "unicode": 9554, 7555 "contours": [7556 27557 ]7558 }, 7559 {7560 "name": "SF520000", 7561 "unicode": 9555, 7562 "contours": [7563 27564 ]7565 }, 7566 {7567 "name": "SF390000", 7568 "unicode": 9556, 7569 "contours": [7570 27571 ]7572 }, 7573 {7574 "name": "SF220000", 7575 "unicode": 9557, 7576 "contours": [7577 27578 ]7579 }, 7580 {7581 "name": "SF210000", 7582 "unicode": 9558, 7583 "contours": [7584 27585 ]7586 }, 7587 {7588 "name": "SF250000", 7589 "unicode": 9559, 7590 "contours": [7591 27592 ]7593 }, 7594 {7595 "name": "SF500000", 7596 "unicode": 9560, 7597 "contours": [7598 27599 ]7600 }, 7601 {7602 "name": "SF490000", 7603 "unicode": 9561, 7604 "contours": [7605 27606 ]7607 }, 7608 {7609 "name": "SF380000", 7610 "unicode": 9562, 7611 "contours": [7612 27613 ]7614 }, 7615 {7616 "name": "SF280000", 7617 "unicode": 9563, 7618 "contours": [7619 27620 ]7621 }, 7622 {7623 "name": "SF270000", 7624 "unicode": 9564, 7625 "contours": [7626 27627 ]7628 }, 7629 {7630 "name": "SF260000", 7631 "unicode": 9565, 7632 "contours": [7633 27634 ]7635 }, 7636 {7637 "name": "SF360000", 7638 "unicode": 9566, 7639 "contours": [7640 27641 ]7642 }, 7643 {7644 "name": "SF370000", 7645 "unicode": 9567, 7646 "contours": [7647 27648 ]7649 }, 7650 {7651 "name": "SF420000", 7652 "unicode": 9568, 7653 "contours": [7654 37655 ]7656 }, 7657 {7658 "name": "SF190000", 7659 "unicode": 9569, 7660 "contours": [7661 27662 ]7663 }, 7664 {7665 "name": "SF200000", 7666 "unicode": 9570, 7667 "contours": [7668 27669 ]7670 }, 7671 {7672 "name": "SF230000", 7673 "unicode": 9571, 7674 "contours": [7675 37676 ]7677 }, 7678 {7679 "name": "SF470000", 7680 "unicode": 9572, 7681 "contours": [7682 27683 ]7684 }, 7685 {7686 "name": "SF480000", 7687 "unicode": 9573, 7688 "contours": [7689 17690 ]7691 }, 7692 {7693 "name": "SF410000", 7694 "unicode": 9574, 7695 "contours": [7696 37697 ]7698 }, 7699 {7700 "name": "SF450000", 7701 "unicode": 9575, 7702 "contours": [7703 27704 ]7705 }, 7706 {7707 "name": "SF460000", 7708 "unicode": 9576, 7709 "contours": [7710 17711 ]7712 }, 7713 {7714 "name": "SF400000", 7715 "unicode": 9577, 7716 "contours": [7717 37718 ]7719 }, 7720 {7721 "name": "SF540000", 7722 "unicode": 9578, 7723 "contours": [7724 17725 ]7726 }, 7727 {7728 "name": "SF530000", 7729 "unicode": 9579, 7730 "contours": [7731 17732 ]7733 }, 7734 {7735 "name": "SF440000", 7736 "unicode": 9580, 7737 "contours": [7738 47739 ]7740 }, 7741 {7742 "name": "ellipsis", 7743 "unicode": 8230, 7744 "contours": [7745 37746 ]7747 }, 7748 {7749 "name": "block", 7750 "unicode": 9608, 7751 "contours": [7752 17753 ]7754 }, 7755 {7756 "name": "uni058F", 7757 "unicode": 1423, 7758 "contours": [7759 17760 ]7761 }, 7762 {7763 "name": "ltshade", 7764 "unicode": 9617, 7765 "contours": [7766 467767 ]7768 }, 7769 {7770 "name": "shade", 7771 "unicode": 9618, 7772 "contours": [7773 857774 ]7775 }, 7776 {7777 "name": "dkshade", 7778 "unicode": 9619, 7779 "contours": [7780 737781 ]7782 }, 7783 {7784 "name": "uni2027", 7785 "unicode": 8231, 7786 "contours": [7787 17788 ]7789 }, 7790 {7791 "name": "uni25A0", 7792 "unicode": 9632, 7793 "contours": [7794 17795 ]7796 }, 7797 {7798 "name": "uni25A1", 7799 "unicode": 9633, 7800 "contours": [7801 27802 ]7803 }, 7804 {7805 "name": "uni25AA", 7806 "unicode": 9642, 7807 "contours": [7808 17809 ]7810 }, 7811 {7812 "name": "uni25AB", 7813 "unicode": 9643, 7814 "contours": [7815 27816 ]7817 }, 7818 {7819 "name": "triagup", 7820 "unicode": 9650, 7821 "contours": [7822 17823 ]7824 }, 7825 {7826 "name": "uni25B3", 7827 "unicode": 9651, 7828 "contours": [7829 27830 ]7831 }, 7832 {7833 "name": "uni25B6", 7834 "unicode": 9654, 7835 "contours": [7836 17837 ]7838 }, 7839 {7840 "name": "uni25B7", 7841 "unicode": 9655, 7842 "contours": [7843 27844 ]7845 }, 7846 {7847 "name": "triagdn", 7848 "unicode": 9660, 7849 "contours": [7850 17851 ]7852 }, 7853 {7854 "name": "uni25BD", 7855 "unicode": 9661, 7856 "contours": [7857 27858 ]7859 }, 7860 {7861 "name": "uni25C0", 7862 "unicode": 9664, 7863 "contours": [7864 17865 ]7866 }, 7867 {7868 "name": "uni25C1", 7869 "unicode": 9665, 7870 "contours": [7871 27872 ]7873 }, 7874 {7875 "name": "uni25C6", 7876 "unicode": 9670, 7877 "contours": [7878 17879 ]7880 }, 7881 {7882 "name": "uni25C7", 7883 "unicode": 9671, 7884 "contours": [7885 27886 ]7887 }, 7888 {7889 "name": "uni25C9", 7890 "unicode": 9673, 7891 "contours": [7892 37893 ]7894 }, 7895 {7896 "name": "lozenge", 7897 "unicode": 9674, 7898 "contours": [7899 27900 ]7901 }, 7902 {7903 "name": "circle", 7904 "unicode": 9675, 7905 "contours": [7906 27907 ]7908 }, 7909 {7910 "name": "uni25CC", 7911 "unicode": 9676, 7912 "contours": [7913 16, 7914 127915 ]7916 }, 7917 {7918 "name": "uni25CF", 7919 "unicode": 9679, 7920 "contours": [7921 17922 ]7923 }, 7924 {7925 "name": "uniE0FF", 7926 "unicode": 57599, 7927 "contours": [7928 77929 ]7930 }, 7931 {7932 "name": "uni2102", 7933 "unicode": 8450, 7934 "contours": [7935 27936 ]7937 }, 7938 {7939 "name": "uni2610", 7940 "unicode": 9744, 7941 "contours": [7942 27943 ]7944 }, 7945 {7946 "name": "uni2611", 7947 "unicode": 9745, 7948 "contours": [7949 27950 ]7951 }, 7952 {7953 "name": "uni2105", 7954 "unicode": 8453, 7955 "contours": [7956 47957 ]7958 }, 7959 {7960 "name": "uni210A", 7961 "unicode": 8458, 7962 "contours": [7963 27964 ]7965 }, 7966 {7967 "name": "uni210D", 7968 "unicode": 8461, 7969 "contours": [7970 27971 ]7972 }, 7973 {7974 "name": "musicalnote", 7975 "unicode": 9834, 7976 "contours": [7977 17978 ]7979 }, 7980 {7981 "name": "emacron", 7982 "unicode": 275, 7983 "contours": [7984 37985 ]7986 }, 7987 {7988 "name": "uni0002", 7989 "unicode": 2, 7990 "contours": [7991 07992 ]7993 }, 7994 {7995 "name": "uni2115", 7996 "unicode": 8469, 7997 "contours": [7998 27999 ]8000 }, 8001 {8002 "name": "Edotaccent", 8003 "unicode": 278, 8004 "contours": [8005 28006 ]8007 }, 8008 {8009 "name": "uni202F", 8010 "unicode": 8239, 8011 "contours": [8012 08013 ]8014 }, 8015 {8016 "name": "uni2117", 8017 "unicode": 8471, 8018 "contours": [8019 3, 8020 48021 ]8022 }, 8023 {8024 "name": "uni2119", 8025 "unicode": 8473, 8026 "contours": [8027 28028 ]8029 }, 8030 {8031 "name": "uni211A", 8032 "unicode": 8474, 8033 "contours": [8034 38035 ]8036 }, 8037 {8038 "name": "perthousand", 8039 "unicode": 8240, 8040 "contours": [8041 6, 8042 78043 ]8044 }, 8045 {8046 "name": "uni26AD", 8047 "unicode": 9901, 8048 "contours": [8049 48050 ]8051 }, 8052 {8053 "name": "uni26AE", 8054 "unicode": 9902, 8055 "contours": [8056 38057 ]8058 }, 8059 {8060 "name": "uni26AF", 8061 "unicode": 9903, 8062 "contours": [8063 38064 ]8065 }, 8066 {8067 "name": "nine", 8068 "unicode": 57, 8069 "contours": [8070 1, 8071 28072 ]8073 }, 8074 {8075 "name": "Gdotaccent", 8076 "unicode": 288, 8077 "contours": [8078 28079 ]8080 }, 8081 {8082 "name": "uni2031", 8083 "unicode": 8241, 8084 "contours": [8085 98086 ]8087 }, 8088 {8089 "name": "trademark", 8090 "unicode": 8482, 8091 "contours": [8092 28093 ]8094 }, 8095 {8096 "name": "colon", 8097 "unicode": 58, 8098 "contours": [8099 28100 ]8101 }, 8102 {8103 "name": "uni2124", 8104 "unicode": 8484, 8105 "contours": [8106 28107 ]8108 }, 8109 {8110 "name": "Hbar", 8111 "unicode": 294, 8112 "contours": [8113 28114 ]8115 }, 8116 {8117 "name": "uniE000", 8118 "unicode": 57344, 8119 "contours": [8120 18121 ]8122 }, 8123 {8124 "name": "ibreve", 8125 "unicode": 301, 8126 "contours": [8127 28128 ]8129 }, 8130 {8131 "name": "uni2713", 8132 "unicode": 10003, 8133 "contours": [8134 18135 ]8136 }, 8137 {8138 "name": "Iogonek", 8139 "unicode": 302, 8140 "contours": [8141 1, 8142 28143 ]8144 }, 8145 {8146 "name": "uni2034", 8147 "unicode": 8244, 8148 "contours": [8149 38150 ]8151 }, 8152 {8153 "name": "ij", 8154 "unicode": 307, 8155 "contours": [8156 3, 8157 48158 ]8159 }, 8160 {8161 "name": "uni2035", 8162 "unicode": 8245, 8163 "contours": [8164 18165 ]8166 }, 8167 {8168 "name": "uni2752", 8169 "unicode": 10066, 8170 "contours": [8171 28172 ]8173 }, 8174 {8175 "name": "uni275B", 8176 "unicode": 10075, 8177 "contours": [8178 18179 ]8180 }, 8181 {8182 "name": "uni275C", 8183 "unicode": 10076, 8184 "contours": [8185 18186 ]8187 }, 8188 {8189 "name": "uni275D", 8190 "unicode": 10077, 8191 "contours": [8192 18193 ]8194 }, 8195 {8196 "name": "uni275E", 8197 "unicode": 10078, 8198 "contours": [8199 18200 ]8201 }, 8202 {8203 "name": "uni2761", 8204 "unicode": 10081, 8205 "contours": [8206 28207 ]8208 }, 8209 {8210 "name": "uni2037", 8211 "unicode": 8247, 8212 "contours": [8213 38214 ]8215 }, 8216 {8217 "name": "uni2780", 8218 "unicode": 10112, 8219 "contours": [8220 38221 ]8222 }, 8223 {8224 "name": "uni2781", 8225 "unicode": 10113, 8226 "contours": [8227 38228 ]8229 }, 8230 {8231 "name": "uni2782", 8232 "unicode": 10114, 8233 "contours": [8234 38235 ]8236 }, 8237 {8238 "name": "uni2783", 8239 "unicode": 10115, 8240 "contours": [8241 48242 ]8243 }, 8244 {8245 "name": "uni2784", 8246 "unicode": 10116, 8247 "contours": [8248 38249 ]8250 }, 8251 {8252 "name": "uni2785", 8253 "unicode": 10117, 8254 "contours": [8255 48256 ]8257 }, 8258 {8259 "name": "uni2786", 8260 "unicode": 10118, 8261 "contours": [8262 38263 ]8264 }, 8265 {8266 "name": "uni2787", 8267 "unicode": 10119, 8268 "contours": [8269 58270 ]8271 }, 8272 {8273 "name": "uni2788", 8274 "unicode": 10120, 8275 "contours": [8276 48277 ]8278 }, 8279 {8280 "name": "uniA78B", 8281 "unicode": 42891, 8282 "contours": [8283 18284 ]8285 }, 8286 {8287 "name": "uniA78C", 8288 "unicode": 42892, 8289 "contours": [8290 18291 ]8292 }, 8293 {8294 "name": "uniFFFC", 8295 "unicode": 65532, 8296 "contours": [8297 228298 ]8299 }, 8300 {8301 "name": "uni2038", 8302 "unicode": 8248, 8303 "contours": [8304 18305 ]8306 }, 8307 {8308 "name": "uniFFFD", 8309 "unicode": 65533, 8310 "contours": [8311 3, 8312 58313 ]8314 }, 8315 {8316 "name": "uni27C2", 8317 "unicode": 10178, 8318 "contours": [8319 18320 ]8321 }, 8322 {8323 "name": "uni27E8", 8324 "unicode": 10216, 8325 "contours": [8326 18327 ]8328 }, 8329 {8330 "name": "uni27E9", 8331 "unicode": 10217, 8332 "contours": [8333 18334 ]8335 }, 8336 {8337 "name": "oe", 8338 "unicode": 339, 8339 "contours": [8340 38341 ]8342 }, 8343 {8344 "name": "Racute", 8345 "unicode": 340, 8346 "contours": [8347 38348 ]8349 }, 8350 {8351 "name": "onefifth", 8352 "unicode": 8533, 8353 "contours": [8354 38355 ]8356 }, 8357 {8358 "name": "twofifths", 8359 "unicode": 8534, 8360 "contours": [8361 38362 ]8363 }, 8364 {8365 "name": "threefifths", 8366 "unicode": 8535, 8367 "contours": [8368 38369 ]8370 }, 8371 {8372 "name": "fourfifths", 8373 "unicode": 8536, 8374 "contours": [8375 48376 ]8377 }, 8378 {8379 "name": "onesixth", 8380 "unicode": 8537, 8381 "contours": [8382 48383 ]8384 }, 8385 {8386 "name": "fivesixths", 8387 "unicode": 8538, 8388 "contours": [8389 48390 ]8391 }, 8392 {8393 "name": "sacute", 8394 "unicode": 347, 8395 "contours": [8396 28397 ]8398 }, 8399 {8400 "name": "threeeighths", 8401 "unicode": 8540, 8402 "contours": [8403 58404 ]8405 }, 8406 {8407 "name": "uni203D", 8408 "unicode": 8253, 8409 "contours": [8410 28411 ]8412 }, 8413 {8414 "name": "fiveeighths", 8415 "unicode": 8541, 8416 "contours": [8417 58418 ]8419 }, 8420 {8421 "name": "seveneighths", 8422 "unicode": 8542, 8423 "contours": [8424 58425 ]8426 }, 8427 {8428 "name": "uni203F", 8429 "unicode": 8255, 8430 "contours": [8431 18432 ]8433 }, 8434 {8435 "name": "utilde", 8436 "unicode": 361, 8437 "contours": [8438 28439 ]8440 }, 8441 {8442 "name": "uni2040", 8443 "unicode": 8256, 8444 "contours": [8445 18446 ]8447 }, 8448 {8449 "name": "I", 8450 "unicode": 73, 8451 "contours": [8452 18453 ]8454 }, 8455 {8456 "name": "uni2043", 8457 "unicode": 8259, 8458 "contours": [8459 18460 ]8461 }, 8462 {8463 "name": "uniA8FB", 8464 "unicode": 43259, 8465 "contours": [8466 18467 ]8468 }, 8469 {8470 "name": "fraction", 8471 "unicode": 8260, 8472 "contours": [8473 18474 ]8475 }, 8476 {8477 "name": "uni0901", 8478 "unicode": 2305, 8479 "contours": [8480 28481 ]8482 }, 8483 {8484 "name": "uni0902", 8485 "unicode": 2306, 8486 "contours": [8487 18488 ]8489 }, 8490 {8491 "name": "uni0903", 8492 "unicode": 2307, 8493 "contours": [8494 28495 ]8496 }, 8497 {8498 "name": "uni0904", 8499 "unicode": 2308, 8500 "contours": [8501 18502 ]8503 }, 8504 {8505 "name": "uni0905", 8506 "unicode": 2309, 8507 "contours": [8508 18509 ]8510 }, 8511 {8512 "name": "uni0906", 8513 "unicode": 2310, 8514 "contours": [8515 18516 ]8517 }, 8518 {8519 "name": "uni0907", 8520 "unicode": 2311, 8521 "contours": [8522 18523 ]8524 }, 8525 {8526 "name": "uni0908", 8527 "unicode": 2312, 8528 "contours": [8529 18530 ]8531 }, 8532 {8533 "name": "uni0909", 8534 "unicode": 2313, 8535 "contours": [8536 18537 ]8538 }, 8539 {8540 "name": "uni090A", 8541 "unicode": 2314, 8542 "contours": [8543 18544 ]8545 }, 8546 {8547 "name": "uni090B", 8548 "unicode": 2315, 8549 "contours": [8550 18551 ]8552 }, 8553 {8554 "name": "uni090C", 8555 "unicode": 2316, 8556 "contours": [8557 18558 ]8559 }, 8560 {8561 "name": "uni090D", 8562 "unicode": 2317, 8563 "contours": [8564 28565 ]8566 }, 8567 {8568 "name": "uni090E", 8569 "unicode": 2318, 8570 "contours": [8571 18572 ]8573 }, 8574 {8575 "name": "uni090F", 8576 "unicode": 2319, 8577 "contours": [8578 18579 ]8580 }, 8581 {8582 "name": "uni0910", 8583 "unicode": 2320, 8584 "contours": [8585 18586 ]8587 }, 8588 {8589 "name": "uni0911", 8590 "unicode": 2321, 8591 "contours": [8592 28593 ]8594 }, 8595 {8596 "name": "uni0912", 8597 "unicode": 2322, 8598 "contours": [8599 18600 ]8601 }, 8602 {8603 "name": "uni0913", 8604 "unicode": 2323, 8605 "contours": [8606 18607 ]8608 }, 8609 {8610 "name": "uni0914", 8611 "unicode": 2324, 8612 "contours": [8613 18614 ]8615 }, 8616 {8617 "name": "uni0915", 8618 "unicode": 2325, 8619 "contours": [8620 1, 8621 28622 ]8623 }, 8624 {8625 "name": "uni0916", 8626 "unicode": 2326, 8627 "contours": [8628 1, 8629 38630 ]8631 }, 8632 {8633 "name": "uni0917", 8634 "unicode": 2327, 8635 "contours": [8636 18637 ]8638 }, 8639 {8640 "name": "uni0918", 8641 "unicode": 2328, 8642 "contours": [8643 28644 ]8645 }, 8646 {8647 "name": "uni0919", 8648 "unicode": 2329, 8649 "contours": [8650 28651 ]8652 }, 8653 {8654 "name": "uni091A", 8655 "unicode": 2330, 8656 "contours": [8657 18658 ]8659 }, 8660 {8661 "name": "uni091B", 8662 "unicode": 2331, 8663 "contours": [8664 28665 ]8666 }, 8667 {8668 "name": "uni091C", 8669 "unicode": 2332, 8670 "contours": [8671 18672 ]8673 }, 8674 {8675 "name": "uni091D", 8676 "unicode": 2333, 8677 "contours": [8678 28679 ]8680 }, 8681 {8682 "name": "uni091E", 8683 "unicode": 2334, 8684 "contours": [8685 18686 ]8687 }, 8688 {8689 "name": "uni091F", 8690 "unicode": 2335, 8691 "contours": [8692 18693 ]8694 }, 8695 {8696 "name": "uni0920", 8697 "unicode": 2336, 8698 "contours": [8699 28700 ]8701 }, 8702 {8703 "name": "uni0921", 8704 "unicode": 2337, 8705 "contours": [8706 18707 ]8708 }, 8709 {8710 "name": "uni0922", 8711 "unicode": 2338, 8712 "contours": [8713 1, 8714 28715 ]8716 }, 8717 {8718 "name": "uni0923", 8719 "unicode": 2339, 8720 "contours": [8721 28722 ]8723 }, 8724 {8725 "name": "uni0924", 8726 "unicode": 2340, 8727 "contours": [8728 18729 ]8730 }, 8731 {8732 "name": "uni0925", 8733 "unicode": 2341, 8734 "contours": [8735 18736 ]8737 }, 8738 {8739 "name": "uni0926", 8740 "unicode": 2342, 8741 "contours": [8742 18743 ]8744 }, 8745 {8746 "name": "uni0927", 8747 "unicode": 2343, 8748 "contours": [8749 18750 ]8751 }, 8752 {8753 "name": "uni0928", 8754 "unicode": 2344, 8755 "contours": [8756 18757 ]8758 }, 8759 {8760 "name": "uni0929", 8761 "unicode": 2345, 8762 "contours": [8763 28764 ]8765 }, 8766 {8767 "name": "uni092A", 8768 "unicode": 2346, 8769 "contours": [8770 28771 ]8772 }, 8773 {8774 "name": "uni092B", 8775 "unicode": 2347, 8776 "contours": [8777 28778 ]8779 }, 8780 {8781 "name": "uni092C", 8782 "unicode": 2348, 8783 "contours": [8784 2, 8785 38786 ]8787 }, 8788 {8789 "name": "uni092D", 8790 "unicode": 2349, 8791 "contours": [8792 18793 ]8794 }, 8795 {8796 "name": "uni092E", 8797 "unicode": 2350, 8798 "contours": [8799 28800 ]8801 }, 8802 {8803 "name": "uni092F", 8804 "unicode": 2351, 8805 "contours": [8806 28807 ]8808 }, 8809 {8810 "name": "uni0930", 8811 "unicode": 2352, 8812 "contours": [8813 18814 ]8815 }, 8816 {8817 "name": "uni0931", 8818 "unicode": 2353, 8819 "contours": [8820 28821 ]8822 }, 8823 {8824 "name": "uni0932", 8825 "unicode": 2354, 8826 "contours": [8827 18828 ]8829 }, 8830 {8831 "name": "uni0933", 8832 "unicode": 2355, 8833 "contours": [8834 38835 ]8836 }, 8837 {8838 "name": "uni0934", 8839 "unicode": 2356, 8840 "contours": [8841 48842 ]8843 }, 8844 {8845 "name": "uni0935", 8846 "unicode": 2357, 8847 "contours": [8848 1, 8849 28850 ]8851 }, 8852 {8853 "name": "uni0936", 8854 "unicode": 2358, 8855 "contours": [8856 28857 ]8858 }, 8859 {8860 "name": "uni0937", 8861 "unicode": 2359, 8862 "contours": [8863 38864 ]8865 }, 8866 {8867 "name": "uni0938", 8868 "unicode": 2360, 8869 "contours": [8870 28871 ]8872 }, 8873 {8874 "name": "uni0939", 8875 "unicode": 2361, 8876 "contours": [8877 18878 ]8879 }, 8880 {8881 "name": "uni093A", 8882 "unicode": 2362, 8883 "contours": [8884 18885 ]8886 }, 8887 {8888 "name": "uni093B", 8889 "unicode": 2363, 8890 "contours": [8891 18892 ]8893 }, 8894 {8895 "name": "uni093C", 8896 "unicode": 2364, 8897 "contours": [8898 18899 ]8900 }, 8901 {8902 "name": "uni093D", 8903 "unicode": 2365, 8904 "contours": [8905 18906 ]8907 }, 8908 {8909 "name": "uni093E", 8910 "unicode": 2366, 8911 "contours": [8912 18913 ]8914 }, 8915 {8916 "name": "uni093F", 8917 "unicode": 2367, 8918 "contours": [8919 18920 ]8921 }, 8922 {8923 "name": "uni0940", 8924 "unicode": 2368, 8925 "contours": [8926 18927 ]8928 }, 8929 {8930 "name": "uni0941", 8931 "unicode": 2369, 8932 "contours": [8933 18934 ]8935 }, 8936 {8937 "name": "uni0942", 8938 "unicode": 2370, 8939 "contours": [8940 18941 ]8942 }, 8943 {8944 "name": "uni0943", 8945 "unicode": 2371, 8946 "contours": [8947 18948 ]8949 }, 8950 {8951 "name": "uni0944", 8952 "unicode": 2372, 8953 "contours": [8954 18955 ]8956 }, 8957 {8958 "name": "uni0945", 8959 "unicode": 2373, 8960 "contours": [8961 18962 ]8963 }, 8964 {8965 "name": "uni0946", 8966 "unicode": 2374, 8967 "contours": [8968 18969 ]8970 }, 8971 {8972 "name": "uni0947", 8973 "unicode": 2375, 8974 "contours": [8975 18976 ]8977 }, 8978 {8979 "name": "uni0948", 8980 "unicode": 2376, 8981 "contours": [8982 18983 ]8984 }, 8985 {8986 "name": "uni0949", 8987 "unicode": 2377, 8988 "contours": [8989 28990 ]8991 }, 8992 {8993 "name": "uni094A", 8994 "unicode": 2378, 8995 "contours": [8996 18997 ]8998 }, 8999 {9000 "name": "uni094B", 9001 "unicode": 2379, 9002 "contours": [9003 19004 ]9005 }, 9006 {9007 "name": "uni094C", 9008 "unicode": 2380, 9009 "contours": [9010 19011 ]9012 }, 9013 {9014 "name": "uni094D", 9015 "unicode": 2381, 9016 "contours": [9017 19018 ]9019 }, 9020 {9021 "name": "uni094F", 9022 "unicode": 2383, 9023 "contours": [9024 19025 ]9026 }, 9027 {9028 "name": "uni0950", 9029 "unicode": 2384, 9030 "contours": [9031 39032 ]9033 }, 9034 {9035 "name": "uni0951", 9036 "unicode": 2385, 9037 "contours": [9038 19039 ]9040 }, 9041 {9042 "name": "uni0952", 9043 "unicode": 2386, 9044 "contours": [9045 19046 ]9047 }, 9048 {9049 "name": "uni0953", 9050 "unicode": 2387, 9051 "contours": [9052 19053 ]9054 }, 9055 {9056 "name": "uni0954", 9057 "unicode": 2388, 9058 "contours": [9059 19060 ]9061 }, 9062 {9063 "name": "uni0955", 9064 "unicode": 2389, 9065 "contours": [9066 29067 ]9068 }, 9069 {9070 "name": "uni0956", 9071 "unicode": 2390, 9072 "contours": [9073 19074 ]9075 }, 9076 {9077 "name": "uni0957", 9078 "unicode": 2391, 9079 "contours": [9080 29081 ]9082 }, 9083 {9084 "name": "uni0958", 9085 "unicode": 2392, 9086 "contours": [9087 2, 9088 39089 ]9090 }, 9091 {9092 "name": "uni0959", 9093 "unicode": 2393, 9094 "contours": [9095 2, 9096 49097 ]9098 }, 9099 {9100 "name": "uni095A", 9101 "unicode": 2394, 9102 "contours": [9103 29104 ]9105 }, 9106 {9107 "name": "uni095B", 9108 "unicode": 2395, 9109 "contours": [9110 29111 ]9112 }, 9113 {9114 "name": "uni095C", 9115 "unicode": 2396, 9116 "contours": [9117 29118 ]9119 }, 9120 {9121 "name": "uni095D", 9122 "unicode": 2397, 9123 "contours": [9124 2, 9125 39126 ]9127 }, 9128 {9129 "name": "uni095E", 9130 "unicode": 2398, 9131 "contours": [9132 39133 ]9134 }, 9135 {9136 "name": "uni095F", 9137 "unicode": 2399, 9138 "contours": [9139 39140 ]9141 }, 9142 {9143 "name": "uni0960", 9144 "unicode": 2400, 9145 "contours": [9146 19147 ]9148 }, 9149 {9150 "name": "uni0190", 9151 "unicode": 400, 9152 "contours": [9153 19154 ]9155 }, 9156 {9157 "name": "uni0962", 9158 "unicode": 2402, 9159 "contours": [9160 19161 ]9162 }, 9163 {9164 "name": "uni0963", 9165 "unicode": 2403, 9166 "contours": [9167 19168 ]9169 }, 9170 {9171 "name": "uni0964", 9172 "unicode": 2404, 9173 "contours": [9174 19175 ]9176 }, 9177 {9178 "name": "uni0965", 9179 "unicode": 2405, 9180 "contours": [9181 29182 ]9183 }, 9184 {9185 "name": "uni0966", 9186 "unicode": 2406, 9187 "contours": [9188 29189 ]9190 }, 9191 {9192 "name": "uni0191", 9193 "unicode": 401, 9194 "contours": [9195 19196 ]9197 }, 9198 {9199 "name": "uni0968", 9200 "unicode": 2408, 9201 "contours": [9202 19203 ]9204 }, 9205 {9206 "name": "uni0969", 9207 "unicode": 2409, 9208 "contours": [9209 19210 ]9211 }, 9212 {9213 "name": "uni096A", 9214 "unicode": 2410, 9215 "contours": [9216 29217 ]9218 }, 9219 {9220 "name": "uni096B", 9221 "unicode": 2411, 9222 "contours": [9223 19224 ]9225 }, 9226 {9227 "name": "uni096C", 9228 "unicode": 2412, 9229 "contours": [9230 1, 9231 29232 ]9233 }, 9234 {9235 "name": "uni0192", 9236 "unicode": 402, 9237 "contours": [9238 19239 ]9240 }, 9241 {9242 "name": "uni096E", 9243 "unicode": 2414, 9244 "contours": [9245 1, 9246 39247 ]9248 }, 9249 {9250 "name": "uni096F", 9251 "unicode": 2415, 9252 "contours": [9253 29254 ]9255 }, 9256 {9257 "name": "uni0970", 9258 "unicode": 2416, 9259 "contours": [9260 29261 ]9262 }, 9263 {9264 "name": "uni0971", 9265 "unicode": 2417, 9266 "contours": [9267 19268 ]9269 }, 9270 {9271 "name": "uni0972", 9272 "unicode": 2418, 9273 "contours": [9274 29275 ]9276 }, 9277 {9278 "name": "uni0193", 9279 "unicode": 403, 9280 "contours": [9281 19282 ]9283 }, 9284 {9285 "name": "uni0974", 9286 "unicode": 2420, 9287 "contours": [9288 19289 ]9290 }, 9291 {9292 "name": "uni0975", 9293 "unicode": 2421, 9294 "contours": [9295 19296 ]9297 }, 9298 {9299 "name": "uni0976", 9300 "unicode": 2422, 9301 "contours": [9302 29303 ]9304 }, 9305 {9306 "name": "uni0977", 9307 "unicode": 2423, 9308 "contours": [9309 39310 ]9311 }, 9312 {9313 "name": "uni0194", 9314 "unicode": 404, 9315 "contours": [9316 29317 ]9318 }, 9319 {9320 "name": "uni097A", 9321 "unicode": 2426, 9322 "contours": [9323 39324 ]9325 }, 9326 {9327 "name": "uni097B", 9328 "unicode": 2427, 9329 "contours": [9330 19331 ]9332 }, 9333 {9334 "name": "uni097C", 9335 "unicode": 2428, 9336 "contours": [9337 19338 ]9339 }, 9340 {9341 "name": "uni097D", 9342 "unicode": 2429, 9343 "contours": [9344 19345 ]9346 }, 9347 {9348 "name": "uni097E", 9349 "unicode": 2430, 9350 "contours": [9351 29352 ]9353 }, 9354 {9355 "name": "uni0195", 9356 "unicode": 405, 9357 "contours": [9358 19359 ]9360 }, 9361 {9362 "name": "uni2983", 9363 "unicode": 10627, 9364 "contours": [9365 29366 ]9367 }, 9368 {9369 "name": "uni2984", 9370 "unicode": 10628, 9371 "contours": [9372 29373 ]9374 }, 9375 {9376 "name": "uni0196", 9377 "unicode": 406, 9378 "contours": [9379 19380 ]9381 }, 9382 {9383 "name": "uni0197", 9384 "unicode": 407, 9385 "contours": [9386 19387 ]9388 }, 9389 {9390 "name": "uni0198", 9391 "unicode": 408, 9392 "contours": [9393 19394 ]9395 }, 9396 {9397 "name": "uni2199", 9398 "unicode": 8601, 9399 "contours": [9400 19401 ]9402 }, 9403 {9404 "name": "uni299B", 9405 "unicode": 10651, 9406 "contours": [9407 29408 ]9409 }, 9410 {9411 "name": "uni299D", 9412 "unicode": 10653, 9413 "contours": [9414 39415 ]9416 }, 9417 {9418 "name": "uni204B", 9419 "unicode": 8267, 9420 "contours": [9421 29422 ]9423 }, 9424 {9425 "name": "uni21A4", 9426 "unicode": 8612, 9427 "contours": [9428 19429 ]9430 }, 9431 {9432 "name": "uni21A5", 9433 "unicode": 8613, 9434 "contours": [9435 19436 ]9437 }, 9438 {9439 "name": "uni21A6", 9440 "unicode": 8614, 9441 "contours": [9442 19443 ]9444 }, 9445 {9446 "name": "uni21A7", 9447 "unicode": 8615, 9448 "contours": [9449 19450 ]9451 }, 9452 {9453 "name": "uni01AB", 9454 "unicode": 427, 9455 "contours": [9456 19457 ]9458 }, 9459 {9460 "name": "uni21B0", 9461 "unicode": 8624, 9462 "contours": [9463 19464 ]9465 }, 9466 {9467 "name": "uni01B1", 9468 "unicode": 433, 9469 "contours": [9470 19471 ]9472 }, 9473 {9474 "name": "uni21B2", 9475 "unicode": 8626, 9476 "contours": [9477 19478 ]9479 }, 9480 {9481 "name": "uni2A2F", 9482 "unicode": 10799, 9483 "contours": [9484 19485 ]9486 }, 9487 {9488 "name": "uni21B3", 9489 "unicode": 8627, 9490 "contours": [9491 19492 ]9493 }, 9494 {9495 "name": "uni21B4", 9496 "unicode": 8628, 9497 "contours": [9498 19499 ]9500 }, 9501 {9502 "name": "uni21B5", 9503 "unicode": 8629, 9504 "contours": [9505 19506 ]9507 }, 9508 {9509 "name": "uni21B6", 9510 "unicode": 8630, 9511 "contours": [9512 19513 ]9514 }, 9515 {9516 "name": "uni21B7", 9517 "unicode": 8631, 9518 "contours": [9519 19520 ]9521 }, 9522 {9523 "name": "uni21B8", 9524 "unicode": 8632, 9525 "contours": [9526 29527 ]9528 }, 9529 {9530 "name": "uni21B9", 9531 "unicode": 8633, 9532 "contours": [9533 49534 ]9535 }, 9536 {9537 "name": "uni21BA", 9538 "unicode": 8634, 9539 "contours": [9540 19541 ]9542 }, 9543 {9544 "name": "uni21BC", 9545 "unicode": 8636, 9546 "contours": [9547 19548 ]9549 }, 9550 {9551 "name": "uni21BD", 9552 "unicode": 8637, 9553 "contours": [9554 19555 ]9556 }, 9557 {9558 "name": "uni21BE", 9559 "unicode": 8638, 9560 "contours": [9561 19562 ]9563 }, 9564 {9565 "name": "uni21BF", 9566 "unicode": 8639, 9567 "contours": [9568 19569 ]9570 }, 9571 {9572 "name": "uni21C0", 9573 "unicode": 8640, 9574 "contours": [9575 19576 ]9577 }, 9578 {9579 "name": "uni21C1", 9580 "unicode": 8641, 9581 "contours": [9582 19583 ]9584 }, 9585 {9586 "name": "uni21C2", 9587 "unicode": 8642, 9588 "contours": [9589 19590 ]9591 }, 9592 {9593 "name": "uni21C3", 9594 "unicode": 8643, 9595 "contours": [9596 19597 ]9598 }, 9599 {9600 "name": "uni21C4", 9601 "unicode": 8644, 9602 "contours": [9603 29604 ]9605 }, 9606 {9607 "name": "uni21C5", 9608 "unicode": 8645, 9609 "contours": [9610 29611 ]9612 }, 9613 {9614 "name": "uni21C6", 9615 "unicode": 8646, 9616 "contours": [9617 29618 ]9619 }, 9620 {9621 "name": "uni21C7", 9622 "unicode": 8647, 9623 "contours": [9624 19625 ]9626 }, 9627 {9628 "name": "uni21C8", 9629 "unicode": 8648, 9630 "contours": [9631 19632 ]9633 }, 9634 {9635 "name": "uni21C9", 9636 "unicode": 8649, 9637 "contours": [9638 19639 ]9640 }, 9641 {9642 "name": "uni21CA", 9643 "unicode": 8650, 9644 "contours": [9645 19646 ]9647 }, 9648 {9649 "name": "uni21CB", 9650 "unicode": 8651, 9651 "contours": [9652 29653 ]9654 }, 9655 {9656 "name": "uni21CC", 9657 "unicode": 8652, 9658 "contours": [9659 29660 ]9661 }, 9662 {9663 "name": "arrowdblright", 9664 "unicode": 8658, 9665 "contours": [9666 19667 ]9668 }, 9669 {9670 "name": "arrowdblboth", 9671 "unicode": 8660, 9672 "contours": [9673 29674 ]9675 }, 9676 {9677 "name": "uni21DA", 9678 "unicode": 8666, 9679 "contours": [9680 19681 ]9682 }, 9683 {9684 "name": "uni21DB", 9685 "unicode": 8667, 9686 "contours": [9687 19688 ]9689 }, 9690 {9691 "name": "uni21DC", 9692 "unicode": 8668, 9693 "contours": [9694 19695 ]9696 }, 9697 {9698 "name": "uni21DD", 9699 "unicode": 8669, 9700 "contours": [9701 19702 ]9703 }, 9704 {9705 "name": "uni21DE", 9706 "unicode": 8670, 9707 "contours": [9708 19709 ]9710 }, 9711 {9712 "name": "uni21DF", 9713 "unicode": 8671, 9714 "contours": [9715 19716 ]9717 }, 9718 {9719 "name": "uni21E0", 9720 "unicode": 8672, 9721 "contours": [9722 39723 ]9724 }, 9725 {9726 "name": "uni21E1", 9727 "unicode": 8673, 9728 "contours": [9729 39730 ]9731 }, 9732 {9733 "name": "uni21E2", 9734 "unicode": 8674, 9735 "contours": [9736 39737 ]9738 }, 9739 {9740 "name": "uni21E3", 9741 "unicode": 8675, 9742 "contours": [9743 39744 ]9745 }, 9746 {9747 "name": "uni2B58", 9748 "unicode": 11096, 9749 "contours": [9750 29751 ]9752 }, 9753 {9754 "name": "uni21E4", 9755 "unicode": 8676, 9756 "contours": [9757 29758 ]9759 }, 9760 {9761 "name": "uni21E5", 9762 "unicode": 8677, 9763 "contours": [9764 29765 ]9766 }, 9767 {9768 "name": "uniEE01", 9769 "unicode": 60929, 9770 "contours": [9771 29772 ]9773 }, 9774 {9775 "name": "uni21F5", 9776 "unicode": 8693, 9777 "contours": [9778 29779 ]9780 }, 9781 {9782 "name": "uni205D", 9783 "unicode": 8285, 9784 "contours": [9785 39786 ]9787 }, 9788 {9789 "name": "universal", 9790 "unicode": 8704, 9791 "contours": [9792 29793 ]9794 }, 9795 {9796 "name": "Ainvertedbreve", 9797 "unicode": 514, 9798 "contours": [9799 39800 ]9801 }, 9802 {9803 "name": "existential", 9804 "unicode": 8707, 9805 "contours": [9806 19807 ]9808 }, 9809 {9810 "name": "uni2204", 9811 "unicode": 8708, 9812 "contours": [9813 39814 ]9815 }, 9816 {9817 "name": "emptyset", 9818 "unicode": 8709, 9819 "contours": [9820 39821 ]9822 }, 9823 {9824 "name": "Einvertedbreve", 9825 "unicode": 518, 9826 "contours": [9827 29828 ]9829 }, 9830 {9831 "name": "uni205F", 9832 "unicode": 8287, 9833 "contours": [9834 09835 ]9836 }, 9837 {9838 "name": "gradient", 9839 "unicode": 8711, 9840 "contours": [9841 29842 ]9843 }, 9844 {9845 "name": "element", 9846 "unicode": 8712, 9847 "contours": [9848 19849 ]9850 }, 9851 {9852 "name": "notelement", 9853 "unicode": 8713, 9854 "contours": [9855 39856 ]9857 }, 9858 {9859 "name": "suchthat", 9860 "unicode": 8715, 9861 "contours": [9862 19863 ]9864 }, 9865 {9866 "name": "uni220C", 9867 "unicode": 8716, 9868 "contours": [9869 39870 ]9871 }, 9872 {9873 "name": "uni220E", 9874 "unicode": 8718, 9875 "contours": [9876 19877 ]9878 }, 9879 {9880 "name": "oinvertedbreve", 9881 "unicode": 527, 9882 "contours": [9883 39884 ]9885 }, 9886 {9887 "name": "rdblgrave", 9888 "unicode": 529, 9889 "contours": [9890 39891 ]9892 }, 9893 {9894 "name": "Rinvertedbreve", 9895 "unicode": 530, 9896 "contours": [9897 39898 ]9899 }, 9900 {9901 "name": "uni2213", 9902 "unicode": 8723, 9903 "contours": [9904 29905 ]9906 }, 9907 {9908 "name": "udblgrave", 9909 "unicode": 533, 9910 "contours": [9911 39912 ]9913 }, 9914 {9915 "name": "uni2216", 9916 "unicode": 8726, 9917 "contours": [9918 19919 ]9920 }, 9921 {9922 "name": "asteriskmath", 9923 "unicode": 8727, 9924 "contours": [9925 19926 ]9927 }, 9928 {9929 "name": "uni2218", 9930 "unicode": 8728, 9931 "contours": [9932 29933 ]9934 }, 9935 {9936 "name": "uni0219", 9937 "unicode": 537, 9938 "contours": [9939 29940 ]9941 }, 9942 {9943 "name": "radical", 9944 "unicode": 8730, 9945 "contours": [9946 19947 ]9948 }, 9949 {9950 "name": "proportional", 9951 "unicode": 8733, 9952 "contours": [9953 29954 ]9955 }, 9956 {9957 "name": "uni021E", 9958 "unicode": 542, 9959 "contours": [9960 29961 ]9962 }, 9963 {9964 "name": "orthogonal", 9965 "unicode": 8735, 9966 "contours": [9967 19968 ]9969 }, 9970 {9971 "name": "angle", 9972 "unicode": 8736, 9973 "contours": [9974 19975 ]9976 }, 9977 {9978 "name": "uni2221", 9979 "unicode": 8737, 9980 "contours": [9981 29982 ]9983 }, 9984 {9985 "name": "uni2222", 9986 "unicode": 8738, 9987 "contours": [9988 29989 ]9990 }, 9991 {9992 "name": "uni2223", 9993 "unicode": 8739, 9994 "contours": [9995 19996 ]9997 }, 9998 {9999 "name": "uni2224", 10000 "unicode": 8740, 10001 "contours": [10002 110003 ]10004 }, 10005 {10006 "name": "uni2225", 10007 "unicode": 8741, 10008 "contours": [10009 210010 ]10011 }, 10012 {10013 "name": "uni2226", 10014 "unicode": 8742, 10015 "contours": [10016 110017 ]10018 }, 10019 {10020 "name": "logicaland", 10021 "unicode": 8743, 10022 "contours": [10023 110024 ]10025 }, 10026 {10027 "name": "logicalor", 10028 "unicode": 8744, 10029 "contours": [10030 110031 ]10032 }, 10033 {10034 "name": "intersection", 10035 "unicode": 8745, 10036 "contours": [10037 110038 ]10039 }, 10040 {10041 "name": "union", 10042 "unicode": 8746, 10043 "contours": [10044 110045 ]10046 }, 10047 {10048 "name": "uni022B", 10049 "unicode": 555, 10050 "contours": [10051 510052 ]10053 }, 10054 {10055 "name": "uni222C", 10056 "unicode": 8748, 10057 "contours": [10058 210059 ]10060 }, 10061 {10062 "name": "uni222D", 10063 "unicode": 8749, 10064 "contours": [10065 310066 ]10067 }, 10068 {10069 "name": "uni222E", 10070 "unicode": 8750, 10071 "contours": [10072 310073 ]10074 }, 10075 {10076 "name": "uni222F", 10077 "unicode": 8751, 10078 "contours": [10079 410080 ]10081 }, 10082 {10083 "name": "uni2230", 10084 "unicode": 8752, 10085 "contours": [10086 510087 ]10088 }, 10089 {10090 "name": "therefore", 10091 "unicode": 8756, 10092 "contours": [10093 310094 ]10095 }, 10096 {10097 "name": "uni2235", 10098 "unicode": 8757, 10099 "contours": [10100 310101 ]10102 }, 10103 {10104 "name": "uni2236", 10105 "unicode": 8758, 10106 "contours": [10107 210108 ]10109 }, 10110 {10111 "name": "similar", 10112 "unicode": 8764, 10113 "contours": [10114 110115 ]10116 }, 10117 {10118 "name": "uni223D", 10119 "unicode": 8765, 10120 "contours": [10121 110122 ]10123 }, 10124 {10125 "name": "uni2241", 10126 "unicode": 8769, 10127 "contours": [10128 110129 ]10130 }, 10131 {10132 "name": "uni2243", 10133 "unicode": 8771, 10134 "contours": [10135 210136 ]10137 }, 10138 {10139 "name": "congruent", 10140 "unicode": 8773, 10141 "contours": [10142 310143 ]10144 }, 10145 {10146 "name": "uni0248", 10147 "unicode": 584, 10148 "contours": [10149 110150 ]10151 }, 10152 {10153 "name": "uni2249", 10154 "unicode": 8777, 10155 "contours": [10156 110157 ]10158 }, 10159 {10160 "name": "w", 10161 "unicode": 119, 10162 "contours": [10163 110164 ]10165 }, 10166 {10167 "name": "uni0E01", 10168 "unicode": 3585, 10169 "contours": [10170 110171 ]10172 }, 10173 {10174 "name": "uni0E02", 10175 "unicode": 3586, 10176 "contours": [10177 1, 10178 210179 ]10180 }, 10181 {10182 "name": "uni0E03", 10183 "unicode": 3587, 10184 "contours": [10185 1, 10186 210187 ]10188 }, 10189 {10190 "name": "uni0E04", 10191 "unicode": 3588, 10192 "contours": [10193 1, 10194 210195 ]10196 }, 10197 {10198 "name": "uni0E05", 10199 "unicode": 3589, 10200 "contours": [10201 1, 10202 210203 ]10204 }, 10205 {10206 "name": "uni0E06", 10207 "unicode": 3590, 10208 "contours": [10209 1, 10210 310211 ]10212 }, 10213 {10214 "name": "uni0E07", 10215 "unicode": 3591, 10216 "contours": [10217 1, 10218 210219 ]10220 }, 10221 {10222 "name": "uni0E08", 10223 "unicode": 3592, 10224 "contours": [10225 1, 10226 210227 ]10228 }, 10229 {10230 "name": "uni0E09", 10231 "unicode": 3593, 10232 "contours": [10233 1, 10234 310235 ]10236 }, 10237 {10238 "name": "uni0E0A", 10239 "unicode": 3594, 10240 "contours": [10241 1, 10242 210243 ]10244 }, 10245 {10246 "name": "uni0E0B", 10247 "unicode": 3595, 10248 "contours": [10249 1, 10250 210251 ]10252 }, 10253 {10254 "name": "uni0E0C", 10255 "unicode": 3596, 10256 "contours": [10257 1, 10258 310259 ]10260 }, 10261 {10262 "name": "uni0E0D", 10263 "unicode": 3597, 10264 "contours": [10265 1, 10266 410267 ]10268 }, 10269 {10270 "name": "uni0E0E", 10271 "unicode": 3598, 10272 "contours": [10273 1, 10274 310275 ]10276 }, 10277 {10278 "name": "uni0E0F", 10279 "unicode": 3599, 10280 "contours": [10281 1, 10282 310283 ]10284 }, 10285 {10286 "name": "uni0E10", 10287 "unicode": 3600, 10288 "contours": [10289 1, 10290 510291 ]10292 }, 10293 {10294 "name": "uni0E11", 10295 "unicode": 3601, 10296 "contours": [10297 1, 10298 210299 ]10300 }, 10301 {10302 "name": "uni0E12", 10303 "unicode": 3602, 10304 "contours": [10305 1, 10306 310307 ]10308 }, 10309 {10310 "name": "uni0E13", 10311 "unicode": 3603, 10312 "contours": [10313 1, 10314 310315 ]10316 }, 10317 {10318 "name": "uni0E14", 10319 "unicode": 3604, 10320 "contours": [10321 1, 10322 210323 ]10324 }, 10325 {10326 "name": "uni0E15", 10327 "unicode": 3605, 10328 "contours": [10329 1, 10330 210331 ]10332 }, 10333 {10334 "name": "uni0E16", 10335 "unicode": 3606, 10336 "contours": [10337 1, 10338 210339 ]10340 }, 10341 {10342 "name": "uni2259", 10343 "unicode": 8793, 10344 "contours": [10345 310346 ]10347 }, 10348 {10349 "name": "uni2E18", 10350 "unicode": 11800, 10351 "contours": [10352 210353 ]10354 }, 10355 {10356 "name": "uni0E19", 10357 "unicode": 3609, 10358 "contours": [10359 1, 10360 310361 ]10362 }, 10363 {10364 "name": "uni0E1A", 10365 "unicode": 3610, 10366 "contours": [10367 1, 10368 210369 ]10370 }, 10371 {10372 "name": "uni0E1B", 10373 "unicode": 3611, 10374 "contours": [10375 1, 10376 210377 ]10378 }, 10379 {10380 "name": "uni0E1C", 10381 "unicode": 3612, 10382 "contours": [10383 1, 10384 210385 ]10386 }, 10387 {10388 "name": "uni0E1D", 10389 "unicode": 3613, 10390 "contours": [10391 1, 10392 210393 ]10394 }, 10395 {10396 "name": "uni0E1E", 10397 "unicode": 3614, 10398 "contours": [10399 1, 10400 210401 ]10402 }, 10403 {10404 "name": "uni0E1F", 10405 "unicode": 3615, 10406 "contours": [10407 1, 10408 210409 ]10410 }, 10411 {10412 "name": "uni0E20", 10413 "unicode": 3616, 10414 "contours": [10415 1, 10416 210417 ]10418 }, 10419 {10420 "name": "uni0E21", 10421 "unicode": 3617, 10422 "contours": [10423 1, 10424 310425 ]10426 }, 10427 {10428 "name": "uni0E22", 10429 "unicode": 3618, 10430 "contours": [10431 1, 10432 210433 ]10434 }, 10435 {10436 "name": "uni0E23", 10437 "unicode": 3619, 10438 "contours": [10439 1, 10440 210441 ]10442 }, 10443 {10444 "name": "uni0E24", 10445 "unicode": 3620, 10446 "contours": [10447 1, 10448 210449 ]10450 }, 10451 {10452 "name": "uni0E25", 10453 "unicode": 3621, 10454 "contours": [10455 1, 10456 210457 ]10458 }, 10459 {10460 "name": "uni0E26", 10461 "unicode": 3622, 10462 "contours": [10463 1, 10464 210465 ]10466 }, 10467 {10468 "name": "uni0E27", 10469 "unicode": 3623, 10470 "contours": [10471 1, 10472 210473 ]10474 }, 10475 {10476 "name": "uni0E28", 10477 "unicode": 3624, 10478 "contours": [10479 1, 10480 210481 ]10482 }, 10483 {10484 "name": "uni0E29", 10485 "unicode": 3625, 10486 "contours": [10487 1, 10488 310489 ]10490 }, 10491 {10492 "name": "uni0E2A", 10493 "unicode": 3626, 10494 "contours": [10495 1, 10496 210497 ]10498 }, 10499 {10500 "name": "uni0E2B", 10501 "unicode": 3627, 10502 "contours": [10503 1, 10504 310505 ]10506 }, 10507 {10508 "name": "uni0E2C", 10509 "unicode": 3628, 10510 "contours": [10511 1, 10512 310513 ]10514 }, 10515 {10516 "name": "uni0E2D", 10517 "unicode": 3629, 10518 "contours": [10519 1, 10520 210521 ]10522 }, 10523 {10524 "name": "uni0E2E", 10525 "unicode": 3630, 10526 "contours": [10527 1, 10528 310529 ]10530 }, 10531 {10532 "name": "uni0E2F", 10533 "unicode": 3631, 10534 "contours": [10535 1, 10536 210537 ]10538 }, 10539 {10540 "name": "uni0E30", 10541 "unicode": 3632, 10542 "contours": [10543 2, 10544 410545 ]10546 }, 10547 {10548 "name": "uni0E31", 10549 "unicode": 3633, 10550 "contours": [10551 1, 10552 210553 ]10554 }, 10555 {10556 "name": "uni0E32", 10557 "unicode": 3634, 10558 "contours": [10559 110560 ]10561 }, 10562 {10563 "name": "uni0E33", 10564 "unicode": 3635, 10565 "contours": [10566 310567 ]10568 }, 10569 {10570 "name": "uni0E34", 10571 "unicode": 3636, 10572 "contours": [10573 1, 10574 210575 ]10576 }, 10577 {10578 "name": "uni0E35", 10579 "unicode": 3637, 10580 "contours": [10581 1, 10582 210583 ]10584 }, 10585 {10586 "name": "uni0E36", 10587 "unicode": 3638, 10588 "contours": [10589 2, 10590 310591 ]10592 }, 10593 {10594 "name": "uni0E37", 10595 "unicode": 3639, 10596 "contours": [10597 1, 10598 210599 ]10600 }, 10601 {10602 "name": "uni0E38", 10603 "unicode": 3640, 10604 "contours": [10605 1, 10606 210607 ]10608 }, 10609 {10610 "name": "uni0E39", 10611 "unicode": 3641, 10612 "contours": [10613 1, 10614 210615 ]10616 }, 10617 {10618 "name": "uni2E3A", 10619 "unicode": 11834, 10620 "contours": [10621 110622 ]10623 }, 10624 {10625 "name": "uni2E3B", 10626 "unicode": 11835, 10627 "contours": [10628 110629 ]10630 }, 10631 {10632 "name": "uni0E3F", 10633 "unicode": 3647, 10634 "contours": [10635 310636 ]10637 }, 10638 {10639 "name": "uni0E40", 10640 "unicode": 3648, 10641 "contours": [10642 1, 10643 210644 ]10645 }, 10646 {10647 "name": "uni0E41", 10648 "unicode": 3649, 10649 "contours": [10650 2, 10651 410652 ]10653 }, 10654 {10655 "name": "uni0E42", 10656 "unicode": 3650, 10657 "contours": [10658 1, 10659 210660 ]10661 }, 10662 {10663 "name": "uni0E43", 10664 "unicode": 3651, 10665 "contours": [10666 1, 10667 310668 ]10669 }, 10670 {10671 "name": "uni0E44", 10672 "unicode": 3652, 10673 "contours": [10674 1, 10675 210676 ]10677 }, 10678 {10679 "name": "uni0E45", 10680 "unicode": 3653, 10681 "contours": [10682 110683 ]10684 }, 10685 {10686 "name": "uni0E46", 10687 "unicode": 3654, 10688 "contours": [10689 1, 10690 210691 ]10692 }, 10693 {10694 "name": "equivalence", 10695 "unicode": 8801, 10696 "contours": [10697 310698 ]10699 }, 10700 {10701 "name": "uni0E48", 10702 "unicode": 3656, 10703 "contours": [10704 110705 ]10706 }, 10707 {10708 "name": "uni0E49", 10709 "unicode": 3657, 10710 "contours": [10711 1, 10712 210713 ]10714 }, 10715 {10716 "name": "uni0E4A", 10717 "unicode": 3658, 10718 "contours": [10719 1, 10720 210721 ]10722 }, 10723 {10724 "name": "uni0E4B", 10725 "unicode": 3659, 10726 "contours": [10727 110728 ]10729 }, 10730 {10731 "name": "uni0E4C", 10732 "unicode": 3660, 10733 "contours": [10734 1, 10735 210736 ]10737 }, 10738 {10739 "name": "uni0E4D", 10740 "unicode": 3661, 10741 "contours": [10742 210743 ]10744 }, 10745 {10746 "name": "uni0E4E", 10747 "unicode": 3662, 10748 "contours": [10749 110750 ]10751 }, 10752 {10753 "name": "uni0E4F", 10754 "unicode": 3663, 10755 "contours": [10756 410757 ]10758 }, 10759 {10760 "name": "uni0E50", 10761 "unicode": 3664, 10762 "contours": [10763 210764 ]10765 }, 10766 {10767 "name": "uni0E51", 10768 "unicode": 3665, 10769 "contours": [10770 1, 10771 210772 ]10773 }, 10774 {10775 "name": "uni0E52", 10776 "unicode": 3666, 10777 "contours": [10778 1, 10779 210780 ]10781 }, 10782 {10783 "name": "uni0E53", 10784 "unicode": 3667, 10785 "contours": [10786 1, 10787 210788 ]10789 }, 10790 {10791 "name": "uni0E54", 10792 "unicode": 3668, 10793 "contours": [10794 1, 10795 210796 ]10797 }, 10798 {10799 "name": "uni0E55", 10800 "unicode": 3669, 10801 "contours": [10802 1, 10803 310804 ]10805 }, 10806 {10807 "name": "uni0E56", 10808 "unicode": 3670, 10809 "contours": [10810 1, 10811 210812 ]10813 }, 10814 {10815 "name": "uni0E57", 10816 "unicode": 3671, 10817 "contours": [10818 1, 10819 210820 ]10821 }, 10822 {10823 "name": "uni0E58", 10824 "unicode": 3672, 10825 "contours": [10826 1, 10827 210828 ]10829 }, 10830 {10831 "name": "uni0E59", 10832 "unicode": 3673, 10833 "contours": [10834 1, 10835 210836 ]10837 }, 10838 {10839 "name": "uni0E5A", 10840 "unicode": 3674, 10841 "contours": [10842 1, 10843 210844 ]10845 }, 10846 {10847 "name": "uni0E5B", 10848 "unicode": 3675, 10849 "contours": [10850 1, 10851 210852 ]10853 }, 10854 {10855 "name": "uni207A", 10856 "unicode": 8314, 10857 "contours": [10858 110859 ]10860 }, 10861 {10862 "name": "uni207B", 10863 "unicode": 8315, 10864 "contours": [10865 110866 ]10867 }, 10868 {10869 "name": "uni0FD5", 10870 "unicode": 4053, 10871 "contours": [10872 110873 ]10874 }, 10875 {10876 "name": "uniEFFD", 10877 "unicode": 61437, 10878 "contours": [10879 9, 10880 710881 ]10882 }, 10883 {10884 "name": "uniF000", 10885 "unicode": 61440, 10886 "contours": [10887 1410888 ]10889 }, 10890 {10891 "name": "fi", 10892 "unicode": 61441, 10893 "contours": [10894 310895 ]10896 }, 10897 {10898 "name": "fl", 10899 "unicode": 61442, 10900 "contours": [10901 210902 ]10903 }, 10904 {10905 "name": "uni02B9", 10906 "unicode": 697, 10907 "contours": [10908 110909 ]10910 }, 10911 {10912 "name": "uni02BF", 10913 "unicode": 703, 10914 "contours": [10915 110916 ]10917 }, 10918 {10919 "name": "dotmath", 10920 "unicode": 8901, 10921 "contours": [10922 110923 ]10924 }, 10925 {10926 "name": "uniF0FF", 10927 "unicode": 61695, 10928 "contours": [10929 710930 ]10931 }, 10932 {10933 "name": "ubuntu", 10934 "unicode": 61952, 10935 "contours": [10936 1410937 ]10938 }, 10939 {10940 "name": "uni2308", 10941 "unicode": 8968, 10942 "contours": [10943 110944 ]10945 }, 10946 {10947 "name": "uni2309", 10948 "unicode": 8969, 10949 "contours": [10950 110951 ]10952 }, 10953 {10954 "name": "uni230A", 10955 "unicode": 8970, 10956 "contours": [10957 110958 ]10959 }, 10960 {10961 "name": "uni230B", 10962 "unicode": 8971, 10963 "contours": [10964 110965 ]10966 }, 10967 {10968 "name": "uniA900", 10969 "unicode": 43264, 10970 "contours": [10971 210972 ]10973 }, 10974 {10975 "name": "brokenbar", 10976 "unicode": 166, 10977 "contours": [10978 210979 ]10980 }, 10981 {10982 "name": "uni21B1", 10983 "unicode": 8625, 10984 "contours": [10985 110986 ]10987 }, 10988 {10989 "name": "uni1E01", 10990 "unicode": 7681, 10991 "contours": [10992 410993 ]10994 }, 10995 {10996 "name": "uniEE02", 10997 "unicode": 60930, 10998 "contours": [10999 211000 ]11001 }, 11002 {11003 "name": "quotedbl", 11004 "unicode": 34, 11005 "contours": [11006 211007 ]11008 }, 11009 {11010 "name": "logicalnot", 11011 "unicode": 172, 11012 "contours": [11013 111014 ]11015 }, 11016 {11017 "name": "lira", 11018 "unicode": 8356, 11019 "contours": [11020 111021 ]11022 }, 11023 {11024 "name": "registered", 11025 "unicode": 174, 11026 "contours": [11027 3, 11028 411029 ]11030 }, 11031 {11032 "name": "uni0E17", 11033 "unicode": 3607, 11034 "contours": [11035 1, 11036 211037 ]11038 }, 11039 {11040 "name": "uni0E18", 11041 "unicode": 3608, 11042 "contours": [11043 111044 ]11045 }, 11046 {11047 "name": "two.sups", 11048 "unicode": 178, 11049 "contours": [11050 111051 ]11052 }, 11053 {11054 "name": "oneseventh", 11055 "unicode": 62726, 11056 "contours": [11057 311058 ]11059 }, 11060 {11061 "name": "twosevenths", 11062 "unicode": 62727, 11063 "contours": [11064 311065 ]11066 }, 11067 {11068 "name": "threesevenths", 11069 "unicode": 62728, 11070 "contours": [11071 311072 ]11073 }, 11074 {11075 "name": "foursevenths", 11076 "unicode": 62729, 11077 "contours": [11078 411079 ]11080 }, 11081 {11082 "name": "fivesevenths", 11083 "unicode": 62730, 11084 "contours": [11085 311086 ]11087 }, 11088 {11089 "name": "sixsevenths", 11090 "unicode": 62731, 11091 "contours": [11092 411093 ]11094 }, 11095 {11096 "name": "oneninth", 11097 "unicode": 62732, 11098 "contours": [11099 411100 ]11101 }, 11102 {11103 "name": "twoninths", 11104 "unicode": 62733, 11105 "contours": [11106 411107 ]11108 }, 11109 {11110 "name": "fourninths", 11111 "unicode": 62734, 11112 "contours": [11113 511114 ]11115 }, 11116 {11117 "name": "fiveninths", 11118 "unicode": 62735, 11119 "contours": [11120 411121 ]11122 }, 11123 {11124 "name": "sevenninths", 11125 "unicode": 62736, 11126 "contours": [11127 411128 ]11129 }, 11130 {11131 "name": "eightninths", 11132 "unicode": 62737, 11133 "contours": [11134 611135 ]11136 }, 11137 {11138 "name": "dong", 11139 "unicode": 8363, 11140 "contours": [11141 3, 11142 411143 ]11144 }, 11145 {11146 "name": "acute", 11147 "unicode": 180, 11148 "contours": [11149 111150 ]11151 }, 11152 {11153 "name": "uni00B5", 11154 "unicode": 181, 11155 "contours": [11156 111157 ]11158 }, 11159 {11160 "name": "uni20AD", 11161 "unicode": 8365, 11162 "contours": [11163 111164 ]11165 }, 11166 {11167 "name": "uni0E3A", 11168 "unicode": 3642, 11169 "contours": [11170 111171 ]11172 }, 11173 {11174 "name": "cedilla", 11175 "unicode": 184, 11176 "contours": [11177 111178 ]11179 }, 11180 {11181 "name": "uni0E47", 11182 "unicode": 3655, 11183 "contours": [11184 1, 11185 211186 ]11187 }, 11188 {11189 "name": "percent", 11190 "unicode": 37, 11191 "contours": [11192 511193 ]11194 }, 11195 {11196 "name": "ordmasculine", 11197 "unicode": 186, 11198 "contours": [11199 2, 11200 311201 ]11202 }, 11203 {11204 "name": "uni0900", 11205 "unicode": 2304, 11206 "contours": [11207 211208 ]11209 }, 11210 {11211 "name": "uniA901", 11212 "unicode": 43265, 11213 "contours": [11214 211215 ]11216 }, 11217 {11218 "name": "uniA902", 11219 "unicode": 43266, 11220 "contours": [11221 111222 ]11223 }, 11224 {11225 "name": "uniA903", 11226 "unicode": 43267, 11227 "contours": [11228 211229 ]11230 }, 11231 {11232 "name": "uniA904", 11233 "unicode": 43268, 11234 "contours": [11235 111236 ]11237 }, 11238 {11239 "name": "uniA905", 11240 "unicode": 43269, 11241 "contours": [11242 111243 ]11244 }, 11245 {11246 "name": "uniA906", 11247 "unicode": 43270, 11248 "contours": [11249 211250 ]11251 }, 11252 {11253 "name": "uniA907", 11254 "unicode": 43271, 11255 "contours": [11256 111257 ]11258 }, 11259 {11260 "name": "uniA908", 11261 "unicode": 43272, 11262 "contours": [11263 111264 ]11265 }, 11266 {11267 "name": "uniA909", 11268 "unicode": 43273, 11269 "contours": [11270 111271 ]11272 }, 11273 {11274 "name": "uniA90A", 11275 "unicode": 43274, 11276 "contours": [11277 211278 ]11279 }, 11280 {11281 "name": "uniA90B", 11282 "unicode": 43275, 11283 "contours": [11284 211285 ]11286 }, 11287 {11288 "name": "uniA90C", 11289 "unicode": 43276, 11290 "contours": [11291 211292 ]11293 }, 11294 {11295 "name": "uniA90D", 11296 "unicode": 43277, 11297 "contours": [11298 111299 ]11300 }, 11301 {11302 "name": "uniA90E", 11303 "unicode": 43278, 11304 "contours": [11305 211306 ]11307 }, 11308 {11309 "name": "uniA90F", 11310 "unicode": 43279, 11311 "contours": [11312 111313 ]11314 }, 11315 {11316 "name": "uniA910", 11317 "unicode": 43280, 11318 "contours": [11319 111320 ]11321 }, 11322 {11323 "name": "uniA911", 11324 "unicode": 43281, 11325 "contours": [11326 111327 ]11328 }, 11329 {11330 "name": "uni0502", 11331 "unicode": 1282, 11332 "contours": [11333 211334 ]11335 }, 11336 {11337 "name": "uniA912", 11338 "unicode": 43282, 11339 "contours": [11340 211341 ]11342 }, 11343 {11344 "name": "uniA913", 11345 "unicode": 43283, 11346 "contours": [11347 111348 ]11349 }, 11350 {11351 "name": "uniA914", 11352 "unicode": 43284, 11353 "contours": [11354 111355 ]11356 }, 11357 {11358 "name": "uniA915", 11359 "unicode": 43285, 11360 "contours": [11361 211362 ]11363 }, 11364 {11365 "name": "uniA916", 11366 "unicode": 43286, 11367 "contours": [11368 111369 ]11370 }, 11371 {11372 "name": "uniA917", 11373 "unicode": 43287, 11374 "contours": [11375 211376 ]11377 }, 11378 {11379 "name": "uniA918", 11380 "unicode": 43288, 11381 "contours": [11382 211383 ]11384 }, 11385 {11386 "name": "uniA919", 11387 "unicode": 43289, 11388 "contours": [11389 211390 ]11391 }, 11392 {11393 "name": "uniA91A", 11394 "unicode": 43290, 11395 "contours": [11396 111397 ]11398 }, 11399 {11400 "name": "uniA91B", 11401 "unicode": 43291, 11402 "contours": [11403 111404 ]11405 }, 11406 {11407 "name": "uniA91C", 11408 "unicode": 43292, 11409 "contours": [11410 111411 ]11412 }, 11413 {11414 "name": "chi", 11415 "unicode": 967, 11416 "contours": [11417 111418 ]11419 }, 11420 {11421 "name": "uniA91D", 11422 "unicode": 43293, 11423 "contours": [11424 111425 ]11426 }, 11427 {11428 "name": "uniA91E", 11429 "unicode": 43294, 11430 "contours": [11431 111432 ]11433 }, 11434 {11435 "name": "uni20B9", 11436 "unicode": 8377, 11437 "contours": [11438 111439 ]11440 }, 11441 {11442 "name": "uniA91F", 11443 "unicode": 43295, 11444 "contours": [11445 211446 ]11447 }, 11448 {11449 "name": "uniA920", 11450 "unicode": 43296, 11451 "contours": [11452 111453 ]11454 }, 11455 {11456 "name": "commaaccent", 11457 "unicode": 63171, 11458 "contours": [11459 111460 ]11461 }, 11462 {11463 "name": "uniA921", 11464 "unicode": 43297, 11465 "contours": [11466 111467 ]11468 }, 11469 {11470 "name": "uniA922", 11471 "unicode": 43298, 11472 "contours": [11473 111474 ]11475 }, 11476 {11477 "name": "uniA923", 11478 "unicode": 43299, 11479 "contours": [11480 111481 ]11482 }, 11483 {11484 "name": "uniF6D7", 11485 "unicode": 63191, 11486 "contours": [11487 311488 ]11489 }, 11490 {11491 "name": "uniF6D8", 11492 "unicode": 63192, 11493 "contours": [11494 311495 ]11496 }, 11497 {11498 "name": "uniA924", 11499 "unicode": 43300, 11500 "contours": [11501 211502 ]11503 }, 11504 {11505 "name": "uniA925", 11506 "unicode": 43301, 11507 "contours": [11508 311509 ]11510 }, 11511 {11512 "name": "ueMark-kayahli", 11513 "unicode": 43302, 11514 "contours": [11515 111516 ]11517 }, 11518 {11519 "name": "eMark-kayahli", 11520 "unicode": 43303, 11521 "contours": [11522 111523 ]11524 }, 11525 {11526 "name": "uMark-kayahli", 11527 "unicode": 43304, 11528 "contours": [11529 111530 ]11531 }, 11532 {11533 "name": "eeMark-kayahli", 11534 "unicode": 43305, 11535 "contours": [11536 111537 ]11538 }, 11539 {11540 "name": "oMark-kayahli", 11541 "unicode": 43306, 11542 "contours": [11543 211544 ]11545 }, 11546 {11547 "name": "toneplophu-kayahli", 11548 "unicode": 43307, 11549 "contours": [11550 111551 ]11552 }, 11553 {11554 "name": "tonecalya-kayahli", 11555 "unicode": 43308, 11556 "contours": [11557 111558 ]11559 }, 11560 {11561 "name": "tonecalyaplophu-kayahli", 11562 "unicode": 43309, 11563 "contours": [11564 211565 ]11566 }, 11567 {11568 "name": "cwi-kayahli", 11569 "unicode": 43310, 11570 "contours": [11571 111572 ]11573 }, 11574 {11575 "name": "shya-kayahli", 11576 "unicode": 43311, 11577 "contours": [11578 111579 ]11580 }, 11581 {11582 "name": "uni050C", 11583 "unicode": 1292, 11584 "contours": [11585 111586 ]11587 }, 11588 {11589 "name": "zero.alt", 11590 "unicode": 63488, 11591 "contours": [11592 211593 ]11594 }, 11595 {11596 "name": "one.alt", 11597 "unicode": 63489, 11598 "contours": [11599 111600 ]11601 }, 11602 {11603 "name": "two.alt", 11604 "unicode": 63490, 11605 "contours": [11606 111607 ]11608 }, 11609 {11610 "name": "three.alt", 11611 "unicode": 63491, 11612 "contours": [11613 111614 ]11615 }, 11616 {11617 "name": "four.alt", 11618 "unicode": 63492, 11619 "contours": [11620 211621 ]11622 }, 11623 {11624 "name": "five.alt", 11625 "unicode": 63493, 11626 "contours": [11627 111628 ]11629 }, 11630 {11631 "name": "six.alt", 11632 "unicode": 63494, 11633 "contours": [11634 211635 ]11636 }, 11637 {11638 "name": "seven.alt", 11639 "unicode": 63495, 11640 "contours": [11641 111642 ]11643 }, 11644 {11645 "name": "eight.alt", 11646 "unicode": 63496, 11647 "contours": [11648 311649 ]11650 }, 11651 {11652 "name": "nine.alt", 11653 "unicode": 63497, 11654 "contours": [11655 211656 ]11657 }, 11658 {11659 "name": "zero.sups", 11660 "unicode": 63498, 11661 "contours": [11662 2, 11663 311664 ]11665 }, 11666 {11667 "name": "one.sups", 11668 "unicode": 63499, 11669 "contours": [11670 111671 ]11672 }, 11673 {11674 "name": "two.sups", 11675 "unicode": 63500, 11676 "contours": [11677 111678 ]11679 }, 11680 {11681 "name": "three.sups", 11682 "unicode": 63501, 11683 "contours": [11684 111685 ]11686 }, 11687 {11688 "name": "four.sups", 11689 "unicode": 63502, 11690 "contours": [11691 211692 ]11693 }, 11694 {11695 "name": "five.sups", 11696 "unicode": 63503, 11697 "contours": [11698 111699 ]11700 }, 11701 {11702 "name": "six.sups", 11703 "unicode": 63504, 11704 "contours": [11705 211706 ]11707 }, 11708 {11709 "name": "seven.sups", 11710 "unicode": 63505, 11711 "contours": [11712 111713 ]11714 }, 11715 {11716 "name": "eight.sups", 11717 "unicode": 63506, 11718 "contours": [11719 311720 ]11721 }, 11722 {11723 "name": "nine.sups", 11724 "unicode": 63507, 11725 "contours": [11726 211727 ]11728 }, 11729 {11730 "name": "zero.sinf", 11731 "unicode": 63508, 11732 "contours": [11733 2, 11734 311735 ]11736 }, 11737 {11738 "name": "one.sinf", 11739 "unicode": 63509, 11740 "contours": [11741 111742 ]11743 }, 11744 {11745 "name": "two.sinf", 11746 "unicode": 63510, 11747 "contours": [11748 111749 ]11750 }, 11751 {11752 "name": "three.sinf", 11753 "unicode": 63511, 11754 "contours": [11755 111756 ]11757 }, 11758 {11759 "name": "four.sinf", 11760 "unicode": 63512, 11761 "contours": [11762 211763 ]11764 }, 11765 {11766 "name": "five.sinf", 11767 "unicode": 63513, 11768 "contours": [11769 111770 ]11771 }, 11772 {11773 "name": "six.sinf", 11774 "unicode": 63514, 11775 "contours": [11776 211777 ]11778 }, 11779 {11780 "name": "seven.sinf", 11781 "unicode": 63515, 11782 "contours": [11783 111784 ]11785 }, 11786 {11787 "name": "eight.sinf", 11788 "unicode": 63516, 11789 "contours": [11790 311791 ]11792 }, 11793 {11794 "name": "nine.sinf", 11795 "unicode": 63517, 11796 "contours": [11797 211798 ]11799 }, 11800 {11801 "name": "uni0961", 11802 "unicode": 2401, 11803 "contours": [11804 111805 ]11806 }, 11807 {11808 "name": "uni2036", 11809 "unicode": 8246, 11810 "contours": [11811 211812 ]11813 }, 11814 {11815 "name": "uni0967", 11816 "unicode": 2407, 11817 "contours": [11818 111819 ]11820 }, 11821 {11822 "name": "uni096D", 11823 "unicode": 2413, 11824 "contours": [11825 1, 11826 211827 ]11828 }, 11829 {11830 "name": "uni0973", 11831 "unicode": 2419, 11832 "contours": [11833 111834 ]11835 }, 11836 {11837 "name": "uni0979", 11838 "unicode": 2425, 11839 "contours": [11840 411841 ]11842 }, 11843 {11844 "name": "uni0427", 11845 "unicode": 1063, 11846 "contours": [11847 111848 ]11849 }, 11850 {11851 "name": "uni097F", 11852 "unicode": 2431, 11853 "contours": [11854 311855 ]11856 }, 11857 {11858 "name": "uniF8FF", 11859 "unicode": 63743, 11860 "contours": [11861 2, 11862 311863 ]11864 }, 11865 {11866 "name": "SF030000", 11867 "unicode": 9488, 11868 "contours": [11869 111870 ]11871 }, 11872 {11873 "name": "uni2000", 11874 "unicode": 8192, 11875 "contours": [11876 011877 ]11878 }, 11879 {11880 "name": "SF080000", 11881 "unicode": 9500, 11882 "contours": [11883 111884 ]11885 }, 11886 {11887 "name": "uni0469", 11888 "unicode": 1129, 11889 "contours": [11890 211891 ]11892 }, 11893 {11894 "name": "uni046F", 11895 "unicode": 1135, 11896 "contours": [11897 211898 ]11899 }, 11900 {11901 "name": "uni047B", 11902 "unicode": 1147, 11903 "contours": [11904 211905 ]11906 }, 11907 {11908 "name": "f_f", 11909 "unicode": 64256, 11910 "contours": [11911 1, 11912 211913 ]11914 }, 11915 {11916 "name": "f_i", 11917 "unicode": 64257, 11918 "contours": [11919 1, 11920 2, 11921 311922 ]11923 }, 11924 {11925 "name": "f_l", 11926 "unicode": 64258, 11927 "contours": [11928 1, 11929 211930 ]11931 }, 11932 {11933 "name": "f_f_i", 11934 "unicode": 64259, 11935 "contours": [11936 1, 11937 2, 11938 411939 ]11940 }, 11941 {11942 "name": "f_f_l", 11943 "unicode": 64260, 11944 "contours": [11945 1, 11946 2, 11947 311948 ]11949 }, 11950 {11951 "name": "s_t", 11952 "unicode": 64262, 11953 "contours": [11954 111955 ]11956 }, 11957 {11958 "name": "SF090000", 11959 "unicode": 9508, 11960 "contours": [11961 111962 ]11963 }, 11964 {11965 "name": "a.sups", 11966 "unicode": 7491, 11967 "contours": [11968 211969 ]11970 }, 11971 {11972 "name": "b.sups", 11973 "unicode": 7495, 11974 "contours": [11975 211976 ]11977 }, 11978 {11979 "name": "d.sups", 11980 "unicode": 7496, 11981 "contours": [11982 211983 ]11984 }, 11985 {11986 "name": "e.sups", 11987 "unicode": 7497, 11988 "contours": [11989 211990 ]11991 }, 11992 {11993 "name": "g.sups", 11994 "unicode": 7501, 11995 "contours": [11996 311997 ]11998 }, 11999 {12000 "name": "k.sups", 12001 "unicode": 7503, 12002 "contours": [12003 112004 ]12005 }, 12006 {12007 "name": "m.sups", 12008 "unicode": 7504, 12009 "contours": [12010 112011 ]12012 }, 12013 {12014 "name": "o.sups", 12015 "unicode": 7506, 12016 "contours": [12017 212018 ]12019 }, 12020 {12021 "name": "p.sups", 12022 "unicode": 7510, 12023 "contours": [12024 212025 ]12026 }, 12027 {12028 "name": "t.sups", 12029 "unicode": 7511, 12030 "contours": [12031 112032 ]12033 }, 12034 {12035 "name": "u.sups", 12036 "unicode": 7512, 12037 "contours": [12038 112039 ]12040 }, 12041 {12042 "name": "v.sups", 12043 "unicode": 7515, 12044 "contours": [12045 112046 ]12047 }, 12048 {12049 "name": "c.sups", 12050 "unicode": 7580, 12051 "contours": [12052 112053 ]12054 }, 12055 {12056 "name": "f.sups", 12057 "unicode": 7584, 12058 "contours": [12059 112060 ]12061 }, 12062 {12063 "name": "z.sups", 12064 "unicode": 7611, 12065 "contours": [12066 112067 ]12068 }, 12069 {12070 "name": "uni1E00", 12071 "unicode": 7680, 12072 "contours": [12073 412074 ]12075 }, 12076 {12077 "name": "uni0500", 12078 "unicode": 1280, 12079 "contours": [12080 212081 ]12082 }, 12083 {12084 "name": "uni1E02", 12085 "unicode": 7682, 12086 "contours": [12087 412088 ]12089 }, 12090 {12091 "name": "uni1E03", 12092 "unicode": 7683, 12093 "contours": [12094 312095 ]12096 }, 12097 {12098 "name": "uni1E08", 12099 "unicode": 7688, 12100 "contours": [12101 212102 ]12103 }, 12104 {12105 "name": "uni1E09", 12106 "unicode": 7689, 12107 "contours": [12108 212109 ]12110 }, 12111 {12112 "name": "uni1E0A", 12113 "unicode": 7690, 12114 "contours": [12115 312116 ]12117 }, 12118 {12119 "name": "uni1E0B", 12120 "unicode": 7691, 12121 "contours": [12122 312123 ]12124 }, 12125 {12126 "name": "uni1E0C", 12127 "unicode": 7692, 12128 "contours": [12129 312130 ]12131 }, 12132 {12133 "name": "uni1E0D", 12134 "unicode": 7693, 12135 "contours": [12136 312137 ]12138 }, 12139 {12140 "name": "uni1E0E", 12141 "unicode": 7694, 12142 "contours": [12143 312144 ]12145 }, 12146 {12147 "name": "uni1E0F", 12148 "unicode": 7695, 12149 "contours": [12150 312151 ]12152 }, 12153 {12154 "name": "uni1E14", 12155 "unicode": 7700, 12156 "contours": [12157 312158 ]12159 }, 12160 {12161 "name": "uni1E15", 12162 "unicode": 7701, 12163 "contours": [12164 412165 ]12166 }, 12167 {12168 "name": "uni1E16", 12169 "unicode": 7702, 12170 "contours": [12171 312172 ]12173 }, 12174 {12175 "name": "uni1E17", 12176 "unicode": 7703, 12177 "contours": [12178 412179 ]12180 }, 12181 {12182 "name": "uni1E1C", 12183 "unicode": 7708, 12184 "contours": [12185 212186 ]12187 }, 12188 {12189 "name": "uni1E1D", 12190 "unicode": 7709, 12191 "contours": [12192 312193 ]12194 }, 12195 {12196 "name": "uni1E1E", 12197 "unicode": 7710, 12198 "contours": [12199 212200 ]12201 }, 12202 {12203 "name": "fdotaccent", 12204 "unicode": 7711, 12205 "contours": [12206 212207 ]12208 }, 12209 {12210 "name": "uni1E20", 12211 "unicode": 7712, 12212 "contours": [12213 212214 ]12215 }, 12216 {12217 "name": "uni1E21", 12218 "unicode": 7713, 12219 "contours": [12220 3, 12221 412222 ]12223 }, 12224 {12225 "name": "uni1E24", 12226 "unicode": 7716, 12227 "contours": [12228 212229 ]12230 }, 12231 {12232 "name": "uni1E25", 12233 "unicode": 7717, 12234 "contours": [12235 212236 ]12237 }, 12238 {12239 "name": "uni1E2A", 12240 "unicode": 7722, 12241 "contours": [12242 212243 ]12244 }, 12245 {12246 "name": "uni1E2B", 12247 "unicode": 7723, 12248 "contours": [12249 212250 ]12251 }, 12252 {12253 "name": "uni1E2E", 12254 "unicode": 7726, 12255 "contours": [12256 412257 ]12258 }, 12259 {12260 "name": "uni1E2F", 12261 "unicode": 7727, 12262 "contours": [12263 412264 ]12265 }, 12266 {12267 "name": "uni1E36", 12268 "unicode": 7734, 12269 "contours": [12270 212271 ]12272 }, 12273 {12274 "name": "uni1E37", 12275 "unicode": 7735, 12276 "contours": [12277 212278 ]12279 }, 12280 {12281 "name": "uni1E38", 12282 "unicode": 7736, 12283 "contours": [12284 312285 ]12286 }, 12287 {12288 "name": "uni1E39", 12289 "unicode": 7737, 12290 "contours": [12291 312292 ]12293 }, 12294 {12295 "name": "uni1E3A", 12296 "unicode": 7738, 12297 "contours": [12298 212299 ]12300 }, 12301 {12302 "name": "uni1E3B", 12303 "unicode": 7739, 12304 "contours": [12305 212306 ]12307 }, 12308 {12309 "name": "uni1E3E", 12310 "unicode": 7742, 12311 "contours": [12312 212313 ]12314 }, 12315 {12316 "name": "uni1E3F", 12317 "unicode": 7743, 12318 "contours": [12319 212320 ]12321 }, 12322 {12323 "name": "uni1E40", 12324 "unicode": 7744, 12325 "contours": [12326 212327 ]12328 }, 12329 {12330 "name": "uni1E41", 12331 "unicode": 7745, 12332 "contours": [12333 212334 ]12335 }, 12336 {12337 "name": "uni1E42", 12338 "unicode": 7746, 12339 "contours": [12340 212341 ]12342 }, 12343 {12344 "name": "uni1E43", 12345 "unicode": 7747, 12346 "contours": [12347 212348 ]12349 }, 12350 {12351 "name": "uni1E44", 12352 "unicode": 7748, 12353 "contours": [12354 212355 ]12356 }, 12357 {12358 "name": "uni1E45", 12359 "unicode": 7749, 12360 "contours": [12361 212362 ]12363 }, 12364 {12365 "name": "uni1E46", 12366 "unicode": 7750, 12367 "contours": [12368 212369 ]12370 }, 12371 {12372 "name": "uni1E47", 12373 "unicode": 7751, 12374 "contours": [12375 212376 ]12377 }, 12378 {12379 "name": "uni1E48", 12380 "unicode": 7752, 12381 "contours": [12382 212383 ]12384 }, 12385 {12386 "name": "uni1E49", 12387 "unicode": 7753, 12388 "contours": [12389 212390 ]12391 }, 12392 {12393 "name": "uni1E4C", 12394 "unicode": 7756, 12395 "contours": [12396 412397 ]12398 }, 12399 {12400 "name": "uni1E4D", 12401 "unicode": 7757, 12402 "contours": [12403 412404 ]12405 }, 12406 {12407 "name": "uni1E4E", 12408 "unicode": 7758, 12409 "contours": [12410 512411 ]12412 }, 12413 {12414 "name": "uni1E4F", 12415 "unicode": 7759, 12416 "contours": [12417 512418 ]12419 }, 12420 {12421 "name": "uni1E50", 12422 "unicode": 7760, 12423 "contours": [12424 412425 ]12426 }, 12427 {12428 "name": "uni1E51", 12429 "unicode": 7761, 12430 "contours": [12431 412432 ]12433 }, 12434 {12435 "name": "uni1E52", 12436 "unicode": 7762, 12437 "contours": [12438 412439 ]12440 }, 12441 {12442 "name": "uni1E53", 12443 "unicode": 7763, 12444 "contours": [12445 412446 ]12447 }, 12448 {12449 "name": "uni1E56", 12450 "unicode": 7766, 12451 "contours": [12452 312453 ]12454 }, 12455 {12456 "name": "uni1E57", 12457 "unicode": 7767, 12458 "contours": [12459 312460 ]12461 }, 12462 {12463 "name": "uni1E5A", 12464 "unicode": 7770, 12465 "contours": [12466 312467 ]12468 }, 12469 {12470 "name": "uni1E5B", 12471 "unicode": 7771, 12472 "contours": [12473 212474 ]12475 }, 12476 {12477 "name": "uni1E5C", 12478 "unicode": 7772, 12479 "contours": [12480 412481 ]12482 }, 12483 {12484 "name": "uni1E5D", 12485 "unicode": 7773, 12486 "contours": [12487 312488 ]12489 }, 12490 {12491 "name": "uni1E5E", 12492 "unicode": 7774, 12493 "contours": [12494 312495 ]12496 }, 12497 {12498 "name": "uni1E5F", 12499 "unicode": 7775, 12500 "contours": [12501 212502 ]12503 }, 12504 {12505 "name": "uni1E60", 12506 "unicode": 7776, 12507 "contours": [12508 212509 ]12510 }, 12511 {12512 "name": "uni1E61", 12513 "unicode": 7777, 12514 "contours": [12515 212516 ]12517 }, 12518 {12519 "name": "uni1E62", 12520 "unicode": 7778, 12521 "contours": [12522 212523 ]12524 }, 12525 {12526 "name": "uni1E63", 12527 "unicode": 7779, 12528 "contours": [12529 212530 ]12531 }, 12532 {12533 "name": "uni1E64", 12534 "unicode": 7780, 12535 "contours": [12536 312537 ]12538 }, 12539 {12540 "name": "uni1E65", 12541 "unicode": 7781, 12542 "contours": [12543 312544 ]12545 }, 12546 {12547 "name": "uni1E66", 12548 "unicode": 7782, 12549 "contours": [12550 312551 ]12552 }, 12553 {12554 "name": "uni1E67", 12555 "unicode": 7783, 12556 "contours": [12557 312558 ]12559 }, 12560 {12561 "name": "uni1E68", 12562 "unicode": 7784, 12563 "contours": [12564 312565 ]12566 }, 12567 {12568 "name": "uni1E69", 12569 "unicode": 7785, 12570 "contours": [12571 312572 ]12573 }, 12574 {12575 "name": "uni1E6A", 12576 "unicode": 7786, 12577 "contours": [12578 212579 ]12580 }, 12581 {12582 "name": "uni1E6B", 12583 "unicode": 7787, 12584 "contours": [12585 212586 ]12587 }, 12588 {12589 "name": "uni1E6C", 12590 "unicode": 7788, 12591 "contours": [12592 212593 ]12594 }, 12595 {12596 "name": "uni1E6D", 12597 "unicode": 7789, 12598 "contours": [12599 212600 ]12601 }, 12602 {12603 "name": "uni1E6E", 12604 "unicode": 7790, 12605 "contours": [12606 212607 ]12608 }, 12609 {12610 "name": "uni1E6F", 12611 "unicode": 7791, 12612 "contours": [12613 212614 ]12615 }, 12616 {12617 "name": "uni1E78", 12618 "unicode": 7800, 12619 "contours": [12620 312621 ]12622 }, 12623 {12624 "name": "uni1E79", 12625 "unicode": 7801, 12626 "contours": [12627 312628 ]12629 }, 12630 {12631 "name": "uni1E7A", 12632 "unicode": 7802, 12633 "contours": [12634 412635 ]12636 }, 12637 {12638 "name": "uni1E7B", 12639 "unicode": 7803, 12640 "contours": [12641 412642 ]12643 }, 12644 {12645 "name": "Wgrave", 12646 "unicode": 7808, 12647 "contours": [12648 212649 ]12650 }, 12651 {12652 "name": "wgrave", 12653 "unicode": 7809, 12654 "contours": [12655 212656 ]12657 }, 12658 {12659 "name": "Wacute", 12660 "unicode": 7810, 12661 "contours": [12662 212663 ]12664 }, 12665 {12666 "name": "wacute", 12667 "unicode": 7811, 12668 "contours": [12669 212670 ]12671 }, 12672 {12673 "name": "Wdieresis", 12674 "unicode": 7812, 12675 "contours": [12676 312677 ]12678 }, 12679 {12680 "name": "wdieresis", 12681 "unicode": 7813, 12682 "contours": [12683 312684 ]12685 }, 12686 {12687 "name": "uni1E8E", 12688 "unicode": 7822, 12689 "contours": [12690 212691 ]12692 }, 12693 {12694 "name": "uni1E8F", 12695 "unicode": 7823, 12696 "contours": [12697 212698 ]12699 }, 12700 {12701 "name": "uni1E92", 12702 "unicode": 7826, 12703 "contours": [12704 212705 ]12706 }, 12707 {12708 "name": "uni1E93", 12709 "unicode": 7827, 12710 "contours": [12711 212712 ]12713 }, 12714 {12715 "name": "uni1E97", 12716 "unicode": 7831, 12717 "contours": [12718 312719 ]12720 }, 12721 {12722 "name": "uni1E9E", 12723 "unicode": 7838, 12724 "contours": [12725 112726 ]12727 }, 12728 {12729 "name": "uni1EA0", 12730 "unicode": 7840, 12731 "contours": [12732 312733 ]12734 }, 12735 {12736 "name": "uni1EA1", 12737 "unicode": 7841, 12738 "contours": [12739 312740 ]12741 }, 12742 {12743 "name": "uni1EA2", 12744 "unicode": 7842, 12745 "contours": [12746 312747 ]12748 }, 12749 {12750 "name": "uni1EA3", 12751 "unicode": 7843, 12752 "contours": [12753 312754 ]12755 }, 12756 {12757 "name": "uni1EA4", 12758 "unicode": 7844, 12759 "contours": [12760 412761 ]12762 }, 12763 {12764 "name": "uni1EA5", 12765 "unicode": 7845, 12766 "contours": [12767 412768 ]12769 }, 12770 {12771 "name": "uni1EA6", 12772 "unicode": 7846, 12773 "contours": [12774 412775 ]12776 }, 12777 {12778 "name": "uni1EA7", 12779 "unicode": 7847, 12780 "contours": [12781 412782 ]12783 }, 12784 {12785 "name": "uni1EA8", 12786 "unicode": 7848, 12787 "contours": [12788 412789 ]12790 }, 12791 {12792 "name": "uni1EA9", 12793 "unicode": 7849, 12794 "contours": [12795 412796 ]12797 }, 12798 {12799 "name": "uni1EAA", 12800 "unicode": 7850, 12801 "contours": [12802 412803 ]12804 }, 12805 {12806 "name": "uni1EAB", 12807 "unicode": 7851, 12808 "contours": [12809 412810 ]12811 }, 12812 {12813 "name": "uni1EAC", 12814 "unicode": 7852, 12815 "contours": [12816 412817 ]12818 }, 12819 {12820 "name": "uni1EAD", 12821 "unicode": 7853, 12822 "contours": [12823 412824 ]12825 }, 12826 {12827 "name": "uni1EAE", 12828 "unicode": 7854, 12829 "contours": [12830 412831 ]12832 }, 12833 {12834 "name": "uni1EAF", 12835 "unicode": 7855, 12836 "contours": [12837 412838 ]12839 }, 12840 {12841 "name": "uni1EB0", 12842 "unicode": 7856, 12843 "contours": [12844 412845 ]12846 }, 12847 {12848 "name": "uni1EB1", 12849 "unicode": 7857, 12850 "contours": [12851 412852 ]12853 }, 12854 {12855 "name": "uni1EB2", 12856 "unicode": 7858, 12857 "contours": [12858 412859 ]12860 }, 12861 {12862 "name": "uni1EB3", 12863 "unicode": 7859, 12864 "contours": [12865 412866 ]12867 }, 12868 {12869 "name": "uni1EB4", 12870 "unicode": 7860, 12871 "contours": [12872 412873 ]12874 }, 12875 {12876 "name": "uni1EB5", 12877 "unicode": 7861, 12878 "contours": [12879 412880 ]12881 }, 12882 {12883 "name": "uni1EB6", 12884 "unicode": 7862, 12885 "contours": [12886 412887 ]12888 }, 12889 {12890 "name": "uni1EB7", 12891 "unicode": 7863, 12892 "contours": [12893 412894 ]12895 }, 12896 {12897 "name": "uni1EB8", 12898 "unicode": 7864, 12899 "contours": [12900 212901 ]12902 }, 12903 {12904 "name": "uni1EB9", 12905 "unicode": 7865, 12906 "contours": [12907 312908 ]12909 }, 12910 {12911 "name": "uni1EBA", 12912 "unicode": 7866, 12913 "contours": [12914 212915 ]12916 }, 12917 {12918 "name": "uni1EBB", 12919 "unicode": 7867, 12920 "contours": [12921 312922 ]12923 }, 12924 {12925 "name": "uni1EBC", 12926 "unicode": 7868, 12927 "contours": [12928 212929 ]12930 }, 12931 {12932 "name": "uni1EBD", 12933 "unicode": 7869, 12934 "contours": [12935 312936 ]12937 }, 12938 {12939 "name": "uni1EBE", 12940 "unicode": 7870, 12941 "contours": [12942 312943 ]12944 }, 12945 {12946 "name": "uni1EBF", 12947 "unicode": 7871, 12948 "contours": [12949 412950 ]12951 }, 12952 {12953 "name": "uni1EC0", 12954 "unicode": 7872, 12955 "contours": [12956 312957 ]12958 }, 12959 {12960 "name": "uni1EC1", 12961 "unicode": 7873, 12962 "contours": [12963 412964 ]12965 }, 12966 {12967 "name": "uni1EC2", 12968 "unicode": 7874, 12969 "contours": [12970 312971 ]12972 }, 12973 {12974 "name": "uni1EC3", 12975 "unicode": 7875, 12976 "contours": [12977 412978 ]12979 }, 12980 {12981 "name": "uni1EC4", 12982 "unicode": 7876, 12983 "contours": [12984 312985 ]12986 }, 12987 {12988 "name": "uni1EC5", 12989 "unicode": 7877, 12990 "contours": [12991 412992 ]12993 }, 12994 {12995 "name": "uni1EC6", 12996 "unicode": 7878, 12997 "contours": [12998 312999 ]13000 }, 13001 {13002 "name": "uni1EC7", 13003 "unicode": 7879, 13004 "contours": [13005 413006 ]13007 }, 13008 {13009 "name": "uni1EC8", 13010 "unicode": 7880, 13011 "contours": [13012 213013 ]13014 }, 13015 {13016 "name": "uni1EC9", 13017 "unicode": 7881, 13018 "contours": [13019 213020 ]13021 }, 13022 {13023 "name": "uni1ECA", 13024 "unicode": 7882, 13025 "contours": [13026 213027 ]13028 }, 13029 {13030 "name": "uni1ECB", 13031 "unicode": 7883, 13032 "contours": [13033 313034 ]13035 }, 13036 {13037 "name": "uni1ECC", 13038 "unicode": 7884, 13039 "contours": [13040 313041 ]13042 }, 13043 {13044 "name": "uni1ECD", 13045 "unicode": 7885, 13046 "contours": [13047 313048 ]13049 }, 13050 {13051 "name": "uni1ECE", 13052 "unicode": 7886, 13053 "contours": [13054 313055 ]13056 }, 13057 {13058 "name": "uni1ECF", 13059 "unicode": 7887, 13060 "contours": [13061 313062 ]13063 }, 13064 {13065 "name": "uni1ED0", 13066 "unicode": 7888, 13067 "contours": [13068 413069 ]13070 }, 13071 {13072 "name": "uni1ED1", 13073 "unicode": 7889, 13074 "contours": [13075 413076 ]13077 }, 13078 {13079 "name": "uni1ED2", 13080 "unicode": 7890, 13081 "contours": [13082 413083 ]13084 }, 13085 {13086 "name": "uni1ED3", 13087 "unicode": 7891, 13088 "contours": [13089 413090 ]13091 }, 13092 {13093 "name": "uni1ED4", 13094 "unicode": 7892, 13095 "contours": [13096 413097 ]13098 }, 13099 {13100 "name": "uni1ED5", 13101 "unicode": 7893, 13102 "contours": [13103 413104 ]13105 }, 13106 {13107 "name": "uni1ED6", 13108 "unicode": 7894, 13109 "contours": [13110 413111 ]13112 }, 13113 {13114 "name": "uni1ED7", 13115 "unicode": 7895, 13116 "contours": [13117 413118 ]13119 }, 13120 {13121 "name": "uni1ED8", 13122 "unicode": 7896, 13123 "contours": [13124 413125 ]13126 }, 13127 {13128 "name": "uni1ED9", 13129 "unicode": 7897, 13130 "contours": [13131 413132 ]13133 }, 13134 {13135 "name": "uni1EDA", 13136 "unicode": 7898, 13137 "contours": [13138 3, 13139 413140 ]13141 }, 13142 {13143 "name": "uni1EDB", 13144 "unicode": 7899, 13145 "contours": [13146 313147 ]13148 }, 13149 {13150 "name": "uni1EDC", 13151 "unicode": 7900, 13152 "contours": [13153 3, 13154 413155 ]13156 }, 13157 {13158 "name": "uni1EDD", 13159 "unicode": 7901, 13160 "contours": [13161 313162 ]13163 }, 13164 {13165 "name": "uni1EDE", 13166 "unicode": 7902, 13167 "contours": [13168 3, 13169 413170 ]13171 }, 13172 {13173 "name": "uni1EDF", 13174 "unicode": 7903, 13175 "contours": [13176 313177 ]13178 }, 13179 {13180 "name": "uni1EE0", 13181 "unicode": 7904, 13182 "contours": [13183 3, 13184 413185 ]13186 }, 13187 {13188 "name": "uni1EE1", 13189 "unicode": 7905, 13190 "contours": [13191 313192 ]13193 }, 13194 {13195 "name": "uni1EE2", 13196 "unicode": 7906, 13197 "contours": [13198 3, 13199 413200 ]13201 }, 13202 {13203 "name": "uni1EE3", 13204 "unicode": 7907, 13205 "contours": [13206 313207 ]13208 }, 13209 {13210 "name": "uni1EE4", 13211 "unicode": 7908, 13212 "contours": [13213 213214 ]13215 }, 13216 {13217 "name": "uni1EE5", 13218 "unicode": 7909, 13219 "contours": [13220 213221 ]13222 }, 13223 {13224 "name": "uni1EE6", 13225 "unicode": 7910, 13226 "contours": [13227 213228 ]13229 }, 13230 {13231 "name": "uni1EE7", 13232 "unicode": 7911, 13233 "contours": [13234 213235 ]13236 }, 13237 {13238 "name": "uni1EE8", 13239 "unicode": 7912, 13240 "contours": [13241 213242 ]13243 }, 13244 {13245 "name": "uni1EE9", 13246 "unicode": 7913, 13247 "contours": [13248 213249 ]13250 }, 13251 {13252 "name": "uni1EEA", 13253 "unicode": 7914, 13254 "contours": [13255 213256 ]13257 }, 13258 {13259 "name": "uni1EEB", 13260 "unicode": 7915, 13261 "contours": [13262 213263 ]13264 }, 13265 {13266 "name": "uni1EEC", 13267 "unicode": 7916, 13268 "contours": [13269 213270 ]13271 }, 13272 {13273 "name": "uni1EED", 13274 "unicode": 7917, 13275 "contours": [13276 213277 ]13278 }, 13279 {13280 "name": "uni1EEE", 13281 "unicode": 7918, 13282 "contours": [13283 213284 ]13285 }, 13286 {13287 "name": "uni1EEF", 13288 "unicode": 7919, 13289 "contours": [13290 213291 ]13292 }, 13293 {13294 "name": "uni1EF0", 13295 "unicode": 7920, 13296 "contours": [13297 213298 ]13299 }, 13300 {13301 "name": "uni1EF1", 13302 "unicode": 7921, 13303 "contours": [13304 213305 ]13306 }, 13307 {13308 "name": "Ygrave", 13309 "unicode": 7922, 13310 "contours": [13311 213312 ]13313 }, 13314 {13315 "name": "ygrave", 13316 "unicode": 7923, 13317 "contours": [13318 213319 ]13320 }, 13321 {13322 "name": "uni1EF4", 13323 "unicode": 7924, 13324 "contours": [13325 213326 ]13327 }, 13328 {13329 "name": "uni1EF5", 13330 "unicode": 7925, 13331 "contours": [13332 213333 ]13334 }, 13335 {13336 "name": "uni1EF6", 13337 "unicode": 7926, 13338 "contours": [13339 213340 ]13341 }, 13342 {13343 "name": "uni1EF7", 13344 "unicode": 7927, 13345 "contours": [13346 213347 ]13348 }, 13349 {13350 "name": "uni1EF8", 13351 "unicode": 7928, 13352 "contours": [13353 213354 ]13355 }, 13356 {13357 "name": "uni1EF9", 13358 "unicode": 7929, 13359 "contours": [13360 213361 ]13362 }, 13363 {13364 "name": "uniFEFF", 13365 "unicode": 65279, 13366 "contours": [13367 013368 ]13369 }, 13370 {13371 "name": "uni1F00", 13372 "unicode": 7936, 13373 "contours": [13374 313375 ]13376 }, 13377 {13378 "name": "uni1F01", 13379 "unicode": 7937, 13380 "contours": [13381 313382 ]13383 }, 13384 {13385 "name": "uni1F02", 13386 "unicode": 7938, 13387 "contours": [13388 413389 ]13390 }, 13391 {13392 "name": "uni1F03", 13393 "unicode": 7939, 13394 "contours": [13395 413396 ]13397 }, 13398 {13399 "name": "uni1F04", 13400 "unicode": 7940, 13401 "contours": [13402 413403 ]13404 }, 13405 {13406 "name": "uni1F05", 13407 "unicode": 7941, 13408 "contours": [13409 413410 ]13411 }, 13412 {13413 "name": "uni1F06", 13414 "unicode": 7942, 13415 "contours": [13416 413417 ]13418 }, 13419 {13420 "name": "uni1F07", 13421 "unicode": 7943, 13422 "contours": [13423 413424 ]13425 }, 13426 {13427 "name": "uni1F08", 13428 "unicode": 7944, 13429 "contours": [13430 313431 ]13432 }, 13433 {13434 "name": "uni1F09", 13435 "unicode": 7945, 13436 "contours": [13437 313438 ]13439 }, 13440 {13441 "name": "uni1F0A", 13442 "unicode": 7946, 13443 "contours": [13444 413445 ]13446 }, 13447 {13448 "name": "uni1F0B", 13449 "unicode": 7947, 13450 "contours": [13451 413452 ]13453 }, 13454 {13455 "name": "uni1F0C", 13456 "unicode": 7948, 13457 "contours": [13458 413459 ]13460 }, 13461 {13462 "name": "uni1F0D", 13463 "unicode": 7949, 13464 "contours": [13465 413466 ]13467 }, 13468 {13469 "name": "uni1F0E", 13470 "unicode": 7950, 13471 "contours": [13472 413473 ]13474 }, 13475 {13476 "name": "uni1F0F", 13477 "unicode": 7951, 13478 "contours": [13479 413480 ]13481 }, 13482 {13483 "name": "uni1F10", 13484 "unicode": 7952, 13485 "contours": [13486 213487 ]13488 }, 13489 {13490 "name": "uni1F11", 13491 "unicode": 7953, 13492 "contours": [13493 213494 ]13495 }, 13496 {13497 "name": "uni1F12", 13498 "unicode": 7954, 13499 "contours": [13500 313501 ]13502 }, 13503 {13504 "name": "uni1F13", 13505 "unicode": 7955, 13506 "contours": [13507 313508 ]13509 }, 13510 {13511 "name": "uni1F14", 13512 "unicode": 7956, 13513 "contours": [13514 313515 ]13516 }, 13517 {13518 "name": "uni1F15", 13519 "unicode": 7957, 13520 "contours": [13521 313522 ]13523 }, 13524 {13525 "name": "uni1F18", 13526 "unicode": 7960, 13527 "contours": [13528 213529 ]13530 }, 13531 {13532 "name": "uni1F19", 13533 "unicode": 7961, 13534 "contours": [13535 213536 ]13537 }, 13538 {13539 "name": "uni1F1A", 13540 "unicode": 7962, 13541 "contours": [13542 313543 ]13544 }, 13545 {13546 "name": "uni1F1B", 13547 "unicode": 7963, 13548 "contours": [13549 313550 ]13551 }, 13552 {13553 "name": "uni1F1C", 13554 "unicode": 7964, 13555 "contours": [13556 313557 ]13558 }, 13559 {13560 "name": "uni1F1D", 13561 "unicode": 7965, 13562 "contours": [13563 313564 ]13565 }, 13566 {13567 "name": "uni1F20", 13568 "unicode": 7968, 13569 "contours": [13570 213571 ]13572 }, 13573 {13574 "name": "uni1F21", 13575 "unicode": 7969, 13576 "contours": [13577 213578 ]13579 }, 13580 {13581 "name": "uni1F22", 13582 "unicode": 7970, 13583 "contours": [13584 313585 ]13586 }, 13587 {13588 "name": "uni1F23", 13589 "unicode": 7971, 13590 "contours": [13591 313592 ]13593 }, 13594 {13595 "name": "uni1F24", 13596 "unicode": 7972, 13597 "contours": [13598 313599 ]13600 }, 13601 {13602 "name": "uni1F25", 13603 "unicode": 7973, 13604 "contours": [13605 313606 ]13607 }, 13608 {13609 "name": "uni1F26", 13610 "unicode": 7974, 13611 "contours": [13612 313613 ]13614 }, 13615 {13616 "name": "uni1F27", 13617 "unicode": 7975, 13618 "contours": [13619 313620 ]13621 }, 13622 {13623 "name": "uni1F28", 13624 "unicode": 7976, 13625 "contours": [13626 213627 ]13628 }, 13629 {13630 "name": "uni1F29", 13631 "unicode": 7977, 13632 "contours": [13633 213634 ]13635 }, 13636 {13637 "name": "uni1F2A", 13638 "unicode": 7978, 13639 "contours": [13640 313641 ]13642 }, 13643 {13644 "name": "uni1F2B", 13645 "unicode": 7979, 13646 "contours": [13647 313648 ]13649 }, 13650 {13651 "name": "uni1F2C", 13652 "unicode": 7980, 13653 "contours": [13654 313655 ]13656 }, 13657 {13658 "name": "uni1F2D", 13659 "unicode": 7981, 13660 "contours": [13661 313662 ]13663 }, 13664 {13665 "name": "uni1F2E", 13666 "unicode": 7982, 13667 "contours": [13668 313669 ]13670 }, 13671 {13672 "name": "uni1F2F", 13673 "unicode": 7983, 13674 "contours": [13675 313676 ]13677 }, 13678 {13679 "name": "uni1F30", 13680 "unicode": 7984, 13681 "contours": [13682 213683 ]13684 }, 13685 {13686 "name": "uni1F31", 13687 "unicode": 7985, 13688 "contours": [13689 213690 ]13691 }, 13692 {13693 "name": "uni1F32", 13694 "unicode": 7986, 13695 "contours": [13696 313697 ]13698 }, 13699 {13700 "name": "uni1F33", 13701 "unicode": 7987, 13702 "contours": [13703 313704 ]13705 }, 13706 {13707 "name": "uni1F34", 13708 "unicode": 7988, 13709 "contours": [13710 313711 ]13712 }, 13713 {13714 "name": "uni1F35", 13715 "unicode": 7989, 13716 "contours": [13717 313718 ]13719 }, 13720 {13721 "name": "uni1F36", 13722 "unicode": 7990, 13723 "contours": [13724 313725 ]13726 }, 13727 {13728 "name": "uni1F37", 13729 "unicode": 7991, 13730 "contours": [13731 313732 ]13733 }, 13734 {13735 "name": "uni1F38", 13736 "unicode": 7992, 13737 "contours": [13738 213739 ]13740 }, 13741 {13742 "name": "uni1F39", 13743 "unicode": 7993, 13744 "contours": [13745 213746 ]13747 }, 13748 {13749 "name": "uni1F3A", 13750 "unicode": 7994, 13751 "contours": [13752 313753 ]13754 }, 13755 {13756 "name": "uni1F3B", 13757 "unicode": 7995, 13758 "contours": [13759 313760 ]13761 }, 13762 {13763 "name": "uni1F3C", 13764 "unicode": 7996, 13765 "contours": [13766 313767 ]13768 }, 13769 {13770 "name": "uni1F3D", 13771 "unicode": 7997, 13772 "contours": [13773 313774 ]13775 }, 13776 {13777 "name": "uni1F3E", 13778 "unicode": 7998, 13779 "contours": [13780 313781 ]13782 }, 13783 {13784 "name": "uni1F3F", 13785 "unicode": 7999, 13786 "contours": [13787 313788 ]13789 }, 13790 {13791 "name": "uni1F40", 13792 "unicode": 8000, 13793 "contours": [13794 313795 ]13796 }, 13797 {13798 "name": "uni1F41", 13799 "unicode": 8001, 13800 "contours": [13801 313802 ]13803 }, 13804 {13805 "name": "uni1F42", 13806 "unicode": 8002, 13807 "contours": [13808 413809 ]13810 }, 13811 {13812 "name": "uni1F43", 13813 "unicode": 8003, 13814 "contours": [13815 413816 ]13817 }, 13818 {13819 "name": "uni1F44", 13820 "unicode": 8004, 13821 "contours": [13822 413823 ]13824 }, 13825 {13826 "name": "uni1F45", 13827 "unicode": 8005, 13828 "contours": [13829 413830 ]13831 }, 13832 {13833 "name": "uni1F48", 13834 "unicode": 8008, 13835 "contours": [13836 313837 ]13838 }, 13839 {13840 "name": "uni1F49", 13841 "unicode": 8009, 13842 "contours": [13843 313844 ]13845 }, 13846 {13847 "name": "uni1F4A", 13848 "unicode": 8010, 13849 "contours": [13850 413851 ]13852 }, 13853 {13854 "name": "uni1F4B", 13855 "unicode": 8011, 13856 "contours": [13857 413858 ]13859 }, 13860 {13861 "name": "uni1F4C", 13862 "unicode": 8012, 13863 "contours": [13864 413865 ]13866 }, 13867 {13868 "name": "uni1F4D", 13869 "unicode": 8013, 13870 "contours": [13871 413872 ]13873 }, 13874 {13875 "name": "uni1F50", 13876 "unicode": 8016, 13877 "contours": [13878 213879 ]13880 }, 13881 {13882 "name": "uni1F51", 13883 "unicode": 8017, 13884 "contours": [13885 213886 ]13887 }, 13888 {13889 "name": "uni1F52", 13890 "unicode": 8018, 13891 "contours": [13892 313893 ]13894 }, 13895 {13896 "name": "uni1F53", 13897 "unicode": 8019, 13898 "contours": [13899 313900 ]13901 }, 13902 {13903 "name": "uni1F54", 13904 "unicode": 8020, 13905 "contours": [13906 313907 ]13908 }, 13909 {13910 "name": "uni1F55", 13911 "unicode": 8021, 13912 "contours": [13913 313914 ]13915 }, 13916 {13917 "name": "uni1F56", 13918 "unicode": 8022, 13919 "contours": [13920 313921 ]13922 }, 13923 {13924 "name": "uni1F57", 13925 "unicode": 8023, 13926 "contours": [13927 313928 ]13929 }, 13930 {13931 "name": "uni1F59", 13932 "unicode": 8025, 13933 "contours": [13934 213935 ]13936 }, 13937 {13938 "name": "uni1F5B", 13939 "unicode": 8027, 13940 "contours": [13941 313942 ]13943 }, 13944 {13945 "name": "uni1F5D", 13946 "unicode": 8029, 13947 "contours": [13948 313949 ]13950 }, 13951 {13952 "name": "uni1F5F", 13953 "unicode": 8031, 13954 "contours": [13955 313956 ]13957 }, 13958 {13959 "name": "uni1F60", 13960 "unicode": 8032, 13961 "contours": [13962 213963 ]13964 }, 13965 {13966 "name": "uni1F61", 13967 "unicode": 8033, 13968 "contours": [13969 213970 ]13971 }, 13972 {13973 "name": "uni1F62", 13974 "unicode": 8034, 13975 "contours": [13976 313977 ]13978 }, 13979 {13980 "name": "uni1F63", 13981 "unicode": 8035, 13982 "contours": [13983 313984 ]13985 }, 13986 {13987 "name": "uni1F64", 13988 "unicode": 8036, 13989 "contours": [13990 313991 ]13992 }, 13993 {13994 "name": "uni1F65", 13995 "unicode": 8037, 13996 "contours": [13997 313998 ]13999 }, 14000 {14001 "name": "uni1F66", 14002 "unicode": 8038, 14003 "contours": [14004 314005 ]14006 }, 14007 {14008 "name": "uni1F67", 14009 "unicode": 8039, 14010 "contours": [14011 314012 ]14013 }, 14014 {14015 "name": "uni1F68", 14016 "unicode": 8040, 14017 "contours": [14018 214019 ]14020 }, 14021 {14022 "name": "uni1F69", 14023 "unicode": 8041, 14024 "contours": [14025 214026 ]14027 }, 14028 {14029 "name": "uni1F6A", 14030 "unicode": 8042, 14031 "contours": [14032 314033 ]14034 }, 14035 {14036 "name": "uni1F6B", 14037 "unicode": 8043, 14038 "contours": [14039 314040 ]14041 }, 14042 {14043 "name": "uni1F6C", 14044 "unicode": 8044, 14045 "contours": [14046 314047 ]14048 }, 14049 {14050 "name": "uni1F6D", 14051 "unicode": 8045, 14052 "contours": [14053 314054 ]14055 }, 14056 {14057 "name": "uni1F6E", 14058 "unicode": 8046, 14059 "contours": [14060 314061 ]14062 }, 14063 {14064 "name": "uni1F6F", 14065 "unicode": 8047, 14066 "contours": [14067 314068 ]14069 }, 14070 {14071 "name": "uni1F70", 14072 "unicode": 8048, 14073 "contours": [14074 314075 ]14076 }, 14077 {14078 "name": "uni1F71", 14079 "unicode": 8049, 14080 "contours": [14081 314082 ]14083 }, 14084 {14085 "name": "uni1F72", 14086 "unicode": 8050, 14087 "contours": [14088 214089 ]14090 }, 14091 {14092 "name": "uni1F73", 14093 "unicode": 8051, 14094 "contours": [14095 214096 ]14097 }, 14098 {14099 "name": "uni1F74", 14100 "unicode": 8052, 14101 "contours": [14102 214103 ]14104 }, 14105 {14106 "name": "uni1F75", 14107 "unicode": 8053, 14108 "contours": [14109 214110 ]14111 }, 14112 {14113 "name": "uni1F76", 14114 "unicode": 8054, 14115 "contours": [14116 214117 ]14118 }, 14119 {14120 "name": "uni1F77", 14121 "unicode": 8055, 14122 "contours": [14123 214124 ]14125 }, 14126 {14127 "name": "uni1F78", 14128 "unicode": 8056, 14129 "contours": [14130 314131 ]14132 }, 14133 {14134 "name": "uni1F79", 14135 "unicode": 8057, 14136 "contours": [14137 314138 ]14139 }, 14140 {14141 "name": "uni1F7A", 14142 "unicode": 8058, 14143 "contours": [14144 214145 ]14146 }, 14147 {14148 "name": "uni1F7B", 14149 "unicode": 8059, 14150 "contours": [14151 214152 ]14153 }, 14154 {14155 "name": "uni1F7C", 14156 "unicode": 8060, 14157 "contours": [14158 214159 ]14160 }, 14161 {14162 "name": "uni1F7D", 14163 "unicode": 8061, 14164 "contours": [14165 214166 ]14167 }, 14168 {14169 "name": "uni1F80", 14170 "unicode": 8064, 14171 "contours": [14172 414173 ]14174 }, 14175 {14176 "name": "uni1F81", 14177 "unicode": 8065, 14178 "contours": [14179 414180 ]14181 }, 14182 {14183 "name": "uni1F82", 14184 "unicode": 8066, 14185 "contours": [14186 514187 ]14188 }, 14189 {14190 "name": "uni1F83", 14191 "unicode": 8067, 14192 "contours": [14193 514194 ]14195 }, 14196 {14197 "name": "uni1F84", 14198 "unicode": 8068, 14199 "contours": [14200 514201 ]14202 }, 14203 {14204 "name": "uni1F85", 14205 "unicode": 8069, 14206 "contours": [14207 514208 ]14209 }, 14210 {14211 "name": "uni1F86", 14212 "unicode": 8070, 14213 "contours": [14214 514215 ]14216 }, 14217 {14218 "name": "uni1F87", 14219 "unicode": 8071, 14220 "contours": [14221 514222 ]14223 }, 14224 {14225 "name": "uni1F88", 14226 "unicode": 8072, 14227 "contours": [14228 414229 ]14230 }, 14231 {14232 "name": "uni1F89", 14233 "unicode": 8073, 14234 "contours": [14235 414236 ]14237 }, 14238 {14239 "name": "uni1F8A", 14240 "unicode": 8074, 14241 "contours": [14242 514243 ]14244 }, 14245 {14246 "name": "uni1F8B", 14247 "unicode": 8075, 14248 "contours": [14249 514250 ]14251 }, 14252 {14253 "name": "uni1F8C", 14254 "unicode": 8076, 14255 "contours": [14256 514257 ]14258 }, 14259 {14260 "name": "uni1F8D", 14261 "unicode": 8077, 14262 "contours": [14263 514264 ]14265 }, 14266 {14267 "name": "uni1F8E", 14268 "unicode": 8078, 14269 "contours": [14270 514271 ]14272 }, 14273 {14274 "name": "uni1F8F", 14275 "unicode": 8079, 14276 "contours": [14277 514278 ]14279 }, 14280 {14281 "name": "uni1F90", 14282 "unicode": 8080, 14283 "contours": [14284 314285 ]14286 }, 14287 {14288 "name": "uni1F91", 14289 "unicode": 8081, 14290 "contours": [14291 314292 ]14293 }, 14294 {14295 "name": "uni1F92", 14296 "unicode": 8082, 14297 "contours": [14298 414299 ]14300 }, 14301 {14302 "name": "uni1F93", 14303 "unicode": 8083, 14304 "contours": [14305 414306 ]14307 }, 14308 {14309 "name": "uni1F94", 14310 "unicode": 8084, 14311 "contours": [14312 414313 ]14314 }, 14315 {14316 "name": "uni1F95", 14317 "unicode": 8085, 14318 "contours": [14319 414320 ]14321 }, 14322 {14323 "name": "uni1F96", 14324 "unicode": 8086, 14325 "contours": [14326 414327 ]14328 }, 14329 {14330 "name": "uni1F97", 14331 "unicode": 8087, 14332 "contours": [14333 414334 ]14335 }, 14336 {14337 "name": "uni1F98", 14338 "unicode": 8088, 14339 "contours": [14340 314341 ]14342 }, 14343 {14344 "name": "uni1F99", 14345 "unicode": 8089, 14346 "contours": [14347 314348 ]14349 }, 14350 {14351 "name": "uni1F9A", 14352 "unicode": 8090, 14353 "contours": [14354 414355 ]14356 }, 14357 {14358 "name": "uni1F9B", 14359 "unicode": 8091, 14360 "contours": [14361 414362 ]14363 }, 14364 {14365 "name": "uni1F9C", 14366 "unicode": 8092, 14367 "contours": [14368 414369 ]14370 }, 14371 {14372 "name": "uni1F9D", 14373 "unicode": 8093, 14374 "contours": [14375 414376 ]14377 }, 14378 {14379 "name": "uni1F9E", 14380 "unicode": 8094, 14381 "contours": [14382 414383 ]14384 }, 14385 {14386 "name": "uni1F9F", 14387 "unicode": 8095, 14388 "contours": [14389 414390 ]14391 }, 14392 {14393 "name": "uni1FA0", 14394 "unicode": 8096, 14395 "contours": [14396 314397 ]14398 }, 14399 {14400 "name": "uni1FA1", 14401 "unicode": 8097, 14402 "contours": [14403 314404 ]14405 }, 14406 {14407 "name": "uni1FA2", 14408 "unicode": 8098, 14409 "contours": [14410 414411 ]14412 }, 14413 {14414 "name": "uni1FA3", 14415 "unicode": 8099, 14416 "contours": [14417 414418 ]14419 }, 14420 {14421 "name": "uni1FA4", 14422 "unicode": 8100, 14423 "contours": [14424 414425 ]14426 }, 14427 {14428 "name": "uni1FA5", 14429 "unicode": 8101, 14430 "contours": [14431 414432 ]14433 }, 14434 {14435 "name": "uni1FA6", 14436 "unicode": 8102, 14437 "contours": [14438 414439 ]14440 }, 14441 {14442 "name": "uni1FA7", 14443 "unicode": 8103, 14444 "contours": [14445 414446 ]14447 }, 14448 {14449 "name": "uni1FA8", 14450 "unicode": 8104, 14451 "contours": [14452 314453 ]14454 }, 14455 {14456 "name": "uni1FA9", 14457 "unicode": 8105, 14458 "contours": [14459 314460 ]14461 }, 14462 {14463 "name": "uni1FAA", 14464 "unicode": 8106, 14465 "contours": [14466 414467 ]14468 }, 14469 {14470 "name": "uni1FAB", 14471 "unicode": 8107, 14472 "contours": [14473 414474 ]14475 }, 14476 {14477 "name": "uni1FAC", 14478 "unicode": 8108, 14479 "contours": [14480 414481 ]14482 }, 14483 {14484 "name": "uni1FAD", 14485 "unicode": 8109, 14486 "contours": [14487 414488 ]14489 }, 14490 {14491 "name": "uni1FAE", 14492 "unicode": 8110, 14493 "contours": [14494 414495 ]14496 }, 14497 {14498 "name": "uni1FAF", 14499 "unicode": 8111, 14500 "contours": [14501 414502 ]14503 }, 14504 {14505 "name": "uni1FB0", 14506 "unicode": 8112, 14507 "contours": [14508 314509 ]14510 }, 14511 {14512 "name": "uni1FB1", 14513 "unicode": 8113, 14514 "contours": [14515 314516 ]14517 }, 14518 {14519 "name": "uni1FB2", 14520 "unicode": 8114, 14521 "contours": [14522 414523 ]14524 }, 14525 {14526 "name": "uni1FB3", 14527 "unicode": 8115, 14528 "contours": [14529 314530 ]14531 }, 14532 {14533 "name": "uni1FB4", 14534 "unicode": 8116, 14535 "contours": [14536 414537 ]14538 }, 14539 {14540 "name": "uni1FB6", 14541 "unicode": 8118, 14542 "contours": [14543 314544 ]14545 }, 14546 {14547 "name": "uni1FB7", 14548 "unicode": 8119, 14549 "contours": [14550 414551 ]14552 }, 14553 {14554 "name": "uni1FB8", 14555 "unicode": 8120, 14556 "contours": [14557 314558 ]14559 }, 14560 {14561 "name": "uni1FB9", 14562 "unicode": 8121, 14563 "contours": [14564 314565 ]14566 }, 14567 {14568 "name": "uni1FBA", 14569 "unicode": 8122, 14570 "contours": [14571 314572 ]14573 }, 14574 {14575 "name": "uni1FBB", 14576 "unicode": 8123, 14577 "contours": [14578 314579 ]14580 }, 14581 {14582 "name": "uni1FBC", 14583 "unicode": 8124, 14584 "contours": [14585 314586 ]14587 }, 14588 {14589 "name": "uni1FBD", 14590 "unicode": 8125, 14591 "contours": [14592 114593 ]14594 }, 14595 {14596 "name": "uni1FBE", 14597 "unicode": 8126, 14598 "contours": [14599 114600 ]14601 }, 14602 {14603 "name": "uni1FBF", 14604 "unicode": 8127, 14605 "contours": [14606 114607 ]14608 }, 14609 {14610 "name": "uni1FC0", 14611 "unicode": 8128, 14612 "contours": [14613 114614 ]14615 }, 14616 {14617 "name": "uni1FC1", 14618 "unicode": 8129, 14619 "contours": [14620 314621 ]14622 }, 14623 {14624 "name": "uni1FC2", 14625 "unicode": 8130, 14626 "contours": [14627 314628 ]14629 }, 14630 {14631 "name": "uni1FC3", 14632 "unicode": 8131, 14633 "contours": [14634 214635 ]14636 }, 14637 {14638 "name": "uni1FC4", 14639 "unicode": 8132, 14640 "contours": [14641 314642 ]14643 }, 14644 {14645 "name": "uni1FC6", 14646 "unicode": 8134, 14647 "contours": [14648 214649 ]14650 }, 14651 {14652 "name": "uni1FC7", 14653 "unicode": 8135, 14654 "contours": [14655 314656 ]14657 }, 14658 {14659 "name": "uni1FC8", 14660 "unicode": 8136, 14661 "contours": [14662 214663 ]14664 }, 14665 {14666 "name": "uni1FC9", 14667 "unicode": 8137, 14668 "contours": [14669 214670 ]14671 }, 14672 {14673 "name": "uni1FCA", 14674 "unicode": 8138, 14675 "contours": [14676 214677 ]14678 }, 14679 {14680 "name": "uni1FCB", 14681 "unicode": 8139, 14682 "contours": [14683 214684 ]14685 }, 14686 {14687 "name": "uni1FCC", 14688 "unicode": 8140, 14689 "contours": [14690 214691 ]14692 }, 14693 {14694 "name": "uni1FCD", 14695 "unicode": 8141, 14696 "contours": [14697 214698 ]14699 }, 14700 {14701 "name": "uni1FCE", 14702 "unicode": 8142, 14703 "contours": [14704 214705 ]14706 }, 14707 {14708 "name": "uni1FCF", 14709 "unicode": 8143, 14710 "contours": [14711 214712 ]14713 }, 14714 {14715 "name": "uni1FD0", 14716 "unicode": 8144, 14717 "contours": [14718 214719 ]14720 }, 14721 {14722 "name": "uni1FD1", 14723 "unicode": 8145, 14724 "contours": [14725 214726 ]14727 }, 14728 {14729 "name": "uni1FD2", 14730 "unicode": 8146, 14731 "contours": [14732 414733 ]14734 }, 14735 {14736 "name": "uni1FD3", 14737 "unicode": 8147, 14738 "contours": [14739 414740 ]14741 }, 14742 {14743 "name": "uni1FD6", 14744 "unicode": 8150, 14745 "contours": [14746 214747 ]14748 }, 14749 {14750 "name": "uni1FD7", 14751 "unicode": 8151, 14752 "contours": [14753 414754 ]14755 }, 14756 {14757 "name": "uni1FD8", 14758 "unicode": 8152, 14759 "contours": [14760 214761 ]14762 }, 14763 {14764 "name": "uni1FD9", 14765 "unicode": 8153, 14766 "contours": [14767 214768 ]14769 }, 14770 {14771 "name": "uni1FDA", 14772 "unicode": 8154, 14773 "contours": [14774 214775 ]14776 }, 14777 {14778 "name": "uni1FDB", 14779 "unicode": 8155, 14780 "contours": [14781 214782 ]14783 }, 14784 {14785 "name": "uni1FDD", 14786 "unicode": 8157, 14787 "contours": [14788 214789 ]14790 }, 14791 {14792 "name": "uni1FDE", 14793 "unicode": 8158, 14794 "contours": [14795 214796 ]14797 }, 14798 {14799 "name": "uni1FDF", 14800 "unicode": 8159, 14801 "contours": [14802 214803 ]14804 }, 14805 {14806 "name": "uni1FE0", 14807 "unicode": 8160, 14808 "contours": [14809 214810 ]14811 }, 14812 {14813 "name": "uni1FE1", 14814 "unicode": 8161, 14815 "contours": [14816 214817 ]14818 }, 14819 {14820 "name": "uni1FE2", 14821 "unicode": 8162, 14822 "contours": [14823 414824 ]14825 }, 14826 {14827 "name": "uni1FE3", 14828 "unicode": 8163, 14829 "contours": [14830 414831 ]14832 }, 14833 {14834 "name": "uni1FE4", 14835 "unicode": 8164, 14836 "contours": [14837 314838 ]14839 }, 14840 {14841 "name": "uni1FE5", 14842 "unicode": 8165, 14843 "contours": [14844 314845 ]14846 }, 14847 {14848 "name": "uni1FE6", 14849 "unicode": 8166, 14850 "contours": [14851 214852 ]14853 }, 14854 {14855 "name": "uni1FE7", 14856 "unicode": 8167, 14857 "contours": [14858 414859 ]14860 }, 14861 {14862 "name": "uni1FE8", 14863 "unicode": 8168, 14864 "contours": [14865 214866 ]14867 }, 14868 {14869 "name": "uni1FE9", 14870 "unicode": 8169, 14871 "contours": [14872 214873 ]14874 }, 14875 {14876 "name": "uni1FEA", 14877 "unicode": 8170, 14878 "contours": [14879 214880 ]14881 }, 14882 {14883 "name": "uni1FEB", 14884 "unicode": 8171, 14885 "contours": [14886 214887 ]14888 }, 14889 {14890 "name": "uni1FEC", 14891 "unicode": 8172, 14892 "contours": [14893 314894 ]14895 }, 14896 {14897 "name": "uni1FED", 14898 "unicode": 8173, 14899 "contours": [14900 314901 ]14902 }, 14903 {14904 "name": "uni1FEE", 14905 "unicode": 8174, 14906 "contours": [14907 314908 ]14909 }, 14910 {14911 "name": "uni1FEF", 14912 "unicode": 8175, 14913 "contours": [14914 114915 ]14916 }, 14917 {14918 "name": "uni1FF2", 14919 "unicode": 8178, 14920 "contours": [14921 314922 ]14923 }, 14924 {14925 "name": "uni1FF3", 14926 "unicode": 8179, 14927 "contours": [14928 214929 ]14930 }, 14931 {14932 "name": "uni1FF4", 14933 "unicode": 8180, 14934 "contours": [14935 314936 ]14937 }, 14938 {14939 "name": "uni1FF6", 14940 "unicode": 8182, 14941 "contours": [14942 214943 ]14944 }, 14945 {14946 "name": "uni1FF7", 14947 "unicode": 8183, 14948 "contours": [14949 314950 ]14951 }, 14952 {14953 "name": "uni1FF8", 14954 "unicode": 8184, 14955 "contours": [14956 314957 ]14958 }, 14959 {14960 "name": "uni1FF9", 14961 "unicode": 8185, 14962 "contours": [14963 314964 ]14965 }, 14966 {14967 "name": "uni1FFA", 14968 "unicode": 8186, 14969 "contours": [14970 214971 ]14972 }, 14973 {14974 "name": "uni1FFB", 14975 "unicode": 8187, 14976 "contours": [14977 214978 ]14979 }, 14980 {14981 "name": "uni1FFC", 14982 "unicode": 8188, 14983 "contours": [14984 214985 ]14986 }, 14987 {14988 "name": "uni1FFD", 14989 "unicode": 8189, 14990 "contours": [14991 114992 ]14993 }, 14994 {14995 "name": "uni1FFE", 14996 "unicode": 8190, 14997 "contours": [14998 114999 ]15000 }...

Full Screen

Full Screen

config.py

Source:config.py Github

copy

Full Screen

1import os2ENVIRON = os.environ3class SettingHolder(object):4 def setup_mainnet(self):5 # self.ETH_URL = "https://mainnet.infura.io/pZc5ZTRYM8wYfRPtoQal"6 self.ETH_URL = "http://127.0.0.1:8545"7 # self.ETH_URL = "http://47.91.249.76:8545"8 self.ETHSCAN_API_PREFIX = "https://api.etherscan.io/api?"9 self.API_KEY = "FQBNNPZ4H5ZEWDYPPGGS5QR4J9DG5FNHCM"10 self.CONTRACT_ADDRESS = "0x67fba6d5eed1f20f8454ab93aed3a010f36f549d"11 self.FUNDING_ADDRESS = "0x0d7c7d0e76e25290abb5bfec7d1adff36befb09f"12 self.PRIVTKEY = ENVIRON.get("PRIVTKEY")13 self.PASSWORD_HASH = "$2b$10$F7GVmj.eahbHMIUjOxooYuLBMqZaIGcJZ7KxufGfbxwGTErKCzNQm"14 self.REMOTE_ADDR = ENVIRON.get("REMOTE_ADDRESS")15 self.REDIS_HOST = "appserver.trinity.ink"16 self.REDIS_PORT = 637917 self.REDIS_PASSWORD = ENVIRON.get("REDIS_PASSWORD")18 self.MONGO_URI = ENVIRON.get("MONGO_URI")19 self.TOPICS_OF_ERC_TRANSFER = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"20 def setup_testnet(self):21 self.ETH_URL = "https://ropsten.infura.io/pZc5ZTRYM8wYfRPtoQal"22 self.ETHSCAN_API_PREFIX = "https://ropsten.etherscan.io/api?"23 self.API_KEY = "FQBNNPZ4H5ZEWDYPPGGS5QR4J9DG5FNHCM"24 self.CONTRACT_ADDRESS = "0x65096f2b7a8dc1592479f1911cd2b98dae4d2218"25 self.FUNDING_ADDRESS = "0xcA9f427df31A1F5862968fad1fE98c0a9eE068c4"26 self.PRIVTKEY = ENVIRON.get("PRIVTKEY")27 self.PASSWORD_HASH = "$2b$10$F7GVmj.eahbHMIUjOxooYuLBMqZaIGcJZ7KxufGfbxwGTErKCzNQm"28 self.REMOTE_ADDR = ENVIRON.get("REMOTE_ADDRESS")29 self.REDIS_HOST = "47.104.81.20"30 self.REDIS_PORT = 900131 self.MONGO_HOST = "127.0.0.1"32 self.MONGO_PORT = 2701733 def setup_privtnet(self):34 self.ETH_URL = "https://ropsten.infura.io/pZc5ZTRYM8wYfRPtoQal"35ERC20_ABI = [36 {37 "anonymous": False,38 "inputs": [39 {40 "indexed": True,41 "name": "from",42 "type": "address"43 },44 {45 "indexed": True,46 "name": "to",47 "type": "address"48 },49 {50 "indexed": False,51 "name": "value",52 "type": "uint256"53 }54 ],55 "name": "Transfer",56 "type": "event"57 },58 {59 "constant": False,60 "inputs": [61 {62 "name": "_spender",63 "type": "address"64 },65 {66 "name": "_value",67 "type": "uint256"68 }69 ],70 "name": "approve",71 "outputs": [72 {73 "name": "",74 "type": "bool"75 }76 ],77 "payable": False,78 "stateMutability": "nonpayable",79 "type": "function"80 },81 {82 "constant": False,83 "inputs": [84 {85 "name": "_value",86 "type": "uint256"87 }88 ],89 "name": "burn",90 "outputs": [91 {92 "name": "",93 "type": "bool"94 }95 ],96 "payable": False,97 "stateMutability": "nonpayable",98 "type": "function"99 },100 {101 "constant": False,102 "inputs": [103 {104 "name": "_from",105 "type": "address"106 },107 {108 "name": "_value",109 "type": "uint256"110 }111 ],112 "name": "burnFrom",113 "outputs": [114 {115 "name": "",116 "type": "bool"117 }118 ],119 "payable": False,120 "stateMutability": "nonpayable",121 "type": "function"122 },123 {124 "constant": False,125 "inputs": [126 {127 "name": "newAdmin",128 "type": "address"129 }130 ],131 "name": "changeAdmin",132 "outputs": [],133 "payable": False,134 "stateMutability": "nonpayable",135 "type": "function"136 },137 {138 "constant": False,139 "inputs": [140 {141 "name": "newOwner",142 "type": "address"143 }144 ],145 "name": "changeAll",146 "outputs": [],147 "payable": False,148 "stateMutability": "nonpayable",149 "type": "function"150 },151 {152 "constant": False,153 "inputs": [154 {155 "name": "_spender",156 "type": "address"157 },158 {159 "name": "_subtractedValue",160 "type": "uint256"161 }162 ],163 "name": "decreaseApproval",164 "outputs": [165 {166 "name": "success",167 "type": "bool"168 }169 ],170 "payable": False,171 "stateMutability": "nonpayable",172 "type": "function"173 },174 {175 "constant": False,176 "inputs": [177 {178 "name": "token",179 "type": "address"180 },181 {182 "name": "amount",183 "type": "uint256"184 }185 ],186 "name": "emergencyERC20Drain",187 "outputs": [],188 "payable": False,189 "stateMutability": "nonpayable",190 "type": "function"191 },192 {193 "constant": False,194 "inputs": [195 {196 "name": "_spender",197 "type": "address"198 },199 {200 "name": "_addedValue",201 "type": "uint256"202 }203 ],204 "name": "increaseApproval",205 "outputs": [206 {207 "name": "success",208 "type": "bool"209 }210 ],211 "payable": False,212 "stateMutability": "nonpayable",213 "type": "function"214 },215 {216 "constant": False,217 "inputs": [218 {219 "name": "newPausedPublic",220 "type": "bool"221 },222 {223 "name": "newPausedOwnerAdmin",224 "type": "bool"225 }226 ],227 "name": "pause",228 "outputs": [],229 "payable": False,230 "stateMutability": "nonpayable",231 "type": "function"232 },233 {234 "anonymous": False,235 "inputs": [236 {237 "indexed": True,238 "name": "_burner",239 "type": "address"240 },241 {242 "indexed": False,243 "name": "_value",244 "type": "uint256"245 }246 ],247 "name": "Burn",248 "type": "event"249 },250 {251 "anonymous": False,252 "inputs": [253 {254 "indexed": True,255 "name": "previousOwner",256 "type": "address"257 },258 {259 "indexed": True,260 "name": "newOwner",261 "type": "address"262 }263 ],264 "name": "OwnershipTransferred",265 "type": "event"266 },267 {268 "anonymous": False,269 "inputs": [270 {271 "indexed": False,272 "name": "newState",273 "type": "bool"274 }275 ],276 "name": "PauseOwnerAdmin",277 "type": "event"278 },279 {280 "anonymous": False,281 "inputs": [282 {283 "indexed": False,284 "name": "newState",285 "type": "bool"286 }287 ],288 "name": "PausePublic",289 "type": "event"290 },291 {292 "constant": False,293 "inputs": [294 {295 "name": "_to",296 "type": "address"297 },298 {299 "name": "_value",300 "type": "uint256"301 }302 ],303 "name": "transfer",304 "outputs": [305 {306 "name": "",307 "type": "bool"308 }309 ],310 "payable": False,311 "stateMutability": "nonpayable",312 "type": "function"313 },314 {315 "anonymous": False,316 "inputs": [317 {318 "indexed": True,319 "name": "previousAdmin",320 "type": "address"321 },322 {323 "indexed": True,324 "name": "newAdmin",325 "type": "address"326 }327 ],328 "name": "AdminTransferred",329 "type": "event"330 },331 {332 "anonymous": False,333 "inputs": [334 {335 "indexed": True,336 "name": "owner",337 "type": "address"338 },339 {340 "indexed": True,341 "name": "spender",342 "type": "address"343 },344 {345 "indexed": False,346 "name": "value",347 "type": "uint256"348 }349 ],350 "name": "Approval",351 "type": "event"352 },353 {354 "constant": False,355 "inputs": [356 {357 "name": "_from",358 "type": "address"359 },360 {361 "name": "_to",362 "type": "address"363 },364 {365 "name": "_value",366 "type": "uint256"367 }368 ],369 "name": "transferFrom",370 "outputs": [371 {372 "name": "",373 "type": "bool"374 }375 ],376 "payable": False,377 "stateMutability": "nonpayable",378 "type": "function"379 },380 {381 "constant": False,382 "inputs": [383 {384 "name": "newOwner",385 "type": "address"386 }387 ],388 "name": "transferOwnership",389 "outputs": [],390 "payable": False,391 "stateMutability": "nonpayable",392 "type": "function"393 },394 {395 "inputs": [],396 "payable": False,397 "stateMutability": "nonpayable",398 "type": "constructor"399 },400 {401 "constant": True,402 "inputs": [],403 "name": "admin",404 "outputs": [405 {406 "name": "",407 "type": "address"408 }409 ],410 "payable": False,411 "stateMutability": "view",412 "type": "function"413 },414 {415 "constant": True,416 "inputs": [417 {418 "name": "_owner",419 "type": "address"420 },421 {422 "name": "_spender",423 "type": "address"424 }425 ],426 "name": "allowance",427 "outputs": [428 {429 "name": "",430 "type": "uint256"431 }432 ],433 "payable": False,434 "stateMutability": "view",435 "type": "function"436 },437 {438 "constant": True,439 "inputs": [440 {441 "name": "_owner",442 "type": "address"443 }444 ],445 "name": "balanceOf",446 "outputs": [447 {448 "name": "balance",449 "type": "uint256"450 }451 ],452 "payable": False,453 "stateMutability": "view",454 "type": "function"455 },456 {457 "constant": True,458 "inputs": [],459 "name": "decimals",460 "outputs": [461 {462 "name": "",463 "type": "uint8"464 }465 ],466 "payable": False,467 "stateMutability": "view",468 "type": "function"469 },470 {471 "constant": True,472 "inputs": [],473 "name": "name",474 "outputs": [475 {476 "name": "",477 "type": "string"478 }479 ],480 "payable": False,481 "stateMutability": "view",482 "type": "function"483 },484 {485 "constant": True,486 "inputs": [],487 "name": "owner",488 "outputs": [489 {490 "name": "",491 "type": "address"492 }493 ],494 "payable": False,495 "stateMutability": "view",496 "type": "function"497 },498 {499 "constant": True,500 "inputs": [],501 "name": "pausedOwnerAdmin",502 "outputs": [503 {504 "name": "",505 "type": "bool"506 }507 ],508 "payable": False,509 "stateMutability": "view",510 "type": "function"511 },512 {513 "constant": True,514 "inputs": [],515 "name": "pausedPublic",516 "outputs": [517 {518 "name": "",519 "type": "bool"520 }521 ],522 "payable": False,523 "stateMutability": "view",524 "type": "function"525 },526 {527 "constant": True,528 "inputs": [],529 "name": "symbol",530 "outputs": [531 {532 "name": "",533 "type": "string"534 }535 ],536 "payable": False,537 "stateMutability": "view",538 "type": "function"539 },540 {541 "constant": True,542 "inputs": [],543 "name": "totalSupply",544 "outputs": [545 {546 "name": "",547 "type": "uint256"548 }549 ],550 "payable": False,551 "stateMutability": "view",552 "type": "function"553 }554]555#适配大写的 NAME,DECIMALS,SYMBOL556ERC20_ABI_EXCEPTION_1 = [557 {558 "anonymous": False,559 "inputs": [560 {561 "indexed": True,562 "name": "from",563 "type": "address"564 },565 {566 "indexed": True,567 "name": "to",568 "type": "address"569 },570 {571 "indexed": False,572 "name": "value",573 "type": "uint256"574 }575 ],576 "name": "Transfer",577 "type": "event"578 },579 {580 "constant": False,581 "inputs": [582 {583 "name": "_spender",584 "type": "address"585 },586 {587 "name": "_value",588 "type": "uint256"589 }590 ],591 "name": "approve",592 "outputs": [593 {594 "name": "",595 "type": "bool"596 }597 ],598 "payable": False,599 "stateMutability": "nonpayable",600 "type": "function"601 },602 {603 "constant": False,604 "inputs": [605 {606 "name": "_value",607 "type": "uint256"608 }609 ],610 "name": "burn",611 "outputs": [612 {613 "name": "",614 "type": "bool"615 }616 ],617 "payable": False,618 "stateMutability": "nonpayable",619 "type": "function"620 },621 {622 "constant": False,623 "inputs": [624 {625 "name": "_from",626 "type": "address"627 },628 {629 "name": "_value",630 "type": "uint256"631 }632 ],633 "name": "burnFrom",634 "outputs": [635 {636 "name": "",637 "type": "bool"638 }639 ],640 "payable": False,641 "stateMutability": "nonpayable",642 "type": "function"643 },644 {645 "constant": False,646 "inputs": [647 {648 "name": "newAdmin",649 "type": "address"650 }651 ],652 "name": "changeAdmin",653 "outputs": [],654 "payable": False,655 "stateMutability": "nonpayable",656 "type": "function"657 },658 {659 "constant": False,660 "inputs": [661 {662 "name": "newOwner",663 "type": "address"664 }665 ],666 "name": "changeAll",667 "outputs": [],668 "payable": False,669 "stateMutability": "nonpayable",670 "type": "function"671 },672 {673 "constant": False,674 "inputs": [675 {676 "name": "_spender",677 "type": "address"678 },679 {680 "name": "_subtractedValue",681 "type": "uint256"682 }683 ],684 "name": "decreaseApproval",685 "outputs": [686 {687 "name": "success",688 "type": "bool"689 }690 ],691 "payable": False,692 "stateMutability": "nonpayable",693 "type": "function"694 },695 {696 "constant": False,697 "inputs": [698 {699 "name": "token",700 "type": "address"701 },702 {703 "name": "amount",704 "type": "uint256"705 }706 ],707 "name": "emergencyERC20Drain",708 "outputs": [],709 "payable": False,710 "stateMutability": "nonpayable",711 "type": "function"712 },713 {714 "constant": False,715 "inputs": [716 {717 "name": "_spender",718 "type": "address"719 },720 {721 "name": "_addedValue",722 "type": "uint256"723 }724 ],725 "name": "increaseApproval",726 "outputs": [727 {728 "name": "success",729 "type": "bool"730 }731 ],732 "payable": False,733 "stateMutability": "nonpayable",734 "type": "function"735 },736 {737 "constant": False,738 "inputs": [739 {740 "name": "newPausedPublic",741 "type": "bool"742 },743 {744 "name": "newPausedOwnerAdmin",745 "type": "bool"746 }747 ],748 "name": "pause",749 "outputs": [],750 "payable": False,751 "stateMutability": "nonpayable",752 "type": "function"753 },754 {755 "anonymous": False,756 "inputs": [757 {758 "indexed": True,759 "name": "_burner",760 "type": "address"761 },762 {763 "indexed": False,764 "name": "_value",765 "type": "uint256"766 }767 ],768 "name": "Burn",769 "type": "event"770 },771 {772 "anonymous": False,773 "inputs": [774 {775 "indexed": True,776 "name": "previousOwner",777 "type": "address"778 },779 {780 "indexed": True,781 "name": "newOwner",782 "type": "address"783 }784 ],785 "name": "OwnershipTransferred",786 "type": "event"787 },788 {789 "anonymous": False,790 "inputs": [791 {792 "indexed": False,793 "name": "newState",794 "type": "bool"795 }796 ],797 "name": "PauseOwnerAdmin",798 "type": "event"799 },800 {801 "anonymous": False,802 "inputs": [803 {804 "indexed": False,805 "name": "newState",806 "type": "bool"807 }808 ],809 "name": "PausePublic",810 "type": "event"811 },812 {813 "constant": False,814 "inputs": [815 {816 "name": "_to",817 "type": "address"818 },819 {820 "name": "_value",821 "type": "uint256"822 }823 ],824 "name": "transfer",825 "outputs": [826 {827 "name": "",828 "type": "bool"829 }830 ],831 "payable": False,832 "stateMutability": "nonpayable",833 "type": "function"834 },835 {836 "anonymous": False,837 "inputs": [838 {839 "indexed": True,840 "name": "previousAdmin",841 "type": "address"842 },843 {844 "indexed": True,845 "name": "newAdmin",846 "type": "address"847 }848 ],849 "name": "AdminTransferred",850 "type": "event"851 },852 {853 "anonymous": False,854 "inputs": [855 {856 "indexed": True,857 "name": "owner",858 "type": "address"859 },860 {861 "indexed": True,862 "name": "spender",863 "type": "address"864 },865 {866 "indexed": False,867 "name": "value",868 "type": "uint256"869 }870 ],871 "name": "Approval",872 "type": "event"873 },874 {875 "constant": False,876 "inputs": [877 {878 "name": "_from",879 "type": "address"880 },881 {882 "name": "_to",883 "type": "address"884 },885 {886 "name": "_value",887 "type": "uint256"888 }889 ],890 "name": "transferFrom",891 "outputs": [892 {893 "name": "",894 "type": "bool"895 }896 ],897 "payable": False,898 "stateMutability": "nonpayable",899 "type": "function"900 },901 {902 "constant": False,903 "inputs": [904 {905 "name": "newOwner",906 "type": "address"907 }908 ],909 "name": "transferOwnership",910 "outputs": [],911 "payable": False,912 "stateMutability": "nonpayable",913 "type": "function"914 },915 {916 "inputs": [],917 "payable": False,918 "stateMutability": "nonpayable",919 "type": "constructor"920 },921 {922 "constant": True,923 "inputs": [],924 "name": "admin",925 "outputs": [926 {927 "name": "",928 "type": "address"929 }930 ],931 "payable": False,932 "stateMutability": "view",933 "type": "function"934 },935 {936 "constant": True,937 "inputs": [938 {939 "name": "_owner",940 "type": "address"941 },942 {943 "name": "_spender",944 "type": "address"945 }946 ],947 "name": "allowance",948 "outputs": [949 {950 "name": "",951 "type": "uint256"952 }953 ],954 "payable": False,955 "stateMutability": "view",956 "type": "function"957 },958 {959 "constant": True,960 "inputs": [961 {962 "name": "_owner",963 "type": "address"964 }965 ],966 "name": "balanceOf",967 "outputs": [968 {969 "name": "balance",970 "type": "uint256"971 }972 ],973 "payable": False,974 "stateMutability": "view",975 "type": "function"976 },977 {978 "constant": True,979 "inputs": [],980 "name": "DECIMALS",981 "outputs": [982 {983 "name": "",984 "type": "uint8"985 }986 ],987 "payable": False,988 "stateMutability": "view",989 "type": "function"990 },991 {992 "constant": True,993 "inputs": [],994 "name": "NAME",995 "outputs": [996 {997 "name": "",998 "type": "string"999 }1000 ],1001 "payable": False,1002 "stateMutability": "view",1003 "type": "function"1004 },1005 {1006 "constant": True,1007 "inputs": [],1008 "name": "owner",1009 "outputs": [1010 {1011 "name": "",1012 "type": "address"1013 }1014 ],1015 "payable": False,1016 "stateMutability": "view",1017 "type": "function"1018 },1019 {1020 "constant": True,1021 "inputs": [],1022 "name": "pausedOwnerAdmin",1023 "outputs": [1024 {1025 "name": "",1026 "type": "bool"1027 }1028 ],1029 "payable": False,1030 "stateMutability": "view",1031 "type": "function"1032 },1033 {1034 "constant": True,1035 "inputs": [],1036 "name": "pausedPublic",1037 "outputs": [1038 {1039 "name": "",1040 "type": "bool"1041 }1042 ],1043 "payable": False,1044 "stateMutability": "view",1045 "type": "function"1046 },1047 {1048 "constant": True,1049 "inputs": [],1050 "name": "SYMBOL",1051 "outputs": [1052 {1053 "name": "",1054 "type": "string"1055 }1056 ],1057 "payable": False,1058 "stateMutability": "view",1059 "type": "function"1060 },1061 {1062 "constant": True,1063 "inputs": [],1064 "name": "totalSupply",1065 "outputs": [1066 {1067 "name": "",1068 "type": "uint256"1069 }1070 ],1071 "payable": False,1072 "stateMutability": "view",1073 "type": "function"1074 }1075]1076#适配name symbol 返回值是bytes32的1077ERC20_ABI_EXCEPTION_2 = [1078 {1079 "anonymous": False,1080 "inputs": [1081 {1082 "indexed": True,1083 "name": "from",1084 "type": "address"1085 },1086 {1087 "indexed": True,1088 "name": "to",1089 "type": "address"1090 },1091 {1092 "indexed": False,1093 "name": "value",1094 "type": "uint256"1095 }1096 ],1097 "name": "Transfer",1098 "type": "event"1099 },1100 {1101 "constant": False,1102 "inputs": [1103 {1104 "name": "_spender",1105 "type": "address"1106 },1107 {1108 "name": "_value",1109 "type": "uint256"1110 }1111 ],1112 "name": "approve",1113 "outputs": [1114 {1115 "name": "",1116 "type": "bool"1117 }1118 ],1119 "payable": False,1120 "stateMutability": "nonpayable",1121 "type": "function"1122 },1123 {1124 "constant": False,1125 "inputs": [1126 {1127 "name": "_value",1128 "type": "uint256"1129 }1130 ],1131 "name": "burn",1132 "outputs": [1133 {1134 "name": "",1135 "type": "bool"1136 }1137 ],1138 "payable": False,1139 "stateMutability": "nonpayable",1140 "type": "function"1141 },1142 {1143 "constant": False,1144 "inputs": [1145 {1146 "name": "_from",1147 "type": "address"1148 },1149 {1150 "name": "_value",1151 "type": "uint256"1152 }1153 ],1154 "name": "burnFrom",1155 "outputs": [1156 {1157 "name": "",1158 "type": "bool"1159 }1160 ],1161 "payable": False,1162 "stateMutability": "nonpayable",1163 "type": "function"1164 },1165 {1166 "constant": False,1167 "inputs": [1168 {1169 "name": "newAdmin",1170 "type": "address"1171 }1172 ],1173 "name": "changeAdmin",1174 "outputs": [],1175 "payable": False,1176 "stateMutability": "nonpayable",1177 "type": "function"1178 },1179 {1180 "constant": False,1181 "inputs": [1182 {1183 "name": "newOwner",1184 "type": "address"1185 }1186 ],1187 "name": "changeAll",1188 "outputs": [],1189 "payable": False,1190 "stateMutability": "nonpayable",1191 "type": "function"1192 },1193 {1194 "constant": False,1195 "inputs": [1196 {1197 "name": "_spender",1198 "type": "address"1199 },1200 {1201 "name": "_subtractedValue",1202 "type": "uint256"1203 }1204 ],1205 "name": "decreaseApproval",1206 "outputs": [1207 {1208 "name": "success",1209 "type": "bool"1210 }1211 ],1212 "payable": False,1213 "stateMutability": "nonpayable",1214 "type": "function"1215 },1216 {1217 "constant": False,1218 "inputs": [1219 {1220 "name": "token",1221 "type": "address"1222 },1223 {1224 "name": "amount",1225 "type": "uint256"1226 }1227 ],1228 "name": "emergencyERC20Drain",1229 "outputs": [],1230 "payable": False,1231 "stateMutability": "nonpayable",1232 "type": "function"1233 },1234 {1235 "constant": False,1236 "inputs": [1237 {1238 "name": "_spender",1239 "type": "address"1240 },1241 {1242 "name": "_addedValue",1243 "type": "uint256"1244 }1245 ],1246 "name": "increaseApproval",1247 "outputs": [1248 {1249 "name": "success",1250 "type": "bool"1251 }1252 ],1253 "payable": False,1254 "stateMutability": "nonpayable",1255 "type": "function"1256 },1257 {1258 "constant": False,1259 "inputs": [1260 {1261 "name": "newPausedPublic",1262 "type": "bool"1263 },1264 {1265 "name": "newPausedOwnerAdmin",1266 "type": "bool"1267 }1268 ],1269 "name": "pause",1270 "outputs": [],1271 "payable": False,1272 "stateMutability": "nonpayable",1273 "type": "function"1274 },1275 {1276 "anonymous": False,1277 "inputs": [1278 {1279 "indexed": True,1280 "name": "_burner",1281 "type": "address"1282 },1283 {1284 "indexed": False,1285 "name": "_value",1286 "type": "uint256"1287 }1288 ],1289 "name": "Burn",1290 "type": "event"1291 },1292 {1293 "anonymous": False,1294 "inputs": [1295 {1296 "indexed": True,1297 "name": "previousOwner",1298 "type": "address"1299 },1300 {1301 "indexed": True,1302 "name": "newOwner",1303 "type": "address"1304 }1305 ],1306 "name": "OwnershipTransferred",1307 "type": "event"1308 },1309 {1310 "anonymous": False,1311 "inputs": [1312 {1313 "indexed": False,1314 "name": "newState",1315 "type": "bool"1316 }1317 ],1318 "name": "PauseOwnerAdmin",1319 "type": "event"1320 },1321 {1322 "anonymous": False,1323 "inputs": [1324 {1325 "indexed": False,1326 "name": "newState",1327 "type": "bool"1328 }1329 ],1330 "name": "PausePublic",1331 "type": "event"1332 },1333 {1334 "constant": False,1335 "inputs": [1336 {1337 "name": "_to",1338 "type": "address"1339 },1340 {1341 "name": "_value",1342 "type": "uint256"1343 }1344 ],1345 "name": "transfer",1346 "outputs": [1347 {1348 "name": "",1349 "type": "bool"1350 }1351 ],1352 "payable": False,1353 "stateMutability": "nonpayable",1354 "type": "function"1355 },1356 {1357 "anonymous": False,1358 "inputs": [1359 {1360 "indexed": True,1361 "name": "previousAdmin",1362 "type": "address"1363 },1364 {1365 "indexed": True,1366 "name": "newAdmin",1367 "type": "address"1368 }1369 ],1370 "name": "AdminTransferred",1371 "type": "event"1372 },1373 {1374 "anonymous": False,1375 "inputs": [1376 {1377 "indexed": True,1378 "name": "owner",1379 "type": "address"1380 },1381 {1382 "indexed": True,1383 "name": "spender",1384 "type": "address"1385 },1386 {1387 "indexed": False,1388 "name": "value",1389 "type": "uint256"1390 }1391 ],1392 "name": "Approval",1393 "type": "event"1394 },1395 {1396 "constant": False,1397 "inputs": [1398 {1399 "name": "_from",1400 "type": "address"1401 },1402 {1403 "name": "_to",1404 "type": "address"1405 },1406 {1407 "name": "_value",1408 "type": "uint256"1409 }1410 ],1411 "name": "transferFrom",1412 "outputs": [1413 {1414 "name": "",1415 "type": "bool"1416 }1417 ],1418 "payable": False,1419 "stateMutability": "nonpayable",1420 "type": "function"1421 },1422 {1423 "constant": False,1424 "inputs": [1425 {1426 "name": "newOwner",1427 "type": "address"1428 }1429 ],1430 "name": "transferOwnership",1431 "outputs": [],1432 "payable": False,1433 "stateMutability": "nonpayable",1434 "type": "function"1435 },1436 {1437 "inputs": [],1438 "payable": False,1439 "stateMutability": "nonpayable",1440 "type": "constructor"1441 },1442 {1443 "constant": True,1444 "inputs": [],1445 "name": "admin",1446 "outputs": [1447 {1448 "name": "",1449 "type": "address"1450 }1451 ],1452 "payable": False,1453 "stateMutability": "view",1454 "type": "function"1455 },1456 {1457 "constant": True,1458 "inputs": [1459 {1460 "name": "_owner",1461 "type": "address"1462 },1463 {1464 "name": "_spender",1465 "type": "address"1466 }1467 ],1468 "name": "allowance",1469 "outputs": [1470 {1471 "name": "",1472 "type": "uint256"1473 }1474 ],1475 "payable": False,1476 "stateMutability": "view",1477 "type": "function"1478 },1479 {1480 "constant": True,1481 "inputs": [1482 {1483 "name": "_owner",1484 "type": "address"1485 }1486 ],1487 "name": "balanceOf",1488 "outputs": [1489 {1490 "name": "balance",1491 "type": "uint256"1492 }1493 ],1494 "payable": False,1495 "stateMutability": "view",1496 "type": "function"1497 },1498 {1499 "constant": True,1500 "inputs": [],1501 "name": "decimals",1502 "outputs": [1503 {1504 "name": "",1505 "type": "uint8"1506 }1507 ],1508 "payable": False,1509 "stateMutability": "view",1510 "type": "function"1511 },1512 {1513 "constant": True,1514 "inputs": [],1515 "name": "name",1516 "outputs": [1517 {1518 "name": "",1519 "type": "bytes32"1520 }1521 ],1522 "payable": False,1523 "stateMutability": "view",1524 "type": "function"1525 },1526 {1527 "constant": True,1528 "inputs": [],1529 "name": "owner",1530 "outputs": [1531 {1532 "name": "",1533 "type": "address"1534 }1535 ],1536 "payable": False,1537 "stateMutability": "view",1538 "type": "function"1539 },1540 {1541 "constant": True,1542 "inputs": [],1543 "name": "pausedOwnerAdmin",1544 "outputs": [1545 {1546 "name": "",1547 "type": "bool"1548 }1549 ],1550 "payable": False,1551 "stateMutability": "view",1552 "type": "function"1553 },1554 {1555 "constant": True,1556 "inputs": [],1557 "name": "pausedPublic",1558 "outputs": [1559 {1560 "name": "",1561 "type": "bool"1562 }1563 ],1564 "payable": False,1565 "stateMutability": "view",1566 "type": "function"1567 },1568 {1569 "constant": True,1570 "inputs": [],1571 "name": "symbol",1572 "outputs": [1573 {1574 "name": "",1575 "type": "bytes32"1576 }1577 ],1578 "payable": False,1579 "stateMutability": "view",1580 "type": "function"1581 },1582 {1583 "constant": True,1584 "inputs": [],1585 "name": "totalSupply",1586 "outputs": [1587 {1588 "name": "",1589 "type": "uint256"1590 }1591 ],1592 "payable": False,1593 "stateMutability": "view",1594 "type": "function"1595 }1596]1597ERC721_ABI = [1598 {1599 "constant": True,1600 "inputs": [1601 {1602 "name": "_interfaceId",1603 "type": "bytes4"1604 }1605 ],1606 "name": "supportsInterface",1607 "outputs": [1608 {1609 "name": "",1610 "type": "bool"1611 }1612 ],1613 "payable": False,1614 "stateMutability": "view",1615 "type": "function"1616 },1617 {1618 "constant": False,1619 "inputs": [1620 {1621 "name": "_tokenIdList",1622 "type": "uint256[]"1623 },1624 {1625 "name": "_tokenOwner",1626 "type": "address"1627 }1628 ],1629 "name": "createToken",1630 "outputs": [],1631 "payable": True,1632 "stateMutability": "payable",1633 "type": "function"1634 },1635 {1636 "constant": True,1637 "inputs": [],1638 "name": "name",1639 "outputs": [1640 {1641 "name": "",1642 "type": "string"1643 }1644 ],1645 "payable": False,1646 "stateMutability": "view",1647 "type": "function"1648 },1649 {1650 "constant": True,1651 "inputs": [1652 {1653 "name": "_tokenId",1654 "type": "uint256"1655 }1656 ],1657 "name": "getApproved",1658 "outputs": [1659 {1660 "name": "",1661 "type": "address"1662 }1663 ],1664 "payable": False,1665 "stateMutability": "view",1666 "type": "function"1667 },1668 {1669 "constant": False,1670 "inputs": [1671 {1672 "name": "_to",1673 "type": "address"1674 },1675 {1676 "name": "_tokenId",1677 "type": "uint256"1678 }1679 ],1680 "name": "approve",1681 "outputs": [],1682 "payable": False,1683 "stateMutability": "nonpayable",1684 "type": "function"1685 },1686 {1687 "constant": True,1688 "inputs": [1689 {1690 "name": "_tokenId",1691 "type": "uint256"1692 }1693 ],1694 "name": "getNFTbyTokenId",1695 "outputs": [1696 {1697 "name": "attribute",1698 "type": "string"1699 },1700 {1701 "name": "birthTime",1702 "type": "uint256"1703 },1704 {1705 "name": "status",1706 "type": "bool"1707 }1708 ],1709 "payable": False,1710 "stateMutability": "view",1711 "type": "function"1712 },1713 {1714 "constant": False,1715 "inputs": [1716 {1717 "name": "_tokenId",1718 "type": "uint256"1719 },1720 {1721 "name": "_uri",1722 "type": "string"1723 }1724 ],1725 "name": "setTokenURI",1726 "outputs": [],1727 "payable": False,1728 "stateMutability": "nonpayable",1729 "type": "function"1730 },1731 {1732 "constant": True,1733 "inputs": [],1734 "name": "totalSupply",1735 "outputs": [1736 {1737 "name": "",1738 "type": "uint256"1739 }1740 ],1741 "payable": False,1742 "stateMutability": "view",1743 "type": "function"1744 },1745 {1746 "constant": True,1747 "inputs": [],1748 "name": "InterfaceId_ERC165",1749 "outputs": [1750 {1751 "name": "",1752 "type": "bytes4"1753 }1754 ],1755 "payable": False,1756 "stateMutability": "view",1757 "type": "function"1758 },1759 {1760 "constant": False,1761 "inputs": [1762 {1763 "name": "_from",1764 "type": "address"1765 },1766 {1767 "name": "_to",1768 "type": "address"1769 },1770 {1771 "name": "_tokenId",1772 "type": "uint256"1773 }1774 ],1775 "name": "transferFrom",1776 "outputs": [],1777 "payable": False,1778 "stateMutability": "nonpayable",1779 "type": "function"1780 },1781 {1782 "constant": True,1783 "inputs": [1784 {1785 "name": "_owner",1786 "type": "address"1787 },1788 {1789 "name": "_index",1790 "type": "uint256"1791 }1792 ],1793 "name": "tokenOfOwnerByIndex",1794 "outputs": [1795 {1796 "name": "",1797 "type": "uint256"1798 }1799 ],1800 "payable": False,1801 "stateMutability": "view",1802 "type": "function"1803 },1804 {1805 "constant": False,1806 "inputs": [1807 {1808 "name": "_from",1809 "type": "address"1810 },1811 {1812 "name": "_to",1813 "type": "address"1814 },1815 {1816 "name": "_tokenId",1817 "type": "uint256"1818 }1819 ],1820 "name": "safeTransferFrom",1821 "outputs": [],1822 "payable": False,1823 "stateMutability": "nonpayable",1824 "type": "function"1825 },1826 {1827 "constant": True,1828 "inputs": [1829 {1830 "name": "_tokenId",1831 "type": "uint256"1832 }1833 ],1834 "name": "exists",1835 "outputs": [1836 {1837 "name": "",1838 "type": "bool"1839 }1840 ],1841 "payable": False,1842 "stateMutability": "view",1843 "type": "function"1844 },1845 {1846 "constant": True,1847 "inputs": [1848 {1849 "name": "_index",1850 "type": "uint256"1851 }1852 ],1853 "name": "tokenByIndex",1854 "outputs": [1855 {1856 "name": "",1857 "type": "uint256"1858 }1859 ],1860 "payable": False,1861 "stateMutability": "view",1862 "type": "function"1863 },1864 {1865 "constant": True,1866 "inputs": [1867 {1868 "name": "_tokenId",1869 "type": "uint256"1870 }1871 ],1872 "name": "ownerOf",1873 "outputs": [1874 {1875 "name": "",1876 "type": "address"1877 }1878 ],1879 "payable": False,1880 "stateMutability": "view",1881 "type": "function"1882 },1883 {1884 "constant": True,1885 "inputs": [1886 {1887 "name": "_owner",1888 "type": "address"1889 }1890 ],1891 "name": "balanceOf",1892 "outputs": [1893 {1894 "name": "",1895 "type": "uint256"1896 }1897 ],1898 "payable": False,1899 "stateMutability": "view",1900 "type": "function"1901 },1902 {1903 "constant": False,1904 "inputs": [],1905 "name": "renounceOwnership",1906 "outputs": [],1907 "payable": False,1908 "stateMutability": "nonpayable",1909 "type": "function"1910 },1911 {1912 "constant": True,1913 "inputs": [1914 {1915 "name": "_owner",1916 "type": "address"1917 }1918 ],1919 "name": "tokensOfOwner",1920 "outputs": [1921 {1922 "name": "",1923 "type": "uint256[]"1924 }1925 ],1926 "payable": False,1927 "stateMutability": "view",1928 "type": "function"1929 },1930 {1931 "constant": True,1932 "inputs": [],1933 "name": "owner",1934 "outputs": [1935 {1936 "name": "",1937 "type": "address"1938 }1939 ],1940 "payable": False,1941 "stateMutability": "view",1942 "type": "function"1943 },1944 {1945 "constant": True,1946 "inputs": [],1947 "name": "symbol",1948 "outputs": [1949 {1950 "name": "",1951 "type": "string"1952 }1953 ],1954 "payable": False,1955 "stateMutability": "view",1956 "type": "function"1957 },1958 {1959 "constant": False,1960 "inputs": [1961 {1962 "name": "_to",1963 "type": "address"1964 },1965 {1966 "name": "_approved",1967 "type": "bool"1968 }1969 ],1970 "name": "setApprovalForAll",1971 "outputs": [],1972 "payable": False,1973 "stateMutability": "nonpayable",1974 "type": "function"1975 },1976 {1977 "constant": False,1978 "inputs": [1979 {1980 "name": "_from",1981 "type": "address"1982 },1983 {1984 "name": "_to",1985 "type": "address"1986 },1987 {1988 "name": "_tokenId",1989 "type": "uint256"1990 },1991 {1992 "name": "_data",1993 "type": "bytes"1994 }1995 ],1996 "name": "safeTransferFrom",1997 "outputs": [],1998 "payable": False,1999 "stateMutability": "nonpayable",2000 "type": "function"2001 },2002 {2003 "constant": True,2004 "inputs": [2005 {2006 "name": "_tokenId",2007 "type": "uint256"2008 }2009 ],2010 "name": "tokenURI",2011 "outputs": [2012 {2013 "name": "",2014 "type": "string"2015 }2016 ],2017 "payable": False,2018 "stateMutability": "view",2019 "type": "function"2020 },2021 {2022 "constant": True,2023 "inputs": [2024 {2025 "name": "_owner",2026 "type": "address"2027 }2028 ],2029 "name": "myTokens",2030 "outputs": [2031 {2032 "name": "",2033 "type": "uint256[]"2034 }2035 ],2036 "payable": False,2037 "stateMutability": "view",2038 "type": "function"2039 },2040 {2041 "constant": False,2042 "inputs": [2043 {2044 "name": "_tokenId",2045 "type": "uint256"2046 },2047 {2048 "name": "attribute",2049 "type": "string"2050 },2051 {2052 "name": "status",2053 "type": "bool"2054 }2055 ],2056 "name": "setNFTbyTokenId",2057 "outputs": [],2058 "payable": False,2059 "stateMutability": "nonpayable",2060 "type": "function"2061 },2062 {2063 "constant": True,2064 "inputs": [2065 {2066 "name": "_owner",2067 "type": "address"2068 },2069 {2070 "name": "_operator",2071 "type": "address"2072 }2073 ],2074 "name": "isApprovedForAll",2075 "outputs": [2076 {2077 "name": "",2078 "type": "bool"2079 }2080 ],2081 "payable": False,2082 "stateMutability": "view",2083 "type": "function"2084 },2085 {2086 "constant": False,2087 "inputs": [2088 {2089 "name": "_newOwner",2090 "type": "address"2091 }2092 ],2093 "name": "transferOwnership",2094 "outputs": [],2095 "payable": False,2096 "stateMutability": "nonpayable",2097 "type": "function"2098 },2099 {2100 "inputs": [],2101 "payable": False,2102 "stateMutability": "nonpayable",2103 "type": "constructor"2104 },2105 {2106 "anonymous": False,2107 "inputs": [2108 {2109 "indexed": True,2110 "name": "buyer",2111 "type": "address"2112 },2113 {2114 "indexed": False,2115 "name": "tokenId",2116 "type": "uint256"2117 }2118 ],2119 "name": "BoughtToken",2120 "type": "event"2121 },2122 {2123 "anonymous": False,2124 "inputs": [2125 {2126 "indexed": False,2127 "name": "tokenId",2128 "type": "uint256"2129 },2130 {2131 "indexed": False,2132 "name": "result",2133 "type": "bool"2134 }2135 ],2136 "name": "SetNFTbyTokenId",2137 "type": "event"2138 },2139 {2140 "anonymous": False,2141 "inputs": [2142 {2143 "indexed": True,2144 "name": "previousOwner",2145 "type": "address"2146 }2147 ],2148 "name": "OwnershipRenounced",2149 "type": "event"2150 },2151 {2152 "anonymous": False,2153 "inputs": [2154 {2155 "indexed": True,2156 "name": "previousOwner",2157 "type": "address"2158 },2159 {2160 "indexed": True,2161 "name": "newOwner",2162 "type": "address"2163 }2164 ],2165 "name": "OwnershipTransferred",2166 "type": "event"2167 },2168 {2169 "anonymous": False,2170 "inputs": [2171 {2172 "indexed": True,2173 "name": "_from",2174 "type": "address"2175 },2176 {2177 "indexed": True,2178 "name": "_to",2179 "type": "address"2180 },2181 {2182 "indexed": True,2183 "name": "_tokenId",2184 "type": "uint256"2185 }2186 ],2187 "name": "Transfer",2188 "type": "event"2189 },2190 {2191 "anonymous": False,2192 "inputs": [2193 {2194 "indexed": True,2195 "name": "_owner",2196 "type": "address"2197 },2198 {2199 "indexed": True,2200 "name": "_approved",2201 "type": "address"2202 },2203 {2204 "indexed": True,2205 "name": "_tokenId",2206 "type": "uint256"2207 }2208 ],2209 "name": "Approval",2210 "type": "event"2211 },2212 {2213 "anonymous": False,2214 "inputs": [2215 {2216 "indexed": True,2217 "name": "_owner",2218 "type": "address"2219 },2220 {2221 "indexed": True,2222 "name": "_operator",2223 "type": "address"2224 },2225 {2226 "indexed": False,2227 "name": "_approved",2228 "type": "bool"2229 }2230 ],2231 "name": "ApprovalForAll",2232 "type": "event"2233 }2234]2235setting = SettingHolder()2236if ENVIRON.get("CURRENT_ENVIRON") == "testnet":2237 setting.setup_testnet()2238elif ENVIRON.get("CURRENT_ENVIRON") == "mainnet":2239 setting.setup_mainnet()2240elif ENVIRON.get("CURRENT_ENVIRON") == "privtnet":2241 setting.setup_privtnet()2242else:...

Full Screen

Full Screen

event_rpcgen.py

Source:event_rpcgen.py Github

copy

Full Screen

1#!/usr/bin/env python2#3# Copyright (c) 2005 Niels Provos <provos@citi.umich.edu>4# All rights reserved.5#6# Generates marshaling code based on libevent.7import sys8import re9#10_NAME = "event_rpcgen.py"11_VERSION = "0.1"12_STRUCT_RE = '[a-z][a-z_0-9]*'13# Globals14line_count = 015white = re.compile(r'^\s+')16cppcomment = re.compile(r'\/\/.*$')17headerdirect = []18cppdirect = []19# Holds everything that makes a struct20class Struct:21 def __init__(self, name):22 self._name = name23 self._entries = []24 self._tags = {}25 print >>sys.stderr, ' Created struct: %s' % name26 def AddEntry(self, entry):27 if self._tags.has_key(entry.Tag()):28 print >>sys.stderr, ( 'Entry "%s" duplicates tag number '29 '%d from "%s" around line %d' ) % (30 entry.Name(), entry.Tag(),31 self._tags[entry.Tag()], line_count)32 sys.exit(1)33 self._entries.append(entry)34 self._tags[entry.Tag()] = entry.Name()35 print >>sys.stderr, ' Added entry: %s' % entry.Name()36 def Name(self):37 return self._name38 def EntryTagName(self, entry):39 """Creates the name inside an enumeration for distinguishing data40 types."""41 name = "%s_%s" % (self._name, entry.Name())42 return name.upper()43 def PrintIdented(self, file, ident, code):44 """Takes an array, add indentation to each entry and prints it."""45 for entry in code:46 print >>file, '%s%s' % (ident, entry)47 def PrintTags(self, file):48 """Prints the tag definitions for a structure."""49 print >>file, '/* Tag definition for %s */' % self._name50 print >>file, 'enum %s_ {' % self._name.lower()51 for entry in self._entries:52 print >>file, ' %s=%d,' % (self.EntryTagName(entry),53 entry.Tag())54 print >>file, ' %s_MAX_TAGS' % (self._name.upper())55 print >>file, '};\n'56 def PrintForwardDeclaration(self, file):57 print >>file, 'struct %s;' % self._name58 def PrintDeclaration(self, file):59 print >>file, '/* Structure declaration for %s */' % self._name60 print >>file, 'struct %s_access_ {' % self._name61 for entry in self._entries:62 dcl = entry.AssignDeclaration('(*%s_assign)' % entry.Name())63 dcl.extend(64 entry.GetDeclaration('(*%s_get)' % entry.Name()))65 if entry.Array():66 dcl.extend(67 entry.AddDeclaration('(*%s_add)' % entry.Name()))68 self.PrintIdented(file, ' ', dcl)69 print >>file, '};\n'70 print >>file, 'struct %s {' % self._name71 print >>file, ' struct %s_access_ *base;\n' % self._name72 for entry in self._entries:73 dcl = entry.Declaration()74 self.PrintIdented(file, ' ', dcl)75 print >>file, ''76 for entry in self._entries:77 print >>file, ' ev_uint8_t %s_set;' % entry.Name()78 print >>file, '};\n'79 print >>file, \80"""struct %(name)s *%(name)s_new(void);81void %(name)s_free(struct %(name)s *);82void %(name)s_clear(struct %(name)s *);83void %(name)s_marshal(struct evbuffer *, const struct %(name)s *);84int %(name)s_unmarshal(struct %(name)s *, struct evbuffer *);85int %(name)s_complete(struct %(name)s *);86void evtag_marshal_%(name)s(struct evbuffer *, ev_uint32_t, 87 const struct %(name)s *);88int evtag_unmarshal_%(name)s(struct evbuffer *, ev_uint32_t,89 struct %(name)s *);""" % { 'name' : self._name }90 # Write a setting function of every variable91 for entry in self._entries:92 self.PrintIdented(file, '', entry.AssignDeclaration(93 entry.AssignFuncName()))94 self.PrintIdented(file, '', entry.GetDeclaration(95 entry.GetFuncName()))96 if entry.Array():97 self.PrintIdented(file, '', entry.AddDeclaration(98 entry.AddFuncName()))99 print >>file, '/* --- %s done --- */\n' % self._name100 def PrintCode(self, file):101 print >>file, ('/*\n'102 ' * Implementation of %s\n'103 ' */\n') % self._name104 print >>file, \105 'static struct %(name)s_access_ __%(name)s_base = {' % \106 { 'name' : self._name }107 for entry in self._entries:108 self.PrintIdented(file, ' ', entry.CodeBase())109 print >>file, '};\n'110 # Creation111 print >>file, (112 'struct %(name)s *\n'113 '%(name)s_new(void)\n'114 '{\n'115 ' struct %(name)s *tmp;\n'116 ' if ((tmp = malloc(sizeof(struct %(name)s))) == NULL) {\n'117 ' event_warn("%%s: malloc", __func__);\n'118 ' return (NULL);\n'119 ' }\n'120 ' tmp->base = &__%(name)s_base;\n') % { 'name' : self._name }121 for entry in self._entries:122 self.PrintIdented(file, ' ', entry.CodeNew('tmp'))123 print >>file, ' tmp->%s_set = 0;\n' % entry.Name()124 print >>file, (125 ' return (tmp);\n'126 '}\n')127 # Adding128 for entry in self._entries:129 if entry.Array():130 self.PrintIdented(file, '', entry.CodeAdd())131 print >>file, ''132 133 # Assigning134 for entry in self._entries:135 self.PrintIdented(file, '', entry.CodeAssign())136 print >>file, ''137 # Getting138 for entry in self._entries:139 self.PrintIdented(file, '', entry.CodeGet())140 print >>file, ''141 142 # Clearing143 print >>file, ( 'void\n'144 '%(name)s_clear(struct %(name)s *tmp)\n'145 '{'146 ) % { 'name' : self._name }147 for entry in self._entries:148 self.PrintIdented(file, ' ', entry.CodeClear('tmp'))149 print >>file, '}\n'150 # Freeing151 print >>file, ( 'void\n'152 '%(name)s_free(struct %(name)s *tmp)\n'153 '{'154 ) % { 'name' : self._name }155 156 for entry in self._entries:157 self.PrintIdented(file, ' ', entry.CodeFree('tmp'))158 print >>file, (' free(tmp);\n'159 '}\n')160 # Marshaling161 print >>file, ('void\n'162 '%(name)s_marshal(struct evbuffer *evbuf, '163 'const struct %(name)s *tmp)'164 '{') % { 'name' : self._name }165 for entry in self._entries:166 indent = ' '167 # Optional entries do not have to be set168 if entry.Optional():169 indent += ' '170 print >>file, ' if (tmp->%s_set) {' % entry.Name()171 self.PrintIdented(172 file, indent,173 entry.CodeMarshal('evbuf', self.EntryTagName(entry), 'tmp'))174 if entry.Optional():175 print >>file, ' }'176 print >>file, '}\n'177 178 # Unmarshaling179 print >>file, ('int\n'180 '%(name)s_unmarshal(struct %(name)s *tmp, '181 ' struct evbuffer *evbuf)\n'182 '{\n'183 ' ev_uint32_t tag;\n'184 ' while (EVBUFFER_LENGTH(evbuf) > 0) {\n'185 ' if (evtag_peek(evbuf, &tag) == -1)\n'186 ' return (-1);\n'187 ' switch (tag) {\n'188 ) % { 'name' : self._name }189 for entry in self._entries:190 print >>file, ' case %s:\n' % self.EntryTagName(entry)191 if not entry.Array():192 print >>file, (193 ' if (tmp->%s_set)\n'194 ' return (-1);'195 ) % (entry.Name())196 self.PrintIdented(197 file, ' ',198 entry.CodeUnmarshal('evbuf',199 self.EntryTagName(entry), 'tmp'))200 print >>file, ( ' tmp->%s_set = 1;\n' % entry.Name() +201 ' break;\n' )202 print >>file, ( ' default:\n'203 ' return -1;\n'204 ' }\n'205 ' }\n' )206 # Check if it was decoded completely207 print >>file, ( ' if (%(name)s_complete(tmp) == -1)\n'208 ' return (-1);'209 ) % { 'name' : self._name }210 # Successfully decoded211 print >>file, ( ' return (0);\n'212 '}\n')213 # Checking if a structure has all the required data214 print >>file, (215 'int\n'216 '%(name)s_complete(struct %(name)s *msg)\n'217 '{' ) % { 'name' : self._name }218 for entry in self._entries:219 self.PrintIdented(220 file, ' ',221 entry.CodeComplete('msg'))222 print >>file, (223 ' return (0);\n'224 '}\n' )225 # Complete message unmarshaling226 print >>file, (227 'int\n'228 'evtag_unmarshal_%(name)s(struct evbuffer *evbuf, '229 'ev_uint32_t need_tag, struct %(name)s *msg)\n'230 '{\n'231 ' ev_uint32_t tag;\n'232 ' int res = -1;\n'233 '\n'234 ' struct evbuffer *tmp = evbuffer_new();\n'235 '\n'236 ' if (evtag_unmarshal(evbuf, &tag, tmp) == -1'237 ' || tag != need_tag)\n'238 ' goto error;\n'239 '\n'240 ' if (%(name)s_unmarshal(msg, tmp) == -1)\n'241 ' goto error;\n'242 '\n'243 ' res = 0;\n'244 '\n'245 ' error:\n'246 ' evbuffer_free(tmp);\n'247 ' return (res);\n'248 '}\n' ) % { 'name' : self._name }249 # Complete message marshaling250 print >>file, (251 'void\n'252 'evtag_marshal_%(name)s(struct evbuffer *evbuf, ev_uint32_t tag, '253 'const struct %(name)s *msg)\n'254 '{\n'255 ' struct evbuffer *_buf = evbuffer_new();\n'256 ' assert(_buf != NULL);\n'257 ' evbuffer_drain(_buf, -1);\n'258 ' %(name)s_marshal(_buf, msg);\n'259 ' evtag_marshal(evbuf, tag, EVBUFFER_DATA(_buf), '260 'EVBUFFER_LENGTH(_buf));\n'261 ' evbuffer_free(_buf);\n'262 '}\n' ) % { 'name' : self._name }263class Entry:264 def __init__(self, type, name, tag):265 self._type = type266 self._name = name267 self._tag = int(tag)268 self._ctype = type269 self._optional = 0270 self._can_be_array = 0271 self._array = 0272 self._line_count = -1273 self._struct = None274 self._refname = None275 def GetTranslation(self):276 return { "parent_name" : self._struct.Name(),277 "name" : self._name,278 "ctype" : self._ctype,279 "refname" : self._refname280 }281 282 def SetStruct(self, struct):283 self._struct = struct284 def LineCount(self):285 assert self._line_count != -1286 return self._line_count287 def SetLineCount(self, number):288 self._line_count = number289 def Array(self):290 return self._array291 def Optional(self):292 return self._optional293 def Tag(self):294 return self._tag295 def Name(self):296 return self._name297 def Type(self):298 return self._type299 def MakeArray(self, yes=1):300 self._array = yes301 302 def MakeOptional(self):303 self._optional = 1304 def GetFuncName(self):305 return '%s_%s_get' % (self._struct.Name(), self._name)306 307 def GetDeclaration(self, funcname):308 code = [ 'int %s(struct %s *, %s *);' % (309 funcname, self._struct.Name(), self._ctype ) ]310 return code311 def CodeGet(self):312 code = (313 'int',314 '%(parent_name)s_%(name)s_get(struct %(parent_name)s *msg, '315 '%(ctype)s *value)',316 '{',317 ' if (msg->%(name)s_set != 1)',318 ' return (-1);',319 ' *value = msg->%(name)s_data;',320 ' return (0);',321 '}' )322 code = '\n'.join(code)323 code = code % self.GetTranslation()324 return code.split('\n')325 326 def AssignFuncName(self):327 return '%s_%s_assign' % (self._struct.Name(), self._name)328 329 def AddFuncName(self):330 return '%s_%s_add' % (self._struct.Name(), self._name)331 332 def AssignDeclaration(self, funcname):333 code = [ 'int %s(struct %s *, const %s);' % (334 funcname, self._struct.Name(), self._ctype ) ]335 return code336 def CodeAssign(self):337 code = [ 'int',338 '%(parent_name)s_%(name)s_assign(struct %(parent_name)s *msg,'339 ' const %(ctype)s value)',340 '{',341 ' msg->%(name)s_set = 1;',342 ' msg->%(name)s_data = value;',343 ' return (0);',344 '}' ]345 code = '\n'.join(code)346 code = code % self.GetTranslation()347 return code.split('\n')348 def CodeClear(self, structname):349 code = [ '%s->%s_set = 0;' % (structname, self.Name()) ]350 return code351 352 def CodeComplete(self, structname):353 if self.Optional():354 return []355 356 code = [ 'if (!%s->%s_set)' % (structname, self.Name()),357 ' return (-1);' ]358 return code359 def CodeFree(self, name):360 return []361 def CodeBase(self):362 code = [363 '%(parent_name)s_%(name)s_assign,',364 '%(parent_name)s_%(name)s_get,'365 ]366 if self.Array():367 code.append('%(parent_name)s_%(name)s_add,')368 code = '\n'.join(code)369 code = code % self.GetTranslation()370 return code.split('\n')371 def Verify(self):372 if self.Array() and not self._can_be_array:373 print >>sys.stderr, (374 'Entry "%s" cannot be created as an array '375 'around line %d' ) % (self._name, self.LineCount())376 sys.exit(1)377 if not self._struct:378 print >>sys.stderr, (379 'Entry "%s" does not know which struct it belongs to '380 'around line %d' ) % (self._name, self.LineCount())381 sys.exit(1)382 if self._optional and self._array:383 print >>sys.stderr, ( 'Entry "%s" has illegal combination of '384 'optional and array around line %d' ) % (385 self._name, self.LineCount() )386 sys.exit(1)387class EntryBytes(Entry):388 def __init__(self, type, name, tag, length):389 # Init base class390 Entry.__init__(self, type, name, tag)391 self._length = length392 self._ctype = 'ev_uint8_t'393 def GetDeclaration(self, funcname):394 code = [ 'int %s(struct %s *, %s **);' % (395 funcname, self._struct.Name(), self._ctype ) ]396 return code397 398 def AssignDeclaration(self, funcname):399 code = [ 'int %s(struct %s *, const %s *);' % (400 funcname, self._struct.Name(), self._ctype ) ]401 return code402 403 def Declaration(self):404 dcl = ['ev_uint8_t %s_data[%s];' % (self._name, self._length)]405 406 return dcl407 def CodeGet(self):408 name = self._name409 code = [ 'int',410 '%s_%s_get(struct %s *msg, %s **value)' % (411 self._struct.Name(), name,412 self._struct.Name(), self._ctype),413 '{',414 ' if (msg->%s_set != 1)' % name,415 ' return (-1);',416 ' *value = msg->%s_data;' % name,417 ' return (0);',418 '}' ]419 return code420 421 def CodeAssign(self):422 name = self._name423 code = [ 'int',424 '%s_%s_assign(struct %s *msg, const %s *value)' % (425 self._struct.Name(), name,426 self._struct.Name(), self._ctype),427 '{',428 ' msg->%s_set = 1;' % name,429 ' memcpy(msg->%s_data, value, %s);' % (430 name, self._length),431 ' return (0);',432 '}' ]433 return code434 435 def CodeUnmarshal(self, buf, tag_name, var_name):436 code = [ 'if (evtag_unmarshal_fixed(%s, %s, ' % (buf, tag_name) +437 '%s->%s_data, ' % (var_name, self._name) +438 'sizeof(%s->%s_data)) == -1) {' % (439 var_name, self._name),440 ' event_warnx("%%s: failed to unmarshal %s", __func__);' % (441 self._name ),442 ' return (-1);',443 '}'444 ]445 return code446 def CodeMarshal(self, buf, tag_name, var_name):447 code = ['evtag_marshal(%s, %s, %s->%s_data, sizeof(%s->%s_data));' % (448 buf, tag_name, var_name, self._name, var_name, self._name )]449 return code450 def CodeClear(self, structname):451 code = [ '%s->%s_set = 0;' % (structname, self.Name()),452 'memset(%s->%s_data, 0, sizeof(%s->%s_data));' % (453 structname, self._name, structname, self._name)]454 return code455 456 def CodeNew(self, name):457 code = ['memset(%s->%s_data, 0, sizeof(%s->%s_data));' % (458 name, self._name, name, self._name)]459 return code460 def Verify(self):461 if not self._length:462 print >>sys.stderr, 'Entry "%s" needs a length around line %d' % (463 self._name, self.LineCount() )464 sys.exit(1)465 Entry.Verify(self)466class EntryInt(Entry):467 def __init__(self, type, name, tag):468 # Init base class469 Entry.__init__(self, type, name, tag)470 self._ctype = 'ev_uint32_t'471 def CodeUnmarshal(self, buf, tag_name, var_name):472 code = ['if (evtag_unmarshal_int(%s, %s, &%s->%s_data) == -1) {' % (473 buf, tag_name, var_name, self._name),474 ' event_warnx("%%s: failed to unmarshal %s", __func__);' % (475 self._name ),476 ' return (-1);',477 '}' ] 478 return code479 def CodeMarshal(self, buf, tag_name, var_name):480 code = ['evtag_marshal_int(%s, %s, %s->%s_data);' % (481 buf, tag_name, var_name, self._name)]482 return code483 def Declaration(self):484 dcl = ['ev_uint32_t %s_data;' % self._name]485 return dcl486 def CodeNew(self, name):487 code = ['%s->%s_data = 0;' % (name, self._name)]488 return code489class EntryString(Entry):490 def __init__(self, type, name, tag):491 # Init base class492 Entry.__init__(self, type, name, tag)493 self._ctype = 'char *'494 def CodeAssign(self):495 name = self._name496 code = """int497%(parent_name)s_%(name)s_assign(struct %(parent_name)s *msg,498 const %(ctype)s value)499{500 if (msg->%(name)s_data != NULL)501 free(msg->%(name)s_data);502 if ((msg->%(name)s_data = strdup(value)) == NULL)503 return (-1);504 msg->%(name)s_set = 1;505 return (0);506}""" % self.GetTranslation()507 return code.split('\n')508 509 def CodeUnmarshal(self, buf, tag_name, var_name):510 code = ['if (evtag_unmarshal_string(%s, %s, &%s->%s_data) == -1) {' % (511 buf, tag_name, var_name, self._name),512 ' event_warnx("%%s: failed to unmarshal %s", __func__);' % (513 self._name ),514 ' return (-1);',515 '}'516 ]517 return code518 def CodeMarshal(self, buf, tag_name, var_name):519 code = ['evtag_marshal_string(%s, %s, %s->%s_data);' % (520 buf, tag_name, var_name, self._name)]521 return code522 def CodeClear(self, structname):523 code = [ 'if (%s->%s_set == 1) {' % (structname, self.Name()),524 ' free (%s->%s_data);' % (structname, self.Name()),525 ' %s->%s_data = NULL;' % (structname, self.Name()),526 ' %s->%s_set = 0;' % (structname, self.Name()),527 '}'528 ]529 return code530 531 def CodeNew(self, name):532 code = ['%s->%s_data = NULL;' % (name, self._name)]533 return code534 def CodeFree(self, name):535 code = ['if (%s->%s_data != NULL)' % (name, self._name),536 ' free (%s->%s_data); ' % (name, self._name)]537 return code538 def Declaration(self):539 dcl = ['char *%s_data;' % self._name]540 return dcl541class EntryStruct(Entry):542 def __init__(self, type, name, tag, refname):543 # Init base class544 Entry.__init__(self, type, name, tag)545 self._can_be_array = 1546 self._refname = refname547 self._ctype = 'struct %s*' % refname548 def CodeGet(self):549 name = self._name550 code = [ 'int',551 '%s_%s_get(struct %s *msg, %s *value)' % (552 self._struct.Name(), name,553 self._struct.Name(), self._ctype),554 '{',555 ' if (msg->%s_set != 1) {' % name,556 ' msg->%s_data = %s_new();' % (name, self._refname),557 ' if (msg->%s_data == NULL)' % name,558 ' return (-1);',559 ' msg->%s_set = 1;' % name,560 ' }',561 ' *value = msg->%s_data;' % name,562 ' return (0);',563 '}' ]564 return code565 566 def CodeAssign(self):567 name = self._name568 code = """int569%(parent_name)s_%(name)s_assign(struct %(parent_name)s *msg,570 const %(ctype)s value)571{572 struct evbuffer *tmp = NULL;573 if (msg->%(name)s_set) {574 %(refname)s_clear(msg->%(name)s_data);575 msg->%(name)s_set = 0;576 } else {577 msg->%(name)s_data = %(refname)s_new();578 if (msg->%(name)s_data == NULL) {579 event_warn("%%s: %(refname)s_new()", __func__);580 goto error;581 }582 }583 if ((tmp = evbuffer_new()) == NULL) {584 event_warn("%%s: evbuffer_new()", __func__);585 goto error;586 }587 %(refname)s_marshal(tmp, value);588 if (%(refname)s_unmarshal(msg->%(name)s_data, tmp) == -1) {589 event_warnx("%%s: %(refname)s_unmarshal", __func__);590 goto error;591 }592 msg->%(name)s_set = 1;593 evbuffer_free(tmp);594 return (0);595 error:596 if (tmp != NULL)597 evbuffer_free(tmp);598 if (msg->%(name)s_data != NULL) {599 %(refname)s_free(msg->%(name)s_data);600 msg->%(name)s_data = NULL;601 }602 return (-1);603}""" % self.GetTranslation()604 return code.split('\n')605 606 def CodeComplete(self, structname):607 if self.Optional():608 code = [ 'if (%s->%s_set && %s_complete(%s->%s_data) == -1)' % (609 structname, self.Name(),610 self._refname, structname, self.Name()),611 ' return (-1);' ]612 else:613 code = [ 'if (%s_complete(%s->%s_data) == -1)' % (614 self._refname, structname, self.Name()),615 ' return (-1);' ]616 return code617 618 def CodeUnmarshal(self, buf, tag_name, var_name):619 code = ['%s->%s_data = %s_new();' % (620 var_name, self._name, self._refname),621 'if (%s->%s_data == NULL)' % (var_name, self._name),622 ' return (-1);',623 'if (evtag_unmarshal_%s(%s, %s, %s->%s_data) == -1) {' % (624 self._refname, buf, tag_name, var_name, self._name),625 ' event_warnx("%%s: failed to unmarshal %s", __func__);' % (626 self._name ),627 ' return (-1);',628 '}'629 ]630 return code631 def CodeMarshal(self, buf, tag_name, var_name):632 code = ['evtag_marshal_%s(%s, %s, %s->%s_data);' % (633 self._refname, buf, tag_name, var_name, self._name)]634 return code635 def CodeClear(self, structname):636 code = [ 'if (%s->%s_set == 1) {' % (structname, self.Name()),637 ' %s_free(%s->%s_data);' % (638 self._refname, structname, self.Name()),639 ' %s->%s_data = NULL;' % (structname, self.Name()),640 ' %s->%s_set = 0;' % (structname, self.Name()),641 '}'642 ]643 return code644 645 def CodeNew(self, name):646 code = ['%s->%s_data = NULL;' % (name, self._name)]647 return code648 def CodeFree(self, name):649 code = ['if (%s->%s_data != NULL)' % (name, self._name),650 ' %s_free(%s->%s_data); ' % (651 self._refname, name, self._name)]652 return code653 def Declaration(self):654 dcl = ['%s %s_data;' % (self._ctype, self._name)]655 return dcl656class EntryVarBytes(Entry):657 def __init__(self, type, name, tag):658 # Init base class659 Entry.__init__(self, type, name, tag)660 self._ctype = 'ev_uint8_t *'661 def GetDeclaration(self, funcname):662 code = [ 'int %s(struct %s *, %s *, ev_uint32_t *);' % (663 funcname, self._struct.Name(), self._ctype ) ]664 return code665 666 def AssignDeclaration(self, funcname):667 code = [ 'int %s(struct %s *, const %s, ev_uint32_t);' % (668 funcname, self._struct.Name(), self._ctype ) ]669 return code670 671 def CodeAssign(self):672 name = self._name673 code = [ 'int',674 '%s_%s_assign(struct %s *msg, '675 'const %s value, ev_uint32_t len)' % (676 self._struct.Name(), name,677 self._struct.Name(), self._ctype),678 '{',679 ' if (msg->%s_data != NULL)' % name,680 ' free (msg->%s_data);' % name,681 ' msg->%s_data = malloc(len);' % name,682 ' if (msg->%s_data == NULL)' % name,683 ' return (-1);',684 ' msg->%s_set = 1;' % name,685 ' msg->%s_length = len;' % name,686 ' memcpy(msg->%s_data, value, len);' % name,687 ' return (0);',688 '}' ]689 return code690 691 def CodeGet(self):692 name = self._name693 code = [ 'int',694 '%s_%s_get(struct %s *msg, %s *value, ev_uint32_t *plen)' % (695 self._struct.Name(), name,696 self._struct.Name(), self._ctype),697 '{',698 ' if (msg->%s_set != 1)' % name,699 ' return (-1);',700 ' *value = msg->%s_data;' % name,701 ' *plen = msg->%s_length;' % name,702 ' return (0);',703 '}' ]704 return code705 def CodeUnmarshal(self, buf, tag_name, var_name):706 code = ['if (evtag_payload_length(%s, &%s->%s_length) == -1)' % (707 buf, var_name, self._name),708 ' return (-1);',709 # We do not want DoS opportunities710 'if (%s->%s_length > EVBUFFER_LENGTH(%s))' % (711 var_name, self._name, buf),712 ' return (-1);',713 'if ((%s->%s_data = malloc(%s->%s_length)) == NULL)' % (714 var_name, self._name, var_name, self._name),715 ' return (-1);',716 'if (evtag_unmarshal_fixed(%s, %s, %s->%s_data, '717 '%s->%s_length) == -1) {' % (718 buf, tag_name, var_name, self._name, var_name, self._name),719 ' event_warnx("%%s: failed to unmarshal %s", __func__);' % (720 self._name ),721 ' return (-1);',722 '}'723 ]724 return code725 def CodeMarshal(self, buf, tag_name, var_name):726 code = ['evtag_marshal(%s, %s, %s->%s_data, %s->%s_length);' % (727 buf, tag_name, var_name, self._name, var_name, self._name)]728 return code729 def CodeClear(self, structname):730 code = [ 'if (%s->%s_set == 1) {' % (structname, self.Name()),731 ' free (%s->%s_data);' % (structname, self.Name()),732 ' %s->%s_data = NULL;' % (structname, self.Name()),733 ' %s->%s_length = 0;' % (structname, self.Name()),734 ' %s->%s_set = 0;' % (structname, self.Name()),735 '}'736 ]737 return code738 739 def CodeNew(self, name):740 code = ['%s->%s_data = NULL;' % (name, self._name),741 '%s->%s_length = 0;' % (name, self._name) ]742 return code743 def CodeFree(self, name):744 code = ['if (%s->%s_data != NULL)' % (name, self._name),745 ' free (%s->%s_data); ' % (name, self._name)]746 return code747 def Declaration(self):748 dcl = ['ev_uint8_t *%s_data;' % self._name,749 'ev_uint32_t %s_length;' % self._name]750 return dcl751class EntryArray(Entry):752 def __init__(self, entry):753 # Init base class754 Entry.__init__(self, entry._type, entry._name, entry._tag)755 self._entry = entry756 self._refname = entry._refname757 self._ctype = 'struct %s *' % self._refname758 def GetDeclaration(self, funcname):759 """Allows direct access to elements of the array."""760 translate = self.GetTranslation()761 translate["funcname"] = funcname762 code = [763 'int %(funcname)s(struct %(parent_name)s *, int, %(ctype)s *);' %764 translate ]765 return code766 767 def AssignDeclaration(self, funcname):768 code = [ 'int %s(struct %s *, int, const %s);' % (769 funcname, self._struct.Name(), self._ctype ) ]770 return code771 772 def AddDeclaration(self, funcname):773 code = [ '%s %s(struct %s *);' % (774 self._ctype, funcname, self._struct.Name() ) ]775 return code776 777 def CodeGet(self):778 code = """int779%(parent_name)s_%(name)s_get(struct %(parent_name)s *msg, int offset,780 %(ctype)s *value)781{782 if (!msg->%(name)s_set || offset < 0 || offset >= msg->%(name)s_length)783 return (-1);784 *value = msg->%(name)s_data[offset];785 return (0);786}""" % self.GetTranslation()787 return code.split('\n')788 789 def CodeAssign(self):790 code = """int791%(parent_name)s_%(name)s_assign(struct %(parent_name)s *msg, int off,792 const %(ctype)s value)793{794 struct evbuffer *tmp = NULL;795 if (!msg->%(name)s_set || off < 0 || off >= msg->%(name)s_length)796 return (-1);797 %(refname)s_clear(msg->%(name)s_data[off]);798 if ((tmp = evbuffer_new()) == NULL) {799 event_warn("%%s: evbuffer_new()", __func__);800 goto error;801 }802 %(refname)s_marshal(tmp, value);803 if (%(refname)s_unmarshal(msg->%(name)s_data[off], tmp) == -1) {804 event_warnx("%%s: %(refname)s_unmarshal", __func__);805 goto error;806 }807 evbuffer_free(tmp);808 return (0);809error:810 if (tmp != NULL)811 evbuffer_free(tmp);812 %(refname)s_clear(msg->%(name)s_data[off]);813 return (-1);814}""" % self.GetTranslation()815 return code.split('\n')816 817 def CodeAdd(self):818 code = \819"""%(ctype)s820%(parent_name)s_%(name)s_add(struct %(parent_name)s *msg)821{822 if (++msg->%(name)s_length >= msg->%(name)s_num_allocated) {823 int tobe_allocated = msg->%(name)s_num_allocated;824 %(ctype)s* new_data = NULL;825 tobe_allocated = !tobe_allocated ? 1 : tobe_allocated << 1;826 new_data = (%(ctype)s*) realloc(msg->%(name)s_data,827 tobe_allocated * sizeof(%(ctype)s));828 if (new_data == NULL)829 goto error;830 msg->%(name)s_data = new_data;831 msg->%(name)s_num_allocated = tobe_allocated;832 }833 msg->%(name)s_data[msg->%(name)s_length - 1] = %(refname)s_new();834 if (msg->%(name)s_data[msg->%(name)s_length - 1] == NULL)835 goto error;836 msg->%(name)s_set = 1;837 return (msg->%(name)s_data[msg->%(name)s_length - 1]);838error:839 --msg->%(name)s_length;840 return (NULL);841}842 """ % self.GetTranslation()843 return code.split('\n')844 def CodeComplete(self, structname):845 code = []846 translate = self.GetTranslation()847 if self.Optional():848 code.append( 'if (%(structname)s->%(name)s_set)' % translate)849 translate["structname"] = structname850 tmp = """{851 int i;852 for (i = 0; i < %(structname)s->%(name)s_length; ++i) {853 if (%(refname)s_complete(%(structname)s->%(name)s_data[i]) == -1)854 return (-1);855 }856}""" % translate857 code.extend(tmp.split('\n'))858 return code859 860 def CodeUnmarshal(self, buf, tag_name, var_name):861 translate = self.GetTranslation()862 translate["var_name"] = var_name863 translate["buf"] = buf864 translate["tag_name"] = tag_name865 code = """if (%(parent_name)s_%(name)s_add(%(var_name)s) == NULL)866 return (-1);867if (evtag_unmarshal_%(refname)s(%(buf)s, %(tag_name)s,868 %(var_name)s->%(name)s_data[%(var_name)s->%(name)s_length - 1]) == -1) {869 --%(var_name)s->%(name)s_length;870 event_warnx("%%s: failed to unmarshal %(name)s", __func__);871 return (-1);872}""" % translate873 return code.split('\n')874 def CodeMarshal(self, buf, tag_name, var_name):875 code = ['{',876 ' int i;',877 ' for (i = 0; i < %s->%s_length; ++i) {' % (878 var_name, self._name),879 ' evtag_marshal_%s(%s, %s, %s->%s_data[i]);' % (880 self._refname, buf, tag_name, var_name, self._name),881 ' }',882 '}'883 ]884 return code885 def CodeClear(self, structname):886 code = [ 'if (%s->%s_set == 1) {' % (structname, self.Name()),887 ' int i;',888 ' for (i = 0; i < %s->%s_length; ++i) {' % (889 structname, self.Name()),890 ' %s_free(%s->%s_data[i]);' % (891 self._refname, structname, self.Name()),892 ' }',893 ' free(%s->%s_data);' % (structname, self.Name()),894 ' %s->%s_data = NULL;' % (structname, self.Name()),895 ' %s->%s_set = 0;' % (structname, self.Name()),896 ' %s->%s_length = 0;' % (structname, self.Name()),897 ' %s->%s_num_allocated = 0;' % (structname, self.Name()),898 '}'899 ]900 return code901 902 def CodeNew(self, name):903 code = ['%s->%s_data = NULL;' % (name, self._name),904 '%s->%s_length = 0;' % (name, self._name),905 '%s->%s_num_allocated = 0;' % (name, self._name)]906 return code907 def CodeFree(self, name):908 code = ['if (%s->%s_data != NULL) {' % (name, self._name),909 ' int i;',910 ' for (i = 0; i < %s->%s_length; ++i) {' % (911 name, self._name),912 ' %s_free(%s->%s_data[i]); ' % (913 self._refname, name, self._name),914 ' %s->%s_data[i] = NULL;' % (name, self._name),915 ' }',916 ' free(%s->%s_data);' % (name, self._name),917 ' %s->%s_data = NULL;' % (name, self._name),918 ' %s->%s_length = 0;' % (name, self._name),919 ' %s->%s_num_allocated = 0;' % (name, self._name),920 '}'921 ]922 return code923 def Declaration(self):924 dcl = ['struct %s **%s_data;' % (self._refname, self._name),925 'int %s_length;' % self._name,926 'int %s_num_allocated;' % self._name ]927 return dcl928def NormalizeLine(line):929 global white930 global cppcomment931 932 line = cppcomment.sub('', line)933 line = line.strip()934 line = white.sub(' ', line)935 return line936def ProcessOneEntry(newstruct, entry):937 optional = 0938 array = 0939 entry_type = ''940 name = ''941 tag = ''942 tag_set = None943 separator = ''944 fixed_length = ''945 tokens = entry.split(' ')946 while tokens:947 token = tokens[0]948 tokens = tokens[1:]949 if not entry_type:950 if not optional and token == 'optional':951 optional = 1952 continue953 if not array and token == 'array':954 array = 1955 continue956 if not entry_type:957 entry_type = token958 continue959 if not name:960 res = re.match(r'^([^\[\]]+)(\[.*\])?$', token)961 if not res:962 print >>sys.stderr, 'Cannot parse name: \"%s\" around %d' % (963 entry, line_count)964 sys.exit(1)965 name = res.group(1)966 fixed_length = res.group(2)967 if fixed_length:968 fixed_length = fixed_length[1:-1]969 continue970 if not separator:971 separator = token972 if separator != '=':973 print >>sys.stderr, 'Expected "=" after name \"%s\" got %s' % (974 name, token)975 sys.exit(1)976 continue977 if not tag_set:978 tag_set = 1979 if not re.match(r'^(0x)?[0-9]+$', token):980 print >>sys.stderr, 'Expected tag number: \"%s\"' % entry981 sys.exit(1)982 tag = int(token, 0)983 continue984 print >>sys.stderr, 'Cannot parse \"%s\"' % entry985 sys.exit(1)986 if not tag_set:987 print >>sys.stderr, 'Need tag number: \"%s\"' % entry988 sys.exit(1)989 # Create the right entry990 if entry_type == 'bytes':991 if fixed_length:992 newentry = EntryBytes(entry_type, name, tag, fixed_length)993 else:994 newentry = EntryVarBytes(entry_type, name, tag)995 elif entry_type == 'int' and not fixed_length:996 newentry = EntryInt(entry_type, name, tag)997 elif entry_type == 'string' and not fixed_length:998 newentry = EntryString(entry_type, name, tag)999 else:1000 res = re.match(r'^struct\[(%s)\]$' % _STRUCT_RE,1001 entry_type, re.IGNORECASE)1002 if res:1003 # References another struct defined in our file1004 newentry = EntryStruct(entry_type, name, tag, res.group(1))1005 else:1006 print >>sys.stderr, 'Bad type: "%s" in "%s"' % (entry_type, entry)1007 sys.exit(1)1008 structs = []1009 1010 if optional:1011 newentry.MakeOptional()1012 if array:1013 newentry.MakeArray()1014 newentry.SetStruct(newstruct)1015 newentry.SetLineCount(line_count)1016 newentry.Verify()1017 if array:1018 # We need to encapsulate this entry into a struct1019 newname = newentry.Name()+ '_array'1020 # Now borgify the new entry.1021 newentry = EntryArray(newentry)1022 newentry.SetStruct(newstruct)1023 newentry.SetLineCount(line_count)1024 newentry.MakeArray()1025 newstruct.AddEntry(newentry)1026 return structs1027def ProcessStruct(data):1028 tokens = data.split(' ')1029 # First three tokens are: 'struct' 'name' '{'1030 newstruct = Struct(tokens[1])1031 inside = ' '.join(tokens[3:-1])1032 tokens = inside.split(';')1033 structs = []1034 for entry in tokens:1035 entry = NormalizeLine(entry)1036 if not entry:1037 continue1038 # It's possible that new structs get defined in here1039 structs.extend(ProcessOneEntry(newstruct, entry))1040 structs.append(newstruct)1041 return structs1042def GetNextStruct(file):1043 global line_count1044 global cppdirect1045 got_struct = 01046 processed_lines = []1047 have_c_comment = 01048 data = ''1049 while 1:1050 line = file.readline()1051 if not line:1052 break1053 1054 line_count += 11055 line = line[:-1]1056 if not have_c_comment and re.search(r'/\*', line):1057 if re.search(r'/\*.*\*/', line):1058 line = re.sub(r'/\*.*\*/', '', line)1059 else:1060 line = re.sub(r'/\*.*$', '', line)1061 have_c_comment = 11062 if have_c_comment:1063 if not re.search(r'\*/', line):1064 continue1065 have_c_comment = 01066 line = re.sub(r'^.*\*/', '', line)1067 line = NormalizeLine(line)1068 if not line:1069 continue1070 if not got_struct:1071 if re.match(r'#include ["<].*[>"]', line):1072 cppdirect.append(line)1073 continue1074 1075 if re.match(r'^#(if( |def)|endif)', line):1076 cppdirect.append(line)1077 continue1078 if re.match(r'^#define', line):1079 headerdirect.append(line)1080 continue1081 if not re.match(r'^struct %s {$' % _STRUCT_RE,1082 line, re.IGNORECASE):1083 print >>sys.stderr, 'Missing struct on line %d: %s' % (1084 line_count, line)1085 sys.exit(1)1086 else:1087 got_struct = 11088 data += line1089 continue1090 # We are inside the struct1091 tokens = line.split('}')1092 if len(tokens) == 1:1093 data += ' ' + line1094 continue1095 if len(tokens[1]):1096 print >>sys.stderr, 'Trailing garbage after struct on line %d' % (1097 line_count )1098 sys.exit(1)1099 # We found the end of the struct1100 data += ' %s}' % tokens[0]1101 break1102 # Remove any comments, that might be in there1103 data = re.sub(r'/\*.*\*/', '', data)1104 1105 return data1106 1107def Parse(file):1108 """1109 Parses the input file and returns C code and corresponding header file.1110 """1111 entities = []1112 while 1:1113 # Just gets the whole struct nicely formatted1114 data = GetNextStruct(file)1115 if not data:1116 break1117 entities.extend(ProcessStruct(data))1118 return entities1119def GuardName(name):1120 name = '_'.join(name.split('.'))1121 name = '_'.join(name.split('/'))1122 guard = '_'+name.upper()+'_'1123 return guard1124def HeaderPreamble(name):1125 guard = GuardName(name)1126 pre = (1127 '/*\n'1128 ' * Automatically generated from %s\n'1129 ' */\n\n'1130 '#ifndef %s\n'1131 '#define %s\n\n' ) % (1132 name, guard, guard)1133 # insert stdint.h - let's hope everyone has it1134 pre += (1135 '#include <event-config.h>\n'1136 '#ifdef _EVENT_HAVE_STDINT_H\n'1137 '#include <stdint.h>\n'1138 '#endif\n' )1139 for statement in headerdirect:1140 pre += '%s\n' % statement1141 if headerdirect:1142 pre += '\n'1143 pre += (1144 '#define EVTAG_HAS(msg, member) ((msg)->member##_set == 1)\n'1145 '#ifdef __GNUC__\n'1146 '#define EVTAG_ASSIGN(msg, member, args...) '1147 '(*(msg)->base->member##_assign)(msg, ## args)\n'1148 '#define EVTAG_GET(msg, member, args...) '1149 '(*(msg)->base->member##_get)(msg, ## args)\n'1150 '#else\n'1151 '#define EVTAG_ASSIGN(msg, member, ...) '1152 '(*(msg)->base->member##_assign)(msg, ## __VA_ARGS__)\n'1153 '#define EVTAG_GET(msg, member, ...) '1154 '(*(msg)->base->member##_get)(msg, ## __VA_ARGS__)\n'1155 '#endif\n'1156 '#define EVTAG_ADD(msg, member) (*(msg)->base->member##_add)(msg)\n'1157 '#define EVTAG_LEN(msg, member) ((msg)->member##_length)\n'1158 )1159 return pre1160 1161def HeaderPostamble(name):1162 guard = GuardName(name)1163 return '#endif /* %s */' % guard1164def BodyPreamble(name):1165 global _NAME1166 global _VERSION1167 1168 header_file = '.'.join(name.split('.')[:-1]) + '.gen.h'1169 pre = ( '/*\n'1170 ' * Automatically generated from %s\n'1171 ' * by %s/%s. DO NOT EDIT THIS FILE.\n'1172 ' */\n\n' ) % (name, _NAME, _VERSION)1173 pre += ( '#include <sys/types.h>\n'1174 '#ifdef _EVENT_HAVE_SYS_TIME_H\n'1175 '#include <sys/time.h>\n'1176 '#endif\n'1177 '#include <stdlib.h>\n'1178 '#include <string.h>\n'1179 '#include <assert.h>\n'1180 '#define EVENT_NO_STRUCT\n'1181 '#include <event.h>\n\n'1182 '#ifdef _EVENT___func__\n'1183 '#define __func__ _EVENT___func__\n'1184 '#endif\n' )1185 for statement in cppdirect:1186 pre += '%s\n' % statement1187 1188 pre += '\n#include "%s"\n\n' % header_file1189 pre += 'void event_err(int eval, const char *fmt, ...);\n'1190 pre += 'void event_warn(const char *fmt, ...);\n'1191 pre += 'void event_errx(int eval, const char *fmt, ...);\n'1192 pre += 'void event_warnx(const char *fmt, ...);\n\n'1193 return pre1194def main(argv):1195 if len(argv) < 2 or not argv[1]:1196 print >>sys.stderr, 'Need RPC description file as first argument.'1197 sys.exit(1)1198 filename = argv[1]1199 ext = filename.split('.')[-1]1200 if ext != 'rpc':1201 print >>sys.stderr, 'Unrecognized file extension: %s' % ext1202 sys.exit(1)1203 print >>sys.stderr, 'Reading \"%s\"' % filename1204 fp = open(filename, 'r')1205 entities = Parse(fp)1206 fp.close()1207 header_file = '.'.join(filename.split('.')[:-1]) + '.gen.h'1208 impl_file = '.'.join(filename.split('.')[:-1]) + '.gen.c'1209 print >>sys.stderr, '... creating "%s"' % header_file1210 header_fp = open(header_file, 'w')1211 print >>header_fp, HeaderPreamble(filename)1212 # Create forward declarations: allows other structs to reference1213 # each other1214 for entry in entities:1215 entry.PrintForwardDeclaration(header_fp)1216 print >>header_fp, ''1217 for entry in entities:1218 entry.PrintTags(header_fp)1219 entry.PrintDeclaration(header_fp)1220 print >>header_fp, HeaderPostamble(filename)1221 header_fp.close()1222 print >>sys.stderr, '... creating "%s"' % impl_file1223 impl_fp = open(impl_file, 'w')1224 print >>impl_fp, BodyPreamble(filename)1225 for entry in entities:1226 entry.PrintCode(impl_fp)1227 impl_fp.close()1228if __name__ == '__main__':...

Full Screen

Full Screen

test_visitor.py

Source:test_visitor.py Github

copy

Full Screen

1from graphql.language.ast import (Document, Field, Name, OperationDefinition,2 SelectionSet)3from graphql.language.parser import parse4from graphql.language.printer import print_ast5from graphql.language.visitor import (BREAK, REMOVE, ParallelVisitor,6 TypeInfoVisitor, Visitor, visit)7from graphql.type import get_named_type, is_composite_type8from graphql.utils.type_info import TypeInfo9from ...validation.tests.utils import test_schema10from .fixtures import KITCHEN_SINK11def test_allows_editing_a_node_both_on_enter_and_on_leave():12 ast = parse('{ a, b, c { a, b, c } }', no_location=True)13 class TestVisitor(Visitor):14 def __init__(self):15 self.did_enter = False16 self.did_leave = False17 def enter(self, node, *args):18 if isinstance(node, OperationDefinition):19 self.did_enter = True20 selection_set = node.selection_set21 self.selections = None22 if selection_set:23 self.selections = selection_set.selections24 new_selection_set = SelectionSet(25 selections=[])26 return OperationDefinition(27 name=node.name,28 variable_definitions=node.variable_definitions,29 directives=node.directives,30 loc=node.loc,31 operation=node.operation,32 selection_set=new_selection_set)33 def leave(self, node, *args):34 if isinstance(node, OperationDefinition):35 self.did_leave = True36 new_selection_set = None37 if self.selections:38 new_selection_set = SelectionSet(39 selections=self.selections)40 return OperationDefinition(41 name=node.name,42 variable_definitions=node.variable_definitions,43 directives=node.directives,44 loc=node.loc,45 operation=node.operation,46 selection_set=new_selection_set)47 visitor = TestVisitor()48 edited_ast = visit(ast, visitor)49 assert ast == parse('{ a, b, c { a, b, c } }', no_location=True)50 assert edited_ast == ast51 assert visitor.did_enter52 assert visitor.did_leave53def test_allows_editing_the_root_node_on_enter_and_on_leave():54 ast = parse('{ a, b, c { a, b, c } }', no_location=True)55 definitions = ast.definitions56 class TestVisitor(Visitor):57 def __init__(self):58 self.did_enter = False59 self.did_leave = False60 def enter(self, node, *args):61 if isinstance(node, Document):62 self.did_enter = True63 return Document(64 loc=node.loc,65 definitions=[])66 def leave(self, node, *args):67 if isinstance(node, Document):68 self.did_leave = True69 return Document(70 loc=node.loc,71 definitions=definitions)72 visitor = TestVisitor()73 edited_ast = visit(ast, visitor)74 assert edited_ast == ast75 assert visitor.did_enter76 assert visitor.did_leave77def test_allows_for_editing_on_enter():78 ast = parse('{ a, b, c { a, b, c } }', no_location=True)79 class TestVisitor(Visitor):80 def enter(self, node, *args):81 if isinstance(node, Field) and node.name.value == 'b':82 return REMOVE83 edited_ast = visit(ast, TestVisitor())84 assert ast == parse('{ a, b, c { a, b, c } }', no_location=True)85 assert edited_ast == parse('{ a, c { a, c } }', no_location=True)86def test_allows_for_editing_on_leave():87 ast = parse('{ a, b, c { a, b, c } }', no_location=True)88 class TestVisitor(Visitor):89 def leave(self, node, *args):90 if isinstance(node, Field) and node.name.value == 'b':91 return REMOVE92 edited_ast = visit(ast, TestVisitor())93 assert ast == parse('{ a, b, c { a, b, c } }', no_location=True)94 assert edited_ast == parse('{ a, c { a, c } }', no_location=True)95def test_visits_edited_node():96 added_field = Field(name=Name(value='__typename'))97 ast = parse('{ a { x } }')98 class TestVisitor(Visitor):99 def __init__(self):100 self.did_visit_added_field = False101 def enter(self, node, *args):102 if isinstance(node, Field) and node.name.value == 'a':103 selection_set = node.selection_set104 selections = []105 if selection_set:106 selections = selection_set.selections107 new_selection_set = SelectionSet(108 selections=[added_field] + selections)109 return Field(name=None, selection_set=new_selection_set)110 if node is added_field:111 self.did_visit_added_field = True112 visitor = TestVisitor()113 visit(ast, visitor)114 assert visitor.did_visit_added_field115def test_allows_skipping_a_subtree():116 visited = []117 ast = parse('{ a, b { x }, c }')118 class TestVisitor(Visitor):119 def enter(self, node, *args):120 visited.append(121 ['enter', type(node).__name__, getattr(node, 'value', None)])122 if isinstance(node, Field) and node.name.value == 'b':123 return False124 def leave(self, node, *args):125 visited.append(126 ['leave', type(node).__name__, getattr(node, 'value', None)])127 visit(ast, TestVisitor())128 assert visited == [129 ['enter', 'Document', None],130 ['enter', 'OperationDefinition', None],131 ['enter', 'SelectionSet', None],132 ['enter', 'Field', None],133 ['enter', 'Name', 'a'],134 ['leave', 'Name', 'a'],135 ['leave', 'Field', None],136 ['enter', 'Field', None],137 ['enter', 'Field', None],138 ['enter', 'Name', 'c'],139 ['leave', 'Name', 'c'],140 ['leave', 'Field', None],141 ['leave', 'SelectionSet', None],142 ['leave', 'OperationDefinition', None],143 ['leave', 'Document', None],144 ]145def test_allows_early_exit_while_visiting():146 visited = []147 ast = parse('{ a, b { x }, c }')148 class TestVisitor(Visitor):149 def enter(self, node, *args):150 visited.append(151 ['enter', type(node).__name__, getattr(node, 'value', None)])152 if isinstance(node, Name) and node.value == 'x':153 return BREAK154 def leave(self, node, *args):155 visited.append(156 ['leave', type(node).__name__, getattr(node, 'value', None)])157 visit(ast, TestVisitor())158 assert visited == [159 ['enter', 'Document', None],160 ['enter', 'OperationDefinition', None],161 ['enter', 'SelectionSet', None],162 ['enter', 'Field', None],163 ['enter', 'Name', 'a'],164 ['leave', 'Name', 'a'],165 ['leave', 'Field', None],166 ['enter', 'Field', None],167 ['enter', 'Name', 'b'],168 ['leave', 'Name', 'b'],169 ['enter', 'SelectionSet', None],170 ['enter', 'Field', None],171 ['enter', 'Name', 'x'],172 ]173def test_allows_a_named_functions_visitor_api():174 visited = []175 ast = parse('{ a, b { x }, c }')176 class TestVisitor(Visitor):177 def enter_Name(self, node, *args):178 visited.append(179 ['enter', type(node).__name__, getattr(node, 'value', None)])180 def enter_SelectionSet(self, node, *args):181 visited.append(182 ['enter', type(node).__name__, getattr(node, 'value', None)])183 def leave_SelectionSet(self, node, *args):184 visited.append(185 ['leave', type(node).__name__, getattr(node, 'value', None)])186 visit(ast, TestVisitor())187 assert visited == [188 ['enter', 'SelectionSet', None],189 ['enter', 'Name', 'a'],190 ['enter', 'Name', 'b'],191 ['enter', 'SelectionSet', None],192 ['enter', 'Name', 'x'],193 ['leave', 'SelectionSet', None],194 ['enter', 'Name', 'c'],195 ['leave', 'SelectionSet', None],196 ]197def test_visits_kitchen_sink():198 visited = []199 ast = parse(KITCHEN_SINK)200 class TestVisitor(Visitor):201 def enter(self, node, key, parent, *args):202 kind = parent and type(parent).__name__203 if kind == 'list':204 kind = None205 visited.append(['enter', type(node).__name__, key, kind])206 def leave(self, node, key, parent, *args):207 kind = parent and type(parent).__name__208 if kind == 'list':209 kind = None210 visited.append(['leave', type(node).__name__, key, kind])211 visit(ast, TestVisitor())212 assert visited == [213 ['enter', 'Document', None, None],214 ['enter', 'OperationDefinition', 0, None],215 ['enter', 'Name', 'name', 'OperationDefinition'],216 ['leave', 'Name', 'name', 'OperationDefinition'],217 ['enter', 'VariableDefinition', 0, None],218 ['enter', 'Variable', 'variable', 'VariableDefinition'],219 ['enter', 'Name', 'name', 'Variable'],220 ['leave', 'Name', 'name', 'Variable'],221 ['leave', 'Variable', 'variable', 'VariableDefinition'],222 ['enter', 'NamedType', 'type', 'VariableDefinition'],223 ['enter', 'Name', 'name', 'NamedType'],224 ['leave', 'Name', 'name', 'NamedType'],225 ['leave', 'NamedType', 'type', 'VariableDefinition'],226 ['leave', 'VariableDefinition', 0, None],227 ['enter', 'VariableDefinition', 1, None],228 ['enter', 'Variable', 'variable', 'VariableDefinition'],229 ['enter', 'Name', 'name', 'Variable'],230 ['leave', 'Name', 'name', 'Variable'],231 ['leave', 'Variable', 'variable', 'VariableDefinition'],232 ['enter', 'NamedType', 'type', 'VariableDefinition'],233 ['enter', 'Name', 'name', 'NamedType'],234 ['leave', 'Name', 'name', 'NamedType'],235 ['leave', 'NamedType', 'type', 'VariableDefinition'],236 ['enter', 'EnumValue', 'default_value', 'VariableDefinition'],237 ['leave', 'EnumValue', 'default_value', 'VariableDefinition'],238 ['leave', 'VariableDefinition', 1, None],239 ['enter', 'SelectionSet', 'selection_set', 'OperationDefinition'],240 ['enter', 'Field', 0, None],241 ['enter', 'Name', 'alias', 'Field'],242 ['leave', 'Name', 'alias', 'Field'],243 ['enter', 'Name', 'name', 'Field'],244 ['leave', 'Name', 'name', 'Field'],245 ['enter', 'Argument', 0, None],246 ['enter', 'Name', 'name', 'Argument'],247 ['leave', 'Name', 'name', 'Argument'],248 ['enter', 'ListValue', 'value', 'Argument'],249 ['enter', 'IntValue', 0, None],250 ['leave', 'IntValue', 0, None],251 ['enter', 'IntValue', 1, None],252 ['leave', 'IntValue', 1, None],253 ['leave', 'ListValue', 'value', 'Argument'],254 ['leave', 'Argument', 0, None],255 ['enter', 'SelectionSet', 'selection_set', 'Field'],256 ['enter', 'Field', 0, None],257 ['enter', 'Name', 'name', 'Field'],258 ['leave', 'Name', 'name', 'Field'],259 ['leave', 'Field', 0, None],260 ['enter', 'InlineFragment', 1, None],261 ['enter', 'NamedType', 'type_condition', 'InlineFragment'],262 ['enter', 'Name', 'name', 'NamedType'],263 ['leave', 'Name', 'name', 'NamedType'],264 ['leave', 'NamedType', 'type_condition', 'InlineFragment'],265 ['enter', 'Directive', 0, None],266 ['enter', 'Name', 'name', 'Directive'],267 ['leave', 'Name', 'name', 'Directive'],268 ['leave', 'Directive', 0, None],269 ['enter', 'SelectionSet', 'selection_set', 'InlineFragment'],270 ['enter', 'Field', 0, None],271 ['enter', 'Name', 'name', 'Field'],272 ['leave', 'Name', 'name', 'Field'],273 ['enter', 'SelectionSet', 'selection_set', 'Field'],274 ['enter', 'Field', 0, None],275 ['enter', 'Name', 'name', 'Field'],276 ['leave', 'Name', 'name', 'Field'],277 ['leave', 'Field', 0, None],278 ['enter', 'Field', 1, None],279 ['enter', 'Name', 'alias', 'Field'],280 ['leave', 'Name', 'alias', 'Field'],281 ['enter', 'Name', 'name', 'Field'],282 ['leave', 'Name', 'name', 'Field'],283 ['enter', 'Argument', 0, None],284 ['enter', 'Name', 'name', 'Argument'],285 ['leave', 'Name', 'name', 'Argument'],286 ['enter', 'IntValue', 'value', 'Argument'],287 ['leave', 'IntValue', 'value', 'Argument'],288 ['leave', 'Argument', 0, None],289 ['enter', 'Argument', 1, None],290 ['enter', 'Name', 'name', 'Argument'],291 ['leave', 'Name', 'name', 'Argument'],292 ['enter', 'Variable', 'value', 'Argument'],293 ['enter', 'Name', 'name', 'Variable'],294 ['leave', 'Name', 'name', 'Variable'],295 ['leave', 'Variable', 'value', 'Argument'],296 ['leave', 'Argument', 1, None],297 ['enter', 'Directive', 0, None],298 ['enter', 'Name', 'name', 'Directive'],299 ['leave', 'Name', 'name', 'Directive'],300 ['enter', 'Argument', 0, None],301 ['enter', 'Name', 'name', 'Argument'],302 ['leave', 'Name', 'name', 'Argument'],303 ['enter', 'Variable', 'value', 'Argument'],304 ['enter', 'Name', 'name', 'Variable'],305 ['leave', 'Name', 'name', 'Variable'],306 ['leave', 'Variable', 'value', 'Argument'],307 ['leave', 'Argument', 0, None],308 ['leave', 'Directive', 0, None],309 ['enter', 'SelectionSet', 'selection_set', 'Field'],310 ['enter', 'Field', 0, None],311 ['enter', 'Name', 'name', 'Field'],312 ['leave', 'Name', 'name', 'Field'],313 ['leave', 'Field', 0, None],314 ['enter', 'FragmentSpread', 1, None],315 ['enter', 'Name', 'name', 'FragmentSpread'],316 ['leave', 'Name', 'name', 'FragmentSpread'],317 ['leave', 'FragmentSpread', 1, None],318 ['leave', 'SelectionSet', 'selection_set', 'Field'],319 ['leave', 'Field', 1, None],320 ['leave', 'SelectionSet', 'selection_set', 'Field'],321 ['leave', 'Field', 0, None],322 ['leave', 'SelectionSet', 'selection_set', 'InlineFragment'],323 ['leave', 'InlineFragment', 1, None],324 ['enter', 'InlineFragment', 2, None],325 ['enter', 'Directive', 0, None],326 ['enter', 'Name', 'name', 'Directive'],327 ['leave', 'Name', 'name', 'Directive'],328 ['enter', 'Argument', 0, None],329 ['enter', 'Name', 'name', 'Argument'],330 ['leave', 'Name', 'name', 'Argument'],331 ['enter', 'Variable', 'value', 'Argument'],332 ['enter', 'Name', 'name', 'Variable'],333 ['leave', 'Name', 'name', 'Variable'],334 ['leave', 'Variable', 'value', 'Argument'],335 ['leave', 'Argument', 0, None],336 ['leave', 'Directive', 0, None],337 ['enter', 'SelectionSet', 'selection_set', 'InlineFragment'],338 ['enter', 'Field', 0, None],339 ['enter', 'Name', 'name', 'Field'],340 ['leave', 'Name', 'name', 'Field'],341 ['leave', 'Field', 0, None],342 ['leave', 'SelectionSet', 'selection_set', 'InlineFragment'],343 ['leave', 'InlineFragment', 2, None],344 ['enter', 'InlineFragment', 3, None],345 ['enter', 'SelectionSet', 'selection_set', 'InlineFragment'],346 ['enter', 'Field', 0, None],347 ['enter', 'Name', 'name', 'Field'],348 ['leave', 'Name', 'name', 'Field'],349 ['leave', 'Field', 0, None],350 ['leave', 'SelectionSet', 'selection_set', 'InlineFragment'],351 ['leave', 'InlineFragment', 3, None],352 ['leave', 'SelectionSet', 'selection_set', 'Field'],353 ['leave', 'Field', 0, None],354 ['leave', 'SelectionSet', 'selection_set', 'OperationDefinition'],355 ['leave', 'OperationDefinition', 0, None],356 ['enter', 'OperationDefinition', 1, None],357 ['enter', 'Name', 'name', 'OperationDefinition'],358 ['leave', 'Name', 'name', 'OperationDefinition'],359 ['enter', 'SelectionSet', 'selection_set', 'OperationDefinition'],360 ['enter', 'Field', 0, None],361 ['enter', 'Name', 'name', 'Field'],362 ['leave', 'Name', 'name', 'Field'],363 ['enter', 'Argument', 0, None],364 ['enter', 'Name', 'name', 'Argument'],365 ['leave', 'Name', 'name', 'Argument'],366 ['enter', 'IntValue', 'value', 'Argument'],367 ['leave', 'IntValue', 'value', 'Argument'],368 ['leave', 'Argument', 0, None],369 ['enter', 'Directive', 0, None],370 ['enter', 'Name', 'name', 'Directive'],371 ['leave', 'Name', 'name', 'Directive'],372 ['leave', 'Directive', 0, None],373 ['enter', 'SelectionSet', 'selection_set', 'Field'],374 ['enter', 'Field', 0, None],375 ['enter', 'Name', 'name', 'Field'],376 ['leave', 'Name', 'name', 'Field'],377 ['enter', 'SelectionSet', 'selection_set', 'Field'],378 ['enter', 'Field', 0, None],379 ['enter', 'Name', 'name', 'Field'],380 ['leave', 'Name', 'name', 'Field'],381 ['leave', 'Field', 0, None],382 ['leave', 'SelectionSet', 'selection_set', 'Field'],383 ['leave', 'Field', 0, None],384 ['leave', 'SelectionSet', 'selection_set', 'Field'],385 ['leave', 'Field', 0, None],386 ['leave', 'SelectionSet', 'selection_set', 'OperationDefinition'],387 ['leave', 'OperationDefinition', 1, None],388 ['enter', 'OperationDefinition', 2, None],389 ['enter', 'Name', 'name', 'OperationDefinition'],390 ['leave', 'Name', 'name', 'OperationDefinition'],391 ['enter', 'VariableDefinition', 0, None],392 ['enter', 'Variable', 'variable', 'VariableDefinition'],393 ['enter', 'Name', 'name', 'Variable'],394 ['leave', 'Name', 'name', 'Variable'],395 ['leave', 'Variable', 'variable', 'VariableDefinition'],396 ['enter', 'NamedType', 'type', 'VariableDefinition'],397 ['enter', 'Name', 'name', 'NamedType'],398 ['leave', 'Name', 'name', 'NamedType'],399 ['leave', 'NamedType', 'type', 'VariableDefinition'],400 ['leave', 'VariableDefinition', 0, None],401 ['enter', 'SelectionSet', 'selection_set', 'OperationDefinition'],402 ['enter', 'Field', 0, None],403 ['enter', 'Name', 'name', 'Field'],404 ['leave', 'Name', 'name', 'Field'],405 ['enter', 'Argument', 0, None],406 ['enter', 'Name', 'name', 'Argument'],407 ['leave', 'Name', 'name', 'Argument'],408 ['enter', 'Variable', 'value', 'Argument'],409 ['enter', 'Name', 'name', 'Variable'],410 ['leave', 'Name', 'name', 'Variable'],411 ['leave', 'Variable', 'value', 'Argument'],412 ['leave', 'Argument', 0, None],413 ['enter', 'SelectionSet', 'selection_set', 'Field'],414 ['enter', 'Field', 0, None],415 ['enter', 'Name', 'name', 'Field'],416 ['leave', 'Name', 'name', 'Field'],417 ['enter', 'SelectionSet', 'selection_set', 'Field'],418 ['enter', 'Field', 0, None],419 ['enter', 'Name', 'name', 'Field'],420 ['leave', 'Name', 'name', 'Field'],421 ['enter', 'SelectionSet', 'selection_set', 'Field'],422 ['enter', 'Field', 0, None],423 ['enter', 'Name', 'name', 'Field'],424 ['leave', 'Name', 'name', 'Field'],425 ['leave', 'Field', 0, None],426 ['leave', 'SelectionSet', 'selection_set', 'Field'],427 ['leave', 'Field', 0, None],428 ['enter', 'Field', 1, None],429 ['enter', 'Name', 'name', 'Field'],430 ['leave', 'Name', 'name', 'Field'],431 ['enter', 'SelectionSet', 'selection_set', 'Field'],432 ['enter', 'Field', 0, None],433 ['enter', 'Name', 'name', 'Field'],434 ['leave', 'Name', 'name', 'Field'],435 ['leave', 'Field', 0, None],436 ['leave', 'SelectionSet', 'selection_set', 'Field'],437 ['leave', 'Field', 1, None],438 ['leave', 'SelectionSet', 'selection_set', 'Field'],439 ['leave', 'Field', 0, None],440 ['leave', 'SelectionSet', 'selection_set', 'Field'],441 ['leave', 'Field', 0, None],442 ['leave', 'SelectionSet', 'selection_set', 'OperationDefinition'],443 ['leave', 'OperationDefinition', 2, None],444 ['enter', 'FragmentDefinition', 3, None],445 ['enter', 'Name', 'name', 'FragmentDefinition'],446 ['leave', 'Name', 'name', 'FragmentDefinition'],447 ['enter', 'NamedType', 'type_condition', 'FragmentDefinition'],448 ['enter', 'Name', 'name', 'NamedType'],449 ['leave', 'Name', 'name', 'NamedType'],450 ['leave', 'NamedType', 'type_condition', 'FragmentDefinition'],451 ['enter', 'SelectionSet', 'selection_set', 'FragmentDefinition'],452 ['enter', 'Field', 0, None],453 ['enter', 'Name', 'name', 'Field'],454 ['leave', 'Name', 'name', 'Field'],455 ['enter', 'Argument', 0, None],456 ['enter', 'Name', 'name', 'Argument'],457 ['leave', 'Name', 'name', 'Argument'],458 ['enter', 'Variable', 'value', 'Argument'],459 ['enter', 'Name', 'name', 'Variable'],460 ['leave', 'Name', 'name', 'Variable'],461 ['leave', 'Variable', 'value', 'Argument'],462 ['leave', 'Argument', 0, None],463 ['enter', 'Argument', 1, None],464 ['enter', 'Name', 'name', 'Argument'],465 ['leave', 'Name', 'name', 'Argument'],466 ['enter', 'Variable', 'value', 'Argument'],467 ['enter', 'Name', 'name', 'Variable'],468 ['leave', 'Name', 'name', 'Variable'],469 ['leave', 'Variable', 'value', 'Argument'],470 ['leave', 'Argument', 1, None],471 ['enter', 'Argument', 2, None],472 ['enter', 'Name', 'name', 'Argument'],473 ['leave', 'Name', 'name', 'Argument'],474 ['enter', 'ObjectValue', 'value', 'Argument'],475 ['enter', 'ObjectField', 0, None],476 ['enter', 'Name', 'name', 'ObjectField'],477 ['leave', 'Name', 'name', 'ObjectField'],478 ['enter', 'StringValue', 'value', 'ObjectField'],479 ['leave', 'StringValue', 'value', 'ObjectField'],480 ['leave', 'ObjectField', 0, None],481 ['leave', 'ObjectValue', 'value', 'Argument'],482 ['leave', 'Argument', 2, None],483 ['leave', 'Field', 0, None],484 ['leave', 'SelectionSet', 'selection_set', 'FragmentDefinition'],485 ['leave', 'FragmentDefinition', 3, None],486 ['enter', 'OperationDefinition', 4, None],487 ['enter', 'SelectionSet', 'selection_set', 'OperationDefinition'],488 ['enter', 'Field', 0, None],489 ['enter', 'Name', 'name', 'Field'],490 ['leave', 'Name', 'name', 'Field'],491 ['enter', 'Argument', 0, None],492 ['enter', 'Name', 'name', 'Argument'],493 ['leave', 'Name', 'name', 'Argument'],494 ['enter', 'BooleanValue', 'value', 'Argument'],495 ['leave', 'BooleanValue', 'value', 'Argument'],496 ['leave', 'Argument', 0, None],497 ['enter', 'Argument', 1, None],498 ['enter', 'Name', 'name', 'Argument'],499 ['leave', 'Name', 'name', 'Argument'],500 ['enter', 'BooleanValue', 'value', 'Argument'],501 ['leave', 'BooleanValue', 'value', 'Argument'],502 ['leave', 'Argument', 1, None],503 ['leave', 'Field', 0, None],504 ['enter', 'Field', 1, None],505 ['enter', 'Name', 'name', 'Field'],506 ['leave', 'Name', 'name', 'Field'],507 ['leave', 'Field', 1, None],508 ['leave', 'SelectionSet', 'selection_set', 'OperationDefinition'],509 ['leave', 'OperationDefinition', 4, None],510 ['leave', 'Document', None, None]511 ]512def test_visits_in_pararell_allows_skipping_a_subtree():513 visited = []514 ast = parse('{ a, b { x }, c }')515 class TestVisitor(Visitor):516 def enter(self, node, key, parent, *args):517 visited.append(518 ['enter', type(node).__name__, getattr(node, 'value', None)])519 if type(node).__name__ == 'Field' and node.name.value == 'b':520 return False521 def leave(self, node, key, parent, *args):522 visited.append(523 ['leave', type(node).__name__, getattr(node, 'value', None)])524 visit(ast, ParallelVisitor([TestVisitor()]))525 assert visited == [526 ['enter', 'Document', None],527 ['enter', 'OperationDefinition', None],528 ['enter', 'SelectionSet', None],529 ['enter', 'Field', None],530 ['enter', 'Name', 'a'],531 ['leave', 'Name', 'a'],532 ['leave', 'Field', None],533 ['enter', 'Field', None],534 ['enter', 'Field', None],535 ['enter', 'Name', 'c'],536 ['leave', 'Name', 'c'],537 ['leave', 'Field', None],538 ['leave', 'SelectionSet', None],539 ['leave', 'OperationDefinition', None],540 ['leave', 'Document', None],541 ]542def test_visits_in_pararell_allows_skipping_different_subtrees():543 visited = []544 ast = parse('{ a { x }, b { y} }')545 class TestVisitor(Visitor):546 def __init__(self, name):547 self.name = name548 def enter(self, node, key, parent, *args):549 visited.append(["no-{}".format(self.name), 'enter',550 type(node).__name__, getattr(node, 'value', None)])551 if type(node).__name__ == 'Field' and node.name.value == self.name:552 return False553 def leave(self, node, key, parent, *args):554 visited.append(["no-{}".format(self.name), 'leave',555 type(node).__name__, getattr(node, 'value', None)])556 visit(ast, ParallelVisitor([TestVisitor('a'), TestVisitor('b')]))557 assert visited == [558 ['no-a', 'enter', 'Document', None],559 ['no-b', 'enter', 'Document', None],560 ['no-a', 'enter', 'OperationDefinition', None],561 ['no-b', 'enter', 'OperationDefinition', None],562 ['no-a', 'enter', 'SelectionSet', None],563 ['no-b', 'enter', 'SelectionSet', None],564 ['no-a', 'enter', 'Field', None],565 ['no-b', 'enter', 'Field', None],566 ['no-b', 'enter', 'Name', 'a'],567 ['no-b', 'leave', 'Name', 'a'],568 ['no-b', 'enter', 'SelectionSet', None],569 ['no-b', 'enter', 'Field', None],570 ['no-b', 'enter', 'Name', 'x'],571 ['no-b', 'leave', 'Name', 'x'],572 ['no-b', 'leave', 'Field', None],573 ['no-b', 'leave', 'SelectionSet', None],574 ['no-b', 'leave', 'Field', None],575 ['no-a', 'enter', 'Field', None],576 ['no-b', 'enter', 'Field', None],577 ['no-a', 'enter', 'Name', 'b'],578 ['no-a', 'leave', 'Name', 'b'],579 ['no-a', 'enter', 'SelectionSet', None],580 ['no-a', 'enter', 'Field', None],581 ['no-a', 'enter', 'Name', 'y'],582 ['no-a', 'leave', 'Name', 'y'],583 ['no-a', 'leave', 'Field', None],584 ['no-a', 'leave', 'SelectionSet', None],585 ['no-a', 'leave', 'Field', None],586 ['no-a', 'leave', 'SelectionSet', None],587 ['no-b', 'leave', 'SelectionSet', None],588 ['no-a', 'leave', 'OperationDefinition', None],589 ['no-b', 'leave', 'OperationDefinition', None],590 ['no-a', 'leave', 'Document', None],591 ['no-b', 'leave', 'Document', None],592 ]593def test_visits_in_pararell_allows_early_exit_while_visiting():594 visited = []595 ast = parse('{ a, b { x }, c }')596 class TestVisitor(Visitor):597 def enter(self, node, key, parent, *args):598 visited.append(599 ['enter', type(node).__name__, getattr(node, 'value', None)])600 def leave(self, node, key, parent, *args):601 visited.append(602 ['leave', type(node).__name__, getattr(node, 'value', None)])603 if type(node).__name__ == 'Name' and node.value == 'x':604 return BREAK605 visit(ast, ParallelVisitor([TestVisitor()]))606 assert visited == [607 ['enter', 'Document', None],608 ['enter', 'OperationDefinition', None],609 ['enter', 'SelectionSet', None],610 ['enter', 'Field', None],611 ['enter', 'Name', 'a'],612 ['leave', 'Name', 'a'],613 ['leave', 'Field', None],614 ['enter', 'Field', None],615 ['enter', 'Name', 'b'],616 ['leave', 'Name', 'b'],617 ['enter', 'SelectionSet', None],618 ['enter', 'Field', None],619 ['enter', 'Name', 'x'],620 ['leave', 'Name', 'x']621 ]622def test_visits_in_pararell_allows_early_exit_from_different_points():623 visited = []624 ast = parse('{ a { y }, b { x } }')625 class TestVisitor(Visitor):626 def __init__(self, name):627 self.name = name628 def enter(self, node, key, parent, *args):629 visited.append(["break-{}".format(self.name), 'enter',630 type(node).__name__, getattr(node, 'value', None)])631 def leave(self, node, key, parent, *args):632 visited.append(["break-{}".format(self.name), 'leave',633 type(node).__name__, getattr(node, 'value', None)])634 if type(node).__name__ == 'Field' and node.name.value == self.name:635 return BREAK636 visit(ast, ParallelVisitor([TestVisitor('a'), TestVisitor('b')]))637 assert visited == [638 ['break-a', 'enter', 'Document', None],639 ['break-b', 'enter', 'Document', None],640 ['break-a', 'enter', 'OperationDefinition', None],641 ['break-b', 'enter', 'OperationDefinition', None],642 ['break-a', 'enter', 'SelectionSet', None],643 ['break-b', 'enter', 'SelectionSet', None],644 ['break-a', 'enter', 'Field', None],645 ['break-b', 'enter', 'Field', None],646 ['break-a', 'enter', 'Name', 'a'],647 ['break-b', 'enter', 'Name', 'a'],648 ['break-a', 'leave', 'Name', 'a'],649 ['break-b', 'leave', 'Name', 'a'],650 ['break-a', 'enter', 'SelectionSet', None],651 ['break-b', 'enter', 'SelectionSet', None],652 ['break-a', 'enter', 'Field', None],653 ['break-b', 'enter', 'Field', None],654 ['break-a', 'enter', 'Name', 'y'],655 ['break-b', 'enter', 'Name', 'y'],656 ['break-a', 'leave', 'Name', 'y'],657 ['break-b', 'leave', 'Name', 'y'],658 ['break-a', 'leave', 'Field', None],659 ['break-b', 'leave', 'Field', None],660 ['break-a', 'leave', 'SelectionSet', None],661 ['break-b', 'leave', 'SelectionSet', None],662 ['break-a', 'leave', 'Field', None],663 ['break-b', 'leave', 'Field', None],664 ['break-b', 'enter', 'Field', None],665 ['break-b', 'enter', 'Name', 'b'],666 ['break-b', 'leave', 'Name', 'b'],667 ['break-b', 'enter', 'SelectionSet', None],668 ['break-b', 'enter', 'Field', None],669 ['break-b', 'enter', 'Name', 'x'],670 ['break-b', 'leave', 'Name', 'x'],671 ['break-b', 'leave', 'Field', None],672 ['break-b', 'leave', 'SelectionSet', None],673 ['break-b', 'leave', 'Field', None]674 ]675def test_visits_in_pararell_allows_for_editing_on_enter():676 visited = []677 ast = parse('{ a, b, c { a, b, c } }', no_location=True)678 class TestVisitor1(Visitor):679 def enter(self, node, key, parent, *args):680 if type(node).__name__ == 'Field' and node.name.value == 'b':681 return REMOVE682 class TestVisitor2(Visitor):683 def enter(self, node, key, parent, *args):684 visited.append(685 ['enter', type(node).__name__, getattr(node, 'value', None)])686 def leave(self, node, key, parent, *args):687 visited.append(688 ['leave', type(node).__name__, getattr(node, 'value', None)])689 edited_ast = visit(ast, ParallelVisitor([TestVisitor1(), TestVisitor2()]))690 assert ast == parse('{ a, b, c { a, b, c } }', no_location=True)691 assert edited_ast == parse('{ a, c { a, c } }', no_location=True)692 assert visited == [693 ['enter', 'Document', None],694 ['enter', 'OperationDefinition', None],695 ['enter', 'SelectionSet', None],696 ['enter', 'Field', None],697 ['enter', 'Name', 'a'],698 ['leave', 'Name', 'a'],699 ['leave', 'Field', None],700 ['enter', 'Field', None],701 ['enter', 'Name', 'c'],702 ['leave', 'Name', 'c'],703 ['enter', 'SelectionSet', None],704 ['enter', 'Field', None],705 ['enter', 'Name', 'a'],706 ['leave', 'Name', 'a'],707 ['leave', 'Field', None],708 ['enter', 'Field', None],709 ['enter', 'Name', 'c'],710 ['leave', 'Name', 'c'],711 ['leave', 'Field', None],712 ['leave', 'SelectionSet', None],713 ['leave', 'Field', None],714 ['leave', 'SelectionSet', None],715 ['leave', 'OperationDefinition', None],716 ['leave', 'Document', None]717 ]718def test_visits_in_pararell_allows_for_editing_on_leave():719 visited = []720 ast = parse('{ a, b, c { a, b, c } }', no_location=True)721 class TestVisitor1(Visitor):722 def leave(self, node, key, parent, *args):723 if type(node).__name__ == 'Field' and node.name.value == 'b':724 return REMOVE725 class TestVisitor2(Visitor):726 def enter(self, node, key, parent, *args):727 visited.append(728 ['enter', type(node).__name__, getattr(node, 'value', None)])729 def leave(self, node, key, parent, *args):730 visited.append(731 ['leave', type(node).__name__, getattr(node, 'value', None)])732 edited_ast = visit(ast, ParallelVisitor([TestVisitor1(), TestVisitor2()]))733 assert ast == parse('{ a, b, c { a, b, c } }', no_location=True)734 assert edited_ast == parse('{ a, c { a, c } }', no_location=True)735 assert visited == [736 ['enter', 'Document', None],737 ['enter', 'OperationDefinition', None],738 ['enter', 'SelectionSet', None],739 ['enter', 'Field', None],740 ['enter', 'Name', 'a'],741 ['leave', 'Name', 'a'],742 ['leave', 'Field', None],743 ['enter', 'Field', None],744 ['enter', 'Name', 'b'],745 ['leave', 'Name', 'b'],746 ['enter', 'Field', None],747 ['enter', 'Name', 'c'],748 ['leave', 'Name', 'c'],749 ['enter', 'SelectionSet', None],750 ['enter', 'Field', None],751 ['enter', 'Name', 'a'],752 ['leave', 'Name', 'a'],753 ['leave', 'Field', None],754 ['enter', 'Field', None],755 ['enter', 'Name', 'b'],756 ['leave', 'Name', 'b'],757 ['enter', 'Field', None],758 ['enter', 'Name', 'c'],759 ['leave', 'Name', 'c'],760 ['leave', 'Field', None],761 ['leave', 'SelectionSet', None],762 ['leave', 'Field', None],763 ['leave', 'SelectionSet', None],764 ['leave', 'OperationDefinition', None],765 ['leave', 'Document', None]766 ]767def test_visits_with_typeinfo_maintains_type_info_during_visit():768 visited = []769 ast = parse('{ human(id: 4) { name, pets { name }, unknown } }')770 type_info = TypeInfo(test_schema)771 class TestVisitor(Visitor):772 def enter(self, node, key, parent, *args):773 parent_type = type_info.get_parent_type()774 _type = type_info.get_type()775 input_type = type_info.get_input_type()776 visited.append([777 'enter',778 type(node).__name__,779 node.value if type(node).__name__ == "Name" else None,780 str(parent_type) if parent_type else None,781 str(_type) if _type else None,782 str(input_type) if input_type else None783 ])784 def leave(self, node, key, parent, *args):785 parent_type = type_info.get_parent_type()786 _type = type_info.get_type()787 input_type = type_info.get_input_type()788 visited.append([789 'leave',790 type(node).__name__,791 node.value if type(node).__name__ == "Name" else None,792 str(parent_type) if parent_type else None,793 str(_type) if _type else None,794 str(input_type) if input_type else None795 ])796 visit(ast, TypeInfoVisitor(type_info, TestVisitor()))797 assert visited == [798 ['enter', 'Document', None, None, None, None],799 ['enter', 'OperationDefinition', None, None, 'QueryRoot', None],800 ['enter', 'SelectionSet', None, 'QueryRoot', 'QueryRoot', None],801 ['enter', 'Field', None, 'QueryRoot', 'Human', None],802 ['enter', 'Name', 'human', 'QueryRoot', 'Human', None],803 ['leave', 'Name', 'human', 'QueryRoot', 'Human', None],804 ['enter', 'Argument', None, 'QueryRoot', 'Human', 'ID'],805 ['enter', 'Name', 'id', 'QueryRoot', 'Human', 'ID'],806 ['leave', 'Name', 'id', 'QueryRoot', 'Human', 'ID'],807 ['enter', 'IntValue', None, 'QueryRoot', 'Human', 'ID'],808 ['leave', 'IntValue', None, 'QueryRoot', 'Human', 'ID'],809 ['leave', 'Argument', None, 'QueryRoot', 'Human', 'ID'],810 ['enter', 'SelectionSet', None, 'Human', 'Human', None],811 ['enter', 'Field', None, 'Human', 'String', None],812 ['enter', 'Name', 'name', 'Human', 'String', None],813 ['leave', 'Name', 'name', 'Human', 'String', None],814 ['leave', 'Field', None, 'Human', 'String', None],815 ['enter', 'Field', None, 'Human', '[Pet]', None],816 ['enter', 'Name', 'pets', 'Human', '[Pet]', None],817 ['leave', 'Name', 'pets', 'Human', '[Pet]', None],818 ['enter', 'SelectionSet', None, 'Pet', '[Pet]', None],819 ['enter', 'Field', None, 'Pet', 'String', None],820 ['enter', 'Name', 'name', 'Pet', 'String', None],821 ['leave', 'Name', 'name', 'Pet', 'String', None],822 ['leave', 'Field', None, 'Pet', 'String', None],823 ['leave', 'SelectionSet', None, 'Pet', '[Pet]', None],824 ['leave', 'Field', None, 'Human', '[Pet]', None],825 ['enter', 'Field', None, 'Human', None, None],826 ['enter', 'Name', 'unknown', 'Human', None, None],827 ['leave', 'Name', 'unknown', 'Human', None, None],828 ['leave', 'Field', None, 'Human', None, None],829 ['leave', 'SelectionSet', None, 'Human', 'Human', None],830 ['leave', 'Field', None, 'QueryRoot', 'Human', None],831 ['leave', 'SelectionSet', None, 'QueryRoot', 'QueryRoot', None],832 ['leave', 'OperationDefinition', None, None, 'QueryRoot', None],833 ['leave', 'Document', None, None, None, None]834 ]835def test_visits_with_typeinfo_maintains_type_info_during_edit():836 visited = []837 ast = parse('{ human(id: 4) { name, pets }, alien }')838 type_info = TypeInfo(test_schema)839 class TestVisitor(Visitor):840 def enter(self, node, key, parent, *args):841 parent_type = type_info.get_parent_type()842 _type = type_info.get_type()843 input_type = type_info.get_input_type()844 visited.append([845 'enter',846 type(node).__name__,847 node.value if type(node).__name__ == "Name" else None,848 str(parent_type) if parent_type else None,849 str(_type) if _type else None,850 str(input_type) if input_type else None851 ])852 # Make a query valid by adding missing selection sets.853 if type(node).__name__ == "Field" and not node.selection_set and is_composite_type(get_named_type(_type)):854 return Field(855 alias=node.alias,856 name=node.name,857 arguments=node.arguments,858 directives=node.directives,859 selection_set=SelectionSet(860 [Field(name=Name(value='__typename'))]861 )862 )863 def leave(self, node, key, parent, *args):864 parent_type = type_info.get_parent_type()865 _type = type_info.get_type()866 input_type = type_info.get_input_type()867 visited.append([868 'leave',869 type(node).__name__,870 node.value if type(node).__name__ == "Name" else None,871 str(parent_type) if parent_type else None,872 str(_type) if _type else None,873 str(input_type) if input_type else None874 ])875 edited_ast = visit(ast, TypeInfoVisitor(type_info, TestVisitor()))876 # assert print_ast(ast) == print_ast(parse(877 # '{ human(id: 4) { name, pets }, alien }'878 # ))879 assert print_ast(edited_ast) == print_ast(parse(880 '{ human(id: 4) { name, pets { __typename } }, alien { __typename } }'881 ))882 assert visited == [883 ['enter', 'Document', None, None, None, None],884 ['enter', 'OperationDefinition', None, None, 'QueryRoot', None],885 ['enter', 'SelectionSet', None, 'QueryRoot', 'QueryRoot', None],886 ['enter', 'Field', None, 'QueryRoot', 'Human', None],887 ['enter', 'Name', 'human', 'QueryRoot', 'Human', None],888 ['leave', 'Name', 'human', 'QueryRoot', 'Human', None],889 ['enter', 'Argument', None, 'QueryRoot', 'Human', 'ID'],890 ['enter', 'Name', 'id', 'QueryRoot', 'Human', 'ID'],891 ['leave', 'Name', 'id', 'QueryRoot', 'Human', 'ID'],892 ['enter', 'IntValue', None, 'QueryRoot', 'Human', 'ID'],893 ['leave', 'IntValue', None, 'QueryRoot', 'Human', 'ID'],894 ['leave', 'Argument', None, 'QueryRoot', 'Human', 'ID'],895 ['enter', 'SelectionSet', None, 'Human', 'Human', None],896 ['enter', 'Field', None, 'Human', 'String', None],897 ['enter', 'Name', 'name', 'Human', 'String', None],898 ['leave', 'Name', 'name', 'Human', 'String', None],899 ['leave', 'Field', None, 'Human', 'String', None],900 ['enter', 'Field', None, 'Human', '[Pet]', None],901 ['enter', 'Name', 'pets', 'Human', '[Pet]', None],902 ['leave', 'Name', 'pets', 'Human', '[Pet]', None],903 ['enter', 'SelectionSet', None, 'Pet', '[Pet]', None],904 ['enter', 'Field', None, 'Pet', 'String!', None],905 ['enter', 'Name', '__typename', 'Pet', 'String!', None],906 ['leave', 'Name', '__typename', 'Pet', 'String!', None],907 ['leave', 'Field', None, 'Pet', 'String!', None],908 ['leave', 'SelectionSet', None, 'Pet', '[Pet]', None],909 ['leave', 'Field', None, 'Human', '[Pet]', None],910 ['leave', 'SelectionSet', None, 'Human', 'Human', None],911 ['leave', 'Field', None, 'QueryRoot', 'Human', None],912 ['enter', 'Field', None, 'QueryRoot', 'Alien', None],913 ['enter', 'Name', 'alien', 'QueryRoot', 'Alien', None],914 ['leave', 'Name', 'alien', 'QueryRoot', 'Alien', None],915 ['enter', 'SelectionSet', None, 'Alien', 'Alien', None],916 ['enter', 'Field', None, 'Alien', 'String!', None],917 ['enter', 'Name', '__typename', 'Alien', 'String!', None],918 ['leave', 'Name', '__typename', 'Alien', 'String!', None],919 ['leave', 'Field', None, 'Alien', 'String!', None],920 ['leave', 'SelectionSet', None, 'Alien', 'Alien', None],921 ['leave', 'Field', None, 'QueryRoot', 'Alien', None],922 ['leave', 'SelectionSet', None, 'QueryRoot', 'QueryRoot', None],923 ['leave', 'OperationDefinition', None, None, 'QueryRoot', None],924 ['leave', 'Document', None, None, None, None]...

Full Screen

Full Screen

operator_definition.py

Source:operator_definition.py Github

copy

Full Screen

1#2# Copyright 2019 Xilinx Inc.3#4# Licensed under the Apache License, Version 2.0 (the "License");5# you may not use this file except in compliance with the License.6# You may obtain a copy of the License at7#8# http://www.apache.org/licenses/LICENSE-2.09#10# Unless required by applicable law or agreed to in writing, software11# distributed under the License is distributed on an "AS IS" BASIS,12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.13# See the License for the specific language governing permissions and14# limitations under the License.15#16from enum import auto, unique17from nndct_shared.base import NNDCT_OP18from nndct_shared.nndct_graph.base_operator import (AutoName, NndctIrAttr,19 OccurenceType, Operation)20from nndct_shared.nndct_graph.base_tensor import Tensor21class Conv2d(Operation):22 @unique23 class AttrName(AutoName):24 KERNEL = auto()25 STRIDE = auto()26 DILATION = auto()27 PAD_MODE = auto()28 PAD = auto()29 GROUP = auto()30 BIAS_TERM = auto()31 IN_DIM = auto()32 OUT_DIM = auto()33 @unique34 class ParamName(AutoName):35 WEIGHTS = auto()36 BIAS = auto()37 def __init__(self, *args, **kwargs) -> None:38 super(Conv2d, self).__init__(*args, **kwargs)39 # allocate memory for attr value40 self._attr_value_mem = {41 self.AttrName.KERNEL: [None, None],42 self.AttrName.STRIDE: [None, None],43 self.AttrName.DILATION: [None, None],44 self.AttrName.PAD_MODE: [None],45 self.AttrName.PAD: [None, None, None, None],46 self.AttrName.GROUP: [None],47 self.AttrName.BIAS_TERM: [None],48 self.AttrName.IN_DIM: [None],49 self.AttrName.OUT_DIM: [None],50 }51 self._attrs[self.AttrName.KERNEL] = NndctIrAttr(52 name=self.AttrName.KERNEL,53 value_type=int,54 size=2,55 value_mem=self._attr_value_mem[self.AttrName.KERNEL],56 occurence_type=OccurenceType.REQUIRED,57 annotation=r"""kernel size, [kernel_w, kernel_h]""")58 self._attrs[self.AttrName.STRIDE] = NndctIrAttr(59 name=self.AttrName.STRIDE,60 value_type=int,61 size=2,62 value_mem=self._attr_value_mem[self.AttrName.STRIDE],63 occurence_type=OccurenceType.REQUIRED,64 annotation=r"""stride [stride_w, stride_h]""")65 self._attrs[self.AttrName.DILATION] = NndctIrAttr(66 name=self.AttrName.DILATION,67 value_type=int,68 size=2,69 value_mem=self._attr_value_mem[self.AttrName.DILATION],70 occurence_type=OccurenceType.OPTIONAL,71 default_value=[1, 1],72 annotation=r"""dilation, [dilation_w, dilation_h]""")73 self._attrs[self.AttrName.PAD_MODE] = NndctIrAttr(74 name=self.AttrName.PAD_MODE,75 value_type=int,76 size=1,77 value_mem=self._attr_value_mem[self.AttrName.PAD_MODE],78 occurence_type=OccurenceType.REQUIRED,79 annotation=r"""padding mode, 0-PADDING, 1-SAME, 2-VALID, 3-CEIL80 for the FUTURE. use attr pad. SAME, make output with same81 width and height as input. VALID, no padding""")82 self._attrs[self.AttrName.PAD] = NndctIrAttr(83 name=self.AttrName.PAD,84 value_type=int,85 size=4,86 value_mem=self._attr_value_mem[self.AttrName.PAD],87 occurence_type=OccurenceType.OPTIONAL,88 default_value=[0, 0, 0, 0],89 annotation=r"""padding size, only effective when pad mode is PADDING, ["90 "left, right, top, bottom],""")91 self._attrs[self.AttrName.GROUP] = NndctIrAttr(92 name=self.AttrName.GROUP,93 value_type=int,94 size=1,95 value_mem=self._attr_value_mem[self.AttrName.GROUP],96 occurence_type=OccurenceType.OPTIONAL,97 default_value=[1],98 annotation=r"""group""")99 self._attrs[self.AttrName.BIAS_TERM] = NndctIrAttr(100 name=self.AttrName.BIAS_TERM,101 value_type=bool,102 size=1,103 value_mem=self._attr_value_mem[self.AttrName.BIAS_TERM],104 occurence_type=OccurenceType.REQUIRED,105 annotation=r"""whether bias exist""")106 self._attrs[self.AttrName.IN_DIM] = NndctIrAttr(107 name=self.AttrName.IN_DIM,108 value_type=int,109 size=1,110 value_mem=self._attr_value_mem[self.AttrName.IN_DIM],111 occurence_type=OccurenceType.REQUIRED,112 annotation=r"""in_channels""")113 self._attrs[self.AttrName.OUT_DIM] = NndctIrAttr(114 name=self.AttrName.OUT_DIM,115 value_type=int,116 size=1,117 value_mem=self._attr_value_mem[self.AttrName.OUT_DIM],118 occurence_type=OccurenceType.REQUIRED,119 annotation=r"""out_channels""")120class BatchNorm(Operation):121 @unique122 class AttrName(AutoName):123 EPSILON = auto()124 SCALE = auto()125 CENTER = auto()126 OUT_DIM = auto()127 AXIS = auto()128 @unique129 class ParamName(AutoName):130 GAMMA = auto()131 BETA = auto()132 MOVING_MEAN = auto()133 MOVING_VAR = auto()134 def __init__(self, *args, **kwargs) -> None:135 super(BatchNorm, self).__init__(*args, **kwargs)136 # allocate memory for attr value137 self._attr_value_mem = {138 self.AttrName.EPSILON: [None],139 self.AttrName.SCALE: [None],140 self.AttrName.CENTER: [None],141 self.AttrName.OUT_DIM: [None],142 self.AttrName.AXIS: [None]143 }144 self._attrs[self.AttrName.EPSILON] = NndctIrAttr(145 name=self.AttrName.EPSILON,146 value_type=float,147 size=1,148 value_mem=self._attr_value_mem[self.AttrName.EPSILON],149 occurence_type=OccurenceType.REQUIRED,150 annotation=r"""epsilon""")151 self._attrs[self.AttrName.SCALE] = NndctIrAttr(152 name=self.AttrName.SCALE,153 value_type=bool,154 size=1,155 value_mem=self._attr_value_mem[self.AttrName.SCALE],156 occurence_type=OccurenceType.REQUIRED,157 annotation=r"""scale""")158 self._attrs[self.AttrName.CENTER] = NndctIrAttr(159 name=self.AttrName.CENTER,160 value_type=bool,161 size=1,162 value_mem=self._attr_value_mem[self.AttrName.CENTER],163 occurence_type=OccurenceType.REQUIRED,164 annotation=r"""center""")165 self._attrs[self.AttrName.OUT_DIM] = NndctIrAttr(166 name=self.AttrName.OUT_DIM,167 value_type=int,168 size=1,169 value_mem=self._attr_value_mem[self.AttrName.OUT_DIM],170 occurence_type=OccurenceType.REQUIRED,171 annotation=r"""num features""")172 self._attrs[self.AttrName.AXIS] = NndctIrAttr(173 name=self.AttrName.AXIS,174 value_type=int,175 size=1,176 value_mem=self._attr_value_mem[self.AttrName.AXIS],177 occurence_type=OccurenceType.REQUIRED,178 annotation=r"""the axis of the input to implement batchnorm""")179class Dense(Operation):180 @unique181 class AttrName(AutoName):182 BIAS_TERM = auto()183 IN_DIM = auto()184 OUT_DIM = auto()185 @unique186 class ParamName(AutoName):187 WEIGHTS = auto()188 BIAS = auto()189 def __init__(self, *args, **kwargs) -> None:190 super(Dense, self).__init__(*args, **kwargs)191 # allocate memory for attr value192 self._attr_value_mem = {193 self.AttrName.BIAS_TERM: [None],194 self.AttrName.IN_DIM: [None],195 self.AttrName.OUT_DIM: [None],196 }197 self._attrs[self.AttrName.BIAS_TERM] = NndctIrAttr(198 name=self.AttrName.BIAS_TERM,199 value_type=bool,200 size=1,201 value_mem=self._attr_value_mem[self.AttrName.BIAS_TERM],202 occurence_type=OccurenceType.REQUIRED,203 annotation=r"""whether bias exist""")204 self._attrs[self.AttrName.IN_DIM] = NndctIrAttr(205 name=self.AttrName.IN_DIM,206 value_type=int,207 size=1,208 value_mem=self._attr_value_mem[self.AttrName.IN_DIM],209 occurence_type=OccurenceType.REQUIRED,210 annotation=r"""in_channels""")211 self._attrs[self.AttrName.OUT_DIM] = NndctIrAttr(212 name=self.AttrName.OUT_DIM,213 value_type=int,214 size=1,215 value_mem=self._attr_value_mem[self.AttrName.OUT_DIM],216 occurence_type=OccurenceType.REQUIRED,217 annotation=r"""out_channels""")218class Concat(Operation):219 @unique220 class AttrName(AutoName):221 AXIS = auto()222 def __init__(self, *args, **kwargs) -> None:223 super(Concat, self).__init__(*args, **kwargs)224 # allocate memory for attr value225 self._attr_value_mem = {226 self.AttrName.AXIS: [None],227 }228 self._attrs[self.AttrName.AXIS] = NndctIrAttr(229 name=self.AttrName.AXIS,230 value_type=int,231 size=1,232 value_mem=self._attr_value_mem[self.AttrName.AXIS],233 occurence_type=OccurenceType.REQUIRED,234 annotation=r"""specified axis""")235class Shape(Operation):236 @unique237 class AttrName(AutoName):238 AXIS = auto()239 def __init__(self, *args, **kwargs) -> None:240 super(Shape, self).__init__(*args, **kwargs)241 # allocate memory for attr value242 self._attr_value_mem = {243 self.AttrName.AXIS: [None],244 }245 self._attrs[self.AttrName.AXIS] = NndctIrAttr(246 name=self.AttrName.AXIS,247 value_type=int,248 size=1,249 value_mem=self._attr_value_mem[self.AttrName.AXIS],250 occurence_type=OccurenceType.REQUIRED,251 annotation=r"""specified axis""")252class Reshape(Operation):253 @unique254 class AttrName(AutoName):255 SHAPE = auto()256 def __init__(self, *args, **kwargs) -> None:257 super(Reshape, self).__init__(*args, **kwargs)258 # allocate memory for attr value259 self._attr_value_mem = {260 self.AttrName.SHAPE: [], # possible any length261 }262 self._attrs[self.AttrName.SHAPE] = NndctIrAttr(263 name=self.AttrName.SHAPE,264 value_type=(int, Tensor),265 size=None,266 value_mem=self._attr_value_mem[self.AttrName.SHAPE],267 occurence_type=OccurenceType.REQUIRED,268 annotation=r"""the target shape""")269class MaxPool(Operation):270 @unique271 class AttrName(AutoName):272 KERNEL = auto()273 STRIDE = auto()274 DILATION = auto()275 PAD_MODE = auto()276 PAD = auto()277 GLOBAL = auto()278 def __init__(self, *args, **kwargs) -> None:279 super(MaxPool, self).__init__(*args, **kwargs)280 # allocate memory for attr value281 self._attr_value_mem = {282 self.AttrName.KERNEL: [None, None],283 self.AttrName.STRIDE: [None, None],284 self.AttrName.PAD_MODE: [None],285 self.AttrName.PAD: [None, None, None, None],286 self.AttrName.GLOBAL: [None],287 }288 self._attrs[self.AttrName.KERNEL] = NndctIrAttr(289 name=self.AttrName.KERNEL,290 value_type=int,291 size=2,292 value_mem=self._attr_value_mem[self.AttrName.KERNEL],293 occurence_type=OccurenceType.REQUIRED,294 annotation=r"""kernel size, [kernel_w, kernel_h]""")295 self._attrs[self.AttrName.STRIDE] = NndctIrAttr(296 name=self.AttrName.STRIDE,297 value_type=int,298 size=2,299 value_mem=self._attr_value_mem[self.AttrName.STRIDE],300 occurence_type=OccurenceType.REQUIRED,301 annotation=r"""stride [stride_w, stride_h]""")302 self._attrs[self.AttrName.PAD_MODE] = NndctIrAttr(303 name=self.AttrName.PAD_MODE,304 value_type=int,305 size=1,306 value_mem=self._attr_value_mem[self.AttrName.PAD_MODE],307 occurence_type=OccurenceType.REQUIRED,308 annotation=r"""padding mode, 0-PADDING, 1-SAME, 2-VALID, 3-CEIL309 for the FUTURE. use attr pad. SAME, make output with same310 width and height as input. VALID, no padding""")311 self._attrs[self.AttrName.PAD] = NndctIrAttr(312 name=self.AttrName.PAD,313 value_type=int,314 size=4,315 value_mem=self._attr_value_mem[self.AttrName.PAD],316 occurence_type=OccurenceType.OPTIONAL,317 default_value=[0, 0, 0, 0],318 annotation=r"""padding size, only effective when pad mode is PADDING, ["319 "left, right, top, bottom],""")320 self._attrs[self.AttrName.GLOBAL] = NndctIrAttr(321 name=self.AttrName.GLOBAL,322 value_type=bool,323 size=1,324 value_mem=self._attr_value_mem[self.AttrName.GLOBAL],325 occurence_type=OccurenceType.OPTIONAL,326 default_value=[False],327 annotation=r"""global""")328class AvgPool(Operation):329 @unique330 class AttrName(AutoName):331 KERNEL = auto()332 STRIDE = auto()333 PAD_MODE = auto()334 PAD = auto()335 GLOBAL = auto()336 COUNT_INCLUDE_PAD = auto()337 def __init__(self, *args, **kwargs) -> None:338 super(AvgPool, self).__init__(*args, **kwargs)339 # allocate memory for attr value340 self._attr_value_mem = {341 self.AttrName.KERNEL: [None, None],342 self.AttrName.STRIDE: [None, None],343 self.AttrName.PAD_MODE: [None],344 self.AttrName.PAD: [None, None, None, None],345 self.AttrName.GLOBAL: [None],346 self.AttrName.COUNT_INCLUDE_PAD: [None]347 }348 self._attrs[self.AttrName.KERNEL] = NndctIrAttr(349 name=self.AttrName.KERNEL,350 value_type=int,351 size=2,352 value_mem=self._attr_value_mem[self.AttrName.KERNEL],353 occurence_type=OccurenceType.REQUIRED,354 annotation=r"""kernel size, [kernel_w, kernel_h]""")355 self._attrs[self.AttrName.STRIDE] = NndctIrAttr(356 name=self.AttrName.STRIDE,357 value_type=int,358 size=2,359 value_mem=self._attr_value_mem[self.AttrName.STRIDE],360 occurence_type=OccurenceType.REQUIRED,361 annotation=r"""stride [stride_w, stride_h]""")362 self._attrs[self.AttrName.PAD_MODE] = NndctIrAttr(363 name=self.AttrName.PAD_MODE,364 value_type=int,365 size=1,366 value_mem=self._attr_value_mem[self.AttrName.PAD_MODE],367 occurence_type=OccurenceType.REQUIRED,368 annotation=r"""padding mode, 0-PADDING, 1-SAME, 2-VALID, 3-CEIL369 for the FUTURE. use attr pad. SAME, make output with same370 width and height as input. VALID, no padding""")371 self._attrs[self.AttrName.PAD] = NndctIrAttr(372 name=self.AttrName.PAD,373 value_type=int,374 size=4,375 value_mem=self._attr_value_mem[self.AttrName.PAD],376 occurence_type=OccurenceType.OPTIONAL,377 default_value=[0, 0, 0, 0],378 annotation=r"""padding size, only effective when pad mode is PADDING, ["379 "left, right, top, bottom],""")380 self._attrs[self.AttrName.GLOBAL] = NndctIrAttr(381 name=self.AttrName.GLOBAL,382 value_type=bool,383 size=1,384 value_mem=self._attr_value_mem[self.AttrName.GLOBAL],385 occurence_type=OccurenceType.OPTIONAL,386 default_value=[False],387 annotation=r"""global""")388 self._attrs[self.AttrName.COUNT_INCLUDE_PAD] = NndctIrAttr(389 name=self.AttrName.COUNT_INCLUDE_PAD,390 value_type=bool,391 size=1,392 value_mem=self._attr_value_mem[self.AttrName.COUNT_INCLUDE_PAD],393 occurence_type=OccurenceType.OPTIONAL,394 default_value=[True],395 annotation=r"""when True, will include the zero-padding in the averaging calculation""")396class Flatten(Operation):397 @unique398 class AttrName(AutoName):399 START_DIM = "start_axis"400 END_DIM = "end_axis"401 def __init__(self, *args, **kwargs) -> None:402 super(Flatten, self).__init__(*args, **kwargs)403 # allocate memory for attr value404 self._attr_value_mem = {405 self.AttrName.START_DIM: [None],406 self.AttrName.END_DIM: [None],407 }408 self._attrs[self.AttrName.START_DIM] = NndctIrAttr(409 name=self.AttrName.START_DIM,410 value_type=int,411 size=1,412 value_mem=self._attr_value_mem[self.AttrName.START_DIM],413 occurence_type=OccurenceType.REQUIRED,414 annotation=r"""the first dim to flatten""")415 self._attrs[self.AttrName.END_DIM] = NndctIrAttr(416 name=self.AttrName.END_DIM,417 value_type=int,418 size=1,419 value_mem=self._attr_value_mem[self.AttrName.END_DIM],420 occurence_type=OccurenceType.REQUIRED,421 annotation=r"""the last dim to flatten""")422# including mean, max, min etc.423class PermuteInvariantOp(Operation):424 @unique425 class AttrName(AutoName):426 DIMS = "axis"427 KEEP_DIMS = auto()428 def __init__(self, *args, **kwargs) -> None:429 super().__init__(*args, **kwargs)430 # allocate memory for attr value431 self._attr_value_mem = {432 self.AttrName.DIMS: [],433 self.AttrName.KEEP_DIMS: [None],434 }435 self._attrs[self.AttrName.DIMS] = NndctIrAttr(436 name=self.AttrName.DIMS,437 value_type=list,438 size=None,439 value_mem=self._attr_value_mem[self.AttrName.DIMS],440 occurence_type=OccurenceType.REQUIRED,441 annotation=r"""The dimensions to reduce. List of integers""")442 self._attrs[self.AttrName.KEEP_DIMS] = NndctIrAttr(443 name=self.AttrName.KEEP_DIMS,444 value_type=bool,445 size=1,446 value_mem=self._attr_value_mem[self.AttrName.KEEP_DIMS],447 occurence_type=OccurenceType.REQUIRED,448 annotation=r"""specify whether the reduced dimension is kept or not.""")449class Permute(Operation):450 @unique451 class AttrName(AutoName):452 ORDER = auto()453 def __init__(self, *args, **kwargs) -> None:454 super(Permute, self).__init__(*args, **kwargs)455 # allocate memory for attr value456 self._attr_value_mem = {457 self.AttrName.ORDER: [],458 }459 self._attrs[self.AttrName.ORDER] = NndctIrAttr(460 name=self.AttrName.ORDER,461 value_type=(int, Tensor),462 size=None,463 value_mem=self._attr_value_mem[self.AttrName.ORDER],464 occurence_type=OccurenceType.REQUIRED,465 annotation=r"""The dimensions to reduce. List of integers""")466class Softmax(Operation):467 @unique468 class AttrName(AutoName):469 AXIS = auto()470 def __init__(self) -> None:471 super(Softmax, self).__init__(NNDCT_OP.SOFTMAX)472 # allocate memory for attr value473 self._attr_value_mem = {474 self.AttrName.AXIS: [None],475 }476 self._attrs[self.AttrName.AXIS] = NndctIrAttr(477 name=self.AttrName.AXIS,478 value_type=int,479 size=1,480 value_mem=self._attr_value_mem[self.AttrName.AXIS],481 occurence_type=OccurenceType.REQUIRED,482 annotation=r"""the dimension softmax would be performed on. default483 is the last dimension.""")484class Lstm(Operation):485 @unique486 class AttrName(AutoName):487 INPUT_SIZE = auto()488 HIDDEN_SIZE = auto()489 BIDIRECTIONAL = auto()490 NUM_LAYERS = auto()491 BATCH_FIRST = auto()492 @unique493 class ParamName(AutoName):494 WEIGHT_IH = auto()495 WEIGHT_HH = auto()496 WEIGHT_IH_REVERSE = auto()497 WEIGHT_HH_REVERSE = auto()498 BIAS = auto()499 BIAS_REVERSE = auto()500 def __init__(self, *args, **kwargs) -> None:501 super(Lstm, self).__init__(*args, **kwargs)502 # allocate memory for attr value503 self._attr_value_mem = {504 self.AttrName.INPUT_SIZE: [None],505 self.AttrName.HIDDEN_SIZE: [None],506 self.AttrName.BIDIRECTIONAL: [None],507 self.AttrName.NUM_LAYERS: [None],508 self.AttrName.BATCH_FIRST: [None],509 }510 self._attrs[self.AttrName.INPUT_SIZE] = NndctIrAttr(511 name=self.AttrName.INPUT_SIZE,512 value_type=int,513 size=1,514 value_mem=self._attr_value_mem[self.AttrName.INPUT_SIZE],515 occurence_type=OccurenceType.REQUIRED,516 annotation=r"""input size of LSTM.""")517 self._attrs[self.AttrName.HIDDEN_SIZE] = NndctIrAttr(518 name=self.AttrName.HIDDEN_SIZE,519 value_type=int,520 size=1,521 value_mem=self._attr_value_mem[self.AttrName.HIDDEN_SIZE],522 occurence_type=OccurenceType.REQUIRED,523 annotation=r"""hidden size of LSTM.""")524 self._attrs[self.AttrName.BIDIRECTIONAL] = NndctIrAttr(525 name=self.AttrName.BIDIRECTIONAL,526 value_type=bool,527 size=1,528 value_mem=self._attr_value_mem[self.AttrName.BIDIRECTIONAL],529 occurence_type=OccurenceType.REQUIRED,530 annotation=r""" If True, means a bidirectional LSTM.""")531 self._attrs[self.AttrName.NUM_LAYERS] = NndctIrAttr(532 name=self.AttrName.NUM_LAYERS,533 value_type=int,534 size=1,535 value_mem=self._attr_value_mem[self.AttrName.NUM_LAYERS],536 occurence_type=OccurenceType.REQUIRED,537 annotation=r"""Number of recurrent layers""")538 self._attrs[self.AttrName.BATCH_FIRST] = NndctIrAttr(539 name=self.AttrName.BATCH_FIRST,540 value_type=bool,541 size=1,542 value_mem=self._attr_value_mem[self.AttrName.BATCH_FIRST],543 occurence_type=OccurenceType.REQUIRED,544 annotation=r""" If True, then the input and output tensors are provided as (batch, seq, feature)"""545 )546class Gru(Operation):547 @unique548 class AttrName(AutoName):549 INPUT_SIZE = auto()550 HIDDEN_SIZE = auto()551 BIDIRECTIONAL = auto()552 NUM_LAYERS = auto()553 BATCH_FIRST = auto()554 @unique555 class ParamName(AutoName):556 WEIGHT_IH = auto()557 WEIGHT_HH = auto()558 WEIGHT_IH_REVERSE = auto()559 WEIGHT_HH_REVERSE = auto()560 BIAS_IH = auto()561 BIAS_HH = auto()562 BIAS_IH_REVERSE = auto()563 BIAS_HH_REVERSE = auto()564 def __init__(self, *args, **kwargs) -> None:565 super(Gru, self).__init__(*args, **kwargs)566 # allocate memory for attr value567 self._attr_value_mem = {568 self.AttrName.INPUT_SIZE: [None],569 self.AttrName.HIDDEN_SIZE: [None],570 self.AttrName.BIDIRECTIONAL: [None],571 self.AttrName.NUM_LAYERS: [None],572 self.AttrName.BATCH_FIRST: [None],573 }574 self._attrs[self.AttrName.INPUT_SIZE] = NndctIrAttr(575 name=self.AttrName.INPUT_SIZE,576 value_type=int,577 size=1,578 value_mem=self._attr_value_mem[self.AttrName.INPUT_SIZE],579 occurence_type=OccurenceType.REQUIRED,580 annotation=r"""input size of GRU.""")581 self._attrs[self.AttrName.HIDDEN_SIZE] = NndctIrAttr(582 name=self.AttrName.HIDDEN_SIZE,583 value_type=int,584 size=1,585 value_mem=self._attr_value_mem[self.AttrName.HIDDEN_SIZE],586 occurence_type=OccurenceType.REQUIRED,587 annotation=r"""hidden size of GRU.""")588 self._attrs[self.AttrName.BIDIRECTIONAL] = NndctIrAttr(589 name=self.AttrName.BIDIRECTIONAL,590 value_type=bool,591 size=1,592 value_mem=self._attr_value_mem[self.AttrName.BIDIRECTIONAL],593 occurence_type=OccurenceType.REQUIRED,594 annotation=r""" If True, means a bidirectional GRU.""")595 self._attrs[self.AttrName.NUM_LAYERS] = NndctIrAttr(596 name=self.AttrName.NUM_LAYERS,597 value_type=int,598 size=1,599 value_mem=self._attr_value_mem[self.AttrName.NUM_LAYERS],600 occurence_type=OccurenceType.REQUIRED,601 annotation=r"""Number of recurrent layers""")602 self._attrs[self.AttrName.BATCH_FIRST] = NndctIrAttr(603 name=self.AttrName.BATCH_FIRST,604 value_type=bool,605 size=1,606 value_mem=self._attr_value_mem[self.AttrName.BATCH_FIRST],607 occurence_type=OccurenceType.REQUIRED,608 annotation=r""" If True, then the input and output tensors are provided as (batch, seq, feature)"""609 )610class StridedSlice(Operation):611 @unique612 class AttrName(AutoName):613 BEGIN = auto()614 END = auto()615 STRIDES = auto()616 BEGIN_MASK = auto()617 END_MASK = auto()618 ELLIPSIS_MASK = auto()619 NEW_AXIS_MASK = auto()620 SHRINK_AXIS_MASK = auto()621 def __init__(self) -> None:622 super(StridedSlice, self).__init__(NNDCT_OP.STRIDED_SLICE)623 # allocate memory for attr value624 self._attr_value_mem = {625 self.AttrName.BEGIN: [],626 self.AttrName.END: [],627 self.AttrName.STRIDES: [],628 self.AttrName.BEGIN_MASK: [None],629 self.AttrName.END_MASK: [None],630 self.AttrName.ELLIPSIS_MASK: [None],631 self.AttrName.NEW_AXIS_MASK: [None],632 self.AttrName.SHRINK_AXIS_MASK: [None]633 }634 self._attrs[self.AttrName.BEGIN] = NndctIrAttr(635 name=self.AttrName.BEGIN,636 value_type=int,637 size=None,638 value_mem=self._attr_value_mem[self.AttrName.BEGIN],639 occurence_type=OccurenceType.REQUIRED,640 annotation=r"""start location of slicing (included)""")641 self._attrs[self.AttrName.END] = NndctIrAttr(642 name=self.AttrName.END,643 value_type=int,644 size=None,645 value_mem=self._attr_value_mem[self.AttrName.END],646 occurence_type=OccurenceType.REQUIRED,647 annotation=r"""end location of slicing (excluded)""")648 self._attrs[self.AttrName.STRIDES] = NndctIrAttr(649 name=self.AttrName.STRIDES,650 value_type=int,651 size=None,652 value_mem=self._attr_value_mem[self.AttrName.STRIDES],653 occurence_type=OccurenceType.REQUIRED,654 annotation=r"""strides of slicing""")655 self._attrs[self.AttrName.BEGIN_MASK] = NndctIrAttr(656 name=self.AttrName.BEGIN_MASK,657 value_type=int,658 size=1,659 value_mem=self._attr_value_mem[self.AttrName.BEGIN_MASK],660 default_value=0,661 occurence_type=OccurenceType.OPTIONAL,662 annotation=r"""If the ith bit of begin_mask is set, begin[i] is ignored663 and the fullest possible range in that dimension is used664 instead.""")665 self._attrs[self.AttrName.END_MASK] = NndctIrAttr(666 name=self.AttrName.END_MASK,667 value_type=int,668 size=1,669 value_mem=self._attr_value_mem[self.AttrName.END_MASK],670 default_value=0,671 occurence_type=OccurenceType.OPTIONAL,672 annotation=r"""If the ith bit of end_mask is set, end[i] is ignored and673 the fullest possible range in that dimension is used674 instead, except with the end range.""")675 self._attrs[self.AttrName.ELLIPSIS_MASK] = NndctIrAttr(676 name=self.AttrName.ELLIPSIS_MASK,677 value_type=int,678 size=1,679 value_mem=self._attr_value_mem[self.AttrName.ELLIPSIS_MASK],680 default_value=0,681 occurence_type=OccurenceType.OPTIONAL,682 annotation=r"""If the ith bit of ellipsis_mask is set, as many683 unspecified dimensions as needed will be inserted between684 other dimensions. Only one non-zero bit is allowed in685 ellipsis_mask.""")686 self._attrs[self.AttrName.NEW_AXIS_MASK] = NndctIrAttr(687 name=self.AttrName.NEW_AXIS_MASK,688 value_type=int,689 size=1,690 value_mem=self._attr_value_mem[self.AttrName.NEW_AXIS_MASK],691 default_value=0,692 occurence_type=OccurenceType.OPTIONAL,693 annotation=r"""If the ith bit of new_axis_mask is set, then begin, end,694 and stride are ignored and a new length 1 dimension is695 added at this point in the output tensor.""")696 self._attrs[self.AttrName.SHRINK_AXIS_MASK] = NndctIrAttr(697 name=self.AttrName.SHRINK_AXIS_MASK,698 value_type=int,699 size=1,700 value_mem=self._attr_value_mem[self.AttrName.SHRINK_AXIS_MASK],701 default_value=0,702 occurence_type=OccurenceType.OPTIONAL,703 annotation=r"""If the ith bit of shrink_axis_mask is set, it implies that704 taking on the value at index begin[i]. end[i] and705 strides[i] are ignored in this case.""")706class Sub(Operation):707 @unique708 class AttrName(AutoName):709 INPUT = auto()710 OTHER = auto()711 def __init__(self, *args, **kwargs) -> None:712 super().__init__(*args, **kwargs)713 # allocate memory for attr value714 self._attr_value_mem = {715 self.AttrName.INPUT: [None],716 self.AttrName.OTHER: [None],717 }718 self._attrs[self.AttrName.INPUT] = NndctIrAttr(719 name=self.AttrName.INPUT,720 value_type=(int, float, Tensor),721 size=1,722 value_mem=self._attr_value_mem[self.AttrName.INPUT],723 occurence_type=OccurenceType.REQUIRED,724 annotation=r"""the first input tensor.""")725 self._attrs[self.AttrName.OTHER] = NndctIrAttr(726 name=self.AttrName.OTHER,727 value_type=(int, float, Tensor),728 size=1,729 value_mem=self._attr_value_mem[self.AttrName.OTHER],730 occurence_type=OccurenceType.REQUIRED,731 annotation=r"""the second input tensor.""")732class Pad(Operation):733 @unique734 class AttrName(AutoName):735 PAD_WITH = "paddings"736 MODE = auto()737 CONSTANT_VALUES = auto()738 def __init__(self) -> None:739 super().__init__(NNDCT_OP.PAD)740 # allocate memory for attr value741 self._attr_value_mem = {742 self.AttrName.PAD_WITH: [None, None, None, None, None, None, None, None],743 self.AttrName.MODE: [None],744 self.AttrName.CONSTANT_VALUES: [None, None, None, None, None, None, None, None]745 }746 self._attrs[self.AttrName.PAD_WITH] = NndctIrAttr(747 name=self.AttrName.PAD_WITH,748 value_type=int,749 size=8,750 value_mem=self._attr_value_mem[self.AttrName.PAD_WITH],751 occurence_type=OccurenceType.REQUIRED,752 annotation=r"""0 , 0 , left, right, top, bottom, 0, 0""")753 self._attrs[self.AttrName.MODE] = NndctIrAttr(754 name=self.AttrName.MODE,755 value_type=int,756 size=1,757 value_mem=self._attr_value_mem[self.AttrName.MODE],758 occurence_type=OccurenceType.REQUIRED,759 annotation=r"""The padding mode. 0:'CONSTANT', 1:'REFLECT', 2:'SYMMETRIC']."""760 )761 self._attrs[self.AttrName.CONSTANT_VALUES] = NndctIrAttr(762 name=self.AttrName.CONSTANT_VALUES,763 value_type=float,764 size=8,765 value_mem=self._attr_value_mem[self.AttrName.CONSTANT_VALUES],766 occurence_type=OccurenceType.REQUIRED,767 annotation=r"""the value set into the padded locations""")768class LeakyReLU(Operation):769 @unique770 class AttrName(AutoName):771 ALPHA = auto()772 def __init__(self) -> None:773 super().__init__(NNDCT_OP.LEAKY_RELU)774 # allocate memory for attr value775 self._attr_value_mem = {776 self.AttrName.ALPHA: [None],777 }778 self._attrs[self.AttrName.ALPHA] = NndctIrAttr(779 name=self.AttrName.ALPHA,780 value_type=float,781 size=1,782 value_mem=self._attr_value_mem[self.AttrName.ALPHA],783 occurence_type=OccurenceType.REQUIRED,784 annotation=r"""negative slope""")785class Resize(Operation):786 @unique787 class AttrName(AutoName):788 SIZE = auto()789 SCALE = auto()790 ALIGN_CORNERS = auto()791 HALF_PIXEL_CENTERS = auto()792 MODE = auto()793 def __init__(self) -> None:794 super().__init__(NNDCT_OP.RESIZE)795 # allocate memory for attr value796 self._attr_value_mem = {797 self.AttrName.SIZE: [None, None],798 self.AttrName.SCALE: [None, None],799 self.AttrName.ALIGN_CORNERS: [None],800 self.AttrName.HALF_PIXEL_CENTERS: [None],801 self.AttrName.MODE: [None],802 }803 self._attrs[self.AttrName.SIZE] = NndctIrAttr(804 name=self.AttrName.SIZE,805 value_type=(int, Tensor),806 size=2,807 value_mem=self._attr_value_mem[self.AttrName.SIZE],808 default_value=[0, 0],809 occurence_type=OccurenceType.OPTIONAL,810 annotation=r"""output spatial size, [size_w, size_h]""")811 self._attrs[self.AttrName.SCALE] = NndctIrAttr(812 name=self.AttrName.SCALE,813 value_type=float,814 size=2,815 value_mem=self._attr_value_mem[self.AttrName.SCALE],816 default_value=[1.0, 1.0],817 occurence_type=OccurenceType.OPTIONAL,818 annotation=r"""New size = Origin size * scale. {scale_w, scale_h}.""")819 self._attrs[self.AttrName.ALIGN_CORNERS] = NndctIrAttr(820 name=self.AttrName.ALIGN_CORNERS,821 value_type=bool,822 size=1,823 value_mem=self._attr_value_mem[self.AttrName.ALIGN_CORNERS],824 default_value=False,825 occurence_type=OccurenceType.OPTIONAL,826 annotation=r"""It must be set When mode is 3.If true, the centers of827 the 4 corner pixels of the input and output tensors are828 aligned, preserving the values at the corner pixels.829 Defaults to false.""")830 self._attrs[self.AttrName.HALF_PIXEL_CENTERS] = NndctIrAttr(831 name=self.AttrName.HALF_PIXEL_CENTERS,832 value_type=bool,833 size=1,834 value_mem=self._attr_value_mem[self.AttrName.HALF_PIXEL_CENTERS],835 default_value=False,836 occurence_type=OccurenceType.OPTIONAL,837 annotation=r"""half_pixel_centers is false by default in,838 tf.resize_bilinear() and tf.resize_nearest_neighbor().839 is true by default in tf.upsampling2d(), but the version840 of tf should be > r1.13""")841 self._attrs[self.AttrName.MODE] = NndctIrAttr(842 name=self.AttrName.MODE,843 value_type=int,844 size=1,845 value_mem=self._attr_value_mem[self.AttrName.MODE],846 occurence_type=OccurenceType.REQUIRED,847 annotation=r"""OPENCV-NEAREST -> 0, OPENCV-BILINEAR -> 1,848 Tensorflow-NEAREST -> 2, Tensorflow-BILINEAR -> 3,849 To be improved!""")850class Constant(Operation):851 @unique852 class AttrName(AutoName):853 DATA = auto()854 def __init__(self, nndct_op_type) -> None:855 super().__init__(nndct_op_type)856 # allocate memory for attr value857 self._attr_value_mem = {858 self.AttrName.DATA: [],859 }860 self._attrs[self.AttrName.DATA] = NndctIrAttr(861 name=self.AttrName.DATA,862 value_type=(int, float, list),863 size=None,864 value_mem=self._attr_value_mem[self.AttrName.DATA],865 occurence_type=OccurenceType.REQUIRED,866 annotation=r"""Constant Parameter""")867class Squeeze(Operation):868 @unique869 class AttrName(AutoName):870 DIMS = "axis"871 def __init__(self) -> None:872 super().__init__(NNDCT_OP.SQUEEZE)873 # allocate memory for attr value874 self._attr_value_mem = {875 self.AttrName.DIMS: [],876 }877 self._attrs[self.AttrName.DIMS] = NndctIrAttr(878 name=self.AttrName.DIMS,879 value_type=list,880 size=None,881 value_mem=self._attr_value_mem[self.AttrName.DIMS],882 occurence_type=OccurenceType.REQUIRED,883 annotation=r"""The dimensions to be squeezed. The dimension index " //884 "starts at 0.""")885class EmbeddingBag(Operation):886 @unique887 class ParamName(AutoName):...

Full Screen

Full Screen

category_data.py

Source:category_data.py Github

copy

Full Screen

1#!/usr/bin/env python2# encoding: utf-83row_data = [4 {5 'sub_categorys': [6 {7 'sub_categorys': [8 {9 'code': 'yr',10 'name': '羊肉'11 },12 {13 'code': 'ql',14 'name': '禽类'15 },16 {17 'code': 'zr',18 'name': '猪肉'19 },20 {21 'code': 'nr',22 'name': '牛肉'23 }24 ],25 'code': 'jprl',26 'name': '精品肉类'27 },28 {29 'sub_categorys': [30 {31 'code': 'cb',32 'name': '参鲍'33 },34 {35 'code': 'yu',36 'name': '鱼'37 },38 {39 'code': 'xia',40 'name': '虾'41 },42 {43 'code': 'xb',44 'name': '蟹/贝'45 }46 ],47 'code': 'hxsc',48 'name': '海鲜水产'49 },50 {51 'sub_categorys': [52 {53 'code': 'xhd_xyd',54 'name': '松花蛋/咸鸭蛋'55 },56 {57 'code': 'jd',58 'name': '鸡蛋'59 }60 ],61 'code': 'dzp',62 'name': '蛋制品'63 },64 {65 'sub_categorys': [66 {67 'code': 'sc',68 'name': '生菜'69 },70 {71 'code': 'bc',72 'name': '菠菜'73 },74 {75 'code': 'yj',76 'name': '圆椒'77 },78 {79 'code': 'xlh',80 'name': '西兰花'81 }82 ],83 'code': 'ycl',84 'name': '叶菜类'85 },86 {87 'sub_categorys': [88 ],89 'code': 'gjl',90 'name': '根茎类'91 },92 {93 'sub_categorys': [94 ],95 'code': 'qgl',96 'name': '茄果类'97 },98 {99 'sub_categorys': [100 ],101 'code': 'jgl',102 'name': '菌菇类'103 },104 {105 'sub_categorys': [106 ],107 'code': 'jksx',108 'name': '进口生鲜'109 }110 ],111 'code': 'sxsp',112 'name': '生鲜食品'113 },114 {115 'sub_categorys': [116 {117 'sub_categorys': [118 {119 'code': 'wly',120 'name': '五粮液'121 },122 {123 'code': 'lzlj',124 'name': '泸州老窖'125 },126 {127 'code': 'mt',128 'name': '茅台'129 }130 ],131 'code': 'bk',132 'name': '白酒'133 },134 {135 'sub_categorys': [136 ],137 'code': 'ptj',138 'name': '葡萄酒'139 },140 {141 'sub_categorys': [142 ],143 'code': 'yj',144 'name': '洋酒'145 },146 {147 'sub_categorys': [148 ],149 'code': 'pj',150 'name': '啤酒'151 },152 {153 'sub_categorys': [154 {155 'code': 'qtpp',156 'name': '其他品牌'157 },158 {159 'code': 'hj',160 'name': '黄酒'161 },162 {163 'code': 'ysj',164 'name': '养生酒'165 }166 ],167 'code': 'qtjp',168 'name': '其他酒品'169 },170 {171 'sub_categorys': [172 ],173 'code': 'yls',174 'name': '饮料/水'175 },176 {177 'sub_categorys': [178 {179 'code': 'bld',180 'name': '白兰地'181 },182 {183 'code': 'wsj',184 'name': '威士忌'185 }186 ],187 'code': 'hj',188 'name': '红酒'189 }190 ],191 'code': 'jsyl',192 'name': '酒水饮料'193 },194 {195 'sub_categorys': [196 {197 'sub_categorys': [198 {199 'code': '其他食用油',200 'name': '其他食用油'201 },202 {203 'code': '菜仔油',204 'name': '菜仔油'205 },206 {207 'code': '花生油',208 'name': '花生油'209 },210 {211 'code': '橄榄油',212 'name': '橄榄油'213 },214 {215 'code': '礼盒',216 'name': '礼盒'217 }218 ],219 'code': '食用油',220 'name': '食用油'221 },222 {223 'sub_categorys': [224 {225 'code': '面粉/面条',226 'name': '面粉/面条'227 },228 {229 'code': '大米',230 'name': '大米'231 },232 {233 'code': '意大利面',234 'name': '意大利面'235 }236 ],237 'code': '米面杂粮',238 'name': '米面杂粮'239 },240 {241 'sub_categorys': [242 {243 'code': '调味油/汁',244 'name': '调味油/汁'245 },246 {247 'code': '酱油/醋',248 'name': '酱油/醋'249 }250 ],251 'code': '厨房调料',252 'name': '厨房调料'253 },254 {255 'sub_categorys': [256 ],257 'code': '南北干货',258 'name': '南北干货'259 },260 {261 'sub_categorys': [262 ],263 'code': '方便速食',264 'name': '方便速食'265 },266 {267 'sub_categorys': [268 ],269 'code': '调味品',270 'name': '调味品'271 }272 ],273 'code': '粮油副食',274 'name': '粮油副食'275 },276 {277 'sub_categorys': [278 {279 'sub_categorys': [280 {281 'code': '西红柿',282 'name': '西红柿'283 },284 {285 'code': '韭菜',286 'name': '韭菜'287 },288 {289 'code': '青菜',290 'name': '青菜'291 }292 ],293 'code': '有机蔬菜',294 'name': '有机蔬菜'295 },296 {297 'sub_categorys': [298 {299 'code': '甘蓝',300 'name': '甘蓝'301 },302 {303 'code': '胡萝卜',304 'name': '胡萝卜'305 },306 {307 'code': '黄瓜',308 'name': '黄瓜'309 }310 ],311 'code': '精选蔬菜',312 'name': '精选蔬菜'313 },314 {315 'sub_categorys': [316 {317 'code': '火龙果',318 'name': '火龙果'319 },320 {321 'code': '菠萝蜜',322 'name': '菠萝蜜'323 },324 {325 'code': '奇异果',326 'name': '奇异果'327 }328 ],329 'code': '进口水果',330 'name': '进口水果'331 },332 {333 'sub_categorys': [334 {335 'code': '水果礼盒',336 'name': '水果礼盒'337 },338 {339 'code': '苹果',340 'name': '苹果'341 },342 {343 'code': '雪梨',344 'name': '雪梨'345 }346 ],347 'code': '国产水果',348 'name': '国产水果'349 }350 ],351 'code': '蔬菜水果',352 'name': '蔬菜水果'353 },354 {355 'sub_categorys': [356 {357 'sub_categorys': [358 {359 'code': '果冻',360 'name': '果冻'361 },362 {363 'code': '枣类',364 'name': '枣类'365 },366 {367 'code': '蜜饯',368 'name': '蜜饯'369 },370 {371 'code': '肉类零食',372 'name': '肉类零食'373 },374 {375 'code': '坚果炒货',376 'name': '坚果炒货'377 }378 ],379 'code': '休闲零食',380 'name': '休闲零食'381 },382 {383 'sub_categorys': [384 {385 'code': '创意喜糖',386 'name': '创意喜糖'387 },388 {389 'code': '口香糖',390 'name': '口香糖'391 },392 {393 'code': '软糖',394 'name': '软糖'395 },396 {397 'code': '棒棒糖',398 'name': '棒棒糖'399 }400 ],401 'code': '糖果',402 'name': '糖果'403 },404 {405 'sub_categorys': [406 {407 'code': '夹心巧克力',408 'name': '夹心巧克力'409 },410 {411 'code': '白巧克力',412 'name': '白巧克力'413 },414 {415 'code': '松露巧克力',416 'name': '松露巧克力'417 },418 {419 'code': '黑巧克力',420 'name': '黑巧克力'421 }422 ],423 'code': '巧克力',424 'name': '巧克力'425 },426 {427 'sub_categorys': [428 {429 'code': '牛肉干',430 'name': '牛肉干'431 },432 {433 'code': '猪肉脯',434 'name': '猪肉脯'435 },436 {437 'code': '牛肉粒',438 'name': '牛肉粒'439 },440 {441 'code': '猪肉干',442 'name': '猪肉干'443 }444 ],445 'code': '肉干肉脯/豆干',446 'name': '肉干肉脯/豆干'447 },448 {449 'sub_categorys': [450 {451 'code': '鱿鱼足',452 'name': '鱿鱼足'453 },454 {455 'code': '鱿鱼丝',456 'name': '鱿鱼丝'457 },458 {459 'code': '墨鱼/乌贼',460 'name': '墨鱼/乌贼'461 },462 {463 'code': '鱿鱼仔',464 'name': '鱿鱼仔'465 },466 {467 'code': '鱿鱼片',468 'name': '鱿鱼片'469 }470 ],471 'code': '鱿鱼丝/鱼干',472 'name': '鱿鱼丝/鱼干'473 }474 ],475 'code': '休闲食品',476 'name': '休闲食品'477 },478 {479 'sub_categorys': [480 {481 'sub_categorys': [482 ],483 'code': '进口奶品',484 'name': '进口奶品'485 },486 {487 'sub_categorys': [488 ],489 'code': '国产奶品',490 'name': '国产奶品'491 },492 {493 'sub_categorys': [494 ],495 'code': '奶粉',496 'name': '奶粉'497 },498 {499 'sub_categorys': [500 ],501 'code': '有机奶',502 'name': '有机奶'503 },504 {505 'sub_categorys': [506 ],507 'code': '原料奶',508 'name': '原料奶'509 }510 ],511 'code': '奶类食品',512 'name': '奶类食品'513 },514 {515 'sub_categorys': [516 {517 'sub_categorys': [518 ],519 'code': '菌菇类',520 'name': '菌菇类'521 },522 {523 'sub_categorys': [524 ],525 'code': '腌干海产',526 'name': '腌干海产'527 },528 {529 'sub_categorys': [530 ],531 'code': '汤料',532 'name': '汤料'533 },534 {535 'sub_categorys': [536 ],537 'code': '豆类',538 'name': '豆类'539 },540 {541 'sub_categorys': [542 ],543 'code': '干菜/菜干',544 'name': '干菜/菜干'545 },546 {547 'sub_categorys': [548 ],549 'code': '干果/果干',550 'name': '干果/果干'551 },552 {553 'sub_categorys': [554 ],555 'code': '豆制品',556 'name': '豆制品'557 },558 {559 'sub_categorys': [560 ],561 'code': '腊味',562 'name': '腊味'563 }564 ],565 'code': '天然干货',566 'name': '天然干货'567 },568 {569 'sub_categorys': [570 {571 'sub_categorys': [572 ],573 'code': '白茶',574 'name': '白茶'575 },576 {577 'sub_categorys': [578 ],579 'code': '红茶',580 'name': '红茶'581 },582 {583 'sub_categorys': [584 ],585 'code': '绿茶',586 'name': '绿茶'587 }588 ],589 'code': '精选茗茶',590 'name': '精选茗茶'591 }...

Full Screen

Full Screen

chainInfo.py

Source:chainInfo.py Github

copy

Full Screen

1import os2import json3BSC_ABI_GENERIC = json.load(open(os.getcwd() + "/data/ABI_generic.json"))4PANCAKESWAP_ROUTER_CONTRACT_ADDRESS = "0x10ED43C718714eb63d5aA57B78B54704E256024E"5PANCAKESWAP_FACTORY_V2_ADDRESS = "0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73"...

Full Screen

Full Screen

test_srcml_filters.py

Source:test_srcml_filters.py Github

copy

Full Screen

...93 ("<if><condition>(<expr><name></name><operator></operator></expr>)</condition></if>", False),94 ("<if><condition>(<expr><operator></operator><name></name></expr>)</condition></if><block><test>aa</test></block>",95 True),96 ("<if><condition>(<operator></operator><name></name>)</condition></if>", False)])97def test_contain_operator_name(xml, result):98 s = SrcmlFilters(xml, True)99 res = s.contain_operator_name()100 if res == result:101 assert True102 return103 assert False104@pytest.mark.parametrize("xml, result", [105 ("<if><condition>(<expr><name></name></expr>)</condition></if>", True),106 ("<if><condition>(<expr><name>variable</name></expr>)</condition></if>", True),107 ("<if><condition>(<expr><name></name></expr>)</condition></if><block><test>aa</test></block>", True),108 ("<if><condition>(<expr><name></name><name></name></expr>)</condition></if>", False),109 ("<if><conditions>(<expr><name></name></expr>)</conditions></if>", False),110 ("<if><condition>(<expr><name></name><operator></operator><operator></operator><name></name></expr>)</condition></if>", False)])111def test_contain_name(xml, result):112 s = SrcmlFilters(xml, True)113 res = s.contain_name()114 if res == result:115 assert True116 return117 assert False118@pytest.mark.parametrize("xml, result", [119 ("<if><condition>(<expr><name></name><operator></operator><literal></literal></expr>)</condition></if>", True),120 (121 "<if><condition>(<expr><name>test</name><operator></operator><literal>10</literal></expr>)</condition></if><block><test>aa</test></block>",122 True),123 ("<if><condition>(<expr><literal></literal><operator></operator><name>ciao</name></expr>)</condition></if>", True),124 ("<if><condition>(<expr><literal></name><operator></operator><name></literal></expr>)</condition></if>", False),125 ("<if><condition>(<expr><name></name><operator></operator><name></name></expr>)</condition></if>", False)])126def test_contain_operator_name_literal(xml, result):127 s = SrcmlFilters(xml, True)128 res = s.contain_operator_name_literal()129 if res == result:130 assert True131 return132 assert False133@pytest.mark.parametrize("xml, result", [134 ("<if><condition>(<expr><name></name><operator></operator><name></name></expr>)</condition></if>", True),135 (136 "<if><condition>(<expr><name>value</name><operator>==</operator><name>value2</name></expr>)</condition></if><block><test>aa</test></block>",137 True),138 ("<if><condition>(<expr><literal></literal><operator></operator><name></name></expr>)</condition></if>", False),139 ("<if><condition>(<expr><name></name><operator></operator><name></name></expr><expr></expr>)</condition></if>",140 False),141 ("<if><condition>(<expr><name></name><operator></operator><name2></name2></expr>)</condition></if>", False)])142def test_contain_operator_name_name(xml, result):143 s = SrcmlFilters(xml, True)144 res = s.contain_operator_name_name()145 if res == result:146 assert True147 return148 assert False149@pytest.mark.parametrize("xml, result", [150 (151 "<if><condition>(<expr><operator></operator><call><name><name></name><operator>.</operator><name>equal</name></name><argument_list>(<argument><expr><name></name></expr></argument>)</argument_list></call><operator></operator><literal></literal></expr>)</condition></if>",152 True),153 (154 "<if><condition>(<expr><call><name><name></name><operator>.</operator><name>equal</name></name><argument_list>(<argument><expr><name></name></expr></argument>)</argument_list></call><operator></operator><name></name></expr>)</condition></if>",155 True),156 (157 "<if><condition>(<expr><call><name><name></name><operator>.</operator><name>equals</name></name><argument_list>(<argument><expr><name></name></expr></argument>)</argument_list></call><operator></operator><name></name></expr>)</condition></if>",158 False),...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1import { renderHook, act } from '@testing-library/react-hooks'2import useCounter from './useCounter'3test('should increment counter', () => {4 const { result } = renderHook(() => useCounter())5 act(() => {6 result.current.increment()7 })8 expect(result.current.count).toBe(1)9})10import { useState } from 'react'11const useCounter = () => {12 const [count, setCount] = useState(0)13 const increment = () => setCount(count + 1)14 return { count, increment }15}16import { renderHook, act } from '@testing-library/react-hooks'17import useCounter from './useCounter'18test('should increment counter', () => {19 const { result } = renderHook(() => useCounter())20 act(() => {21 result.current.increment()22 })23 expect(result.current.count).toBe(1)24})25import { useState } from 'react'26const useCounter = () => {27 const [count, setCount] = useState(0)28 const increment = () => setCount(count + 1)29 return { count, increment }30}31import { renderHook, act } from '@testing-library/react-hooks'32import useCounter from './useCounter'33test('should increment counter', () => {34 const { result } = renderHook(() => useCounter())35 act(() => {36 result.current.increment()37 })38 expect(result.current.count).toBe(1)39})40import { useState } from 'react'41const useCounter = () => {42 const [count, setCount] = useState(0)43 const increment = () => setCount(count + 1)44 return { count, increment }45}46import { renderHook, act } from '@testing-library/react-hooks'47import useCounter from './useCounter'48test('should increment counter', () => {49 const { result } = renderHook(() => useCounter())50 act(() => {51 result.current.increment()52 })53 expect(result.current.count).toBe(1)54})55import { useState } from 'react'56const useCounter = () => {

Full Screen

Using AI Code Generation

copy

Full Screen

1import { renderHook } from '@testing-library/react-hooks';2import { useCounter } from './useCounter';3test('useCounter', () => {4 const { result } = renderHook(() => useCounter());5 expect(result.current.count).toBe(0);6 act(() => {7 result.current.increment();8 });9 expect(result.current.count).toBe(1);10});11import { useState } from 'react';12export function useCounter() {13 const [count, setCount] = useState(0);14 const increment = () => setCount(count + 1);15 return { count, increment };16}17import { renderHook, act } from '@testing-library/react-hooks';18import { useCounter } from './useCounter';19test('useCounter', () => {20 const { result } = renderHook(() => useCounter());21 expect(result.current.count).toBe(0);22 act(() => {23 result.current.increment();24 });25 expect(result.current.count).toBe(1);26});27import { useState } from 'react';28export function useCounter() {29 const [count, setCount] = useState(0);30 const increment = () => setCount(count + 1);31 return { count, increment };32}33import { renderHook, act } from '@testing-library/react-hooks';34import { useCounter } from './useCounter';35test('useCounter', () => {36 const { result } = renderHook(() => useCounter());37 expect(result.current.count).toBe(0);38 act(() => {39 result.current.increment();40 });41 expect(result.current.count).toBe(1);42});43import { useState } from 'react';44export function useCounter() {45 const [count, setCount] = useState(0);46 const increment = () => setCount(count + 1);47 return { count, increment };48}49import { renderHook, act } from '@testing-library/react-hooks';50import { useCounter } from './useCounter';51test('useCounter', () => {52 const { result } = renderHook(() => useCounter());53 expect(result.current.count).toBe(0);54 act(() => {55 result.current.increment();56 });57 expect(result.current.count).toBe(1);58});

Full Screen

Using AI Code Generation

copy

Full Screen

1import { renderHook } from '@testing-library/react-hooks';2import { useCounter } from './useCounter';3test('useCounter', () => {4 const { result } = renderHook(() => useCounter());5 expect(result.current.count).toBe(0);6 expect(typeof result.current.increment).toBe('function');7});8import { useState } from 'react';9export const useCounter = () => {10 const [count, setCount] = useState(0);11 const increment = () => {12 setCount(count + 1);13 };14 return { count, increment };15};

Full Screen

Using AI Code Generation

copy

Full Screen

1import { renderHook } from '@testing-library/react-hooks'2import { useCounter } from './useCounter'3test('useCounter', () => {4 const { result } = renderHook(() => useCounter())5 expect(result.current.count).toBe(0)6 act(() => {7 result.current.increment()8 })9 expect(result.current.count).toBe(1)10})11import { useState } from 'react'12export function useCounter() {13 const [count, setCount] = useState(0)14 const increment = () => setCount(count + 1)15 return { count, increment }16}

Full Screen

Using AI Code Generation

copy

Full Screen

1import { renderHook, act } from '@testing-library/react-hooks';2import useCounter from './useCounter';3describe('useCounter', () => {4 it('should increment', () => {5 const { result } = renderHook(useCounter);6 act(() => {7 result.current.increment();8 });9 expect(result.current.count).toBe(1);10 });11});12import { useState } from 'react';13const useCounter = () => {14 const [count, setCount] = useState(0);15 const increment = () => setCount(count + 1);16 return { count, increment };17};18export default useCounter;19import { renderHook, act } from '@testing-library/react-hooks';20import useCounter from './useCounter';21describe('useCounter', () => {22 it('should increment', () => {23 const { result } = renderHook(useCounter);24 act(() => {25 result.current.increment();26 });27 expect(result.current.count).toBe(1);28 });29});30import { useState } from 'react';31const useCounter = () => {32 const [count, setCount] = useState(0);33 const increment = () => setCount(count + 1);34 return { count, increment };35};36export default useCounter;37import { renderHook, act } from '@testing-library/react-hooks';38import useCounter from './useCounter';39describe('useCounter', () => {40 it('should increment', () => {41 const { result } = renderHook(useCounter);42 act(() => {43 result.current.increment();44 });45 expect(result.current.count).toBe(1);46 });47});48import { useState } from 'react';49const useCounter = () => {50 const [count, setCount] = useState(0);51 const increment = () => setCount(count + 1);52 return { count, increment };53};54export default useCounter;

Full Screen

Using AI Code Generation

copy

Full Screen

1import { renderHook, act } from '@testing-library/react-hooks';2import useCounter from './useCounter.js';3describe('useCounter', () => {4 it('should increment counter', () => {5 const { result } = renderHook(() => useCounter());6 act(() => {7 result.current.increment();8 });9 expect(result.current.count).toBe(1);10 });11});12import { useState } from 'react';13const useCounter = () => {14 const [count, setCount] = useState(0);15 const increment = () => {16 setCount(count + 1);17 };18 return {19 };20};21export default useCounter;22{23 "dependencies": {24 },25 "scripts": {26 },27 "eslintConfig": {28 },29 "browserslist": {30 }31}32module.exports = {33};34import React from 'react';35import ReactDOM from 'react-dom';36import App from './App';37import './index.css';38ReactDOM.render(<App />, document.getElementById('root'));

Full Screen

Using AI Code Generation

copy

Full Screen

1import { renderHook } from '@testing-library/react-hooks';2import { useName } from './name';3describe('useName', () => {4 it('should return a name', () => {5 const { result } = renderHook(() => useName());6 expect(result.current).toBe('John');7 });8});9export const useName = () => {10 return 'John';11};12{13 "scripts": {14 },15 "devDependencies": {16 }17}18import { renderHook } from '@testing-library/react-hooks';19import { useName } from './name';20describe('useName', () => {21 it('should return a name', () => {22 const { result } = renderHook(() => useName());23 expect(result.current).toBe('John');24 });25});26export const useName = () => {27 return 'John';28};29{30 "scripts": {31 },32 "devDependencies": {33 }34}35import { renderHook } from '@testing-library/react-hooks';36import { useName } from './name';37describe('useName', () => {38 it('should return a name', () => {39 const { result } = renderHook(() => useName());40 expect(result.current).toBe('John');41 });42});43export const useName = () => {44 return 'John';45};46{47 "scripts": {48 },49 "devDependencies": {50 }51}52import { renderHook } from '@testing-library/react-hooks';53import

Full Screen

Using AI Code Generation

copy

Full Screen

1import { renderHook } from '@testing-library/react-hooks';2import useCounter from './useCounter';3test('should increment counter', () => {4 const { result } = renderHook(() => useCounter());5 expect(result.current.count).toBe(0);6 act(() => {7 result.current.increment();8 });9 expect(result.current.count).toBe(1);10});11export default function useCounter() {12 const [count, setCount] = useState(0);13 const increment = () => setCount(count + 1);14 return { count, increment };15}16import React from 'react';17import useCounter from './useCounter';18function App() {19 const { count, increment } = useCounter();20 return (21 <h1>{count}</h1>22 <button onClick={increment}>Increment</button>23 );24}25export default App;26import React from 'react';27import ReactDOM from 'react-dom';28import App from './App';29ReactDOM.render(<App />, document.getElementById('root'));

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run testing-library-react-hooks automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful