diff --git a/grammar/BaseModelica.g4 b/grammar/BaseModelica.g4 index 22cf07e..88edb95 100644 --- a/grammar/BaseModelica.g4 +++ b/grammar/BaseModelica.g4 @@ -310,7 +310,7 @@ primary | STRING | 'false' | 'true' - | ('der' | 'initial' | 'pure') functionCallArgs + | ('der' | 'initial' | 'pure' | 'Clock') functionCallArgs | componentReference functionCallArgs? | '(' outputExpressionList ')' arraySubscripts? | '[' expressionList (';' expressionList)* ']' diff --git a/src/antlr_generated/BaseModelica.interp b/src/antlr_generated/BaseModelica.interp index bc08343..09a9303 100644 --- a/src/antlr_generated/BaseModelica.interp +++ b/src/antlr_generated/BaseModelica.interp @@ -249,4 +249,4 @@ annotationComment atn: -[4, 1, 80, 1059, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 167, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 173, 8, 0, 1, 0, 1, 0, 1, 0, 5, 0, 178, 8, 0, 10, 0, 12, 0, 181, 9, 0, 1, 0, 3, 0, 184, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 192, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 3, 3, 205, 8, 3, 1, 3, 1, 3, 1, 3, 3, 3, 210, 8, 3, 1, 3, 3, 3, 213, 8, 3, 1, 3, 3, 3, 216, 8, 3, 1, 3, 3, 3, 219, 8, 3, 1, 4, 1, 4, 1, 4, 3, 4, 224, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 3, 6, 235, 8, 6, 1, 6, 1, 6, 3, 6, 239, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 244, 8, 6, 1, 6, 3, 6, 247, 8, 6, 1, 6, 3, 6, 250, 8, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 263, 8, 7, 10, 7, 12, 7, 266, 9, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 5, 9, 276, 8, 9, 10, 9, 12, 9, 279, 9, 9, 1, 10, 1, 10, 1, 10, 1, 11, 3, 11, 285, 8, 11, 1, 11, 1, 11, 1, 11, 5, 11, 290, 8, 11, 10, 11, 12, 11, 293, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 299, 8, 11, 10, 11, 12, 11, 302, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 309, 8, 11, 10, 11, 12, 11, 312, 9, 11, 1, 11, 3, 11, 315, 8, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 321, 8, 11, 10, 11, 12, 11, 324, 9, 11, 5, 11, 326, 8, 11, 10, 11, 12, 11, 329, 9, 11, 1, 11, 3, 11, 332, 8, 11, 1, 11, 1, 11, 3, 11, 336, 8, 11, 1, 11, 3, 11, 339, 8, 11, 1, 11, 3, 11, 342, 8, 11, 1, 11, 3, 11, 345, 8, 11, 1, 11, 5, 11, 348, 8, 11, 10, 11, 12, 11, 351, 9, 11, 1, 11, 1, 11, 1, 11, 3, 11, 356, 8, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 3, 13, 363, 8, 13, 1, 13, 1, 13, 1, 13, 3, 13, 368, 8, 13, 1, 13, 1, 13, 1, 14, 1, 14, 3, 14, 374, 8, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 384, 8, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 398, 8, 18, 1, 18, 1, 18, 1, 18, 5, 18, 403, 8, 18, 10, 18, 12, 18, 406, 9, 18, 1, 18, 5, 18, 409, 8, 18, 10, 18, 12, 18, 412, 9, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 422, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 428, 8, 19, 10, 19, 12, 19, 431, 9, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 437, 8, 19, 10, 19, 12, 19, 440, 9, 19, 5, 19, 442, 8, 19, 10, 19, 12, 19, 445, 9, 19, 1, 20, 3, 20, 448, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 3, 22, 463, 8, 22, 1, 22, 1, 22, 1, 22, 1, 23, 3, 23, 469, 8, 23, 1, 23, 3, 23, 472, 8, 23, 1, 24, 1, 24, 1, 24, 5, 24, 477, 8, 24, 10, 24, 12, 24, 480, 9, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 3, 26, 487, 8, 26, 1, 26, 3, 26, 490, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 495, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 501, 8, 27, 1, 28, 1, 28, 3, 28, 505, 8, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 5, 29, 512, 8, 29, 10, 29, 12, 29, 515, 9, 29, 1, 30, 3, 30, 518, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 3, 32, 526, 8, 32, 1, 32, 1, 32, 1, 33, 3, 33, 531, 8, 33, 1, 33, 1, 33, 3, 33, 535, 8, 33, 1, 33, 1, 33, 3, 33, 539, 8, 33, 1, 33, 1, 33, 1, 33, 3, 33, 544, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 3, 34, 550, 8, 34, 1, 35, 3, 35, 553, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 559, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 574, 8, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 584, 8, 36, 10, 36, 12, 36, 587, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 595, 8, 36, 10, 36, 12, 36, 598, 9, 36, 5, 36, 600, 8, 36, 10, 36, 12, 36, 603, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 609, 8, 36, 10, 36, 12, 36, 612, 9, 36, 3, 36, 614, 8, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 625, 8, 37, 10, 37, 12, 37, 628, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 636, 8, 37, 10, 37, 12, 37, 639, 9, 37, 5, 37, 641, 8, 37, 10, 37, 12, 37, 644, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 650, 8, 37, 10, 37, 12, 37, 653, 9, 37, 3, 37, 655, 8, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 666, 8, 38, 10, 38, 12, 38, 669, 9, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 680, 8, 39, 10, 39, 12, 39, 683, 9, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 5, 41, 698, 8, 41, 10, 41, 12, 41, 701, 9, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 712, 8, 42, 10, 42, 12, 42, 715, 9, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 723, 8, 42, 10, 42, 12, 42, 726, 9, 42, 5, 42, 728, 8, 42, 10, 42, 12, 42, 731, 9, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 742, 8, 43, 10, 43, 12, 43, 745, 9, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 753, 8, 43, 10, 43, 12, 43, 756, 9, 43, 5, 43, 758, 8, 43, 10, 43, 12, 43, 761, 9, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 3, 48, 787, 8, 48, 1, 49, 1, 49, 3, 49, 791, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 802, 8, 50, 10, 50, 12, 50, 805, 9, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 815, 8, 51, 3, 51, 817, 8, 51, 1, 52, 1, 52, 1, 52, 5, 52, 822, 8, 52, 10, 52, 12, 52, 825, 9, 52, 1, 53, 1, 53, 1, 53, 5, 53, 830, 8, 53, 10, 53, 12, 53, 833, 9, 53, 1, 54, 3, 54, 836, 8, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 844, 8, 55, 1, 56, 1, 56, 1, 57, 3, 57, 849, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 855, 8, 57, 10, 57, 12, 57, 858, 9, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 866, 8, 59, 10, 59, 12, 59, 869, 9, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 3, 61, 876, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 886, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 892, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 898, 8, 62, 10, 62, 12, 62, 901, 9, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 910, 8, 62, 1, 63, 3, 63, 913, 8, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 5, 64, 920, 8, 64, 10, 64, 12, 64, 923, 9, 64, 1, 65, 3, 65, 926, 8, 65, 1, 65, 1, 65, 3, 65, 930, 8, 65, 1, 65, 1, 65, 1, 65, 3, 65, 935, 8, 65, 5, 65, 937, 8, 65, 10, 65, 12, 65, 940, 9, 65, 1, 66, 1, 66, 3, 66, 944, 8, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 953, 8, 67, 1, 67, 1, 67, 1, 67, 3, 67, 958, 8, 67, 1, 67, 3, 67, 961, 8, 67, 1, 68, 1, 68, 1, 68, 3, 68, 966, 8, 68, 1, 68, 3, 68, 969, 8, 68, 1, 69, 1, 69, 1, 69, 5, 69, 974, 8, 69, 10, 69, 12, 69, 977, 9, 69, 1, 69, 1, 69, 3, 69, 981, 8, 69, 1, 70, 1, 70, 1, 70, 5, 70, 986, 8, 70, 10, 70, 12, 70, 989, 9, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 3, 72, 997, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1003, 8, 73, 1, 73, 1, 73, 1, 74, 3, 74, 1008, 8, 74, 1, 74, 1, 74, 3, 74, 1012, 8, 74, 5, 74, 1014, 8, 74, 10, 74, 12, 74, 1017, 9, 74, 1, 75, 1, 75, 1, 75, 5, 75, 1022, 8, 75, 10, 75, 12, 75, 1025, 9, 75, 1, 76, 1, 76, 1, 76, 1, 76, 5, 76, 1031, 8, 76, 10, 76, 12, 76, 1034, 9, 76, 1, 76, 1, 76, 1, 77, 1, 77, 3, 77, 1040, 8, 77, 1, 78, 1, 78, 3, 78, 1044, 8, 78, 1, 79, 1, 79, 1, 79, 5, 79, 1049, 8, 79, 10, 79, 12, 79, 1052, 9, 79, 3, 79, 1054, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 0, 0, 81, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 0, 7, 1, 0, 19, 20, 3, 0, 9, 9, 25, 25, 30, 30, 1, 0, 49, 54, 1, 0, 55, 58, 1, 0, 59, 62, 1, 0, 63, 64, 3, 0, 8, 8, 17, 17, 22, 22, 1129, 0, 162, 1, 0, 0, 0, 2, 197, 1, 0, 0, 0, 4, 199, 1, 0, 0, 0, 6, 218, 1, 0, 0, 0, 8, 223, 1, 0, 0, 0, 10, 225, 1, 0, 0, 0, 12, 231, 1, 0, 0, 0, 14, 253, 1, 0, 0, 0, 16, 270, 1, 0, 0, 0, 18, 272, 1, 0, 0, 0, 20, 280, 1, 0, 0, 0, 22, 291, 1, 0, 0, 0, 24, 357, 1, 0, 0, 0, 26, 362, 1, 0, 0, 0, 28, 373, 1, 0, 0, 0, 30, 375, 1, 0, 0, 0, 32, 377, 1, 0, 0, 0, 34, 387, 1, 0, 0, 0, 36, 392, 1, 0, 0, 0, 38, 413, 1, 0, 0, 0, 40, 447, 1, 0, 0, 0, 42, 455, 1, 0, 0, 0, 44, 459, 1, 0, 0, 0, 46, 468, 1, 0, 0, 0, 48, 473, 1, 0, 0, 0, 50, 481, 1, 0, 0, 0, 52, 484, 1, 0, 0, 0, 54, 500, 1, 0, 0, 0, 56, 502, 1, 0, 0, 0, 58, 508, 1, 0, 0, 0, 60, 517, 1, 0, 0, 0, 62, 521, 1, 0, 0, 0, 64, 523, 1, 0, 0, 0, 66, 530, 1, 0, 0, 0, 68, 549, 1, 0, 0, 0, 70, 552, 1, 0, 0, 0, 72, 577, 1, 0, 0, 0, 74, 618, 1, 0, 0, 0, 76, 659, 1, 0, 0, 0, 78, 673, 1, 0, 0, 0, 80, 687, 1, 0, 0, 0, 82, 691, 1, 0, 0, 0, 84, 705, 1, 0, 0, 0, 86, 735, 1, 0, 0, 0, 88, 765, 1, 0, 0, 0, 90, 772, 1, 0, 0, 0, 92, 779, 1, 0, 0, 0, 94, 781, 1, 0, 0, 0, 96, 784, 1, 0, 0, 0, 98, 790, 1, 0, 0, 0, 100, 792, 1, 0, 0, 0, 102, 809, 1, 0, 0, 0, 104, 818, 1, 0, 0, 0, 106, 826, 1, 0, 0, 0, 108, 835, 1, 0, 0, 0, 110, 839, 1, 0, 0, 0, 112, 845, 1, 0, 0, 0, 114, 848, 1, 0, 0, 0, 116, 859, 1, 0, 0, 0, 118, 861, 1, 0, 0, 0, 120, 870, 1, 0, 0, 0, 122, 872, 1, 0, 0, 0, 124, 909, 1, 0, 0, 0, 126, 912, 1, 0, 0, 0, 128, 916, 1, 0, 0, 0, 130, 925, 1, 0, 0, 0, 132, 941, 1, 0, 0, 0, 134, 960, 1, 0, 0, 0, 136, 968, 1, 0, 0, 0, 138, 970, 1, 0, 0, 0, 140, 982, 1, 0, 0, 0, 142, 990, 1, 0, 0, 0, 144, 996, 1, 0, 0, 0, 146, 998, 1, 0, 0, 0, 148, 1007, 1, 0, 0, 0, 150, 1018, 1, 0, 0, 0, 152, 1026, 1, 0, 0, 0, 154, 1039, 1, 0, 0, 0, 156, 1041, 1, 0, 0, 0, 158, 1053, 1, 0, 0, 0, 160, 1055, 1, 0, 0, 0, 162, 163, 3, 2, 1, 0, 163, 164, 5, 1, 0, 0, 164, 179, 5, 74, 0, 0, 165, 167, 3, 94, 47, 0, 166, 165, 1, 0, 0, 0, 166, 167, 1, 0, 0, 0, 167, 168, 1, 0, 0, 0, 168, 169, 3, 4, 2, 0, 169, 170, 5, 2, 0, 0, 170, 178, 1, 0, 0, 0, 171, 173, 3, 94, 47, 0, 172, 171, 1, 0, 0, 0, 172, 173, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 174, 175, 3, 44, 22, 0, 175, 176, 5, 2, 0, 0, 176, 178, 1, 0, 0, 0, 177, 166, 1, 0, 0, 0, 177, 172, 1, 0, 0, 0, 178, 181, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 183, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 182, 184, 3, 94, 47, 0, 183, 182, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 186, 5, 3, 0, 0, 186, 187, 3, 10, 5, 0, 187, 191, 5, 2, 0, 0, 188, 189, 3, 160, 80, 0, 189, 190, 5, 2, 0, 0, 190, 192, 1, 0, 0, 0, 191, 188, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 193, 1, 0, 0, 0, 193, 194, 5, 4, 0, 0, 194, 195, 5, 74, 0, 0, 195, 196, 5, 2, 0, 0, 196, 1, 1, 0, 0, 0, 197, 198, 5, 73, 0, 0, 198, 3, 1, 0, 0, 0, 199, 200, 3, 6, 3, 0, 200, 201, 3, 8, 4, 0, 201, 5, 1, 0, 0, 0, 202, 219, 5, 5, 0, 0, 203, 205, 5, 6, 0, 0, 204, 203, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 219, 5, 7, 0, 0, 207, 209, 5, 8, 0, 0, 208, 210, 5, 9, 0, 0, 209, 208, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 213, 1, 0, 0, 0, 211, 213, 5, 10, 0, 0, 212, 207, 1, 0, 0, 0, 212, 211, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 215, 1, 0, 0, 0, 214, 216, 5, 6, 0, 0, 215, 214, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 219, 5, 11, 0, 0, 218, 202, 1, 0, 0, 0, 218, 204, 1, 0, 0, 0, 218, 212, 1, 0, 0, 0, 219, 7, 1, 0, 0, 0, 220, 224, 3, 10, 5, 0, 221, 224, 3, 12, 6, 0, 222, 224, 3, 14, 7, 0, 223, 220, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 9, 1, 0, 0, 0, 225, 226, 5, 74, 0, 0, 226, 227, 3, 158, 79, 0, 227, 228, 3, 22, 11, 0, 228, 229, 5, 4, 0, 0, 229, 230, 5, 74, 0, 0, 230, 11, 1, 0, 0, 0, 231, 232, 5, 74, 0, 0, 232, 249, 5, 12, 0, 0, 233, 235, 3, 16, 8, 0, 234, 233, 1, 0, 0, 0, 234, 235, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 238, 3, 126, 63, 0, 237, 239, 3, 56, 28, 0, 238, 237, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 250, 1, 0, 0, 0, 240, 241, 5, 13, 0, 0, 241, 246, 5, 14, 0, 0, 242, 244, 3, 18, 9, 0, 243, 242, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 247, 1, 0, 0, 0, 245, 247, 5, 15, 0, 0, 246, 243, 1, 0, 0, 0, 246, 245, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 250, 5, 16, 0, 0, 249, 234, 1, 0, 0, 0, 249, 240, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 252, 3, 156, 78, 0, 252, 13, 1, 0, 0, 0, 253, 254, 5, 74, 0, 0, 254, 255, 5, 12, 0, 0, 255, 256, 5, 17, 0, 0, 256, 257, 5, 14, 0, 0, 257, 258, 3, 126, 63, 0, 258, 259, 5, 18, 0, 0, 259, 264, 5, 74, 0, 0, 260, 261, 5, 18, 0, 0, 261, 263, 5, 74, 0, 0, 262, 260, 1, 0, 0, 0, 263, 266, 1, 0, 0, 0, 264, 262, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 267, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 267, 268, 5, 16, 0, 0, 268, 269, 3, 156, 78, 0, 269, 15, 1, 0, 0, 0, 270, 271, 7, 0, 0, 0, 271, 17, 1, 0, 0, 0, 272, 277, 3, 20, 10, 0, 273, 274, 5, 18, 0, 0, 274, 276, 3, 20, 10, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 19, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 281, 5, 74, 0, 0, 281, 282, 3, 156, 78, 0, 282, 21, 1, 0, 0, 0, 283, 285, 3, 94, 47, 0, 284, 283, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 287, 3, 28, 14, 0, 287, 288, 5, 2, 0, 0, 288, 290, 1, 0, 0, 0, 289, 284, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 327, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 300, 5, 21, 0, 0, 295, 296, 3, 66, 33, 0, 296, 297, 5, 2, 0, 0, 297, 299, 1, 0, 0, 0, 298, 295, 1, 0, 0, 0, 299, 302, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 326, 1, 0, 0, 0, 302, 300, 1, 0, 0, 0, 303, 304, 5, 22, 0, 0, 304, 310, 5, 21, 0, 0, 305, 306, 3, 68, 34, 0, 306, 307, 5, 2, 0, 0, 307, 309, 1, 0, 0, 0, 308, 305, 1, 0, 0, 0, 309, 312, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 326, 1, 0, 0, 0, 312, 310, 1, 0, 0, 0, 313, 315, 5, 22, 0, 0, 314, 313, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 322, 5, 23, 0, 0, 317, 318, 3, 70, 35, 0, 318, 319, 5, 2, 0, 0, 319, 321, 1, 0, 0, 0, 320, 317, 1, 0, 0, 0, 321, 324, 1, 0, 0, 0, 322, 320, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 325, 294, 1, 0, 0, 0, 325, 303, 1, 0, 0, 0, 325, 314, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 344, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 332, 3, 94, 47, 0, 331, 330, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 335, 5, 24, 0, 0, 334, 336, 3, 24, 12, 0, 335, 334, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 338, 1, 0, 0, 0, 337, 339, 3, 26, 13, 0, 338, 337, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 341, 1, 0, 0, 0, 340, 342, 3, 160, 80, 0, 341, 340, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 345, 5, 2, 0, 0, 344, 331, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 349, 1, 0, 0, 0, 346, 348, 3, 36, 18, 0, 347, 346, 1, 0, 0, 0, 348, 351, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 355, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 352, 353, 3, 160, 80, 0, 353, 354, 5, 2, 0, 0, 354, 356, 1, 0, 0, 0, 355, 352, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 23, 1, 0, 0, 0, 357, 358, 5, 77, 0, 0, 358, 25, 1, 0, 0, 0, 359, 360, 3, 130, 65, 0, 360, 361, 5, 12, 0, 0, 361, 363, 1, 0, 0, 0, 362, 359, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 365, 5, 74, 0, 0, 365, 367, 5, 14, 0, 0, 366, 368, 3, 150, 75, 0, 367, 366, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 370, 5, 16, 0, 0, 370, 27, 1, 0, 0, 0, 371, 374, 3, 30, 15, 0, 372, 374, 3, 32, 16, 0, 373, 371, 1, 0, 0, 0, 373, 372, 1, 0, 0, 0, 374, 29, 1, 0, 0, 0, 375, 376, 3, 42, 21, 0, 376, 31, 1, 0, 0, 0, 377, 378, 5, 25, 0, 0, 378, 379, 5, 21, 0, 0, 379, 380, 3, 34, 17, 0, 380, 383, 5, 12, 0, 0, 381, 384, 3, 96, 48, 0, 382, 384, 3, 90, 45, 0, 383, 381, 1, 0, 0, 0, 383, 382, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 386, 3, 156, 78, 0, 386, 33, 1, 0, 0, 0, 387, 388, 5, 26, 0, 0, 388, 389, 5, 14, 0, 0, 389, 390, 3, 130, 65, 0, 390, 391, 5, 16, 0, 0, 391, 35, 1, 0, 0, 0, 392, 393, 5, 27, 0, 0, 393, 397, 3, 158, 79, 0, 394, 395, 3, 160, 80, 0, 395, 396, 5, 2, 0, 0, 396, 398, 1, 0, 0, 0, 397, 394, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 404, 1, 0, 0, 0, 399, 400, 3, 40, 20, 0, 400, 401, 5, 2, 0, 0, 401, 403, 1, 0, 0, 0, 402, 399, 1, 0, 0, 0, 403, 406, 1, 0, 0, 0, 404, 402, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 410, 1, 0, 0, 0, 406, 404, 1, 0, 0, 0, 407, 409, 3, 38, 19, 0, 408, 407, 1, 0, 0, 0, 409, 412, 1, 0, 0, 0, 410, 408, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 37, 1, 0, 0, 0, 412, 410, 1, 0, 0, 0, 413, 414, 5, 28, 0, 0, 414, 415, 5, 14, 0, 0, 415, 416, 3, 58, 29, 0, 416, 417, 5, 16, 0, 0, 417, 421, 3, 158, 79, 0, 418, 419, 3, 160, 80, 0, 419, 420, 5, 2, 0, 0, 420, 422, 1, 0, 0, 0, 421, 418, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 443, 1, 0, 0, 0, 423, 429, 5, 21, 0, 0, 424, 425, 3, 66, 33, 0, 425, 426, 5, 2, 0, 0, 426, 428, 1, 0, 0, 0, 427, 424, 1, 0, 0, 0, 428, 431, 1, 0, 0, 0, 429, 427, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 442, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 432, 438, 5, 23, 0, 0, 433, 434, 3, 70, 35, 0, 434, 435, 5, 2, 0, 0, 435, 437, 1, 0, 0, 0, 436, 433, 1, 0, 0, 0, 437, 440, 1, 0, 0, 0, 438, 436, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 442, 1, 0, 0, 0, 440, 438, 1, 0, 0, 0, 441, 423, 1, 0, 0, 0, 441, 432, 1, 0, 0, 0, 442, 445, 1, 0, 0, 0, 443, 441, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 39, 1, 0, 0, 0, 445, 443, 1, 0, 0, 0, 446, 448, 3, 94, 47, 0, 447, 446, 1, 0, 0, 0, 447, 448, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 5, 29, 0, 0, 450, 451, 5, 74, 0, 0, 451, 452, 5, 12, 0, 0, 452, 453, 3, 96, 48, 0, 453, 454, 3, 156, 78, 0, 454, 41, 1, 0, 0, 0, 455, 456, 3, 46, 23, 0, 456, 457, 3, 126, 63, 0, 457, 458, 3, 48, 24, 0, 458, 43, 1, 0, 0, 0, 459, 460, 5, 9, 0, 0, 460, 462, 3, 126, 63, 0, 461, 463, 3, 152, 76, 0, 462, 461, 1, 0, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 465, 3, 52, 26, 0, 465, 466, 3, 156, 78, 0, 466, 45, 1, 0, 0, 0, 467, 469, 7, 1, 0, 0, 468, 467, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 471, 1, 0, 0, 0, 470, 472, 7, 0, 0, 0, 471, 470, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 47, 1, 0, 0, 0, 473, 478, 3, 50, 25, 0, 474, 475, 5, 18, 0, 0, 475, 477, 3, 50, 25, 0, 476, 474, 1, 0, 0, 0, 477, 480, 1, 0, 0, 0, 478, 476, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 49, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 481, 482, 3, 52, 26, 0, 482, 483, 3, 156, 78, 0, 483, 51, 1, 0, 0, 0, 484, 486, 5, 74, 0, 0, 485, 487, 3, 152, 76, 0, 486, 485, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 489, 1, 0, 0, 0, 488, 490, 3, 54, 27, 0, 489, 488, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 53, 1, 0, 0, 0, 491, 494, 3, 56, 28, 0, 492, 493, 5, 12, 0, 0, 493, 495, 3, 96, 48, 0, 494, 492, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 501, 1, 0, 0, 0, 496, 497, 5, 12, 0, 0, 497, 501, 3, 96, 48, 0, 498, 499, 5, 31, 0, 0, 499, 501, 3, 96, 48, 0, 500, 491, 1, 0, 0, 0, 500, 496, 1, 0, 0, 0, 500, 498, 1, 0, 0, 0, 501, 55, 1, 0, 0, 0, 502, 504, 5, 14, 0, 0, 503, 505, 3, 58, 29, 0, 504, 503, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 5, 16, 0, 0, 507, 57, 1, 0, 0, 0, 508, 513, 3, 60, 30, 0, 509, 510, 5, 18, 0, 0, 510, 512, 3, 60, 30, 0, 511, 509, 1, 0, 0, 0, 512, 515, 1, 0, 0, 0, 513, 511, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 514, 59, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 518, 3, 94, 47, 0, 517, 516, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 3, 62, 31, 0, 520, 61, 1, 0, 0, 0, 521, 522, 3, 64, 32, 0, 522, 63, 1, 0, 0, 0, 523, 525, 3, 128, 64, 0, 524, 526, 3, 54, 27, 0, 525, 524, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 527, 1, 0, 0, 0, 527, 528, 3, 158, 79, 0, 528, 65, 1, 0, 0, 0, 529, 531, 3, 94, 47, 0, 530, 529, 1, 0, 0, 0, 530, 531, 1, 0, 0, 0, 531, 543, 1, 0, 0, 0, 532, 534, 3, 102, 51, 0, 533, 535, 3, 94, 47, 0, 534, 533, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 538, 1, 0, 0, 0, 536, 537, 5, 12, 0, 0, 537, 539, 3, 96, 48, 0, 538, 536, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 544, 1, 0, 0, 0, 540, 544, 3, 72, 36, 0, 541, 544, 3, 76, 38, 0, 542, 544, 3, 84, 42, 0, 543, 532, 1, 0, 0, 0, 543, 540, 1, 0, 0, 0, 543, 541, 1, 0, 0, 0, 543, 542, 1, 0, 0, 0, 544, 545, 1, 0, 0, 0, 545, 546, 3, 156, 78, 0, 546, 67, 1, 0, 0, 0, 547, 550, 3, 66, 33, 0, 548, 550, 3, 88, 44, 0, 549, 547, 1, 0, 0, 0, 549, 548, 1, 0, 0, 0, 550, 69, 1, 0, 0, 0, 551, 553, 3, 94, 47, 0, 552, 551, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 573, 1, 0, 0, 0, 554, 558, 3, 130, 65, 0, 555, 556, 5, 31, 0, 0, 556, 559, 3, 96, 48, 0, 557, 559, 3, 132, 66, 0, 558, 555, 1, 0, 0, 0, 558, 557, 1, 0, 0, 0, 559, 574, 1, 0, 0, 0, 560, 561, 5, 14, 0, 0, 561, 562, 3, 148, 74, 0, 562, 563, 5, 16, 0, 0, 563, 564, 5, 31, 0, 0, 564, 565, 3, 130, 65, 0, 565, 566, 3, 132, 66, 0, 566, 574, 1, 0, 0, 0, 567, 574, 5, 32, 0, 0, 568, 574, 5, 33, 0, 0, 569, 574, 3, 74, 37, 0, 570, 574, 3, 78, 39, 0, 571, 574, 3, 82, 41, 0, 572, 574, 3, 86, 43, 0, 573, 554, 1, 0, 0, 0, 573, 560, 1, 0, 0, 0, 573, 567, 1, 0, 0, 0, 573, 568, 1, 0, 0, 0, 573, 569, 1, 0, 0, 0, 573, 570, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 573, 572, 1, 0, 0, 0, 574, 575, 1, 0, 0, 0, 575, 576, 3, 156, 78, 0, 576, 71, 1, 0, 0, 0, 577, 578, 5, 34, 0, 0, 578, 579, 3, 96, 48, 0, 579, 585, 5, 35, 0, 0, 580, 581, 3, 66, 33, 0, 581, 582, 5, 2, 0, 0, 582, 584, 1, 0, 0, 0, 583, 580, 1, 0, 0, 0, 584, 587, 1, 0, 0, 0, 585, 583, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 601, 1, 0, 0, 0, 587, 585, 1, 0, 0, 0, 588, 589, 5, 36, 0, 0, 589, 590, 3, 96, 48, 0, 590, 596, 5, 35, 0, 0, 591, 592, 3, 66, 33, 0, 592, 593, 5, 2, 0, 0, 593, 595, 1, 0, 0, 0, 594, 591, 1, 0, 0, 0, 595, 598, 1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 600, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 599, 588, 1, 0, 0, 0, 600, 603, 1, 0, 0, 0, 601, 599, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 613, 1, 0, 0, 0, 603, 601, 1, 0, 0, 0, 604, 610, 5, 37, 0, 0, 605, 606, 3, 66, 33, 0, 606, 607, 5, 2, 0, 0, 607, 609, 1, 0, 0, 0, 608, 605, 1, 0, 0, 0, 609, 612, 1, 0, 0, 0, 610, 608, 1, 0, 0, 0, 610, 611, 1, 0, 0, 0, 611, 614, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 613, 604, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 5, 4, 0, 0, 616, 617, 5, 34, 0, 0, 617, 73, 1, 0, 0, 0, 618, 619, 5, 34, 0, 0, 619, 620, 3, 96, 48, 0, 620, 626, 5, 35, 0, 0, 621, 622, 3, 70, 35, 0, 622, 623, 5, 2, 0, 0, 623, 625, 1, 0, 0, 0, 624, 621, 1, 0, 0, 0, 625, 628, 1, 0, 0, 0, 626, 624, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 642, 1, 0, 0, 0, 628, 626, 1, 0, 0, 0, 629, 630, 5, 36, 0, 0, 630, 631, 3, 96, 48, 0, 631, 637, 5, 35, 0, 0, 632, 633, 3, 70, 35, 0, 633, 634, 5, 2, 0, 0, 634, 636, 1, 0, 0, 0, 635, 632, 1, 0, 0, 0, 636, 639, 1, 0, 0, 0, 637, 635, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 641, 1, 0, 0, 0, 639, 637, 1, 0, 0, 0, 640, 629, 1, 0, 0, 0, 641, 644, 1, 0, 0, 0, 642, 640, 1, 0, 0, 0, 642, 643, 1, 0, 0, 0, 643, 654, 1, 0, 0, 0, 644, 642, 1, 0, 0, 0, 645, 651, 5, 37, 0, 0, 646, 647, 3, 70, 35, 0, 647, 648, 5, 2, 0, 0, 648, 650, 1, 0, 0, 0, 649, 646, 1, 0, 0, 0, 650, 653, 1, 0, 0, 0, 651, 649, 1, 0, 0, 0, 651, 652, 1, 0, 0, 0, 652, 655, 1, 0, 0, 0, 653, 651, 1, 0, 0, 0, 654, 645, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 657, 5, 4, 0, 0, 657, 658, 5, 34, 0, 0, 658, 75, 1, 0, 0, 0, 659, 660, 5, 38, 0, 0, 660, 661, 3, 80, 40, 0, 661, 667, 5, 39, 0, 0, 662, 663, 3, 66, 33, 0, 663, 664, 5, 2, 0, 0, 664, 666, 1, 0, 0, 0, 665, 662, 1, 0, 0, 0, 666, 669, 1, 0, 0, 0, 667, 665, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 670, 1, 0, 0, 0, 669, 667, 1, 0, 0, 0, 670, 671, 5, 4, 0, 0, 671, 672, 5, 38, 0, 0, 672, 77, 1, 0, 0, 0, 673, 674, 5, 38, 0, 0, 674, 675, 3, 80, 40, 0, 675, 681, 5, 39, 0, 0, 676, 677, 3, 70, 35, 0, 677, 678, 5, 2, 0, 0, 678, 680, 1, 0, 0, 0, 679, 676, 1, 0, 0, 0, 680, 683, 1, 0, 0, 0, 681, 679, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 684, 1, 0, 0, 0, 683, 681, 1, 0, 0, 0, 684, 685, 5, 4, 0, 0, 685, 686, 5, 38, 0, 0, 686, 79, 1, 0, 0, 0, 687, 688, 5, 74, 0, 0, 688, 689, 5, 40, 0, 0, 689, 690, 3, 96, 48, 0, 690, 81, 1, 0, 0, 0, 691, 692, 5, 41, 0, 0, 692, 693, 3, 96, 48, 0, 693, 699, 5, 39, 0, 0, 694, 695, 3, 70, 35, 0, 695, 696, 5, 2, 0, 0, 696, 698, 1, 0, 0, 0, 697, 694, 1, 0, 0, 0, 698, 701, 1, 0, 0, 0, 699, 697, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 702, 1, 0, 0, 0, 701, 699, 1, 0, 0, 0, 702, 703, 5, 4, 0, 0, 703, 704, 5, 41, 0, 0, 704, 83, 1, 0, 0, 0, 705, 706, 5, 42, 0, 0, 706, 707, 3, 96, 48, 0, 707, 713, 5, 35, 0, 0, 708, 709, 3, 66, 33, 0, 709, 710, 5, 2, 0, 0, 710, 712, 1, 0, 0, 0, 711, 708, 1, 0, 0, 0, 712, 715, 1, 0, 0, 0, 713, 711, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 729, 1, 0, 0, 0, 715, 713, 1, 0, 0, 0, 716, 717, 5, 43, 0, 0, 717, 718, 3, 96, 48, 0, 718, 724, 5, 35, 0, 0, 719, 720, 3, 66, 33, 0, 720, 721, 5, 2, 0, 0, 721, 723, 1, 0, 0, 0, 722, 719, 1, 0, 0, 0, 723, 726, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 727, 716, 1, 0, 0, 0, 728, 731, 1, 0, 0, 0, 729, 727, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 732, 1, 0, 0, 0, 731, 729, 1, 0, 0, 0, 732, 733, 5, 4, 0, 0, 733, 734, 5, 42, 0, 0, 734, 85, 1, 0, 0, 0, 735, 736, 5, 42, 0, 0, 736, 737, 3, 96, 48, 0, 737, 743, 5, 35, 0, 0, 738, 739, 3, 70, 35, 0, 739, 740, 5, 2, 0, 0, 740, 742, 1, 0, 0, 0, 741, 738, 1, 0, 0, 0, 742, 745, 1, 0, 0, 0, 743, 741, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 759, 1, 0, 0, 0, 745, 743, 1, 0, 0, 0, 746, 747, 5, 43, 0, 0, 747, 748, 3, 96, 48, 0, 748, 754, 5, 35, 0, 0, 749, 750, 3, 70, 35, 0, 750, 751, 5, 2, 0, 0, 751, 753, 1, 0, 0, 0, 752, 749, 1, 0, 0, 0, 753, 756, 1, 0, 0, 0, 754, 752, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 758, 1, 0, 0, 0, 756, 754, 1, 0, 0, 0, 757, 746, 1, 0, 0, 0, 758, 761, 1, 0, 0, 0, 759, 757, 1, 0, 0, 0, 759, 760, 1, 0, 0, 0, 760, 762, 1, 0, 0, 0, 761, 759, 1, 0, 0, 0, 762, 763, 5, 4, 0, 0, 763, 764, 5, 42, 0, 0, 764, 87, 1, 0, 0, 0, 765, 766, 5, 44, 0, 0, 766, 767, 5, 14, 0, 0, 767, 768, 3, 130, 65, 0, 768, 769, 5, 18, 0, 0, 769, 770, 3, 92, 46, 0, 770, 771, 5, 16, 0, 0, 771, 89, 1, 0, 0, 0, 772, 773, 5, 44, 0, 0, 773, 774, 5, 14, 0, 0, 774, 775, 3, 96, 48, 0, 775, 776, 5, 18, 0, 0, 776, 777, 3, 92, 46, 0, 777, 778, 5, 16, 0, 0, 778, 91, 1, 0, 0, 0, 779, 780, 3, 96, 48, 0, 780, 93, 1, 0, 0, 0, 781, 782, 5, 45, 0, 0, 782, 783, 5, 76, 0, 0, 783, 95, 1, 0, 0, 0, 784, 786, 3, 98, 49, 0, 785, 787, 3, 94, 47, 0, 786, 785, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 97, 1, 0, 0, 0, 788, 791, 3, 102, 51, 0, 789, 791, 3, 100, 50, 0, 790, 788, 1, 0, 0, 0, 790, 789, 1, 0, 0, 0, 791, 99, 1, 0, 0, 0, 792, 793, 5, 34, 0, 0, 793, 794, 3, 98, 49, 0, 794, 795, 5, 35, 0, 0, 795, 803, 3, 98, 49, 0, 796, 797, 5, 36, 0, 0, 797, 798, 3, 98, 49, 0, 798, 799, 5, 35, 0, 0, 799, 800, 3, 98, 49, 0, 800, 802, 1, 0, 0, 0, 801, 796, 1, 0, 0, 0, 802, 805, 1, 0, 0, 0, 803, 801, 1, 0, 0, 0, 803, 804, 1, 0, 0, 0, 804, 806, 1, 0, 0, 0, 805, 803, 1, 0, 0, 0, 806, 807, 5, 37, 0, 0, 807, 808, 3, 98, 49, 0, 808, 101, 1, 0, 0, 0, 809, 816, 3, 104, 52, 0, 810, 811, 5, 15, 0, 0, 811, 814, 3, 104, 52, 0, 812, 813, 5, 15, 0, 0, 813, 815, 3, 104, 52, 0, 814, 812, 1, 0, 0, 0, 814, 815, 1, 0, 0, 0, 815, 817, 1, 0, 0, 0, 816, 810, 1, 0, 0, 0, 816, 817, 1, 0, 0, 0, 817, 103, 1, 0, 0, 0, 818, 823, 3, 106, 53, 0, 819, 820, 5, 46, 0, 0, 820, 822, 3, 106, 53, 0, 821, 819, 1, 0, 0, 0, 822, 825, 1, 0, 0, 0, 823, 821, 1, 0, 0, 0, 823, 824, 1, 0, 0, 0, 824, 105, 1, 0, 0, 0, 825, 823, 1, 0, 0, 0, 826, 831, 3, 108, 54, 0, 827, 828, 5, 47, 0, 0, 828, 830, 3, 108, 54, 0, 829, 827, 1, 0, 0, 0, 830, 833, 1, 0, 0, 0, 831, 829, 1, 0, 0, 0, 831, 832, 1, 0, 0, 0, 832, 107, 1, 0, 0, 0, 833, 831, 1, 0, 0, 0, 834, 836, 5, 48, 0, 0, 835, 834, 1, 0, 0, 0, 835, 836, 1, 0, 0, 0, 836, 837, 1, 0, 0, 0, 837, 838, 3, 110, 55, 0, 838, 109, 1, 0, 0, 0, 839, 843, 3, 114, 57, 0, 840, 841, 3, 112, 56, 0, 841, 842, 3, 114, 57, 0, 842, 844, 1, 0, 0, 0, 843, 840, 1, 0, 0, 0, 843, 844, 1, 0, 0, 0, 844, 111, 1, 0, 0, 0, 845, 846, 7, 2, 0, 0, 846, 113, 1, 0, 0, 0, 847, 849, 3, 116, 58, 0, 848, 847, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 850, 1, 0, 0, 0, 850, 856, 3, 118, 59, 0, 851, 852, 3, 116, 58, 0, 852, 853, 3, 118, 59, 0, 853, 855, 1, 0, 0, 0, 854, 851, 1, 0, 0, 0, 855, 858, 1, 0, 0, 0, 856, 854, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 115, 1, 0, 0, 0, 858, 856, 1, 0, 0, 0, 859, 860, 7, 3, 0, 0, 860, 117, 1, 0, 0, 0, 861, 867, 3, 122, 61, 0, 862, 863, 3, 120, 60, 0, 863, 864, 3, 122, 61, 0, 864, 866, 1, 0, 0, 0, 865, 862, 1, 0, 0, 0, 866, 869, 1, 0, 0, 0, 867, 865, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 119, 1, 0, 0, 0, 869, 867, 1, 0, 0, 0, 870, 871, 7, 4, 0, 0, 871, 121, 1, 0, 0, 0, 872, 875, 3, 124, 62, 0, 873, 874, 7, 5, 0, 0, 874, 876, 3, 124, 62, 0, 875, 873, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 123, 1, 0, 0, 0, 877, 910, 5, 75, 0, 0, 878, 910, 5, 77, 0, 0, 879, 910, 5, 65, 0, 0, 880, 910, 5, 66, 0, 0, 881, 882, 7, 6, 0, 0, 882, 910, 3, 132, 66, 0, 883, 885, 3, 130, 65, 0, 884, 886, 3, 132, 66, 0, 885, 884, 1, 0, 0, 0, 885, 886, 1, 0, 0, 0, 886, 910, 1, 0, 0, 0, 887, 888, 5, 14, 0, 0, 888, 889, 3, 148, 74, 0, 889, 891, 5, 16, 0, 0, 890, 892, 3, 152, 76, 0, 891, 890, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 910, 1, 0, 0, 0, 893, 894, 5, 67, 0, 0, 894, 899, 3, 150, 75, 0, 895, 896, 5, 2, 0, 0, 896, 898, 3, 150, 75, 0, 897, 895, 1, 0, 0, 0, 898, 901, 1, 0, 0, 0, 899, 897, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 902, 1, 0, 0, 0, 901, 899, 1, 0, 0, 0, 902, 903, 5, 68, 0, 0, 903, 910, 1, 0, 0, 0, 904, 905, 5, 69, 0, 0, 905, 906, 3, 138, 69, 0, 906, 907, 5, 70, 0, 0, 907, 910, 1, 0, 0, 0, 908, 910, 5, 4, 0, 0, 909, 877, 1, 0, 0, 0, 909, 878, 1, 0, 0, 0, 909, 879, 1, 0, 0, 0, 909, 880, 1, 0, 0, 0, 909, 881, 1, 0, 0, 0, 909, 883, 1, 0, 0, 0, 909, 887, 1, 0, 0, 0, 909, 893, 1, 0, 0, 0, 909, 904, 1, 0, 0, 0, 909, 908, 1, 0, 0, 0, 910, 125, 1, 0, 0, 0, 911, 913, 5, 71, 0, 0, 912, 911, 1, 0, 0, 0, 912, 913, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 915, 3, 128, 64, 0, 915, 127, 1, 0, 0, 0, 916, 921, 5, 74, 0, 0, 917, 918, 5, 71, 0, 0, 918, 920, 5, 74, 0, 0, 919, 917, 1, 0, 0, 0, 920, 923, 1, 0, 0, 0, 921, 919, 1, 0, 0, 0, 921, 922, 1, 0, 0, 0, 922, 129, 1, 0, 0, 0, 923, 921, 1, 0, 0, 0, 924, 926, 5, 71, 0, 0, 925, 924, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 929, 5, 74, 0, 0, 928, 930, 3, 152, 76, 0, 929, 928, 1, 0, 0, 0, 929, 930, 1, 0, 0, 0, 930, 938, 1, 0, 0, 0, 931, 932, 5, 71, 0, 0, 932, 934, 5, 74, 0, 0, 933, 935, 3, 152, 76, 0, 934, 933, 1, 0, 0, 0, 934, 935, 1, 0, 0, 0, 935, 937, 1, 0, 0, 0, 936, 931, 1, 0, 0, 0, 937, 940, 1, 0, 0, 0, 938, 936, 1, 0, 0, 0, 938, 939, 1, 0, 0, 0, 939, 131, 1, 0, 0, 0, 940, 938, 1, 0, 0, 0, 941, 943, 5, 14, 0, 0, 942, 944, 3, 134, 67, 0, 943, 942, 1, 0, 0, 0, 943, 944, 1, 0, 0, 0, 944, 945, 1, 0, 0, 0, 945, 946, 5, 16, 0, 0, 946, 133, 1, 0, 0, 0, 947, 952, 3, 96, 48, 0, 948, 949, 5, 18, 0, 0, 949, 953, 3, 136, 68, 0, 950, 951, 5, 38, 0, 0, 951, 953, 3, 80, 40, 0, 952, 948, 1, 0, 0, 0, 952, 950, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 961, 1, 0, 0, 0, 954, 957, 3, 146, 73, 0, 955, 956, 5, 18, 0, 0, 956, 958, 3, 136, 68, 0, 957, 955, 1, 0, 0, 0, 957, 958, 1, 0, 0, 0, 958, 961, 1, 0, 0, 0, 959, 961, 3, 140, 70, 0, 960, 947, 1, 0, 0, 0, 960, 954, 1, 0, 0, 0, 960, 959, 1, 0, 0, 0, 961, 135, 1, 0, 0, 0, 962, 965, 3, 144, 72, 0, 963, 964, 5, 18, 0, 0, 964, 966, 3, 136, 68, 0, 965, 963, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 969, 1, 0, 0, 0, 967, 969, 3, 140, 70, 0, 968, 962, 1, 0, 0, 0, 968, 967, 1, 0, 0, 0, 969, 137, 1, 0, 0, 0, 970, 980, 3, 96, 48, 0, 971, 972, 5, 18, 0, 0, 972, 974, 3, 96, 48, 0, 973, 971, 1, 0, 0, 0, 974, 977, 1, 0, 0, 0, 975, 973, 1, 0, 0, 0, 975, 976, 1, 0, 0, 0, 976, 981, 1, 0, 0, 0, 977, 975, 1, 0, 0, 0, 978, 979, 5, 38, 0, 0, 979, 981, 3, 80, 40, 0, 980, 975, 1, 0, 0, 0, 980, 978, 1, 0, 0, 0, 981, 139, 1, 0, 0, 0, 982, 987, 3, 142, 71, 0, 983, 984, 5, 18, 0, 0, 984, 986, 3, 142, 71, 0, 985, 983, 1, 0, 0, 0, 986, 989, 1, 0, 0, 0, 987, 985, 1, 0, 0, 0, 987, 988, 1, 0, 0, 0, 988, 141, 1, 0, 0, 0, 989, 987, 1, 0, 0, 0, 990, 991, 5, 74, 0, 0, 991, 992, 5, 12, 0, 0, 992, 993, 3, 144, 72, 0, 993, 143, 1, 0, 0, 0, 994, 997, 3, 146, 73, 0, 995, 997, 3, 96, 48, 0, 996, 994, 1, 0, 0, 0, 996, 995, 1, 0, 0, 0, 997, 145, 1, 0, 0, 0, 998, 999, 5, 11, 0, 0, 999, 1000, 3, 126, 63, 0, 1000, 1002, 5, 14, 0, 0, 1001, 1003, 3, 140, 70, 0, 1002, 1001, 1, 0, 0, 0, 1002, 1003, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 5, 16, 0, 0, 1005, 147, 1, 0, 0, 0, 1006, 1008, 3, 96, 48, 0, 1007, 1006, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1015, 1, 0, 0, 0, 1009, 1011, 5, 18, 0, 0, 1010, 1012, 3, 96, 48, 0, 1011, 1010, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1014, 1, 0, 0, 0, 1013, 1009, 1, 0, 0, 0, 1014, 1017, 1, 0, 0, 0, 1015, 1013, 1, 0, 0, 0, 1015, 1016, 1, 0, 0, 0, 1016, 149, 1, 0, 0, 0, 1017, 1015, 1, 0, 0, 0, 1018, 1023, 3, 96, 48, 0, 1019, 1020, 5, 18, 0, 0, 1020, 1022, 3, 96, 48, 0, 1021, 1019, 1, 0, 0, 0, 1022, 1025, 1, 0, 0, 0, 1023, 1021, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 151, 1, 0, 0, 0, 1025, 1023, 1, 0, 0, 0, 1026, 1027, 5, 67, 0, 0, 1027, 1032, 3, 154, 77, 0, 1028, 1029, 5, 18, 0, 0, 1029, 1031, 3, 154, 77, 0, 1030, 1028, 1, 0, 0, 0, 1031, 1034, 1, 0, 0, 0, 1032, 1030, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1035, 1, 0, 0, 0, 1034, 1032, 1, 0, 0, 0, 1035, 1036, 5, 68, 0, 0, 1036, 153, 1, 0, 0, 0, 1037, 1040, 5, 15, 0, 0, 1038, 1040, 3, 96, 48, 0, 1039, 1037, 1, 0, 0, 0, 1039, 1038, 1, 0, 0, 0, 1040, 155, 1, 0, 0, 0, 1041, 1043, 3, 158, 79, 0, 1042, 1044, 3, 160, 80, 0, 1043, 1042, 1, 0, 0, 0, 1043, 1044, 1, 0, 0, 0, 1044, 157, 1, 0, 0, 0, 1045, 1050, 5, 77, 0, 0, 1046, 1047, 5, 55, 0, 0, 1047, 1049, 5, 77, 0, 0, 1048, 1046, 1, 0, 0, 0, 1049, 1052, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1050, 1051, 1, 0, 0, 0, 1051, 1054, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1053, 1045, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 159, 1, 0, 0, 0, 1055, 1056, 5, 72, 0, 0, 1056, 1057, 3, 56, 28, 0, 1057, 161, 1, 0, 0, 0, 129, 166, 172, 177, 179, 183, 191, 204, 209, 212, 215, 218, 223, 234, 238, 243, 246, 249, 264, 277, 284, 291, 300, 310, 314, 322, 325, 327, 331, 335, 338, 341, 344, 349, 355, 362, 367, 373, 383, 397, 404, 410, 421, 429, 438, 441, 443, 447, 462, 468, 471, 478, 486, 489, 494, 500, 504, 513, 517, 525, 530, 534, 538, 543, 549, 552, 558, 573, 585, 596, 601, 610, 613, 626, 637, 642, 651, 654, 667, 681, 699, 713, 724, 729, 743, 754, 759, 786, 790, 803, 814, 816, 823, 831, 835, 843, 848, 856, 867, 875, 885, 891, 899, 909, 912, 921, 925, 929, 934, 938, 943, 952, 957, 960, 965, 968, 975, 980, 987, 996, 1002, 1007, 1011, 1015, 1023, 1032, 1039, 1043, 1050, 1053] \ No newline at end of file +[4, 1, 80, 1059, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 167, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 173, 8, 0, 1, 0, 1, 0, 1, 0, 5, 0, 178, 8, 0, 10, 0, 12, 0, 181, 9, 0, 1, 0, 3, 0, 184, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 192, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 3, 3, 205, 8, 3, 1, 3, 1, 3, 1, 3, 3, 3, 210, 8, 3, 1, 3, 3, 3, 213, 8, 3, 1, 3, 3, 3, 216, 8, 3, 1, 3, 3, 3, 219, 8, 3, 1, 4, 1, 4, 1, 4, 3, 4, 224, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 3, 6, 235, 8, 6, 1, 6, 1, 6, 3, 6, 239, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 244, 8, 6, 1, 6, 3, 6, 247, 8, 6, 1, 6, 3, 6, 250, 8, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 263, 8, 7, 10, 7, 12, 7, 266, 9, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 5, 9, 276, 8, 9, 10, 9, 12, 9, 279, 9, 9, 1, 10, 1, 10, 1, 10, 1, 11, 3, 11, 285, 8, 11, 1, 11, 1, 11, 1, 11, 5, 11, 290, 8, 11, 10, 11, 12, 11, 293, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 299, 8, 11, 10, 11, 12, 11, 302, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 309, 8, 11, 10, 11, 12, 11, 312, 9, 11, 1, 11, 3, 11, 315, 8, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 321, 8, 11, 10, 11, 12, 11, 324, 9, 11, 5, 11, 326, 8, 11, 10, 11, 12, 11, 329, 9, 11, 1, 11, 3, 11, 332, 8, 11, 1, 11, 1, 11, 3, 11, 336, 8, 11, 1, 11, 3, 11, 339, 8, 11, 1, 11, 3, 11, 342, 8, 11, 1, 11, 3, 11, 345, 8, 11, 1, 11, 5, 11, 348, 8, 11, 10, 11, 12, 11, 351, 9, 11, 1, 11, 1, 11, 1, 11, 3, 11, 356, 8, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 3, 13, 363, 8, 13, 1, 13, 1, 13, 1, 13, 3, 13, 368, 8, 13, 1, 13, 1, 13, 1, 14, 1, 14, 3, 14, 374, 8, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 384, 8, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 398, 8, 18, 1, 18, 1, 18, 1, 18, 5, 18, 403, 8, 18, 10, 18, 12, 18, 406, 9, 18, 1, 18, 5, 18, 409, 8, 18, 10, 18, 12, 18, 412, 9, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 422, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 428, 8, 19, 10, 19, 12, 19, 431, 9, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 437, 8, 19, 10, 19, 12, 19, 440, 9, 19, 5, 19, 442, 8, 19, 10, 19, 12, 19, 445, 9, 19, 1, 20, 3, 20, 448, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 3, 22, 463, 8, 22, 1, 22, 1, 22, 1, 22, 1, 23, 3, 23, 469, 8, 23, 1, 23, 3, 23, 472, 8, 23, 1, 24, 1, 24, 1, 24, 5, 24, 477, 8, 24, 10, 24, 12, 24, 480, 9, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 3, 26, 487, 8, 26, 1, 26, 3, 26, 490, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 495, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 501, 8, 27, 1, 28, 1, 28, 3, 28, 505, 8, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 5, 29, 512, 8, 29, 10, 29, 12, 29, 515, 9, 29, 1, 30, 3, 30, 518, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 3, 32, 526, 8, 32, 1, 32, 1, 32, 1, 33, 3, 33, 531, 8, 33, 1, 33, 1, 33, 3, 33, 535, 8, 33, 1, 33, 1, 33, 3, 33, 539, 8, 33, 1, 33, 1, 33, 1, 33, 3, 33, 544, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 3, 34, 550, 8, 34, 1, 35, 3, 35, 553, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 559, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 574, 8, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 584, 8, 36, 10, 36, 12, 36, 587, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 595, 8, 36, 10, 36, 12, 36, 598, 9, 36, 5, 36, 600, 8, 36, 10, 36, 12, 36, 603, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 609, 8, 36, 10, 36, 12, 36, 612, 9, 36, 3, 36, 614, 8, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 625, 8, 37, 10, 37, 12, 37, 628, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 636, 8, 37, 10, 37, 12, 37, 639, 9, 37, 5, 37, 641, 8, 37, 10, 37, 12, 37, 644, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 650, 8, 37, 10, 37, 12, 37, 653, 9, 37, 3, 37, 655, 8, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 666, 8, 38, 10, 38, 12, 38, 669, 9, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 680, 8, 39, 10, 39, 12, 39, 683, 9, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 5, 41, 698, 8, 41, 10, 41, 12, 41, 701, 9, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 712, 8, 42, 10, 42, 12, 42, 715, 9, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 723, 8, 42, 10, 42, 12, 42, 726, 9, 42, 5, 42, 728, 8, 42, 10, 42, 12, 42, 731, 9, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 742, 8, 43, 10, 43, 12, 43, 745, 9, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 753, 8, 43, 10, 43, 12, 43, 756, 9, 43, 5, 43, 758, 8, 43, 10, 43, 12, 43, 761, 9, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 3, 48, 787, 8, 48, 1, 49, 1, 49, 3, 49, 791, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 802, 8, 50, 10, 50, 12, 50, 805, 9, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 815, 8, 51, 3, 51, 817, 8, 51, 1, 52, 1, 52, 1, 52, 5, 52, 822, 8, 52, 10, 52, 12, 52, 825, 9, 52, 1, 53, 1, 53, 1, 53, 5, 53, 830, 8, 53, 10, 53, 12, 53, 833, 9, 53, 1, 54, 3, 54, 836, 8, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 844, 8, 55, 1, 56, 1, 56, 1, 57, 3, 57, 849, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 855, 8, 57, 10, 57, 12, 57, 858, 9, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 866, 8, 59, 10, 59, 12, 59, 869, 9, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 3, 61, 876, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 886, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 892, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 898, 8, 62, 10, 62, 12, 62, 901, 9, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 910, 8, 62, 1, 63, 3, 63, 913, 8, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 5, 64, 920, 8, 64, 10, 64, 12, 64, 923, 9, 64, 1, 65, 3, 65, 926, 8, 65, 1, 65, 1, 65, 3, 65, 930, 8, 65, 1, 65, 1, 65, 1, 65, 3, 65, 935, 8, 65, 5, 65, 937, 8, 65, 10, 65, 12, 65, 940, 9, 65, 1, 66, 1, 66, 3, 66, 944, 8, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 953, 8, 67, 1, 67, 1, 67, 1, 67, 3, 67, 958, 8, 67, 1, 67, 3, 67, 961, 8, 67, 1, 68, 1, 68, 1, 68, 3, 68, 966, 8, 68, 1, 68, 3, 68, 969, 8, 68, 1, 69, 1, 69, 1, 69, 5, 69, 974, 8, 69, 10, 69, 12, 69, 977, 9, 69, 1, 69, 1, 69, 3, 69, 981, 8, 69, 1, 70, 1, 70, 1, 70, 5, 70, 986, 8, 70, 10, 70, 12, 70, 989, 9, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 3, 72, 997, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1003, 8, 73, 1, 73, 1, 73, 1, 74, 3, 74, 1008, 8, 74, 1, 74, 1, 74, 3, 74, 1012, 8, 74, 5, 74, 1014, 8, 74, 10, 74, 12, 74, 1017, 9, 74, 1, 75, 1, 75, 1, 75, 5, 75, 1022, 8, 75, 10, 75, 12, 75, 1025, 9, 75, 1, 76, 1, 76, 1, 76, 1, 76, 5, 76, 1031, 8, 76, 10, 76, 12, 76, 1034, 9, 76, 1, 76, 1, 76, 1, 77, 1, 77, 3, 77, 1040, 8, 77, 1, 78, 1, 78, 3, 78, 1044, 8, 78, 1, 79, 1, 79, 1, 79, 5, 79, 1049, 8, 79, 10, 79, 12, 79, 1052, 9, 79, 3, 79, 1054, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 0, 0, 81, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 0, 7, 1, 0, 19, 20, 3, 0, 9, 9, 25, 25, 30, 30, 1, 0, 49, 54, 1, 0, 55, 58, 1, 0, 59, 62, 1, 0, 63, 64, 4, 0, 8, 8, 17, 17, 22, 22, 29, 29, 1129, 0, 162, 1, 0, 0, 0, 2, 197, 1, 0, 0, 0, 4, 199, 1, 0, 0, 0, 6, 218, 1, 0, 0, 0, 8, 223, 1, 0, 0, 0, 10, 225, 1, 0, 0, 0, 12, 231, 1, 0, 0, 0, 14, 253, 1, 0, 0, 0, 16, 270, 1, 0, 0, 0, 18, 272, 1, 0, 0, 0, 20, 280, 1, 0, 0, 0, 22, 291, 1, 0, 0, 0, 24, 357, 1, 0, 0, 0, 26, 362, 1, 0, 0, 0, 28, 373, 1, 0, 0, 0, 30, 375, 1, 0, 0, 0, 32, 377, 1, 0, 0, 0, 34, 387, 1, 0, 0, 0, 36, 392, 1, 0, 0, 0, 38, 413, 1, 0, 0, 0, 40, 447, 1, 0, 0, 0, 42, 455, 1, 0, 0, 0, 44, 459, 1, 0, 0, 0, 46, 468, 1, 0, 0, 0, 48, 473, 1, 0, 0, 0, 50, 481, 1, 0, 0, 0, 52, 484, 1, 0, 0, 0, 54, 500, 1, 0, 0, 0, 56, 502, 1, 0, 0, 0, 58, 508, 1, 0, 0, 0, 60, 517, 1, 0, 0, 0, 62, 521, 1, 0, 0, 0, 64, 523, 1, 0, 0, 0, 66, 530, 1, 0, 0, 0, 68, 549, 1, 0, 0, 0, 70, 552, 1, 0, 0, 0, 72, 577, 1, 0, 0, 0, 74, 618, 1, 0, 0, 0, 76, 659, 1, 0, 0, 0, 78, 673, 1, 0, 0, 0, 80, 687, 1, 0, 0, 0, 82, 691, 1, 0, 0, 0, 84, 705, 1, 0, 0, 0, 86, 735, 1, 0, 0, 0, 88, 765, 1, 0, 0, 0, 90, 772, 1, 0, 0, 0, 92, 779, 1, 0, 0, 0, 94, 781, 1, 0, 0, 0, 96, 784, 1, 0, 0, 0, 98, 790, 1, 0, 0, 0, 100, 792, 1, 0, 0, 0, 102, 809, 1, 0, 0, 0, 104, 818, 1, 0, 0, 0, 106, 826, 1, 0, 0, 0, 108, 835, 1, 0, 0, 0, 110, 839, 1, 0, 0, 0, 112, 845, 1, 0, 0, 0, 114, 848, 1, 0, 0, 0, 116, 859, 1, 0, 0, 0, 118, 861, 1, 0, 0, 0, 120, 870, 1, 0, 0, 0, 122, 872, 1, 0, 0, 0, 124, 909, 1, 0, 0, 0, 126, 912, 1, 0, 0, 0, 128, 916, 1, 0, 0, 0, 130, 925, 1, 0, 0, 0, 132, 941, 1, 0, 0, 0, 134, 960, 1, 0, 0, 0, 136, 968, 1, 0, 0, 0, 138, 970, 1, 0, 0, 0, 140, 982, 1, 0, 0, 0, 142, 990, 1, 0, 0, 0, 144, 996, 1, 0, 0, 0, 146, 998, 1, 0, 0, 0, 148, 1007, 1, 0, 0, 0, 150, 1018, 1, 0, 0, 0, 152, 1026, 1, 0, 0, 0, 154, 1039, 1, 0, 0, 0, 156, 1041, 1, 0, 0, 0, 158, 1053, 1, 0, 0, 0, 160, 1055, 1, 0, 0, 0, 162, 163, 3, 2, 1, 0, 163, 164, 5, 1, 0, 0, 164, 179, 5, 74, 0, 0, 165, 167, 3, 94, 47, 0, 166, 165, 1, 0, 0, 0, 166, 167, 1, 0, 0, 0, 167, 168, 1, 0, 0, 0, 168, 169, 3, 4, 2, 0, 169, 170, 5, 2, 0, 0, 170, 178, 1, 0, 0, 0, 171, 173, 3, 94, 47, 0, 172, 171, 1, 0, 0, 0, 172, 173, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 174, 175, 3, 44, 22, 0, 175, 176, 5, 2, 0, 0, 176, 178, 1, 0, 0, 0, 177, 166, 1, 0, 0, 0, 177, 172, 1, 0, 0, 0, 178, 181, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 183, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 182, 184, 3, 94, 47, 0, 183, 182, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 186, 5, 3, 0, 0, 186, 187, 3, 10, 5, 0, 187, 191, 5, 2, 0, 0, 188, 189, 3, 160, 80, 0, 189, 190, 5, 2, 0, 0, 190, 192, 1, 0, 0, 0, 191, 188, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 193, 1, 0, 0, 0, 193, 194, 5, 4, 0, 0, 194, 195, 5, 74, 0, 0, 195, 196, 5, 2, 0, 0, 196, 1, 1, 0, 0, 0, 197, 198, 5, 73, 0, 0, 198, 3, 1, 0, 0, 0, 199, 200, 3, 6, 3, 0, 200, 201, 3, 8, 4, 0, 201, 5, 1, 0, 0, 0, 202, 219, 5, 5, 0, 0, 203, 205, 5, 6, 0, 0, 204, 203, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 219, 5, 7, 0, 0, 207, 209, 5, 8, 0, 0, 208, 210, 5, 9, 0, 0, 209, 208, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 213, 1, 0, 0, 0, 211, 213, 5, 10, 0, 0, 212, 207, 1, 0, 0, 0, 212, 211, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 215, 1, 0, 0, 0, 214, 216, 5, 6, 0, 0, 215, 214, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 219, 5, 11, 0, 0, 218, 202, 1, 0, 0, 0, 218, 204, 1, 0, 0, 0, 218, 212, 1, 0, 0, 0, 219, 7, 1, 0, 0, 0, 220, 224, 3, 10, 5, 0, 221, 224, 3, 12, 6, 0, 222, 224, 3, 14, 7, 0, 223, 220, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 9, 1, 0, 0, 0, 225, 226, 5, 74, 0, 0, 226, 227, 3, 158, 79, 0, 227, 228, 3, 22, 11, 0, 228, 229, 5, 4, 0, 0, 229, 230, 5, 74, 0, 0, 230, 11, 1, 0, 0, 0, 231, 232, 5, 74, 0, 0, 232, 249, 5, 12, 0, 0, 233, 235, 3, 16, 8, 0, 234, 233, 1, 0, 0, 0, 234, 235, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 238, 3, 126, 63, 0, 237, 239, 3, 56, 28, 0, 238, 237, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 250, 1, 0, 0, 0, 240, 241, 5, 13, 0, 0, 241, 246, 5, 14, 0, 0, 242, 244, 3, 18, 9, 0, 243, 242, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 247, 1, 0, 0, 0, 245, 247, 5, 15, 0, 0, 246, 243, 1, 0, 0, 0, 246, 245, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 250, 5, 16, 0, 0, 249, 234, 1, 0, 0, 0, 249, 240, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 252, 3, 156, 78, 0, 252, 13, 1, 0, 0, 0, 253, 254, 5, 74, 0, 0, 254, 255, 5, 12, 0, 0, 255, 256, 5, 17, 0, 0, 256, 257, 5, 14, 0, 0, 257, 258, 3, 126, 63, 0, 258, 259, 5, 18, 0, 0, 259, 264, 5, 74, 0, 0, 260, 261, 5, 18, 0, 0, 261, 263, 5, 74, 0, 0, 262, 260, 1, 0, 0, 0, 263, 266, 1, 0, 0, 0, 264, 262, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 267, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 267, 268, 5, 16, 0, 0, 268, 269, 3, 156, 78, 0, 269, 15, 1, 0, 0, 0, 270, 271, 7, 0, 0, 0, 271, 17, 1, 0, 0, 0, 272, 277, 3, 20, 10, 0, 273, 274, 5, 18, 0, 0, 274, 276, 3, 20, 10, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 19, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 281, 5, 74, 0, 0, 281, 282, 3, 156, 78, 0, 282, 21, 1, 0, 0, 0, 283, 285, 3, 94, 47, 0, 284, 283, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 287, 3, 28, 14, 0, 287, 288, 5, 2, 0, 0, 288, 290, 1, 0, 0, 0, 289, 284, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 327, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 300, 5, 21, 0, 0, 295, 296, 3, 66, 33, 0, 296, 297, 5, 2, 0, 0, 297, 299, 1, 0, 0, 0, 298, 295, 1, 0, 0, 0, 299, 302, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 326, 1, 0, 0, 0, 302, 300, 1, 0, 0, 0, 303, 304, 5, 22, 0, 0, 304, 310, 5, 21, 0, 0, 305, 306, 3, 68, 34, 0, 306, 307, 5, 2, 0, 0, 307, 309, 1, 0, 0, 0, 308, 305, 1, 0, 0, 0, 309, 312, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 326, 1, 0, 0, 0, 312, 310, 1, 0, 0, 0, 313, 315, 5, 22, 0, 0, 314, 313, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 322, 5, 23, 0, 0, 317, 318, 3, 70, 35, 0, 318, 319, 5, 2, 0, 0, 319, 321, 1, 0, 0, 0, 320, 317, 1, 0, 0, 0, 321, 324, 1, 0, 0, 0, 322, 320, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 325, 294, 1, 0, 0, 0, 325, 303, 1, 0, 0, 0, 325, 314, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 344, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 332, 3, 94, 47, 0, 331, 330, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 335, 5, 24, 0, 0, 334, 336, 3, 24, 12, 0, 335, 334, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 338, 1, 0, 0, 0, 337, 339, 3, 26, 13, 0, 338, 337, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 341, 1, 0, 0, 0, 340, 342, 3, 160, 80, 0, 341, 340, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 345, 5, 2, 0, 0, 344, 331, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 349, 1, 0, 0, 0, 346, 348, 3, 36, 18, 0, 347, 346, 1, 0, 0, 0, 348, 351, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 355, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 352, 353, 3, 160, 80, 0, 353, 354, 5, 2, 0, 0, 354, 356, 1, 0, 0, 0, 355, 352, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 23, 1, 0, 0, 0, 357, 358, 5, 77, 0, 0, 358, 25, 1, 0, 0, 0, 359, 360, 3, 130, 65, 0, 360, 361, 5, 12, 0, 0, 361, 363, 1, 0, 0, 0, 362, 359, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 365, 5, 74, 0, 0, 365, 367, 5, 14, 0, 0, 366, 368, 3, 150, 75, 0, 367, 366, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 370, 5, 16, 0, 0, 370, 27, 1, 0, 0, 0, 371, 374, 3, 30, 15, 0, 372, 374, 3, 32, 16, 0, 373, 371, 1, 0, 0, 0, 373, 372, 1, 0, 0, 0, 374, 29, 1, 0, 0, 0, 375, 376, 3, 42, 21, 0, 376, 31, 1, 0, 0, 0, 377, 378, 5, 25, 0, 0, 378, 379, 5, 21, 0, 0, 379, 380, 3, 34, 17, 0, 380, 383, 5, 12, 0, 0, 381, 384, 3, 96, 48, 0, 382, 384, 3, 90, 45, 0, 383, 381, 1, 0, 0, 0, 383, 382, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 386, 3, 156, 78, 0, 386, 33, 1, 0, 0, 0, 387, 388, 5, 26, 0, 0, 388, 389, 5, 14, 0, 0, 389, 390, 3, 130, 65, 0, 390, 391, 5, 16, 0, 0, 391, 35, 1, 0, 0, 0, 392, 393, 5, 27, 0, 0, 393, 397, 3, 158, 79, 0, 394, 395, 3, 160, 80, 0, 395, 396, 5, 2, 0, 0, 396, 398, 1, 0, 0, 0, 397, 394, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 404, 1, 0, 0, 0, 399, 400, 3, 40, 20, 0, 400, 401, 5, 2, 0, 0, 401, 403, 1, 0, 0, 0, 402, 399, 1, 0, 0, 0, 403, 406, 1, 0, 0, 0, 404, 402, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 410, 1, 0, 0, 0, 406, 404, 1, 0, 0, 0, 407, 409, 3, 38, 19, 0, 408, 407, 1, 0, 0, 0, 409, 412, 1, 0, 0, 0, 410, 408, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 37, 1, 0, 0, 0, 412, 410, 1, 0, 0, 0, 413, 414, 5, 28, 0, 0, 414, 415, 5, 14, 0, 0, 415, 416, 3, 58, 29, 0, 416, 417, 5, 16, 0, 0, 417, 421, 3, 158, 79, 0, 418, 419, 3, 160, 80, 0, 419, 420, 5, 2, 0, 0, 420, 422, 1, 0, 0, 0, 421, 418, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 443, 1, 0, 0, 0, 423, 429, 5, 21, 0, 0, 424, 425, 3, 66, 33, 0, 425, 426, 5, 2, 0, 0, 426, 428, 1, 0, 0, 0, 427, 424, 1, 0, 0, 0, 428, 431, 1, 0, 0, 0, 429, 427, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 442, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 432, 438, 5, 23, 0, 0, 433, 434, 3, 70, 35, 0, 434, 435, 5, 2, 0, 0, 435, 437, 1, 0, 0, 0, 436, 433, 1, 0, 0, 0, 437, 440, 1, 0, 0, 0, 438, 436, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 442, 1, 0, 0, 0, 440, 438, 1, 0, 0, 0, 441, 423, 1, 0, 0, 0, 441, 432, 1, 0, 0, 0, 442, 445, 1, 0, 0, 0, 443, 441, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 39, 1, 0, 0, 0, 445, 443, 1, 0, 0, 0, 446, 448, 3, 94, 47, 0, 447, 446, 1, 0, 0, 0, 447, 448, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 5, 29, 0, 0, 450, 451, 5, 74, 0, 0, 451, 452, 5, 12, 0, 0, 452, 453, 3, 96, 48, 0, 453, 454, 3, 156, 78, 0, 454, 41, 1, 0, 0, 0, 455, 456, 3, 46, 23, 0, 456, 457, 3, 126, 63, 0, 457, 458, 3, 48, 24, 0, 458, 43, 1, 0, 0, 0, 459, 460, 5, 9, 0, 0, 460, 462, 3, 126, 63, 0, 461, 463, 3, 152, 76, 0, 462, 461, 1, 0, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 465, 3, 52, 26, 0, 465, 466, 3, 156, 78, 0, 466, 45, 1, 0, 0, 0, 467, 469, 7, 1, 0, 0, 468, 467, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 471, 1, 0, 0, 0, 470, 472, 7, 0, 0, 0, 471, 470, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 47, 1, 0, 0, 0, 473, 478, 3, 50, 25, 0, 474, 475, 5, 18, 0, 0, 475, 477, 3, 50, 25, 0, 476, 474, 1, 0, 0, 0, 477, 480, 1, 0, 0, 0, 478, 476, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 49, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 481, 482, 3, 52, 26, 0, 482, 483, 3, 156, 78, 0, 483, 51, 1, 0, 0, 0, 484, 486, 5, 74, 0, 0, 485, 487, 3, 152, 76, 0, 486, 485, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 489, 1, 0, 0, 0, 488, 490, 3, 54, 27, 0, 489, 488, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 53, 1, 0, 0, 0, 491, 494, 3, 56, 28, 0, 492, 493, 5, 12, 0, 0, 493, 495, 3, 96, 48, 0, 494, 492, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 501, 1, 0, 0, 0, 496, 497, 5, 12, 0, 0, 497, 501, 3, 96, 48, 0, 498, 499, 5, 31, 0, 0, 499, 501, 3, 96, 48, 0, 500, 491, 1, 0, 0, 0, 500, 496, 1, 0, 0, 0, 500, 498, 1, 0, 0, 0, 501, 55, 1, 0, 0, 0, 502, 504, 5, 14, 0, 0, 503, 505, 3, 58, 29, 0, 504, 503, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 5, 16, 0, 0, 507, 57, 1, 0, 0, 0, 508, 513, 3, 60, 30, 0, 509, 510, 5, 18, 0, 0, 510, 512, 3, 60, 30, 0, 511, 509, 1, 0, 0, 0, 512, 515, 1, 0, 0, 0, 513, 511, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 514, 59, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 518, 3, 94, 47, 0, 517, 516, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 3, 62, 31, 0, 520, 61, 1, 0, 0, 0, 521, 522, 3, 64, 32, 0, 522, 63, 1, 0, 0, 0, 523, 525, 3, 128, 64, 0, 524, 526, 3, 54, 27, 0, 525, 524, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 527, 1, 0, 0, 0, 527, 528, 3, 158, 79, 0, 528, 65, 1, 0, 0, 0, 529, 531, 3, 94, 47, 0, 530, 529, 1, 0, 0, 0, 530, 531, 1, 0, 0, 0, 531, 543, 1, 0, 0, 0, 532, 534, 3, 102, 51, 0, 533, 535, 3, 94, 47, 0, 534, 533, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 538, 1, 0, 0, 0, 536, 537, 5, 12, 0, 0, 537, 539, 3, 96, 48, 0, 538, 536, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 544, 1, 0, 0, 0, 540, 544, 3, 72, 36, 0, 541, 544, 3, 76, 38, 0, 542, 544, 3, 84, 42, 0, 543, 532, 1, 0, 0, 0, 543, 540, 1, 0, 0, 0, 543, 541, 1, 0, 0, 0, 543, 542, 1, 0, 0, 0, 544, 545, 1, 0, 0, 0, 545, 546, 3, 156, 78, 0, 546, 67, 1, 0, 0, 0, 547, 550, 3, 66, 33, 0, 548, 550, 3, 88, 44, 0, 549, 547, 1, 0, 0, 0, 549, 548, 1, 0, 0, 0, 550, 69, 1, 0, 0, 0, 551, 553, 3, 94, 47, 0, 552, 551, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 573, 1, 0, 0, 0, 554, 558, 3, 130, 65, 0, 555, 556, 5, 31, 0, 0, 556, 559, 3, 96, 48, 0, 557, 559, 3, 132, 66, 0, 558, 555, 1, 0, 0, 0, 558, 557, 1, 0, 0, 0, 559, 574, 1, 0, 0, 0, 560, 561, 5, 14, 0, 0, 561, 562, 3, 148, 74, 0, 562, 563, 5, 16, 0, 0, 563, 564, 5, 31, 0, 0, 564, 565, 3, 130, 65, 0, 565, 566, 3, 132, 66, 0, 566, 574, 1, 0, 0, 0, 567, 574, 5, 32, 0, 0, 568, 574, 5, 33, 0, 0, 569, 574, 3, 74, 37, 0, 570, 574, 3, 78, 39, 0, 571, 574, 3, 82, 41, 0, 572, 574, 3, 86, 43, 0, 573, 554, 1, 0, 0, 0, 573, 560, 1, 0, 0, 0, 573, 567, 1, 0, 0, 0, 573, 568, 1, 0, 0, 0, 573, 569, 1, 0, 0, 0, 573, 570, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 573, 572, 1, 0, 0, 0, 574, 575, 1, 0, 0, 0, 575, 576, 3, 156, 78, 0, 576, 71, 1, 0, 0, 0, 577, 578, 5, 34, 0, 0, 578, 579, 3, 96, 48, 0, 579, 585, 5, 35, 0, 0, 580, 581, 3, 66, 33, 0, 581, 582, 5, 2, 0, 0, 582, 584, 1, 0, 0, 0, 583, 580, 1, 0, 0, 0, 584, 587, 1, 0, 0, 0, 585, 583, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 601, 1, 0, 0, 0, 587, 585, 1, 0, 0, 0, 588, 589, 5, 36, 0, 0, 589, 590, 3, 96, 48, 0, 590, 596, 5, 35, 0, 0, 591, 592, 3, 66, 33, 0, 592, 593, 5, 2, 0, 0, 593, 595, 1, 0, 0, 0, 594, 591, 1, 0, 0, 0, 595, 598, 1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 600, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 599, 588, 1, 0, 0, 0, 600, 603, 1, 0, 0, 0, 601, 599, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 613, 1, 0, 0, 0, 603, 601, 1, 0, 0, 0, 604, 610, 5, 37, 0, 0, 605, 606, 3, 66, 33, 0, 606, 607, 5, 2, 0, 0, 607, 609, 1, 0, 0, 0, 608, 605, 1, 0, 0, 0, 609, 612, 1, 0, 0, 0, 610, 608, 1, 0, 0, 0, 610, 611, 1, 0, 0, 0, 611, 614, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 613, 604, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 5, 4, 0, 0, 616, 617, 5, 34, 0, 0, 617, 73, 1, 0, 0, 0, 618, 619, 5, 34, 0, 0, 619, 620, 3, 96, 48, 0, 620, 626, 5, 35, 0, 0, 621, 622, 3, 70, 35, 0, 622, 623, 5, 2, 0, 0, 623, 625, 1, 0, 0, 0, 624, 621, 1, 0, 0, 0, 625, 628, 1, 0, 0, 0, 626, 624, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 642, 1, 0, 0, 0, 628, 626, 1, 0, 0, 0, 629, 630, 5, 36, 0, 0, 630, 631, 3, 96, 48, 0, 631, 637, 5, 35, 0, 0, 632, 633, 3, 70, 35, 0, 633, 634, 5, 2, 0, 0, 634, 636, 1, 0, 0, 0, 635, 632, 1, 0, 0, 0, 636, 639, 1, 0, 0, 0, 637, 635, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 641, 1, 0, 0, 0, 639, 637, 1, 0, 0, 0, 640, 629, 1, 0, 0, 0, 641, 644, 1, 0, 0, 0, 642, 640, 1, 0, 0, 0, 642, 643, 1, 0, 0, 0, 643, 654, 1, 0, 0, 0, 644, 642, 1, 0, 0, 0, 645, 651, 5, 37, 0, 0, 646, 647, 3, 70, 35, 0, 647, 648, 5, 2, 0, 0, 648, 650, 1, 0, 0, 0, 649, 646, 1, 0, 0, 0, 650, 653, 1, 0, 0, 0, 651, 649, 1, 0, 0, 0, 651, 652, 1, 0, 0, 0, 652, 655, 1, 0, 0, 0, 653, 651, 1, 0, 0, 0, 654, 645, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 657, 5, 4, 0, 0, 657, 658, 5, 34, 0, 0, 658, 75, 1, 0, 0, 0, 659, 660, 5, 38, 0, 0, 660, 661, 3, 80, 40, 0, 661, 667, 5, 39, 0, 0, 662, 663, 3, 66, 33, 0, 663, 664, 5, 2, 0, 0, 664, 666, 1, 0, 0, 0, 665, 662, 1, 0, 0, 0, 666, 669, 1, 0, 0, 0, 667, 665, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 670, 1, 0, 0, 0, 669, 667, 1, 0, 0, 0, 670, 671, 5, 4, 0, 0, 671, 672, 5, 38, 0, 0, 672, 77, 1, 0, 0, 0, 673, 674, 5, 38, 0, 0, 674, 675, 3, 80, 40, 0, 675, 681, 5, 39, 0, 0, 676, 677, 3, 70, 35, 0, 677, 678, 5, 2, 0, 0, 678, 680, 1, 0, 0, 0, 679, 676, 1, 0, 0, 0, 680, 683, 1, 0, 0, 0, 681, 679, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 684, 1, 0, 0, 0, 683, 681, 1, 0, 0, 0, 684, 685, 5, 4, 0, 0, 685, 686, 5, 38, 0, 0, 686, 79, 1, 0, 0, 0, 687, 688, 5, 74, 0, 0, 688, 689, 5, 40, 0, 0, 689, 690, 3, 96, 48, 0, 690, 81, 1, 0, 0, 0, 691, 692, 5, 41, 0, 0, 692, 693, 3, 96, 48, 0, 693, 699, 5, 39, 0, 0, 694, 695, 3, 70, 35, 0, 695, 696, 5, 2, 0, 0, 696, 698, 1, 0, 0, 0, 697, 694, 1, 0, 0, 0, 698, 701, 1, 0, 0, 0, 699, 697, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 702, 1, 0, 0, 0, 701, 699, 1, 0, 0, 0, 702, 703, 5, 4, 0, 0, 703, 704, 5, 41, 0, 0, 704, 83, 1, 0, 0, 0, 705, 706, 5, 42, 0, 0, 706, 707, 3, 96, 48, 0, 707, 713, 5, 35, 0, 0, 708, 709, 3, 66, 33, 0, 709, 710, 5, 2, 0, 0, 710, 712, 1, 0, 0, 0, 711, 708, 1, 0, 0, 0, 712, 715, 1, 0, 0, 0, 713, 711, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 729, 1, 0, 0, 0, 715, 713, 1, 0, 0, 0, 716, 717, 5, 43, 0, 0, 717, 718, 3, 96, 48, 0, 718, 724, 5, 35, 0, 0, 719, 720, 3, 66, 33, 0, 720, 721, 5, 2, 0, 0, 721, 723, 1, 0, 0, 0, 722, 719, 1, 0, 0, 0, 723, 726, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 727, 716, 1, 0, 0, 0, 728, 731, 1, 0, 0, 0, 729, 727, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 732, 1, 0, 0, 0, 731, 729, 1, 0, 0, 0, 732, 733, 5, 4, 0, 0, 733, 734, 5, 42, 0, 0, 734, 85, 1, 0, 0, 0, 735, 736, 5, 42, 0, 0, 736, 737, 3, 96, 48, 0, 737, 743, 5, 35, 0, 0, 738, 739, 3, 70, 35, 0, 739, 740, 5, 2, 0, 0, 740, 742, 1, 0, 0, 0, 741, 738, 1, 0, 0, 0, 742, 745, 1, 0, 0, 0, 743, 741, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 759, 1, 0, 0, 0, 745, 743, 1, 0, 0, 0, 746, 747, 5, 43, 0, 0, 747, 748, 3, 96, 48, 0, 748, 754, 5, 35, 0, 0, 749, 750, 3, 70, 35, 0, 750, 751, 5, 2, 0, 0, 751, 753, 1, 0, 0, 0, 752, 749, 1, 0, 0, 0, 753, 756, 1, 0, 0, 0, 754, 752, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 758, 1, 0, 0, 0, 756, 754, 1, 0, 0, 0, 757, 746, 1, 0, 0, 0, 758, 761, 1, 0, 0, 0, 759, 757, 1, 0, 0, 0, 759, 760, 1, 0, 0, 0, 760, 762, 1, 0, 0, 0, 761, 759, 1, 0, 0, 0, 762, 763, 5, 4, 0, 0, 763, 764, 5, 42, 0, 0, 764, 87, 1, 0, 0, 0, 765, 766, 5, 44, 0, 0, 766, 767, 5, 14, 0, 0, 767, 768, 3, 130, 65, 0, 768, 769, 5, 18, 0, 0, 769, 770, 3, 92, 46, 0, 770, 771, 5, 16, 0, 0, 771, 89, 1, 0, 0, 0, 772, 773, 5, 44, 0, 0, 773, 774, 5, 14, 0, 0, 774, 775, 3, 96, 48, 0, 775, 776, 5, 18, 0, 0, 776, 777, 3, 92, 46, 0, 777, 778, 5, 16, 0, 0, 778, 91, 1, 0, 0, 0, 779, 780, 3, 96, 48, 0, 780, 93, 1, 0, 0, 0, 781, 782, 5, 45, 0, 0, 782, 783, 5, 76, 0, 0, 783, 95, 1, 0, 0, 0, 784, 786, 3, 98, 49, 0, 785, 787, 3, 94, 47, 0, 786, 785, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 97, 1, 0, 0, 0, 788, 791, 3, 102, 51, 0, 789, 791, 3, 100, 50, 0, 790, 788, 1, 0, 0, 0, 790, 789, 1, 0, 0, 0, 791, 99, 1, 0, 0, 0, 792, 793, 5, 34, 0, 0, 793, 794, 3, 98, 49, 0, 794, 795, 5, 35, 0, 0, 795, 803, 3, 98, 49, 0, 796, 797, 5, 36, 0, 0, 797, 798, 3, 98, 49, 0, 798, 799, 5, 35, 0, 0, 799, 800, 3, 98, 49, 0, 800, 802, 1, 0, 0, 0, 801, 796, 1, 0, 0, 0, 802, 805, 1, 0, 0, 0, 803, 801, 1, 0, 0, 0, 803, 804, 1, 0, 0, 0, 804, 806, 1, 0, 0, 0, 805, 803, 1, 0, 0, 0, 806, 807, 5, 37, 0, 0, 807, 808, 3, 98, 49, 0, 808, 101, 1, 0, 0, 0, 809, 816, 3, 104, 52, 0, 810, 811, 5, 15, 0, 0, 811, 814, 3, 104, 52, 0, 812, 813, 5, 15, 0, 0, 813, 815, 3, 104, 52, 0, 814, 812, 1, 0, 0, 0, 814, 815, 1, 0, 0, 0, 815, 817, 1, 0, 0, 0, 816, 810, 1, 0, 0, 0, 816, 817, 1, 0, 0, 0, 817, 103, 1, 0, 0, 0, 818, 823, 3, 106, 53, 0, 819, 820, 5, 46, 0, 0, 820, 822, 3, 106, 53, 0, 821, 819, 1, 0, 0, 0, 822, 825, 1, 0, 0, 0, 823, 821, 1, 0, 0, 0, 823, 824, 1, 0, 0, 0, 824, 105, 1, 0, 0, 0, 825, 823, 1, 0, 0, 0, 826, 831, 3, 108, 54, 0, 827, 828, 5, 47, 0, 0, 828, 830, 3, 108, 54, 0, 829, 827, 1, 0, 0, 0, 830, 833, 1, 0, 0, 0, 831, 829, 1, 0, 0, 0, 831, 832, 1, 0, 0, 0, 832, 107, 1, 0, 0, 0, 833, 831, 1, 0, 0, 0, 834, 836, 5, 48, 0, 0, 835, 834, 1, 0, 0, 0, 835, 836, 1, 0, 0, 0, 836, 837, 1, 0, 0, 0, 837, 838, 3, 110, 55, 0, 838, 109, 1, 0, 0, 0, 839, 843, 3, 114, 57, 0, 840, 841, 3, 112, 56, 0, 841, 842, 3, 114, 57, 0, 842, 844, 1, 0, 0, 0, 843, 840, 1, 0, 0, 0, 843, 844, 1, 0, 0, 0, 844, 111, 1, 0, 0, 0, 845, 846, 7, 2, 0, 0, 846, 113, 1, 0, 0, 0, 847, 849, 3, 116, 58, 0, 848, 847, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 850, 1, 0, 0, 0, 850, 856, 3, 118, 59, 0, 851, 852, 3, 116, 58, 0, 852, 853, 3, 118, 59, 0, 853, 855, 1, 0, 0, 0, 854, 851, 1, 0, 0, 0, 855, 858, 1, 0, 0, 0, 856, 854, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 115, 1, 0, 0, 0, 858, 856, 1, 0, 0, 0, 859, 860, 7, 3, 0, 0, 860, 117, 1, 0, 0, 0, 861, 867, 3, 122, 61, 0, 862, 863, 3, 120, 60, 0, 863, 864, 3, 122, 61, 0, 864, 866, 1, 0, 0, 0, 865, 862, 1, 0, 0, 0, 866, 869, 1, 0, 0, 0, 867, 865, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 119, 1, 0, 0, 0, 869, 867, 1, 0, 0, 0, 870, 871, 7, 4, 0, 0, 871, 121, 1, 0, 0, 0, 872, 875, 3, 124, 62, 0, 873, 874, 7, 5, 0, 0, 874, 876, 3, 124, 62, 0, 875, 873, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 123, 1, 0, 0, 0, 877, 910, 5, 75, 0, 0, 878, 910, 5, 77, 0, 0, 879, 910, 5, 65, 0, 0, 880, 910, 5, 66, 0, 0, 881, 882, 7, 6, 0, 0, 882, 910, 3, 132, 66, 0, 883, 885, 3, 130, 65, 0, 884, 886, 3, 132, 66, 0, 885, 884, 1, 0, 0, 0, 885, 886, 1, 0, 0, 0, 886, 910, 1, 0, 0, 0, 887, 888, 5, 14, 0, 0, 888, 889, 3, 148, 74, 0, 889, 891, 5, 16, 0, 0, 890, 892, 3, 152, 76, 0, 891, 890, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 910, 1, 0, 0, 0, 893, 894, 5, 67, 0, 0, 894, 899, 3, 150, 75, 0, 895, 896, 5, 2, 0, 0, 896, 898, 3, 150, 75, 0, 897, 895, 1, 0, 0, 0, 898, 901, 1, 0, 0, 0, 899, 897, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 902, 1, 0, 0, 0, 901, 899, 1, 0, 0, 0, 902, 903, 5, 68, 0, 0, 903, 910, 1, 0, 0, 0, 904, 905, 5, 69, 0, 0, 905, 906, 3, 138, 69, 0, 906, 907, 5, 70, 0, 0, 907, 910, 1, 0, 0, 0, 908, 910, 5, 4, 0, 0, 909, 877, 1, 0, 0, 0, 909, 878, 1, 0, 0, 0, 909, 879, 1, 0, 0, 0, 909, 880, 1, 0, 0, 0, 909, 881, 1, 0, 0, 0, 909, 883, 1, 0, 0, 0, 909, 887, 1, 0, 0, 0, 909, 893, 1, 0, 0, 0, 909, 904, 1, 0, 0, 0, 909, 908, 1, 0, 0, 0, 910, 125, 1, 0, 0, 0, 911, 913, 5, 71, 0, 0, 912, 911, 1, 0, 0, 0, 912, 913, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 915, 3, 128, 64, 0, 915, 127, 1, 0, 0, 0, 916, 921, 5, 74, 0, 0, 917, 918, 5, 71, 0, 0, 918, 920, 5, 74, 0, 0, 919, 917, 1, 0, 0, 0, 920, 923, 1, 0, 0, 0, 921, 919, 1, 0, 0, 0, 921, 922, 1, 0, 0, 0, 922, 129, 1, 0, 0, 0, 923, 921, 1, 0, 0, 0, 924, 926, 5, 71, 0, 0, 925, 924, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 929, 5, 74, 0, 0, 928, 930, 3, 152, 76, 0, 929, 928, 1, 0, 0, 0, 929, 930, 1, 0, 0, 0, 930, 938, 1, 0, 0, 0, 931, 932, 5, 71, 0, 0, 932, 934, 5, 74, 0, 0, 933, 935, 3, 152, 76, 0, 934, 933, 1, 0, 0, 0, 934, 935, 1, 0, 0, 0, 935, 937, 1, 0, 0, 0, 936, 931, 1, 0, 0, 0, 937, 940, 1, 0, 0, 0, 938, 936, 1, 0, 0, 0, 938, 939, 1, 0, 0, 0, 939, 131, 1, 0, 0, 0, 940, 938, 1, 0, 0, 0, 941, 943, 5, 14, 0, 0, 942, 944, 3, 134, 67, 0, 943, 942, 1, 0, 0, 0, 943, 944, 1, 0, 0, 0, 944, 945, 1, 0, 0, 0, 945, 946, 5, 16, 0, 0, 946, 133, 1, 0, 0, 0, 947, 952, 3, 96, 48, 0, 948, 949, 5, 18, 0, 0, 949, 953, 3, 136, 68, 0, 950, 951, 5, 38, 0, 0, 951, 953, 3, 80, 40, 0, 952, 948, 1, 0, 0, 0, 952, 950, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 961, 1, 0, 0, 0, 954, 957, 3, 146, 73, 0, 955, 956, 5, 18, 0, 0, 956, 958, 3, 136, 68, 0, 957, 955, 1, 0, 0, 0, 957, 958, 1, 0, 0, 0, 958, 961, 1, 0, 0, 0, 959, 961, 3, 140, 70, 0, 960, 947, 1, 0, 0, 0, 960, 954, 1, 0, 0, 0, 960, 959, 1, 0, 0, 0, 961, 135, 1, 0, 0, 0, 962, 965, 3, 144, 72, 0, 963, 964, 5, 18, 0, 0, 964, 966, 3, 136, 68, 0, 965, 963, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 969, 1, 0, 0, 0, 967, 969, 3, 140, 70, 0, 968, 962, 1, 0, 0, 0, 968, 967, 1, 0, 0, 0, 969, 137, 1, 0, 0, 0, 970, 980, 3, 96, 48, 0, 971, 972, 5, 18, 0, 0, 972, 974, 3, 96, 48, 0, 973, 971, 1, 0, 0, 0, 974, 977, 1, 0, 0, 0, 975, 973, 1, 0, 0, 0, 975, 976, 1, 0, 0, 0, 976, 981, 1, 0, 0, 0, 977, 975, 1, 0, 0, 0, 978, 979, 5, 38, 0, 0, 979, 981, 3, 80, 40, 0, 980, 975, 1, 0, 0, 0, 980, 978, 1, 0, 0, 0, 981, 139, 1, 0, 0, 0, 982, 987, 3, 142, 71, 0, 983, 984, 5, 18, 0, 0, 984, 986, 3, 142, 71, 0, 985, 983, 1, 0, 0, 0, 986, 989, 1, 0, 0, 0, 987, 985, 1, 0, 0, 0, 987, 988, 1, 0, 0, 0, 988, 141, 1, 0, 0, 0, 989, 987, 1, 0, 0, 0, 990, 991, 5, 74, 0, 0, 991, 992, 5, 12, 0, 0, 992, 993, 3, 144, 72, 0, 993, 143, 1, 0, 0, 0, 994, 997, 3, 146, 73, 0, 995, 997, 3, 96, 48, 0, 996, 994, 1, 0, 0, 0, 996, 995, 1, 0, 0, 0, 997, 145, 1, 0, 0, 0, 998, 999, 5, 11, 0, 0, 999, 1000, 3, 126, 63, 0, 1000, 1002, 5, 14, 0, 0, 1001, 1003, 3, 140, 70, 0, 1002, 1001, 1, 0, 0, 0, 1002, 1003, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 5, 16, 0, 0, 1005, 147, 1, 0, 0, 0, 1006, 1008, 3, 96, 48, 0, 1007, 1006, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1015, 1, 0, 0, 0, 1009, 1011, 5, 18, 0, 0, 1010, 1012, 3, 96, 48, 0, 1011, 1010, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1014, 1, 0, 0, 0, 1013, 1009, 1, 0, 0, 0, 1014, 1017, 1, 0, 0, 0, 1015, 1013, 1, 0, 0, 0, 1015, 1016, 1, 0, 0, 0, 1016, 149, 1, 0, 0, 0, 1017, 1015, 1, 0, 0, 0, 1018, 1023, 3, 96, 48, 0, 1019, 1020, 5, 18, 0, 0, 1020, 1022, 3, 96, 48, 0, 1021, 1019, 1, 0, 0, 0, 1022, 1025, 1, 0, 0, 0, 1023, 1021, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 151, 1, 0, 0, 0, 1025, 1023, 1, 0, 0, 0, 1026, 1027, 5, 67, 0, 0, 1027, 1032, 3, 154, 77, 0, 1028, 1029, 5, 18, 0, 0, 1029, 1031, 3, 154, 77, 0, 1030, 1028, 1, 0, 0, 0, 1031, 1034, 1, 0, 0, 0, 1032, 1030, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1035, 1, 0, 0, 0, 1034, 1032, 1, 0, 0, 0, 1035, 1036, 5, 68, 0, 0, 1036, 153, 1, 0, 0, 0, 1037, 1040, 5, 15, 0, 0, 1038, 1040, 3, 96, 48, 0, 1039, 1037, 1, 0, 0, 0, 1039, 1038, 1, 0, 0, 0, 1040, 155, 1, 0, 0, 0, 1041, 1043, 3, 158, 79, 0, 1042, 1044, 3, 160, 80, 0, 1043, 1042, 1, 0, 0, 0, 1043, 1044, 1, 0, 0, 0, 1044, 157, 1, 0, 0, 0, 1045, 1050, 5, 77, 0, 0, 1046, 1047, 5, 55, 0, 0, 1047, 1049, 5, 77, 0, 0, 1048, 1046, 1, 0, 0, 0, 1049, 1052, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1050, 1051, 1, 0, 0, 0, 1051, 1054, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1053, 1045, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 159, 1, 0, 0, 0, 1055, 1056, 5, 72, 0, 0, 1056, 1057, 3, 56, 28, 0, 1057, 161, 1, 0, 0, 0, 129, 166, 172, 177, 179, 183, 191, 204, 209, 212, 215, 218, 223, 234, 238, 243, 246, 249, 264, 277, 284, 291, 300, 310, 314, 322, 325, 327, 331, 335, 338, 341, 344, 349, 355, 362, 367, 373, 383, 397, 404, 410, 421, 429, 438, 441, 443, 447, 462, 468, 471, 478, 486, 489, 494, 500, 504, 513, 517, 525, 530, 534, 538, 543, 549, 552, 558, 573, 585, 596, 601, 610, 613, 626, 637, 642, 651, 654, 667, 681, 699, 713, 724, 729, 743, 754, 759, 786, 790, 803, 814, 816, 823, 831, 835, 843, 848, 856, 867, 875, 885, 891, 899, 909, 912, 921, 925, 929, 934, 938, 943, 952, 957, 960, 965, 968, 975, 980, 987, 996, 1002, 1007, 1011, 1015, 1023, 1032, 1039, 1043, 1050, 1053] \ No newline at end of file diff --git a/src/antlr_generated/BaseModelicaParser.py b/src/antlr_generated/BaseModelicaParser.py index d3ed44b..942bcb9 100644 --- a/src/antlr_generated/BaseModelicaParser.py +++ b/src/antlr_generated/BaseModelicaParser.py @@ -107,304 +107,304 @@ def serializedATN(): 80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116, 118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148, 150,152,154,156,158,160,0,7,1,0,19,20,3,0,9,9,25,25,30,30,1,0,49, - 54,1,0,55,58,1,0,59,62,1,0,63,64,3,0,8,8,17,17,22,22,1129,0,162, - 1,0,0,0,2,197,1,0,0,0,4,199,1,0,0,0,6,218,1,0,0,0,8,223,1,0,0,0, - 10,225,1,0,0,0,12,231,1,0,0,0,14,253,1,0,0,0,16,270,1,0,0,0,18,272, - 1,0,0,0,20,280,1,0,0,0,22,291,1,0,0,0,24,357,1,0,0,0,26,362,1,0, - 0,0,28,373,1,0,0,0,30,375,1,0,0,0,32,377,1,0,0,0,34,387,1,0,0,0, - 36,392,1,0,0,0,38,413,1,0,0,0,40,447,1,0,0,0,42,455,1,0,0,0,44,459, - 1,0,0,0,46,468,1,0,0,0,48,473,1,0,0,0,50,481,1,0,0,0,52,484,1,0, - 0,0,54,500,1,0,0,0,56,502,1,0,0,0,58,508,1,0,0,0,60,517,1,0,0,0, - 62,521,1,0,0,0,64,523,1,0,0,0,66,530,1,0,0,0,68,549,1,0,0,0,70,552, - 1,0,0,0,72,577,1,0,0,0,74,618,1,0,0,0,76,659,1,0,0,0,78,673,1,0, - 0,0,80,687,1,0,0,0,82,691,1,0,0,0,84,705,1,0,0,0,86,735,1,0,0,0, - 88,765,1,0,0,0,90,772,1,0,0,0,92,779,1,0,0,0,94,781,1,0,0,0,96,784, - 1,0,0,0,98,790,1,0,0,0,100,792,1,0,0,0,102,809,1,0,0,0,104,818,1, - 0,0,0,106,826,1,0,0,0,108,835,1,0,0,0,110,839,1,0,0,0,112,845,1, - 0,0,0,114,848,1,0,0,0,116,859,1,0,0,0,118,861,1,0,0,0,120,870,1, - 0,0,0,122,872,1,0,0,0,124,909,1,0,0,0,126,912,1,0,0,0,128,916,1, - 0,0,0,130,925,1,0,0,0,132,941,1,0,0,0,134,960,1,0,0,0,136,968,1, - 0,0,0,138,970,1,0,0,0,140,982,1,0,0,0,142,990,1,0,0,0,144,996,1, - 0,0,0,146,998,1,0,0,0,148,1007,1,0,0,0,150,1018,1,0,0,0,152,1026, - 1,0,0,0,154,1039,1,0,0,0,156,1041,1,0,0,0,158,1053,1,0,0,0,160,1055, - 1,0,0,0,162,163,3,2,1,0,163,164,5,1,0,0,164,179,5,74,0,0,165,167, - 3,94,47,0,166,165,1,0,0,0,166,167,1,0,0,0,167,168,1,0,0,0,168,169, - 3,4,2,0,169,170,5,2,0,0,170,178,1,0,0,0,171,173,3,94,47,0,172,171, - 1,0,0,0,172,173,1,0,0,0,173,174,1,0,0,0,174,175,3,44,22,0,175,176, - 5,2,0,0,176,178,1,0,0,0,177,166,1,0,0,0,177,172,1,0,0,0,178,181, - 1,0,0,0,179,177,1,0,0,0,179,180,1,0,0,0,180,183,1,0,0,0,181,179, - 1,0,0,0,182,184,3,94,47,0,183,182,1,0,0,0,183,184,1,0,0,0,184,185, - 1,0,0,0,185,186,5,3,0,0,186,187,3,10,5,0,187,191,5,2,0,0,188,189, - 3,160,80,0,189,190,5,2,0,0,190,192,1,0,0,0,191,188,1,0,0,0,191,192, - 1,0,0,0,192,193,1,0,0,0,193,194,5,4,0,0,194,195,5,74,0,0,195,196, - 5,2,0,0,196,1,1,0,0,0,197,198,5,73,0,0,198,3,1,0,0,0,199,200,3,6, - 3,0,200,201,3,8,4,0,201,5,1,0,0,0,202,219,5,5,0,0,203,205,5,6,0, - 0,204,203,1,0,0,0,204,205,1,0,0,0,205,206,1,0,0,0,206,219,5,7,0, - 0,207,209,5,8,0,0,208,210,5,9,0,0,209,208,1,0,0,0,209,210,1,0,0, - 0,210,213,1,0,0,0,211,213,5,10,0,0,212,207,1,0,0,0,212,211,1,0,0, - 0,212,213,1,0,0,0,213,215,1,0,0,0,214,216,5,6,0,0,215,214,1,0,0, - 0,215,216,1,0,0,0,216,217,1,0,0,0,217,219,5,11,0,0,218,202,1,0,0, - 0,218,204,1,0,0,0,218,212,1,0,0,0,219,7,1,0,0,0,220,224,3,10,5,0, - 221,224,3,12,6,0,222,224,3,14,7,0,223,220,1,0,0,0,223,221,1,0,0, - 0,223,222,1,0,0,0,224,9,1,0,0,0,225,226,5,74,0,0,226,227,3,158,79, - 0,227,228,3,22,11,0,228,229,5,4,0,0,229,230,5,74,0,0,230,11,1,0, - 0,0,231,232,5,74,0,0,232,249,5,12,0,0,233,235,3,16,8,0,234,233,1, - 0,0,0,234,235,1,0,0,0,235,236,1,0,0,0,236,238,3,126,63,0,237,239, - 3,56,28,0,238,237,1,0,0,0,238,239,1,0,0,0,239,250,1,0,0,0,240,241, - 5,13,0,0,241,246,5,14,0,0,242,244,3,18,9,0,243,242,1,0,0,0,243,244, - 1,0,0,0,244,247,1,0,0,0,245,247,5,15,0,0,246,243,1,0,0,0,246,245, - 1,0,0,0,247,248,1,0,0,0,248,250,5,16,0,0,249,234,1,0,0,0,249,240, - 1,0,0,0,250,251,1,0,0,0,251,252,3,156,78,0,252,13,1,0,0,0,253,254, - 5,74,0,0,254,255,5,12,0,0,255,256,5,17,0,0,256,257,5,14,0,0,257, - 258,3,126,63,0,258,259,5,18,0,0,259,264,5,74,0,0,260,261,5,18,0, - 0,261,263,5,74,0,0,262,260,1,0,0,0,263,266,1,0,0,0,264,262,1,0,0, - 0,264,265,1,0,0,0,265,267,1,0,0,0,266,264,1,0,0,0,267,268,5,16,0, - 0,268,269,3,156,78,0,269,15,1,0,0,0,270,271,7,0,0,0,271,17,1,0,0, - 0,272,277,3,20,10,0,273,274,5,18,0,0,274,276,3,20,10,0,275,273,1, - 0,0,0,276,279,1,0,0,0,277,275,1,0,0,0,277,278,1,0,0,0,278,19,1,0, - 0,0,279,277,1,0,0,0,280,281,5,74,0,0,281,282,3,156,78,0,282,21,1, - 0,0,0,283,285,3,94,47,0,284,283,1,0,0,0,284,285,1,0,0,0,285,286, - 1,0,0,0,286,287,3,28,14,0,287,288,5,2,0,0,288,290,1,0,0,0,289,284, - 1,0,0,0,290,293,1,0,0,0,291,289,1,0,0,0,291,292,1,0,0,0,292,327, - 1,0,0,0,293,291,1,0,0,0,294,300,5,21,0,0,295,296,3,66,33,0,296,297, - 5,2,0,0,297,299,1,0,0,0,298,295,1,0,0,0,299,302,1,0,0,0,300,298, - 1,0,0,0,300,301,1,0,0,0,301,326,1,0,0,0,302,300,1,0,0,0,303,304, - 5,22,0,0,304,310,5,21,0,0,305,306,3,68,34,0,306,307,5,2,0,0,307, - 309,1,0,0,0,308,305,1,0,0,0,309,312,1,0,0,0,310,308,1,0,0,0,310, - 311,1,0,0,0,311,326,1,0,0,0,312,310,1,0,0,0,313,315,5,22,0,0,314, - 313,1,0,0,0,314,315,1,0,0,0,315,316,1,0,0,0,316,322,5,23,0,0,317, - 318,3,70,35,0,318,319,5,2,0,0,319,321,1,0,0,0,320,317,1,0,0,0,321, - 324,1,0,0,0,322,320,1,0,0,0,322,323,1,0,0,0,323,326,1,0,0,0,324, - 322,1,0,0,0,325,294,1,0,0,0,325,303,1,0,0,0,325,314,1,0,0,0,326, - 329,1,0,0,0,327,325,1,0,0,0,327,328,1,0,0,0,328,344,1,0,0,0,329, - 327,1,0,0,0,330,332,3,94,47,0,331,330,1,0,0,0,331,332,1,0,0,0,332, - 333,1,0,0,0,333,335,5,24,0,0,334,336,3,24,12,0,335,334,1,0,0,0,335, - 336,1,0,0,0,336,338,1,0,0,0,337,339,3,26,13,0,338,337,1,0,0,0,338, - 339,1,0,0,0,339,341,1,0,0,0,340,342,3,160,80,0,341,340,1,0,0,0,341, - 342,1,0,0,0,342,343,1,0,0,0,343,345,5,2,0,0,344,331,1,0,0,0,344, - 345,1,0,0,0,345,349,1,0,0,0,346,348,3,36,18,0,347,346,1,0,0,0,348, - 351,1,0,0,0,349,347,1,0,0,0,349,350,1,0,0,0,350,355,1,0,0,0,351, - 349,1,0,0,0,352,353,3,160,80,0,353,354,5,2,0,0,354,356,1,0,0,0,355, - 352,1,0,0,0,355,356,1,0,0,0,356,23,1,0,0,0,357,358,5,77,0,0,358, - 25,1,0,0,0,359,360,3,130,65,0,360,361,5,12,0,0,361,363,1,0,0,0,362, - 359,1,0,0,0,362,363,1,0,0,0,363,364,1,0,0,0,364,365,5,74,0,0,365, - 367,5,14,0,0,366,368,3,150,75,0,367,366,1,0,0,0,367,368,1,0,0,0, - 368,369,1,0,0,0,369,370,5,16,0,0,370,27,1,0,0,0,371,374,3,30,15, - 0,372,374,3,32,16,0,373,371,1,0,0,0,373,372,1,0,0,0,374,29,1,0,0, - 0,375,376,3,42,21,0,376,31,1,0,0,0,377,378,5,25,0,0,378,379,5,21, - 0,0,379,380,3,34,17,0,380,383,5,12,0,0,381,384,3,96,48,0,382,384, - 3,90,45,0,383,381,1,0,0,0,383,382,1,0,0,0,384,385,1,0,0,0,385,386, - 3,156,78,0,386,33,1,0,0,0,387,388,5,26,0,0,388,389,5,14,0,0,389, - 390,3,130,65,0,390,391,5,16,0,0,391,35,1,0,0,0,392,393,5,27,0,0, - 393,397,3,158,79,0,394,395,3,160,80,0,395,396,5,2,0,0,396,398,1, - 0,0,0,397,394,1,0,0,0,397,398,1,0,0,0,398,404,1,0,0,0,399,400,3, - 40,20,0,400,401,5,2,0,0,401,403,1,0,0,0,402,399,1,0,0,0,403,406, - 1,0,0,0,404,402,1,0,0,0,404,405,1,0,0,0,405,410,1,0,0,0,406,404, - 1,0,0,0,407,409,3,38,19,0,408,407,1,0,0,0,409,412,1,0,0,0,410,408, - 1,0,0,0,410,411,1,0,0,0,411,37,1,0,0,0,412,410,1,0,0,0,413,414,5, - 28,0,0,414,415,5,14,0,0,415,416,3,58,29,0,416,417,5,16,0,0,417,421, - 3,158,79,0,418,419,3,160,80,0,419,420,5,2,0,0,420,422,1,0,0,0,421, - 418,1,0,0,0,421,422,1,0,0,0,422,443,1,0,0,0,423,429,5,21,0,0,424, - 425,3,66,33,0,425,426,5,2,0,0,426,428,1,0,0,0,427,424,1,0,0,0,428, - 431,1,0,0,0,429,427,1,0,0,0,429,430,1,0,0,0,430,442,1,0,0,0,431, - 429,1,0,0,0,432,438,5,23,0,0,433,434,3,70,35,0,434,435,5,2,0,0,435, - 437,1,0,0,0,436,433,1,0,0,0,437,440,1,0,0,0,438,436,1,0,0,0,438, - 439,1,0,0,0,439,442,1,0,0,0,440,438,1,0,0,0,441,423,1,0,0,0,441, - 432,1,0,0,0,442,445,1,0,0,0,443,441,1,0,0,0,443,444,1,0,0,0,444, - 39,1,0,0,0,445,443,1,0,0,0,446,448,3,94,47,0,447,446,1,0,0,0,447, - 448,1,0,0,0,448,449,1,0,0,0,449,450,5,29,0,0,450,451,5,74,0,0,451, - 452,5,12,0,0,452,453,3,96,48,0,453,454,3,156,78,0,454,41,1,0,0,0, - 455,456,3,46,23,0,456,457,3,126,63,0,457,458,3,48,24,0,458,43,1, - 0,0,0,459,460,5,9,0,0,460,462,3,126,63,0,461,463,3,152,76,0,462, - 461,1,0,0,0,462,463,1,0,0,0,463,464,1,0,0,0,464,465,3,52,26,0,465, - 466,3,156,78,0,466,45,1,0,0,0,467,469,7,1,0,0,468,467,1,0,0,0,468, - 469,1,0,0,0,469,471,1,0,0,0,470,472,7,0,0,0,471,470,1,0,0,0,471, - 472,1,0,0,0,472,47,1,0,0,0,473,478,3,50,25,0,474,475,5,18,0,0,475, - 477,3,50,25,0,476,474,1,0,0,0,477,480,1,0,0,0,478,476,1,0,0,0,478, - 479,1,0,0,0,479,49,1,0,0,0,480,478,1,0,0,0,481,482,3,52,26,0,482, - 483,3,156,78,0,483,51,1,0,0,0,484,486,5,74,0,0,485,487,3,152,76, - 0,486,485,1,0,0,0,486,487,1,0,0,0,487,489,1,0,0,0,488,490,3,54,27, - 0,489,488,1,0,0,0,489,490,1,0,0,0,490,53,1,0,0,0,491,494,3,56,28, - 0,492,493,5,12,0,0,493,495,3,96,48,0,494,492,1,0,0,0,494,495,1,0, - 0,0,495,501,1,0,0,0,496,497,5,12,0,0,497,501,3,96,48,0,498,499,5, - 31,0,0,499,501,3,96,48,0,500,491,1,0,0,0,500,496,1,0,0,0,500,498, - 1,0,0,0,501,55,1,0,0,0,502,504,5,14,0,0,503,505,3,58,29,0,504,503, - 1,0,0,0,504,505,1,0,0,0,505,506,1,0,0,0,506,507,5,16,0,0,507,57, - 1,0,0,0,508,513,3,60,30,0,509,510,5,18,0,0,510,512,3,60,30,0,511, - 509,1,0,0,0,512,515,1,0,0,0,513,511,1,0,0,0,513,514,1,0,0,0,514, - 59,1,0,0,0,515,513,1,0,0,0,516,518,3,94,47,0,517,516,1,0,0,0,517, - 518,1,0,0,0,518,519,1,0,0,0,519,520,3,62,31,0,520,61,1,0,0,0,521, - 522,3,64,32,0,522,63,1,0,0,0,523,525,3,128,64,0,524,526,3,54,27, - 0,525,524,1,0,0,0,525,526,1,0,0,0,526,527,1,0,0,0,527,528,3,158, - 79,0,528,65,1,0,0,0,529,531,3,94,47,0,530,529,1,0,0,0,530,531,1, - 0,0,0,531,543,1,0,0,0,532,534,3,102,51,0,533,535,3,94,47,0,534,533, - 1,0,0,0,534,535,1,0,0,0,535,538,1,0,0,0,536,537,5,12,0,0,537,539, - 3,96,48,0,538,536,1,0,0,0,538,539,1,0,0,0,539,544,1,0,0,0,540,544, - 3,72,36,0,541,544,3,76,38,0,542,544,3,84,42,0,543,532,1,0,0,0,543, - 540,1,0,0,0,543,541,1,0,0,0,543,542,1,0,0,0,544,545,1,0,0,0,545, - 546,3,156,78,0,546,67,1,0,0,0,547,550,3,66,33,0,548,550,3,88,44, - 0,549,547,1,0,0,0,549,548,1,0,0,0,550,69,1,0,0,0,551,553,3,94,47, - 0,552,551,1,0,0,0,552,553,1,0,0,0,553,573,1,0,0,0,554,558,3,130, - 65,0,555,556,5,31,0,0,556,559,3,96,48,0,557,559,3,132,66,0,558,555, - 1,0,0,0,558,557,1,0,0,0,559,574,1,0,0,0,560,561,5,14,0,0,561,562, - 3,148,74,0,562,563,5,16,0,0,563,564,5,31,0,0,564,565,3,130,65,0, - 565,566,3,132,66,0,566,574,1,0,0,0,567,574,5,32,0,0,568,574,5,33, - 0,0,569,574,3,74,37,0,570,574,3,78,39,0,571,574,3,82,41,0,572,574, - 3,86,43,0,573,554,1,0,0,0,573,560,1,0,0,0,573,567,1,0,0,0,573,568, - 1,0,0,0,573,569,1,0,0,0,573,570,1,0,0,0,573,571,1,0,0,0,573,572, - 1,0,0,0,574,575,1,0,0,0,575,576,3,156,78,0,576,71,1,0,0,0,577,578, - 5,34,0,0,578,579,3,96,48,0,579,585,5,35,0,0,580,581,3,66,33,0,581, - 582,5,2,0,0,582,584,1,0,0,0,583,580,1,0,0,0,584,587,1,0,0,0,585, - 583,1,0,0,0,585,586,1,0,0,0,586,601,1,0,0,0,587,585,1,0,0,0,588, - 589,5,36,0,0,589,590,3,96,48,0,590,596,5,35,0,0,591,592,3,66,33, - 0,592,593,5,2,0,0,593,595,1,0,0,0,594,591,1,0,0,0,595,598,1,0,0, - 0,596,594,1,0,0,0,596,597,1,0,0,0,597,600,1,0,0,0,598,596,1,0,0, - 0,599,588,1,0,0,0,600,603,1,0,0,0,601,599,1,0,0,0,601,602,1,0,0, - 0,602,613,1,0,0,0,603,601,1,0,0,0,604,610,5,37,0,0,605,606,3,66, - 33,0,606,607,5,2,0,0,607,609,1,0,0,0,608,605,1,0,0,0,609,612,1,0, - 0,0,610,608,1,0,0,0,610,611,1,0,0,0,611,614,1,0,0,0,612,610,1,0, - 0,0,613,604,1,0,0,0,613,614,1,0,0,0,614,615,1,0,0,0,615,616,5,4, - 0,0,616,617,5,34,0,0,617,73,1,0,0,0,618,619,5,34,0,0,619,620,3,96, - 48,0,620,626,5,35,0,0,621,622,3,70,35,0,622,623,5,2,0,0,623,625, - 1,0,0,0,624,621,1,0,0,0,625,628,1,0,0,0,626,624,1,0,0,0,626,627, - 1,0,0,0,627,642,1,0,0,0,628,626,1,0,0,0,629,630,5,36,0,0,630,631, - 3,96,48,0,631,637,5,35,0,0,632,633,3,70,35,0,633,634,5,2,0,0,634, - 636,1,0,0,0,635,632,1,0,0,0,636,639,1,0,0,0,637,635,1,0,0,0,637, - 638,1,0,0,0,638,641,1,0,0,0,639,637,1,0,0,0,640,629,1,0,0,0,641, - 644,1,0,0,0,642,640,1,0,0,0,642,643,1,0,0,0,643,654,1,0,0,0,644, - 642,1,0,0,0,645,651,5,37,0,0,646,647,3,70,35,0,647,648,5,2,0,0,648, - 650,1,0,0,0,649,646,1,0,0,0,650,653,1,0,0,0,651,649,1,0,0,0,651, - 652,1,0,0,0,652,655,1,0,0,0,653,651,1,0,0,0,654,645,1,0,0,0,654, - 655,1,0,0,0,655,656,1,0,0,0,656,657,5,4,0,0,657,658,5,34,0,0,658, - 75,1,0,0,0,659,660,5,38,0,0,660,661,3,80,40,0,661,667,5,39,0,0,662, - 663,3,66,33,0,663,664,5,2,0,0,664,666,1,0,0,0,665,662,1,0,0,0,666, - 669,1,0,0,0,667,665,1,0,0,0,667,668,1,0,0,0,668,670,1,0,0,0,669, - 667,1,0,0,0,670,671,5,4,0,0,671,672,5,38,0,0,672,77,1,0,0,0,673, - 674,5,38,0,0,674,675,3,80,40,0,675,681,5,39,0,0,676,677,3,70,35, - 0,677,678,5,2,0,0,678,680,1,0,0,0,679,676,1,0,0,0,680,683,1,0,0, - 0,681,679,1,0,0,0,681,682,1,0,0,0,682,684,1,0,0,0,683,681,1,0,0, - 0,684,685,5,4,0,0,685,686,5,38,0,0,686,79,1,0,0,0,687,688,5,74,0, - 0,688,689,5,40,0,0,689,690,3,96,48,0,690,81,1,0,0,0,691,692,5,41, - 0,0,692,693,3,96,48,0,693,699,5,39,0,0,694,695,3,70,35,0,695,696, - 5,2,0,0,696,698,1,0,0,0,697,694,1,0,0,0,698,701,1,0,0,0,699,697, - 1,0,0,0,699,700,1,0,0,0,700,702,1,0,0,0,701,699,1,0,0,0,702,703, - 5,4,0,0,703,704,5,41,0,0,704,83,1,0,0,0,705,706,5,42,0,0,706,707, - 3,96,48,0,707,713,5,35,0,0,708,709,3,66,33,0,709,710,5,2,0,0,710, - 712,1,0,0,0,711,708,1,0,0,0,712,715,1,0,0,0,713,711,1,0,0,0,713, - 714,1,0,0,0,714,729,1,0,0,0,715,713,1,0,0,0,716,717,5,43,0,0,717, - 718,3,96,48,0,718,724,5,35,0,0,719,720,3,66,33,0,720,721,5,2,0,0, - 721,723,1,0,0,0,722,719,1,0,0,0,723,726,1,0,0,0,724,722,1,0,0,0, - 724,725,1,0,0,0,725,728,1,0,0,0,726,724,1,0,0,0,727,716,1,0,0,0, - 728,731,1,0,0,0,729,727,1,0,0,0,729,730,1,0,0,0,730,732,1,0,0,0, - 731,729,1,0,0,0,732,733,5,4,0,0,733,734,5,42,0,0,734,85,1,0,0,0, - 735,736,5,42,0,0,736,737,3,96,48,0,737,743,5,35,0,0,738,739,3,70, - 35,0,739,740,5,2,0,0,740,742,1,0,0,0,741,738,1,0,0,0,742,745,1,0, - 0,0,743,741,1,0,0,0,743,744,1,0,0,0,744,759,1,0,0,0,745,743,1,0, - 0,0,746,747,5,43,0,0,747,748,3,96,48,0,748,754,5,35,0,0,749,750, - 3,70,35,0,750,751,5,2,0,0,751,753,1,0,0,0,752,749,1,0,0,0,753,756, - 1,0,0,0,754,752,1,0,0,0,754,755,1,0,0,0,755,758,1,0,0,0,756,754, - 1,0,0,0,757,746,1,0,0,0,758,761,1,0,0,0,759,757,1,0,0,0,759,760, - 1,0,0,0,760,762,1,0,0,0,761,759,1,0,0,0,762,763,5,4,0,0,763,764, - 5,42,0,0,764,87,1,0,0,0,765,766,5,44,0,0,766,767,5,14,0,0,767,768, - 3,130,65,0,768,769,5,18,0,0,769,770,3,92,46,0,770,771,5,16,0,0,771, - 89,1,0,0,0,772,773,5,44,0,0,773,774,5,14,0,0,774,775,3,96,48,0,775, - 776,5,18,0,0,776,777,3,92,46,0,777,778,5,16,0,0,778,91,1,0,0,0,779, - 780,3,96,48,0,780,93,1,0,0,0,781,782,5,45,0,0,782,783,5,76,0,0,783, - 95,1,0,0,0,784,786,3,98,49,0,785,787,3,94,47,0,786,785,1,0,0,0,786, - 787,1,0,0,0,787,97,1,0,0,0,788,791,3,102,51,0,789,791,3,100,50,0, - 790,788,1,0,0,0,790,789,1,0,0,0,791,99,1,0,0,0,792,793,5,34,0,0, - 793,794,3,98,49,0,794,795,5,35,0,0,795,803,3,98,49,0,796,797,5,36, - 0,0,797,798,3,98,49,0,798,799,5,35,0,0,799,800,3,98,49,0,800,802, - 1,0,0,0,801,796,1,0,0,0,802,805,1,0,0,0,803,801,1,0,0,0,803,804, - 1,0,0,0,804,806,1,0,0,0,805,803,1,0,0,0,806,807,5,37,0,0,807,808, - 3,98,49,0,808,101,1,0,0,0,809,816,3,104,52,0,810,811,5,15,0,0,811, - 814,3,104,52,0,812,813,5,15,0,0,813,815,3,104,52,0,814,812,1,0,0, - 0,814,815,1,0,0,0,815,817,1,0,0,0,816,810,1,0,0,0,816,817,1,0,0, - 0,817,103,1,0,0,0,818,823,3,106,53,0,819,820,5,46,0,0,820,822,3, - 106,53,0,821,819,1,0,0,0,822,825,1,0,0,0,823,821,1,0,0,0,823,824, - 1,0,0,0,824,105,1,0,0,0,825,823,1,0,0,0,826,831,3,108,54,0,827,828, - 5,47,0,0,828,830,3,108,54,0,829,827,1,0,0,0,830,833,1,0,0,0,831, - 829,1,0,0,0,831,832,1,0,0,0,832,107,1,0,0,0,833,831,1,0,0,0,834, - 836,5,48,0,0,835,834,1,0,0,0,835,836,1,0,0,0,836,837,1,0,0,0,837, - 838,3,110,55,0,838,109,1,0,0,0,839,843,3,114,57,0,840,841,3,112, - 56,0,841,842,3,114,57,0,842,844,1,0,0,0,843,840,1,0,0,0,843,844, - 1,0,0,0,844,111,1,0,0,0,845,846,7,2,0,0,846,113,1,0,0,0,847,849, - 3,116,58,0,848,847,1,0,0,0,848,849,1,0,0,0,849,850,1,0,0,0,850,856, - 3,118,59,0,851,852,3,116,58,0,852,853,3,118,59,0,853,855,1,0,0,0, - 854,851,1,0,0,0,855,858,1,0,0,0,856,854,1,0,0,0,856,857,1,0,0,0, - 857,115,1,0,0,0,858,856,1,0,0,0,859,860,7,3,0,0,860,117,1,0,0,0, - 861,867,3,122,61,0,862,863,3,120,60,0,863,864,3,122,61,0,864,866, - 1,0,0,0,865,862,1,0,0,0,866,869,1,0,0,0,867,865,1,0,0,0,867,868, - 1,0,0,0,868,119,1,0,0,0,869,867,1,0,0,0,870,871,7,4,0,0,871,121, - 1,0,0,0,872,875,3,124,62,0,873,874,7,5,0,0,874,876,3,124,62,0,875, - 873,1,0,0,0,875,876,1,0,0,0,876,123,1,0,0,0,877,910,5,75,0,0,878, - 910,5,77,0,0,879,910,5,65,0,0,880,910,5,66,0,0,881,882,7,6,0,0,882, - 910,3,132,66,0,883,885,3,130,65,0,884,886,3,132,66,0,885,884,1,0, - 0,0,885,886,1,0,0,0,886,910,1,0,0,0,887,888,5,14,0,0,888,889,3,148, - 74,0,889,891,5,16,0,0,890,892,3,152,76,0,891,890,1,0,0,0,891,892, - 1,0,0,0,892,910,1,0,0,0,893,894,5,67,0,0,894,899,3,150,75,0,895, - 896,5,2,0,0,896,898,3,150,75,0,897,895,1,0,0,0,898,901,1,0,0,0,899, - 897,1,0,0,0,899,900,1,0,0,0,900,902,1,0,0,0,901,899,1,0,0,0,902, - 903,5,68,0,0,903,910,1,0,0,0,904,905,5,69,0,0,905,906,3,138,69,0, - 906,907,5,70,0,0,907,910,1,0,0,0,908,910,5,4,0,0,909,877,1,0,0,0, - 909,878,1,0,0,0,909,879,1,0,0,0,909,880,1,0,0,0,909,881,1,0,0,0, - 909,883,1,0,0,0,909,887,1,0,0,0,909,893,1,0,0,0,909,904,1,0,0,0, - 909,908,1,0,0,0,910,125,1,0,0,0,911,913,5,71,0,0,912,911,1,0,0,0, - 912,913,1,0,0,0,913,914,1,0,0,0,914,915,3,128,64,0,915,127,1,0,0, - 0,916,921,5,74,0,0,917,918,5,71,0,0,918,920,5,74,0,0,919,917,1,0, - 0,0,920,923,1,0,0,0,921,919,1,0,0,0,921,922,1,0,0,0,922,129,1,0, - 0,0,923,921,1,0,0,0,924,926,5,71,0,0,925,924,1,0,0,0,925,926,1,0, - 0,0,926,927,1,0,0,0,927,929,5,74,0,0,928,930,3,152,76,0,929,928, - 1,0,0,0,929,930,1,0,0,0,930,938,1,0,0,0,931,932,5,71,0,0,932,934, - 5,74,0,0,933,935,3,152,76,0,934,933,1,0,0,0,934,935,1,0,0,0,935, - 937,1,0,0,0,936,931,1,0,0,0,937,940,1,0,0,0,938,936,1,0,0,0,938, - 939,1,0,0,0,939,131,1,0,0,0,940,938,1,0,0,0,941,943,5,14,0,0,942, - 944,3,134,67,0,943,942,1,0,0,0,943,944,1,0,0,0,944,945,1,0,0,0,945, - 946,5,16,0,0,946,133,1,0,0,0,947,952,3,96,48,0,948,949,5,18,0,0, - 949,953,3,136,68,0,950,951,5,38,0,0,951,953,3,80,40,0,952,948,1, - 0,0,0,952,950,1,0,0,0,952,953,1,0,0,0,953,961,1,0,0,0,954,957,3, - 146,73,0,955,956,5,18,0,0,956,958,3,136,68,0,957,955,1,0,0,0,957, - 958,1,0,0,0,958,961,1,0,0,0,959,961,3,140,70,0,960,947,1,0,0,0,960, - 954,1,0,0,0,960,959,1,0,0,0,961,135,1,0,0,0,962,965,3,144,72,0,963, - 964,5,18,0,0,964,966,3,136,68,0,965,963,1,0,0,0,965,966,1,0,0,0, - 966,969,1,0,0,0,967,969,3,140,70,0,968,962,1,0,0,0,968,967,1,0,0, - 0,969,137,1,0,0,0,970,980,3,96,48,0,971,972,5,18,0,0,972,974,3,96, - 48,0,973,971,1,0,0,0,974,977,1,0,0,0,975,973,1,0,0,0,975,976,1,0, - 0,0,976,981,1,0,0,0,977,975,1,0,0,0,978,979,5,38,0,0,979,981,3,80, - 40,0,980,975,1,0,0,0,980,978,1,0,0,0,981,139,1,0,0,0,982,987,3,142, - 71,0,983,984,5,18,0,0,984,986,3,142,71,0,985,983,1,0,0,0,986,989, - 1,0,0,0,987,985,1,0,0,0,987,988,1,0,0,0,988,141,1,0,0,0,989,987, - 1,0,0,0,990,991,5,74,0,0,991,992,5,12,0,0,992,993,3,144,72,0,993, - 143,1,0,0,0,994,997,3,146,73,0,995,997,3,96,48,0,996,994,1,0,0,0, - 996,995,1,0,0,0,997,145,1,0,0,0,998,999,5,11,0,0,999,1000,3,126, - 63,0,1000,1002,5,14,0,0,1001,1003,3,140,70,0,1002,1001,1,0,0,0,1002, - 1003,1,0,0,0,1003,1004,1,0,0,0,1004,1005,5,16,0,0,1005,147,1,0,0, - 0,1006,1008,3,96,48,0,1007,1006,1,0,0,0,1007,1008,1,0,0,0,1008,1015, - 1,0,0,0,1009,1011,5,18,0,0,1010,1012,3,96,48,0,1011,1010,1,0,0,0, - 1011,1012,1,0,0,0,1012,1014,1,0,0,0,1013,1009,1,0,0,0,1014,1017, - 1,0,0,0,1015,1013,1,0,0,0,1015,1016,1,0,0,0,1016,149,1,0,0,0,1017, - 1015,1,0,0,0,1018,1023,3,96,48,0,1019,1020,5,18,0,0,1020,1022,3, - 96,48,0,1021,1019,1,0,0,0,1022,1025,1,0,0,0,1023,1021,1,0,0,0,1023, - 1024,1,0,0,0,1024,151,1,0,0,0,1025,1023,1,0,0,0,1026,1027,5,67,0, - 0,1027,1032,3,154,77,0,1028,1029,5,18,0,0,1029,1031,3,154,77,0,1030, - 1028,1,0,0,0,1031,1034,1,0,0,0,1032,1030,1,0,0,0,1032,1033,1,0,0, - 0,1033,1035,1,0,0,0,1034,1032,1,0,0,0,1035,1036,5,68,0,0,1036,153, - 1,0,0,0,1037,1040,5,15,0,0,1038,1040,3,96,48,0,1039,1037,1,0,0,0, - 1039,1038,1,0,0,0,1040,155,1,0,0,0,1041,1043,3,158,79,0,1042,1044, - 3,160,80,0,1043,1042,1,0,0,0,1043,1044,1,0,0,0,1044,157,1,0,0,0, - 1045,1050,5,77,0,0,1046,1047,5,55,0,0,1047,1049,5,77,0,0,1048,1046, - 1,0,0,0,1049,1052,1,0,0,0,1050,1048,1,0,0,0,1050,1051,1,0,0,0,1051, - 1054,1,0,0,0,1052,1050,1,0,0,0,1053,1045,1,0,0,0,1053,1054,1,0,0, - 0,1054,159,1,0,0,0,1055,1056,5,72,0,0,1056,1057,3,56,28,0,1057,161, - 1,0,0,0,129,166,172,177,179,183,191,204,209,212,215,218,223,234, - 238,243,246,249,264,277,284,291,300,310,314,322,325,327,331,335, - 338,341,344,349,355,362,367,373,383,397,404,410,421,429,438,441, - 443,447,462,468,471,478,486,489,494,500,504,513,517,525,530,534, - 538,543,549,552,558,573,585,596,601,610,613,626,637,642,651,654, - 667,681,699,713,724,729,743,754,759,786,790,803,814,816,823,831, - 835,843,848,856,867,875,885,891,899,909,912,921,925,929,934,938, - 943,952,957,960,965,968,975,980,987,996,1002,1007,1011,1015,1023, - 1032,1039,1043,1050,1053 + 54,1,0,55,58,1,0,59,62,1,0,63,64,4,0,8,8,17,17,22,22,29,29,1129, + 0,162,1,0,0,0,2,197,1,0,0,0,4,199,1,0,0,0,6,218,1,0,0,0,8,223,1, + 0,0,0,10,225,1,0,0,0,12,231,1,0,0,0,14,253,1,0,0,0,16,270,1,0,0, + 0,18,272,1,0,0,0,20,280,1,0,0,0,22,291,1,0,0,0,24,357,1,0,0,0,26, + 362,1,0,0,0,28,373,1,0,0,0,30,375,1,0,0,0,32,377,1,0,0,0,34,387, + 1,0,0,0,36,392,1,0,0,0,38,413,1,0,0,0,40,447,1,0,0,0,42,455,1,0, + 0,0,44,459,1,0,0,0,46,468,1,0,0,0,48,473,1,0,0,0,50,481,1,0,0,0, + 52,484,1,0,0,0,54,500,1,0,0,0,56,502,1,0,0,0,58,508,1,0,0,0,60,517, + 1,0,0,0,62,521,1,0,0,0,64,523,1,0,0,0,66,530,1,0,0,0,68,549,1,0, + 0,0,70,552,1,0,0,0,72,577,1,0,0,0,74,618,1,0,0,0,76,659,1,0,0,0, + 78,673,1,0,0,0,80,687,1,0,0,0,82,691,1,0,0,0,84,705,1,0,0,0,86,735, + 1,0,0,0,88,765,1,0,0,0,90,772,1,0,0,0,92,779,1,0,0,0,94,781,1,0, + 0,0,96,784,1,0,0,0,98,790,1,0,0,0,100,792,1,0,0,0,102,809,1,0,0, + 0,104,818,1,0,0,0,106,826,1,0,0,0,108,835,1,0,0,0,110,839,1,0,0, + 0,112,845,1,0,0,0,114,848,1,0,0,0,116,859,1,0,0,0,118,861,1,0,0, + 0,120,870,1,0,0,0,122,872,1,0,0,0,124,909,1,0,0,0,126,912,1,0,0, + 0,128,916,1,0,0,0,130,925,1,0,0,0,132,941,1,0,0,0,134,960,1,0,0, + 0,136,968,1,0,0,0,138,970,1,0,0,0,140,982,1,0,0,0,142,990,1,0,0, + 0,144,996,1,0,0,0,146,998,1,0,0,0,148,1007,1,0,0,0,150,1018,1,0, + 0,0,152,1026,1,0,0,0,154,1039,1,0,0,0,156,1041,1,0,0,0,158,1053, + 1,0,0,0,160,1055,1,0,0,0,162,163,3,2,1,0,163,164,5,1,0,0,164,179, + 5,74,0,0,165,167,3,94,47,0,166,165,1,0,0,0,166,167,1,0,0,0,167,168, + 1,0,0,0,168,169,3,4,2,0,169,170,5,2,0,0,170,178,1,0,0,0,171,173, + 3,94,47,0,172,171,1,0,0,0,172,173,1,0,0,0,173,174,1,0,0,0,174,175, + 3,44,22,0,175,176,5,2,0,0,176,178,1,0,0,0,177,166,1,0,0,0,177,172, + 1,0,0,0,178,181,1,0,0,0,179,177,1,0,0,0,179,180,1,0,0,0,180,183, + 1,0,0,0,181,179,1,0,0,0,182,184,3,94,47,0,183,182,1,0,0,0,183,184, + 1,0,0,0,184,185,1,0,0,0,185,186,5,3,0,0,186,187,3,10,5,0,187,191, + 5,2,0,0,188,189,3,160,80,0,189,190,5,2,0,0,190,192,1,0,0,0,191,188, + 1,0,0,0,191,192,1,0,0,0,192,193,1,0,0,0,193,194,5,4,0,0,194,195, + 5,74,0,0,195,196,5,2,0,0,196,1,1,0,0,0,197,198,5,73,0,0,198,3,1, + 0,0,0,199,200,3,6,3,0,200,201,3,8,4,0,201,5,1,0,0,0,202,219,5,5, + 0,0,203,205,5,6,0,0,204,203,1,0,0,0,204,205,1,0,0,0,205,206,1,0, + 0,0,206,219,5,7,0,0,207,209,5,8,0,0,208,210,5,9,0,0,209,208,1,0, + 0,0,209,210,1,0,0,0,210,213,1,0,0,0,211,213,5,10,0,0,212,207,1,0, + 0,0,212,211,1,0,0,0,212,213,1,0,0,0,213,215,1,0,0,0,214,216,5,6, + 0,0,215,214,1,0,0,0,215,216,1,0,0,0,216,217,1,0,0,0,217,219,5,11, + 0,0,218,202,1,0,0,0,218,204,1,0,0,0,218,212,1,0,0,0,219,7,1,0,0, + 0,220,224,3,10,5,0,221,224,3,12,6,0,222,224,3,14,7,0,223,220,1,0, + 0,0,223,221,1,0,0,0,223,222,1,0,0,0,224,9,1,0,0,0,225,226,5,74,0, + 0,226,227,3,158,79,0,227,228,3,22,11,0,228,229,5,4,0,0,229,230,5, + 74,0,0,230,11,1,0,0,0,231,232,5,74,0,0,232,249,5,12,0,0,233,235, + 3,16,8,0,234,233,1,0,0,0,234,235,1,0,0,0,235,236,1,0,0,0,236,238, + 3,126,63,0,237,239,3,56,28,0,238,237,1,0,0,0,238,239,1,0,0,0,239, + 250,1,0,0,0,240,241,5,13,0,0,241,246,5,14,0,0,242,244,3,18,9,0,243, + 242,1,0,0,0,243,244,1,0,0,0,244,247,1,0,0,0,245,247,5,15,0,0,246, + 243,1,0,0,0,246,245,1,0,0,0,247,248,1,0,0,0,248,250,5,16,0,0,249, + 234,1,0,0,0,249,240,1,0,0,0,250,251,1,0,0,0,251,252,3,156,78,0,252, + 13,1,0,0,0,253,254,5,74,0,0,254,255,5,12,0,0,255,256,5,17,0,0,256, + 257,5,14,0,0,257,258,3,126,63,0,258,259,5,18,0,0,259,264,5,74,0, + 0,260,261,5,18,0,0,261,263,5,74,0,0,262,260,1,0,0,0,263,266,1,0, + 0,0,264,262,1,0,0,0,264,265,1,0,0,0,265,267,1,0,0,0,266,264,1,0, + 0,0,267,268,5,16,0,0,268,269,3,156,78,0,269,15,1,0,0,0,270,271,7, + 0,0,0,271,17,1,0,0,0,272,277,3,20,10,0,273,274,5,18,0,0,274,276, + 3,20,10,0,275,273,1,0,0,0,276,279,1,0,0,0,277,275,1,0,0,0,277,278, + 1,0,0,0,278,19,1,0,0,0,279,277,1,0,0,0,280,281,5,74,0,0,281,282, + 3,156,78,0,282,21,1,0,0,0,283,285,3,94,47,0,284,283,1,0,0,0,284, + 285,1,0,0,0,285,286,1,0,0,0,286,287,3,28,14,0,287,288,5,2,0,0,288, + 290,1,0,0,0,289,284,1,0,0,0,290,293,1,0,0,0,291,289,1,0,0,0,291, + 292,1,0,0,0,292,327,1,0,0,0,293,291,1,0,0,0,294,300,5,21,0,0,295, + 296,3,66,33,0,296,297,5,2,0,0,297,299,1,0,0,0,298,295,1,0,0,0,299, + 302,1,0,0,0,300,298,1,0,0,0,300,301,1,0,0,0,301,326,1,0,0,0,302, + 300,1,0,0,0,303,304,5,22,0,0,304,310,5,21,0,0,305,306,3,68,34,0, + 306,307,5,2,0,0,307,309,1,0,0,0,308,305,1,0,0,0,309,312,1,0,0,0, + 310,308,1,0,0,0,310,311,1,0,0,0,311,326,1,0,0,0,312,310,1,0,0,0, + 313,315,5,22,0,0,314,313,1,0,0,0,314,315,1,0,0,0,315,316,1,0,0,0, + 316,322,5,23,0,0,317,318,3,70,35,0,318,319,5,2,0,0,319,321,1,0,0, + 0,320,317,1,0,0,0,321,324,1,0,0,0,322,320,1,0,0,0,322,323,1,0,0, + 0,323,326,1,0,0,0,324,322,1,0,0,0,325,294,1,0,0,0,325,303,1,0,0, + 0,325,314,1,0,0,0,326,329,1,0,0,0,327,325,1,0,0,0,327,328,1,0,0, + 0,328,344,1,0,0,0,329,327,1,0,0,0,330,332,3,94,47,0,331,330,1,0, + 0,0,331,332,1,0,0,0,332,333,1,0,0,0,333,335,5,24,0,0,334,336,3,24, + 12,0,335,334,1,0,0,0,335,336,1,0,0,0,336,338,1,0,0,0,337,339,3,26, + 13,0,338,337,1,0,0,0,338,339,1,0,0,0,339,341,1,0,0,0,340,342,3,160, + 80,0,341,340,1,0,0,0,341,342,1,0,0,0,342,343,1,0,0,0,343,345,5,2, + 0,0,344,331,1,0,0,0,344,345,1,0,0,0,345,349,1,0,0,0,346,348,3,36, + 18,0,347,346,1,0,0,0,348,351,1,0,0,0,349,347,1,0,0,0,349,350,1,0, + 0,0,350,355,1,0,0,0,351,349,1,0,0,0,352,353,3,160,80,0,353,354,5, + 2,0,0,354,356,1,0,0,0,355,352,1,0,0,0,355,356,1,0,0,0,356,23,1,0, + 0,0,357,358,5,77,0,0,358,25,1,0,0,0,359,360,3,130,65,0,360,361,5, + 12,0,0,361,363,1,0,0,0,362,359,1,0,0,0,362,363,1,0,0,0,363,364,1, + 0,0,0,364,365,5,74,0,0,365,367,5,14,0,0,366,368,3,150,75,0,367,366, + 1,0,0,0,367,368,1,0,0,0,368,369,1,0,0,0,369,370,5,16,0,0,370,27, + 1,0,0,0,371,374,3,30,15,0,372,374,3,32,16,0,373,371,1,0,0,0,373, + 372,1,0,0,0,374,29,1,0,0,0,375,376,3,42,21,0,376,31,1,0,0,0,377, + 378,5,25,0,0,378,379,5,21,0,0,379,380,3,34,17,0,380,383,5,12,0,0, + 381,384,3,96,48,0,382,384,3,90,45,0,383,381,1,0,0,0,383,382,1,0, + 0,0,384,385,1,0,0,0,385,386,3,156,78,0,386,33,1,0,0,0,387,388,5, + 26,0,0,388,389,5,14,0,0,389,390,3,130,65,0,390,391,5,16,0,0,391, + 35,1,0,0,0,392,393,5,27,0,0,393,397,3,158,79,0,394,395,3,160,80, + 0,395,396,5,2,0,0,396,398,1,0,0,0,397,394,1,0,0,0,397,398,1,0,0, + 0,398,404,1,0,0,0,399,400,3,40,20,0,400,401,5,2,0,0,401,403,1,0, + 0,0,402,399,1,0,0,0,403,406,1,0,0,0,404,402,1,0,0,0,404,405,1,0, + 0,0,405,410,1,0,0,0,406,404,1,0,0,0,407,409,3,38,19,0,408,407,1, + 0,0,0,409,412,1,0,0,0,410,408,1,0,0,0,410,411,1,0,0,0,411,37,1,0, + 0,0,412,410,1,0,0,0,413,414,5,28,0,0,414,415,5,14,0,0,415,416,3, + 58,29,0,416,417,5,16,0,0,417,421,3,158,79,0,418,419,3,160,80,0,419, + 420,5,2,0,0,420,422,1,0,0,0,421,418,1,0,0,0,421,422,1,0,0,0,422, + 443,1,0,0,0,423,429,5,21,0,0,424,425,3,66,33,0,425,426,5,2,0,0,426, + 428,1,0,0,0,427,424,1,0,0,0,428,431,1,0,0,0,429,427,1,0,0,0,429, + 430,1,0,0,0,430,442,1,0,0,0,431,429,1,0,0,0,432,438,5,23,0,0,433, + 434,3,70,35,0,434,435,5,2,0,0,435,437,1,0,0,0,436,433,1,0,0,0,437, + 440,1,0,0,0,438,436,1,0,0,0,438,439,1,0,0,0,439,442,1,0,0,0,440, + 438,1,0,0,0,441,423,1,0,0,0,441,432,1,0,0,0,442,445,1,0,0,0,443, + 441,1,0,0,0,443,444,1,0,0,0,444,39,1,0,0,0,445,443,1,0,0,0,446,448, + 3,94,47,0,447,446,1,0,0,0,447,448,1,0,0,0,448,449,1,0,0,0,449,450, + 5,29,0,0,450,451,5,74,0,0,451,452,5,12,0,0,452,453,3,96,48,0,453, + 454,3,156,78,0,454,41,1,0,0,0,455,456,3,46,23,0,456,457,3,126,63, + 0,457,458,3,48,24,0,458,43,1,0,0,0,459,460,5,9,0,0,460,462,3,126, + 63,0,461,463,3,152,76,0,462,461,1,0,0,0,462,463,1,0,0,0,463,464, + 1,0,0,0,464,465,3,52,26,0,465,466,3,156,78,0,466,45,1,0,0,0,467, + 469,7,1,0,0,468,467,1,0,0,0,468,469,1,0,0,0,469,471,1,0,0,0,470, + 472,7,0,0,0,471,470,1,0,0,0,471,472,1,0,0,0,472,47,1,0,0,0,473,478, + 3,50,25,0,474,475,5,18,0,0,475,477,3,50,25,0,476,474,1,0,0,0,477, + 480,1,0,0,0,478,476,1,0,0,0,478,479,1,0,0,0,479,49,1,0,0,0,480,478, + 1,0,0,0,481,482,3,52,26,0,482,483,3,156,78,0,483,51,1,0,0,0,484, + 486,5,74,0,0,485,487,3,152,76,0,486,485,1,0,0,0,486,487,1,0,0,0, + 487,489,1,0,0,0,488,490,3,54,27,0,489,488,1,0,0,0,489,490,1,0,0, + 0,490,53,1,0,0,0,491,494,3,56,28,0,492,493,5,12,0,0,493,495,3,96, + 48,0,494,492,1,0,0,0,494,495,1,0,0,0,495,501,1,0,0,0,496,497,5,12, + 0,0,497,501,3,96,48,0,498,499,5,31,0,0,499,501,3,96,48,0,500,491, + 1,0,0,0,500,496,1,0,0,0,500,498,1,0,0,0,501,55,1,0,0,0,502,504,5, + 14,0,0,503,505,3,58,29,0,504,503,1,0,0,0,504,505,1,0,0,0,505,506, + 1,0,0,0,506,507,5,16,0,0,507,57,1,0,0,0,508,513,3,60,30,0,509,510, + 5,18,0,0,510,512,3,60,30,0,511,509,1,0,0,0,512,515,1,0,0,0,513,511, + 1,0,0,0,513,514,1,0,0,0,514,59,1,0,0,0,515,513,1,0,0,0,516,518,3, + 94,47,0,517,516,1,0,0,0,517,518,1,0,0,0,518,519,1,0,0,0,519,520, + 3,62,31,0,520,61,1,0,0,0,521,522,3,64,32,0,522,63,1,0,0,0,523,525, + 3,128,64,0,524,526,3,54,27,0,525,524,1,0,0,0,525,526,1,0,0,0,526, + 527,1,0,0,0,527,528,3,158,79,0,528,65,1,0,0,0,529,531,3,94,47,0, + 530,529,1,0,0,0,530,531,1,0,0,0,531,543,1,0,0,0,532,534,3,102,51, + 0,533,535,3,94,47,0,534,533,1,0,0,0,534,535,1,0,0,0,535,538,1,0, + 0,0,536,537,5,12,0,0,537,539,3,96,48,0,538,536,1,0,0,0,538,539,1, + 0,0,0,539,544,1,0,0,0,540,544,3,72,36,0,541,544,3,76,38,0,542,544, + 3,84,42,0,543,532,1,0,0,0,543,540,1,0,0,0,543,541,1,0,0,0,543,542, + 1,0,0,0,544,545,1,0,0,0,545,546,3,156,78,0,546,67,1,0,0,0,547,550, + 3,66,33,0,548,550,3,88,44,0,549,547,1,0,0,0,549,548,1,0,0,0,550, + 69,1,0,0,0,551,553,3,94,47,0,552,551,1,0,0,0,552,553,1,0,0,0,553, + 573,1,0,0,0,554,558,3,130,65,0,555,556,5,31,0,0,556,559,3,96,48, + 0,557,559,3,132,66,0,558,555,1,0,0,0,558,557,1,0,0,0,559,574,1,0, + 0,0,560,561,5,14,0,0,561,562,3,148,74,0,562,563,5,16,0,0,563,564, + 5,31,0,0,564,565,3,130,65,0,565,566,3,132,66,0,566,574,1,0,0,0,567, + 574,5,32,0,0,568,574,5,33,0,0,569,574,3,74,37,0,570,574,3,78,39, + 0,571,574,3,82,41,0,572,574,3,86,43,0,573,554,1,0,0,0,573,560,1, + 0,0,0,573,567,1,0,0,0,573,568,1,0,0,0,573,569,1,0,0,0,573,570,1, + 0,0,0,573,571,1,0,0,0,573,572,1,0,0,0,574,575,1,0,0,0,575,576,3, + 156,78,0,576,71,1,0,0,0,577,578,5,34,0,0,578,579,3,96,48,0,579,585, + 5,35,0,0,580,581,3,66,33,0,581,582,5,2,0,0,582,584,1,0,0,0,583,580, + 1,0,0,0,584,587,1,0,0,0,585,583,1,0,0,0,585,586,1,0,0,0,586,601, + 1,0,0,0,587,585,1,0,0,0,588,589,5,36,0,0,589,590,3,96,48,0,590,596, + 5,35,0,0,591,592,3,66,33,0,592,593,5,2,0,0,593,595,1,0,0,0,594,591, + 1,0,0,0,595,598,1,0,0,0,596,594,1,0,0,0,596,597,1,0,0,0,597,600, + 1,0,0,0,598,596,1,0,0,0,599,588,1,0,0,0,600,603,1,0,0,0,601,599, + 1,0,0,0,601,602,1,0,0,0,602,613,1,0,0,0,603,601,1,0,0,0,604,610, + 5,37,0,0,605,606,3,66,33,0,606,607,5,2,0,0,607,609,1,0,0,0,608,605, + 1,0,0,0,609,612,1,0,0,0,610,608,1,0,0,0,610,611,1,0,0,0,611,614, + 1,0,0,0,612,610,1,0,0,0,613,604,1,0,0,0,613,614,1,0,0,0,614,615, + 1,0,0,0,615,616,5,4,0,0,616,617,5,34,0,0,617,73,1,0,0,0,618,619, + 5,34,0,0,619,620,3,96,48,0,620,626,5,35,0,0,621,622,3,70,35,0,622, + 623,5,2,0,0,623,625,1,0,0,0,624,621,1,0,0,0,625,628,1,0,0,0,626, + 624,1,0,0,0,626,627,1,0,0,0,627,642,1,0,0,0,628,626,1,0,0,0,629, + 630,5,36,0,0,630,631,3,96,48,0,631,637,5,35,0,0,632,633,3,70,35, + 0,633,634,5,2,0,0,634,636,1,0,0,0,635,632,1,0,0,0,636,639,1,0,0, + 0,637,635,1,0,0,0,637,638,1,0,0,0,638,641,1,0,0,0,639,637,1,0,0, + 0,640,629,1,0,0,0,641,644,1,0,0,0,642,640,1,0,0,0,642,643,1,0,0, + 0,643,654,1,0,0,0,644,642,1,0,0,0,645,651,5,37,0,0,646,647,3,70, + 35,0,647,648,5,2,0,0,648,650,1,0,0,0,649,646,1,0,0,0,650,653,1,0, + 0,0,651,649,1,0,0,0,651,652,1,0,0,0,652,655,1,0,0,0,653,651,1,0, + 0,0,654,645,1,0,0,0,654,655,1,0,0,0,655,656,1,0,0,0,656,657,5,4, + 0,0,657,658,5,34,0,0,658,75,1,0,0,0,659,660,5,38,0,0,660,661,3,80, + 40,0,661,667,5,39,0,0,662,663,3,66,33,0,663,664,5,2,0,0,664,666, + 1,0,0,0,665,662,1,0,0,0,666,669,1,0,0,0,667,665,1,0,0,0,667,668, + 1,0,0,0,668,670,1,0,0,0,669,667,1,0,0,0,670,671,5,4,0,0,671,672, + 5,38,0,0,672,77,1,0,0,0,673,674,5,38,0,0,674,675,3,80,40,0,675,681, + 5,39,0,0,676,677,3,70,35,0,677,678,5,2,0,0,678,680,1,0,0,0,679,676, + 1,0,0,0,680,683,1,0,0,0,681,679,1,0,0,0,681,682,1,0,0,0,682,684, + 1,0,0,0,683,681,1,0,0,0,684,685,5,4,0,0,685,686,5,38,0,0,686,79, + 1,0,0,0,687,688,5,74,0,0,688,689,5,40,0,0,689,690,3,96,48,0,690, + 81,1,0,0,0,691,692,5,41,0,0,692,693,3,96,48,0,693,699,5,39,0,0,694, + 695,3,70,35,0,695,696,5,2,0,0,696,698,1,0,0,0,697,694,1,0,0,0,698, + 701,1,0,0,0,699,697,1,0,0,0,699,700,1,0,0,0,700,702,1,0,0,0,701, + 699,1,0,0,0,702,703,5,4,0,0,703,704,5,41,0,0,704,83,1,0,0,0,705, + 706,5,42,0,0,706,707,3,96,48,0,707,713,5,35,0,0,708,709,3,66,33, + 0,709,710,5,2,0,0,710,712,1,0,0,0,711,708,1,0,0,0,712,715,1,0,0, + 0,713,711,1,0,0,0,713,714,1,0,0,0,714,729,1,0,0,0,715,713,1,0,0, + 0,716,717,5,43,0,0,717,718,3,96,48,0,718,724,5,35,0,0,719,720,3, + 66,33,0,720,721,5,2,0,0,721,723,1,0,0,0,722,719,1,0,0,0,723,726, + 1,0,0,0,724,722,1,0,0,0,724,725,1,0,0,0,725,728,1,0,0,0,726,724, + 1,0,0,0,727,716,1,0,0,0,728,731,1,0,0,0,729,727,1,0,0,0,729,730, + 1,0,0,0,730,732,1,0,0,0,731,729,1,0,0,0,732,733,5,4,0,0,733,734, + 5,42,0,0,734,85,1,0,0,0,735,736,5,42,0,0,736,737,3,96,48,0,737,743, + 5,35,0,0,738,739,3,70,35,0,739,740,5,2,0,0,740,742,1,0,0,0,741,738, + 1,0,0,0,742,745,1,0,0,0,743,741,1,0,0,0,743,744,1,0,0,0,744,759, + 1,0,0,0,745,743,1,0,0,0,746,747,5,43,0,0,747,748,3,96,48,0,748,754, + 5,35,0,0,749,750,3,70,35,0,750,751,5,2,0,0,751,753,1,0,0,0,752,749, + 1,0,0,0,753,756,1,0,0,0,754,752,1,0,0,0,754,755,1,0,0,0,755,758, + 1,0,0,0,756,754,1,0,0,0,757,746,1,0,0,0,758,761,1,0,0,0,759,757, + 1,0,0,0,759,760,1,0,0,0,760,762,1,0,0,0,761,759,1,0,0,0,762,763, + 5,4,0,0,763,764,5,42,0,0,764,87,1,0,0,0,765,766,5,44,0,0,766,767, + 5,14,0,0,767,768,3,130,65,0,768,769,5,18,0,0,769,770,3,92,46,0,770, + 771,5,16,0,0,771,89,1,0,0,0,772,773,5,44,0,0,773,774,5,14,0,0,774, + 775,3,96,48,0,775,776,5,18,0,0,776,777,3,92,46,0,777,778,5,16,0, + 0,778,91,1,0,0,0,779,780,3,96,48,0,780,93,1,0,0,0,781,782,5,45,0, + 0,782,783,5,76,0,0,783,95,1,0,0,0,784,786,3,98,49,0,785,787,3,94, + 47,0,786,785,1,0,0,0,786,787,1,0,0,0,787,97,1,0,0,0,788,791,3,102, + 51,0,789,791,3,100,50,0,790,788,1,0,0,0,790,789,1,0,0,0,791,99,1, + 0,0,0,792,793,5,34,0,0,793,794,3,98,49,0,794,795,5,35,0,0,795,803, + 3,98,49,0,796,797,5,36,0,0,797,798,3,98,49,0,798,799,5,35,0,0,799, + 800,3,98,49,0,800,802,1,0,0,0,801,796,1,0,0,0,802,805,1,0,0,0,803, + 801,1,0,0,0,803,804,1,0,0,0,804,806,1,0,0,0,805,803,1,0,0,0,806, + 807,5,37,0,0,807,808,3,98,49,0,808,101,1,0,0,0,809,816,3,104,52, + 0,810,811,5,15,0,0,811,814,3,104,52,0,812,813,5,15,0,0,813,815,3, + 104,52,0,814,812,1,0,0,0,814,815,1,0,0,0,815,817,1,0,0,0,816,810, + 1,0,0,0,816,817,1,0,0,0,817,103,1,0,0,0,818,823,3,106,53,0,819,820, + 5,46,0,0,820,822,3,106,53,0,821,819,1,0,0,0,822,825,1,0,0,0,823, + 821,1,0,0,0,823,824,1,0,0,0,824,105,1,0,0,0,825,823,1,0,0,0,826, + 831,3,108,54,0,827,828,5,47,0,0,828,830,3,108,54,0,829,827,1,0,0, + 0,830,833,1,0,0,0,831,829,1,0,0,0,831,832,1,0,0,0,832,107,1,0,0, + 0,833,831,1,0,0,0,834,836,5,48,0,0,835,834,1,0,0,0,835,836,1,0,0, + 0,836,837,1,0,0,0,837,838,3,110,55,0,838,109,1,0,0,0,839,843,3,114, + 57,0,840,841,3,112,56,0,841,842,3,114,57,0,842,844,1,0,0,0,843,840, + 1,0,0,0,843,844,1,0,0,0,844,111,1,0,0,0,845,846,7,2,0,0,846,113, + 1,0,0,0,847,849,3,116,58,0,848,847,1,0,0,0,848,849,1,0,0,0,849,850, + 1,0,0,0,850,856,3,118,59,0,851,852,3,116,58,0,852,853,3,118,59,0, + 853,855,1,0,0,0,854,851,1,0,0,0,855,858,1,0,0,0,856,854,1,0,0,0, + 856,857,1,0,0,0,857,115,1,0,0,0,858,856,1,0,0,0,859,860,7,3,0,0, + 860,117,1,0,0,0,861,867,3,122,61,0,862,863,3,120,60,0,863,864,3, + 122,61,0,864,866,1,0,0,0,865,862,1,0,0,0,866,869,1,0,0,0,867,865, + 1,0,0,0,867,868,1,0,0,0,868,119,1,0,0,0,869,867,1,0,0,0,870,871, + 7,4,0,0,871,121,1,0,0,0,872,875,3,124,62,0,873,874,7,5,0,0,874,876, + 3,124,62,0,875,873,1,0,0,0,875,876,1,0,0,0,876,123,1,0,0,0,877,910, + 5,75,0,0,878,910,5,77,0,0,879,910,5,65,0,0,880,910,5,66,0,0,881, + 882,7,6,0,0,882,910,3,132,66,0,883,885,3,130,65,0,884,886,3,132, + 66,0,885,884,1,0,0,0,885,886,1,0,0,0,886,910,1,0,0,0,887,888,5,14, + 0,0,888,889,3,148,74,0,889,891,5,16,0,0,890,892,3,152,76,0,891,890, + 1,0,0,0,891,892,1,0,0,0,892,910,1,0,0,0,893,894,5,67,0,0,894,899, + 3,150,75,0,895,896,5,2,0,0,896,898,3,150,75,0,897,895,1,0,0,0,898, + 901,1,0,0,0,899,897,1,0,0,0,899,900,1,0,0,0,900,902,1,0,0,0,901, + 899,1,0,0,0,902,903,5,68,0,0,903,910,1,0,0,0,904,905,5,69,0,0,905, + 906,3,138,69,0,906,907,5,70,0,0,907,910,1,0,0,0,908,910,5,4,0,0, + 909,877,1,0,0,0,909,878,1,0,0,0,909,879,1,0,0,0,909,880,1,0,0,0, + 909,881,1,0,0,0,909,883,1,0,0,0,909,887,1,0,0,0,909,893,1,0,0,0, + 909,904,1,0,0,0,909,908,1,0,0,0,910,125,1,0,0,0,911,913,5,71,0,0, + 912,911,1,0,0,0,912,913,1,0,0,0,913,914,1,0,0,0,914,915,3,128,64, + 0,915,127,1,0,0,0,916,921,5,74,0,0,917,918,5,71,0,0,918,920,5,74, + 0,0,919,917,1,0,0,0,920,923,1,0,0,0,921,919,1,0,0,0,921,922,1,0, + 0,0,922,129,1,0,0,0,923,921,1,0,0,0,924,926,5,71,0,0,925,924,1,0, + 0,0,925,926,1,0,0,0,926,927,1,0,0,0,927,929,5,74,0,0,928,930,3,152, + 76,0,929,928,1,0,0,0,929,930,1,0,0,0,930,938,1,0,0,0,931,932,5,71, + 0,0,932,934,5,74,0,0,933,935,3,152,76,0,934,933,1,0,0,0,934,935, + 1,0,0,0,935,937,1,0,0,0,936,931,1,0,0,0,937,940,1,0,0,0,938,936, + 1,0,0,0,938,939,1,0,0,0,939,131,1,0,0,0,940,938,1,0,0,0,941,943, + 5,14,0,0,942,944,3,134,67,0,943,942,1,0,0,0,943,944,1,0,0,0,944, + 945,1,0,0,0,945,946,5,16,0,0,946,133,1,0,0,0,947,952,3,96,48,0,948, + 949,5,18,0,0,949,953,3,136,68,0,950,951,5,38,0,0,951,953,3,80,40, + 0,952,948,1,0,0,0,952,950,1,0,0,0,952,953,1,0,0,0,953,961,1,0,0, + 0,954,957,3,146,73,0,955,956,5,18,0,0,956,958,3,136,68,0,957,955, + 1,0,0,0,957,958,1,0,0,0,958,961,1,0,0,0,959,961,3,140,70,0,960,947, + 1,0,0,0,960,954,1,0,0,0,960,959,1,0,0,0,961,135,1,0,0,0,962,965, + 3,144,72,0,963,964,5,18,0,0,964,966,3,136,68,0,965,963,1,0,0,0,965, + 966,1,0,0,0,966,969,1,0,0,0,967,969,3,140,70,0,968,962,1,0,0,0,968, + 967,1,0,0,0,969,137,1,0,0,0,970,980,3,96,48,0,971,972,5,18,0,0,972, + 974,3,96,48,0,973,971,1,0,0,0,974,977,1,0,0,0,975,973,1,0,0,0,975, + 976,1,0,0,0,976,981,1,0,0,0,977,975,1,0,0,0,978,979,5,38,0,0,979, + 981,3,80,40,0,980,975,1,0,0,0,980,978,1,0,0,0,981,139,1,0,0,0,982, + 987,3,142,71,0,983,984,5,18,0,0,984,986,3,142,71,0,985,983,1,0,0, + 0,986,989,1,0,0,0,987,985,1,0,0,0,987,988,1,0,0,0,988,141,1,0,0, + 0,989,987,1,0,0,0,990,991,5,74,0,0,991,992,5,12,0,0,992,993,3,144, + 72,0,993,143,1,0,0,0,994,997,3,146,73,0,995,997,3,96,48,0,996,994, + 1,0,0,0,996,995,1,0,0,0,997,145,1,0,0,0,998,999,5,11,0,0,999,1000, + 3,126,63,0,1000,1002,5,14,0,0,1001,1003,3,140,70,0,1002,1001,1,0, + 0,0,1002,1003,1,0,0,0,1003,1004,1,0,0,0,1004,1005,5,16,0,0,1005, + 147,1,0,0,0,1006,1008,3,96,48,0,1007,1006,1,0,0,0,1007,1008,1,0, + 0,0,1008,1015,1,0,0,0,1009,1011,5,18,0,0,1010,1012,3,96,48,0,1011, + 1010,1,0,0,0,1011,1012,1,0,0,0,1012,1014,1,0,0,0,1013,1009,1,0,0, + 0,1014,1017,1,0,0,0,1015,1013,1,0,0,0,1015,1016,1,0,0,0,1016,149, + 1,0,0,0,1017,1015,1,0,0,0,1018,1023,3,96,48,0,1019,1020,5,18,0,0, + 1020,1022,3,96,48,0,1021,1019,1,0,0,0,1022,1025,1,0,0,0,1023,1021, + 1,0,0,0,1023,1024,1,0,0,0,1024,151,1,0,0,0,1025,1023,1,0,0,0,1026, + 1027,5,67,0,0,1027,1032,3,154,77,0,1028,1029,5,18,0,0,1029,1031, + 3,154,77,0,1030,1028,1,0,0,0,1031,1034,1,0,0,0,1032,1030,1,0,0,0, + 1032,1033,1,0,0,0,1033,1035,1,0,0,0,1034,1032,1,0,0,0,1035,1036, + 5,68,0,0,1036,153,1,0,0,0,1037,1040,5,15,0,0,1038,1040,3,96,48,0, + 1039,1037,1,0,0,0,1039,1038,1,0,0,0,1040,155,1,0,0,0,1041,1043,3, + 158,79,0,1042,1044,3,160,80,0,1043,1042,1,0,0,0,1043,1044,1,0,0, + 0,1044,157,1,0,0,0,1045,1050,5,77,0,0,1046,1047,5,55,0,0,1047,1049, + 5,77,0,0,1048,1046,1,0,0,0,1049,1052,1,0,0,0,1050,1048,1,0,0,0,1050, + 1051,1,0,0,0,1051,1054,1,0,0,0,1052,1050,1,0,0,0,1053,1045,1,0,0, + 0,1053,1054,1,0,0,0,1054,159,1,0,0,0,1055,1056,5,72,0,0,1056,1057, + 3,56,28,0,1057,161,1,0,0,0,129,166,172,177,179,183,191,204,209,212, + 215,218,223,234,238,243,246,249,264,277,284,291,300,310,314,322, + 325,327,331,335,338,341,344,349,355,362,367,373,383,397,404,410, + 421,429,438,441,443,447,462,468,471,478,486,489,494,500,504,513, + 517,525,530,534,538,543,549,552,558,573,585,596,601,610,613,626, + 637,642,651,654,667,681,699,713,724,729,743,754,759,786,790,803, + 814,816,823,831,835,843,848,856,867,875,885,891,899,909,912,921, + 925,929,934,938,943,952,957,960,965,968,975,980,987,996,1002,1007, + 1011,1015,1023,1032,1039,1043,1050,1053 ] class BaseModelicaParser ( Parser ): @@ -1906,7 +1906,7 @@ def externalFunctionCall(self): self.state = 367 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & 540713447445381392) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & 5719) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & 540713447982252304) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & 5719) != 0): self.state = 366 self.expressionList() @@ -2095,7 +2095,7 @@ def parameterEquation(self): self.state = 383 self._errHandler.sync(self) token = self._input.LA(1) - if token in [4, 8, 14, 17, 22, 34, 48, 55, 56, 57, 58, 65, 66, 67, 69, 71, 74, 75, 77]: + if token in [4, 8, 14, 17, 22, 29, 34, 48, 55, 56, 57, 58, 65, 66, 67, 69, 71, 74, 75, 77]: self.state = 381 self.expression() pass @@ -3339,7 +3339,7 @@ def equation(self): self.state = 543 self._errHandler.sync(self) token = self._input.LA(1) - if token in [4, 8, 14, 17, 22, 48, 55, 56, 57, 58, 65, 66, 67, 69, 71, 74, 75, 77]: + if token in [4, 8, 14, 17, 22, 29, 48, 55, 56, 57, 58, 65, 66, 67, 69, 71, 74, 75, 77]: self.state = 532 self.simpleExpression() self.state = 534 @@ -3430,7 +3430,7 @@ def initialEquation(self): self.state = 549 self._errHandler.sync(self) token = self._input.LA(1) - if token in [4, 8, 14, 17, 22, 34, 38, 42, 45, 48, 55, 56, 57, 58, 65, 66, 67, 69, 71, 74, 75, 77]: + if token in [4, 8, 14, 17, 22, 29, 34, 38, 42, 45, 48, 55, 56, 57, 58, 65, 66, 67, 69, 71, 74, 75, 77]: self.enterOuterAlt(localctx, 1) self.state = 547 self.equation() @@ -4682,7 +4682,7 @@ def expressionNoDecoration(self): self.state = 790 self._errHandler.sync(self) token = self._input.LA(1) - if token in [4, 8, 14, 17, 22, 48, 55, 56, 57, 58, 65, 66, 67, 69, 71, 74, 75, 77]: + if token in [4, 8, 14, 17, 22, 29, 48, 55, 56, 57, 58, 65, 66, 67, 69, 71, 74, 75, 77]: self.enterOuterAlt(localctx, 1) self.state = 788 self.simpleExpression() @@ -5564,11 +5564,11 @@ def primary(self): self.state = 880 self.match(BaseModelicaParser.T__65) pass - elif token in [8, 17, 22]: + elif token in [8, 17, 22, 29]: self.enterOuterAlt(localctx, 5) self.state = 881 _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 4325632) != 0)): + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 541196544) != 0)): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -5910,7 +5910,7 @@ def functionCallArgs(self): self.state = 943 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & 540713447445383440) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & 5719) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & 540713447982254352) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & 5719) != 0): self.state = 942 self.functionArguments() @@ -6368,7 +6368,7 @@ def functionArgument(self): self.state = 994 self.functionPartialApplication() pass - elif token in [4, 8, 14, 17, 22, 34, 48, 55, 56, 57, 58, 65, 66, 67, 69, 71, 74, 75, 77]: + elif token in [4, 8, 14, 17, 22, 29, 34, 48, 55, 56, 57, 58, 65, 66, 67, 69, 71, 74, 75, 77]: self.enterOuterAlt(localctx, 2) self.state = 995 self.expression() @@ -6496,7 +6496,7 @@ def outputExpressionList(self): self.state = 1007 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & 540713447445381392) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & 5719) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & 540713447982252304) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & 5719) != 0): self.state = 1006 self.expression() @@ -6510,7 +6510,7 @@ def outputExpressionList(self): self.state = 1011 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & 540713447445381392) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & 5719) != 0): + if (((_la) & ~0x3f) == 0 and ((1 << _la) & 540713447982252304) != 0) or ((((_la - 65)) & ~0x3f) == 0 and ((1 << (_la - 65)) & 5719) != 0): self.state = 1010 self.expression() @@ -6704,7 +6704,7 @@ def subscript(self): self.state = 1037 self.match(BaseModelicaParser.T__14) pass - elif token in [4, 8, 14, 17, 22, 34, 48, 55, 56, 57, 58, 65, 66, 67, 69, 71, 74, 75, 77]: + elif token in [4, 8, 14, 17, 22, 29, 34, 48, 55, 56, 57, 58, 65, 66, 67, 69, 71, 74, 75, 77]: self.enterOuterAlt(localctx, 2) self.state = 1038 self.expression() diff --git a/src/antlr_parser.jl b/src/antlr_parser.jl index fd0b7a1..79dd916 100644 --- a/src/antlr_parser.jl +++ b/src/antlr_parser.jl @@ -250,13 +250,13 @@ end function visit_shortClassSpecifier(visitor::ASTBuilderVisitor, ctx::Py) # For now, return a placeholder - can be expanded later name = get_text(ctx.IDENT()) - return BaseModelicaLongClass(name, "", BaseModelicaComposition([], [], [], [], nothing)) + return BaseModelicaLongClass(name, "", BaseModelicaComposition([], [], [], [], nothing, [])) end function visit_derClassSpecifier(visitor::ASTBuilderVisitor, ctx::Py) # For now, return a placeholder - can be expanded later name = get_text(ctx.IDENT(0)) - return BaseModelicaLongClass(name, "", BaseModelicaComposition([], [], [], [], nothing)) + return BaseModelicaLongClass(name, "", BaseModelicaComposition([], [], [], [], nothing, [])) end function visit_globalConstant(visitor::ASTBuilderVisitor, ctx::Py) @@ -342,7 +342,91 @@ function visit_composition(visitor::ASTBuilderVisitor, ctx::Py) end end - return BaseModelicaComposition(components, equations, initial_equations, parameter_equations, annotation) + # Get clock base partitions + base_partitions = [] + partition_ctxs = ctx.basePartition() + if !is_null(partition_ctxs) + if pyconvert(Bool, pybuiltins.hasattr(partition_ctxs, "__iter__")) + for partition_ctx in partition_ctxs + partition = visit_basePartition(visitor, partition_ctx) + if !isnothing(partition) + push!(base_partitions, partition) + end + end + else + partition = visit_basePartition(visitor, partition_ctxs) + if !isnothing(partition) + push!(base_partitions, partition) + end + end + end + + return BaseModelicaComposition(components, equations, initial_equations, parameter_equations, annotation, base_partitions) +end + +function visit_basePartition(visitor::ASTBuilderVisitor, ctx::Py) + # basePartition: 'partition' stringComment (annotationComment ';')? (clockClause ';')* subPartition* + clock_clauses = [] + clock_clause_ctxs = ctx.clockClause() + if !is_null(clock_clause_ctxs) + if pyconvert(Bool, pybuiltins.hasattr(clock_clause_ctxs, "__iter__")) + for cc_ctx in clock_clause_ctxs + push!(clock_clauses, visit_clockClause(visitor, cc_ctx)) + end + else + push!(clock_clauses, visit_clockClause(visitor, clock_clause_ctxs)) + end + end + + sub_partitions = [] + sub_partition_ctxs = ctx.subPartition() + if !is_null(sub_partition_ctxs) + if pyconvert(Bool, pybuiltins.hasattr(sub_partition_ctxs, "__iter__")) + for sp_ctx in sub_partition_ctxs + push!(sub_partitions, visit_subPartition(visitor, sp_ctx)) + end + else + push!(sub_partitions, visit_subPartition(visitor, sub_partition_ctxs)) + end + end + + return BaseModelicaBasePartition(clock_clauses, sub_partitions) +end + +function visit_clockClause(visitor::ASTBuilderVisitor, ctx::Py) + # clockClause: decoration? 'Clock' IDENT '=' expression comment + name = get_text(ctx.IDENT()) + expr = visit_expression(visitor, ctx.expression()) + return BaseModelicaClockClause(name, expr) +end + +function visit_subPartition(visitor::ASTBuilderVisitor, ctx::Py) + # subPartition: 'subpartition' '(' argumentList ')' stringComment (annotationComment ';')? + # ('equation' (equation ';')* | 'algorithm' (statement ';')*)* + clock_args = [] + if !is_null(ctx.argumentList()) + clock_args = visit_argumentList(visitor, ctx.argumentList()) + end + + equations = [] + eq_ctxs = ctx.equation() + if !is_null(eq_ctxs) + if pyconvert(Bool, pybuiltins.hasattr(eq_ctxs, "__iter__")) + for eq_ctx in eq_ctxs + eq = visit_equation(visitor, eq_ctx) + if !isnothing(eq) + push!(equations, eq) + end + end + else + eq = visit_equation(visitor, eq_ctxs) + if !isnothing(eq) + push!(equations, eq) + end + end + end + + return BaseModelicaSubPartition(clock_args, equations) end function visit_genericElement(visitor::ASTBuilderVisitor, ctx::Py) @@ -1022,20 +1106,13 @@ function visit_primary(visitor::ASTBuilderVisitor, ctx::Py) elseif get_text(ctx) == "end" return BaseModelicaIdentifier("end") elseif !is_null(ctx.functionCallArgs()) && is_null(ctx.componentReference()) - # Check for der, initial, or pure function calls - # These appear as: ('der' | 'initial' | 'pure') functionCallArgs + # Check for der, initial, pure, Clock function calls (keywords that can also be function names) + # These appear as: ('der' | 'initial' | 'pure' | 'Clock') functionCallArgs full_text = get_text(ctx) - if startswith(full_text, "der") || startswith(full_text, "initial") || startswith(full_text, "pure") - # Determine which function it is - func_name_str = if startswith(full_text, "der") - "der" - elseif startswith(full_text, "initial") - "initial" - else - "pure" - end - - func_name = BaseModelicaIdentifier(func_name_str) + keyword_funcs = ("der", "initial", "pure", "Clock") + matched = findfirst(kw -> startswith(full_text, kw), keyword_funcs) + if !isnothing(matched) + func_name = BaseModelicaIdentifier(keyword_funcs[matched]) args = visit_functionCallArgs(visitor, ctx.functionCallArgs()) return BaseModelicaFunctionCall(func_name, args) end diff --git a/src/ast.jl b/src/ast.jl index eefc8e6..fe11a6c 100644 --- a/src/ast.jl +++ b/src/ast.jl @@ -22,7 +22,10 @@ BaseModelicaAnyEquation(equation, description) BaseModelicaAnnotation(annotation_content) BaseModelicaForIndex(ident, expression) - BaseModelicaComposition(components, equations, initial_equations, parameter_equations, annotation) + BaseModelicaComposition(components, equations, initial_equations, parameter_equations, annotation, base_partitions) + BaseModelicaClockClause(name, expression) + BaseModelicaSubPartition(clock_args, equations) + BaseModelicaBasePartition(clock_clauses, sub_partitions) BaseModelicaLongClass(name, description, composition) BaseModelicaModification(class_modifications, expr) BaseModelicaClassModificationArg(name, modification) diff --git a/src/evaluator.jl b/src/evaluator.jl index 117994b..b823c52 100644 --- a/src/evaluator.jl +++ b/src/evaluator.jl @@ -232,9 +232,10 @@ function eval_AST(when_eq::BaseModelicaWhenEquation) end end - # Pair shorthand: [condition ~ 0] => affect_eqs - # Fires on positive zero-crossing (condition becomes true) → Modelica edge semantics - push!(callbacks, [crossing ~ 0] => affects) + # Only fire on positive zero-crossing (condition becomes true) → Modelica edge semantics + push!(callbacks, ModelingToolkit.SymbolicContinuousCallback( + [crossing ~ 0], affects; affect_neg = nothing + )) end return callbacks end @@ -282,9 +283,54 @@ function eval_AST(component::BaseModelicaComponentClause) end end +function eval_clocked_rhs(expr_ast, k) + # Recursively evaluate a clocked RHS, mapping previous(x) → x(k-1). + if expr_ast isa BaseModelicaFunctionCall + func_name = expr_ast.func_name + fname = if func_name isa BaseModelicaIdentifier + func_name.name + elseif func_name isa BaseModelicaComponentReference + func_name.ref_list[1].name + else + "" + end + if fname == "previous" + arg = eval_AST(expr_ast.args.args[1]) + return arg(k - 1) + else + return eval_AST(expr_ast) + end + elseif expr_ast isa BaseModelicaSum + return eval_clocked_rhs(expr_ast.left, k) + eval_clocked_rhs(expr_ast.right, k) + elseif expr_ast isa BaseModelicaMinus + return eval_clocked_rhs(expr_ast.left, k) - eval_clocked_rhs(expr_ast.right, k) + elseif expr_ast isa BaseModelicaProd + return eval_clocked_rhs(expr_ast.left, k) * eval_clocked_rhs(expr_ast.right, k) + elseif expr_ast isa BaseModelicaDivide + return eval_clocked_rhs(expr_ast.left, k) / eval_clocked_rhs(expr_ast.right, k) + elseif expr_ast isa BaseModelicaUnaryMinus + return -eval_clocked_rhs(expr_ast.operand, k) + else + return eval_AST(expr_ast) + end +end + +function eval_clocked_equation(eq_ast, k) + # Evaluate a simple equation inside a clock partition. + # LHS variable becomes var(k); RHS evaluates with previous(x) → x(k-1). + inner = eq_ast isa BaseModelicaAnyEquation ? eq_ast.equation : eq_ast + if inner isa BaseModelicaSimpleEquation + lhs_var = eval_AST(inner.lhs) + rhs = eval_clocked_rhs(inner.rhs, k) + return lhs_var(k) ~ rhs + end + return nothing +end + function eval_AST(model::BaseModelicaModel) empty!(variable_map) empty!(parameter_val_map) + empty!(clock_map) class_specifier = model.long_class_specifier model_name = class_specifier.name @@ -399,22 +445,20 @@ function eval_AST(model::BaseModelicaModel) end # Split equations into when-equations (→ continuous callbacks) and regular equations. - # The Julia parser wraps all equation types in BaseModelicaSimpleEquation via |>, - # with the inner type in .lhs. The ANTLR parser produces bare types without that - # wrapper, so guard with hasproperty before touching .equation. - when_equation_list = [ - eq for eq in equations if - hasproperty(eq, :equation) && - eq.equation isa BaseModelicaSimpleEquation && - eq.equation.lhs isa BaseModelicaWhenEquation - ] - regular_equations = [ - eq for eq in equations if !( - hasproperty(eq, :equation) && - eq.equation isa BaseModelicaSimpleEquation && - eq.equation.lhs isa BaseModelicaWhenEquation - ) - ] + # Julia parser: wrapped as BaseModelicaAnyEquation { equation: BaseModelicaSimpleEquation { lhs: BaseModelicaWhenEquation } } + # ANTLR parser: bare BaseModelicaWhenEquation (visit_whenEquation returns directly) + when_equation_list = [] + regular_equations = [] + for eq in equations + if eq isa BaseModelicaWhenEquation || + (hasproperty(eq, :equation) && + eq.equation isa BaseModelicaSimpleEquation && + eq.equation.lhs isa BaseModelicaWhenEquation) + push!(when_equation_list, eq) + else + push!(regular_equations, eq) + end + end # Flatten regular equations - some (like if-equations) return lists eqs_raw = [eval_AST(eq) for eq in regular_equations] @@ -435,7 +479,8 @@ function eval_AST(model::BaseModelicaModel) # Build continuous callbacks from when-equations when_callbacks = [] for eq in when_equation_list - append!(when_callbacks, eval_AST(eq.equation.lhs)) + when_eq = eq isa BaseModelicaWhenEquation ? eq : eq.equation.lhs + append!(when_callbacks, eval_AST(when_eq)) end #vars_and_pars = merge(Dict(vars .=> vars), Dict(pars .=> pars)) @@ -469,14 +514,51 @@ function eval_AST(model::BaseModelicaModel) !isnothing(idx) && (vars[idx] = variable_map[name]) end - real_eqs = Equation[declaration_eqs..., eqs...] + # Process clock partitions: register clocks then evaluate clocked equations. + clocked_eqs = [] + for partition in composition.base_partitions + for cc in partition.clock_clauses + clock_name = Symbol(cc.name) + clock_map[clock_name] = eval_AST(cc.expression) + end + for sp in partition.sub_partitions + clock_sym = nothing + for arg in sp.clock_args + arg_name = arg.name isa BaseModelicaIdentifier ? arg.name.name : arg.name + if arg_name == "clock" + if !isnothing(arg.modification) && + !isnothing(arg.modification.expr) && + !isempty(arg.modification.expr) + ref = arg.modification.expr[end] + ref_name = ref isa BaseModelicaComponentReference ? + Symbol(ref.ref_list[1].name) : Symbol(ref.name) + clock_sym = clock_map[ref_name] + end + end + end + + if isnothing(clock_sym) + error("Could not resolve clock for subpartition") + end + + k = ModelingToolkit.ShiftIndex(clock_sym) + for eq in sp.equations + ceq = eval_clocked_equation(eq, k) + if !isnothing(ceq) + push!(clocked_eqs, ceq) + end + end + end + end + + real_eqs = Equation[declaration_eqs..., eqs..., clocked_eqs...] # Variables that only appear in when-equation bodies need D(v) ~ 0 hold dynamics # so they are proper ODE states between events (constant until an event fires). if !isempty(when_callbacks) continuous_syms = Set(Iterators.flatten(Symbolics.get_variables.(real_eqs))) seen = Set() - for cb in when_callbacks, affect_eq in last(cb) + for cb in when_callbacks, affect_eq in cb.affect.affect var_sym = Symbolics.unwrap(affect_eq.lhs) if var_sym ∉ seen push!(seen, var_sym) @@ -488,10 +570,7 @@ function eval_AST(model::BaseModelicaModel) end end - # Use only() to extract the runtime-typed Pair from Vector{Any} for single events; - # pass the vector directly for multiple events. - events = length(when_callbacks) == 1 ? only(when_callbacks) : when_callbacks - @named sys = System(real_eqs, t; continuous_events = events) + @named sys = System(real_eqs, t; continuous_events = when_callbacks) return mtkcompile(sys) end diff --git a/src/julia_parser.jl b/src/julia_parser.jl index 1c838d0..e09469a 100644 --- a/src/julia_parser.jl +++ b/src/julia_parser.jl @@ -284,7 +284,7 @@ function BaseModelicaComposition(input_list) annotation = input end end - return BaseModelicaComposition(components, equations, initial_equations, parameter_equations, annotation) + return BaseModelicaComposition(components, equations, initial_equations, parameter_equations, annotation, []) end function BaseModelicaPackage(input_list) diff --git a/src/maps.jl b/src/maps.jl index 316fcad..4bbdae7 100644 --- a/src/maps.jl +++ b/src/maps.jl @@ -100,6 +100,12 @@ function_map = Dict( # ── Assertion and termination (Spec 8.3.7-8.3.8) ───────────────────────── :assert => x -> nothing, :terminate => x -> nothing, + + # -- Clocked Variables -- + :pre => x -> ModelingToolkit.Pre(x...), + :sample => x -> ModelingToolkit.Sample(x...), + :hold => x -> ModelingToolkit.Hold(x...), + :Clock => x -> ModelingToolkit.Clock(x...), ) # holds variables, populated by evaluating component_clause @@ -109,3 +115,6 @@ variable_map = Dict() parameter_val_map = Dict() initial_value_map = Dict() + +# holds named clocks for clocked partitions, populated during partition evaluation +clock_map = Dict{Symbol, Any}() diff --git a/test/test_antlr_parser.jl b/test/test_antlr_parser.jl index 0a33f51..9f44a04 100644 --- a/test/test_antlr_parser.jl +++ b/test/test_antlr_parser.jl @@ -303,4 +303,42 @@ BM = BaseModelica @test prob_override.kwargs[:saveat] == 0.01 # User override @test prob_override.tspan[2] == 2.0 # Still from annotation end + + @testset "When Equations (WhenEquation)" begin + when_path = joinpath( + dirname(dirname(pathof(BM))), "test", "testfiles", "WhenEquation.bmo" + ) + when_package = BM.parse_file_antlr(when_path) + @test when_package isa BM.BaseModelicaPackage + + # Verify the when-equation was parsed into the AST + # ANTLR parser returns bare BaseModelicaWhenEquation (not wrapped) + composition = when_package.model.long_class_specifier.composition + @test any(eq -> eq isa BM.BaseModelicaWhenEquation, composition.equations) + + when_system = BM.baseModelica_to_ModelingToolkit(when_package) + @test when_system isa System + @test parse_basemodelica(when_path, parser = :antlr) isa System + end + + @testset "Clocked Variables (RealSample)" begin + real_sample_path = joinpath( + dirname(dirname(pathof(BM))), "test", "testfiles", "RealSample.bmo" + ) + real_sample_package = BM.parse_file_antlr(real_sample_path) + @test real_sample_package isa BM.BaseModelicaPackage + + # Verify the base partition was parsed + composition = real_sample_package.model.long_class_specifier.composition + @test length(composition.base_partitions) == 1 + partition = composition.base_partitions[1] + @test partition isa BM.BaseModelicaBasePartition + @test length(partition.clock_clauses) == 1 + @test partition.clock_clauses[1].name == "c" + @test length(partition.sub_partitions) == 1 + + real_sample_system = BM.baseModelica_to_ModelingToolkit(real_sample_package) + @test real_sample_system isa System + @test parse_basemodelica(real_sample_path, parser = :antlr) isa System + end end diff --git a/test/testfiles/RealSample.bmo b/test/testfiles/RealSample.bmo new file mode 100644 index 0000000..f118d00 --- /dev/null +++ b/test/testfiles/RealSample.bmo @@ -0,0 +1,13 @@ +//! base 0.1.0 +package 'RealSample' + model 'RealSample' + Real 'y'(fixed = true, start = 0.0); + equation + partition /* Beginning of base-partition */ + Clock 'c' = Clock(0.1) "Rational interval clock Operator 16.2"; + + subpartition (clock = 'c') + equation + 'y' = previous('y') + 1.0; + end 'RealSample'; +end 'RealSample'; \ No newline at end of file