gaokao-pro 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"province": "jilin", "province_name": "吉林", "year": 2026, "track": "physics", "track_cn": "物理类", "source": "吉林省教育考试院 官方PDF《2026年吉林省普通高校招生考试物理-普通1分段表(含照顾分)》(经 eol.cn 入口页发现,pdftotext 文本层提取)", "source_url": "https://www.jleea.com.cn/u/cms/www/2026/06/25/2069968590488035329.pdf", "note": "源自吉林省教育考试院官方PDF《2026年吉林省普通高校招生考试物理-普通1分段表(含照顾分)》(https://www.jleea.com.cn/u/cms/www/2026/06/25/2069968590488035329.pdf),经eol.cn入口页(https://gaokao.eol.cn/ji_lin/dongtai/202606/t20260625_2749028.shtml)发现。PDF含文本层(非扫描),用pdftotext -layout提取tens×ones累计矩阵,按score=tens+ones逐分还原为[分数,累计人数]两列表,cumulative逐格取自官方PDF原值。顶部707=12为官方合并段(≥707累计12人),0分行=75551为官方0分/照顾分末段。本科线物理321→累计67422,特控线473→累计31914。;count 由 cumulative(位次) 反推(官方表为累计制/顶部分段合并)", "count": 708, "rows": [{"score": 707, "count": 12, "cumulative": 12}, {"score": 706, "count": 0, "cumulative": 12}, {"score": 705, "count": 2, "cumulative": 14}, {"score": 704, "count": 1, "cumulative": 15}, {"score": 703, "count": 3, "cumulative": 18}, {"score": 702, "count": 6, "cumulative": 24}, {"score": 701, "count": 6, "cumulative": 30}, {"score": 700, "count": 2, "cumulative": 32}, {"score": 699, "count": 6, "cumulative": 38}, {"score": 698, "count": 4, "cumulative": 42}, {"score": 697, "count": 4, "cumulative": 46}, {"score": 696, "count": 7, "cumulative": 53}, {"score": 695, "count": 4, "cumulative": 57}, {"score": 694, "count": 13, "cumulative": 70}, {"score": 693, "count": 9, "cumulative": 79}, {"score": 692, "count": 7, "cumulative": 86}, {"score": 691, "count": 15, "cumulative": 101}, {"score": 690, "count": 7, "cumulative": 108}, {"score": 689, "count": 12, "cumulative": 120}, {"score": 688, "count": 13, "cumulative": 133}, {"score": 687, "count": 16, "cumulative": 149}, {"score": 686, "count": 13, "cumulative": 162}, {"score": 685, "count": 21, "cumulative": 183}, {"score": 684, "count": 14, "cumulative": 197}, {"score": 683, "count": 10, "cumulative": 207}, {"score": 682, "count": 23, "cumulative": 230}, {"score": 681, "count": 15, "cumulative": 245}, {"score": 680, "count": 23, "cumulative": 268}, {"score": 679, "count": 21, "cumulative": 289}, {"score": 678, "count": 21, "cumulative": 310}, {"score": 677, "count": 21, "cumulative": 331}, {"score": 676, "count": 19, "cumulative": 350}, {"score": 675, "count": 19, "cumulative": 369}, {"score": 674, "count": 15, "cumulative": 384}, {"score": 673, "count": 21, "cumulative": 405}, {"score": 672, "count": 19, "cumulative": 424}, {"score": 671, "count": 25, "cumulative": 449}, {"score": 670, "count": 31, "cumulative": 480}, {"score": 669, "count": 30, "cumulative": 510}, {"score": 668, "count": 41, "cumulative": 551}, {"score": 667, "count": 22, "cumulative": 573}, {"score": 666, "count": 32, "cumulative": 605}, {"score": 665, "count": 33, "cumulative": 638}, {"score": 664, "count": 34, "cumulative": 672}, {"score": 663, "count": 31, "cumulative": 703}, {"score": 662, "count": 34, "cumulative": 737}, {"score": 661, "count": 45, "cumulative": 782}, {"score": 660, "count": 40, "cumulative": 822}, {"score": 659, "count": 45, "cumulative": 867}, {"score": 658, "count": 53, "cumulative": 920}, {"score": 657, "count": 41, "cumulative": 961}, {"score": 656, "count": 56, "cumulative": 1017}, {"score": 655, "count": 50, "cumulative": 1067}, {"score": 654, "count": 45, "cumulative": 1112}, {"score": 653, "count": 57, "cumulative": 1169}, {"score": 652, "count": 40, "cumulative": 1209}, {"score": 651, "count": 47, "cumulative": 1256}, {"score": 650, "count": 70, "cumulative": 1326}, {"score": 649, "count": 52, "cumulative": 1378}, {"score": 648, "count": 51, "cumulative": 1429}, {"score": 647, "count": 70, "cumulative": 1499}, {"score": 646, "count": 57, "cumulative": 1556}, {"score": 645, "count": 80, "cumulative": 1636}, {"score": 644, "count": 55, "cumulative": 1691}, {"score": 643, "count": 75, "cumulative": 1766}, {"score": 642, "count": 74, "cumulative": 1840}, {"score": 641, "count": 65, "cumulative": 1905}, {"score": 640, "count": 77, "cumulative": 1982}, {"score": 639, "count": 81, "cumulative": 2063}, {"score": 638, "count": 84, "cumulative": 2147}, {"score": 637, "count": 96, "cumulative": 2243}, {"score": 636, "count": 82, "cumulative": 2325}, {"score": 635, "count": 83, "cumulative": 2408}, {"score": 634, "count": 83, "cumulative": 2491}, {"score": 633, "count": 83, "cumulative": 2574}, {"score": 632, "count": 81, "cumulative": 2655}, {"score": 631, "count": 89, "cumulative": 2744}, {"score": 630, "count": 109, "cumulative": 2853}, {"score": 629, "count": 86, "cumulative": 2939}, {"score": 628, "count": 88, "cumulative": 3027}, {"score": 627, "count": 94, "cumulative": 3121}, {"score": 626, "count": 84, "cumulative": 3205}, {"score": 625, "count": 84, "cumulative": 3289}, {"score": 624, "count": 98, "cumulative": 3387}, {"score": 623, "count": 105, "cumulative": 3492}, {"score": 622, "count": 106, "cumulative": 3598}, {"score": 621, "count": 89, "cumulative": 3687}, {"score": 620, "count": 100, "cumulative": 3787}, {"score": 619, "count": 103, "cumulative": 3890}, {"score": 618, "count": 87, "cumulative": 3977}, {"score": 617, "count": 103, "cumulative": 4080}, {"score": 616, "count": 99, "cumulative": 4179}, {"score": 615, "count": 92, "cumulative": 4271}, {"score": 614, "count": 110, "cumulative": 4381}, {"score": 613, "count": 109, "cumulative": 4490}, {"score": 612, "count": 113, "cumulative": 4603}, {"score": 611, "count": 99, "cumulative": 4702}, {"score": 610, "count": 123, "cumulative": 4825}, {"score": 609, "count": 114, "cumulative": 4939}, {"score": 608, "count": 134, "cumulative": 5073}, {"score": 607, "count": 134, "cumulative": 5207}, {"score": 606, "count": 130, "cumulative": 5337}, {"score": 605, "count": 136, "cumulative": 5473}, {"score": 604, "count": 127, "cumulative": 5600}, {"score": 603, "count": 118, "cumulative": 5718}, {"score": 602, "count": 127, "cumulative": 5845}, {"score": 601, "count": 115, "cumulative": 5960}, {"score": 600, "count": 132, "cumulative": 6092}, {"score": 599, "count": 131, "cumulative": 6223}, {"score": 598, "count": 133, "cumulative": 6356}, {"score": 597, "count": 141, "cumulative": 6497}, {"score": 596, "count": 152, "cumulative": 6649}, {"score": 595, "count": 126, "cumulative": 6775}, {"score": 594, "count": 111, "cumulative": 6886}, {"score": 593, "count": 144, "cumulative": 7030}, {"score": 592, "count": 144, "cumulative": 7174}, {"score": 591, "count": 138, "cumulative": 7312}, {"score": 590, "count": 150, "cumulative": 7462}, {"score": 589, "count": 167, "cumulative": 7629}, {"score": 588, "count": 151, "cumulative": 7780}, {"score": 587, "count": 130, "cumulative": 7910}, {"score": 586, "count": 139, "cumulative": 8049}, {"score": 585, "count": 148, "cumulative": 8197}, {"score": 584, "count": 134, "cumulative": 8331}, {"score": 583, "count": 154, "cumulative": 8485}, {"score": 582, "count": 148, "cumulative": 8633}, {"score": 581, "count": 135, "cumulative": 8768}, {"score": 580, "count": 145, "cumulative": 8913}, {"score": 579, "count": 166, "cumulative": 9079}, {"score": 578, "count": 153, "cumulative": 9232}, {"score": 577, "count": 155, "cumulative": 9387}, {"score": 576, "count": 168, "cumulative": 9555}, {"score": 575, "count": 151, "cumulative": 9706}, {"score": 574, "count": 155, "cumulative": 9861}, {"score": 573, "count": 157, "cumulative": 10018}, {"score": 572, "count": 152, "cumulative": 10170}, {"score": 571, "count": 160, "cumulative": 10330}, {"score": 570, "count": 166, "cumulative": 10496}, {"score": 569, "count": 163, "cumulative": 10659}, {"score": 568, "count": 168, "cumulative": 10827}, {"score": 567, "count": 168, "cumulative": 10995}, {"score": 566, "count": 159, "cumulative": 11154}, {"score": 565, "count": 177, "cumulative": 11331}, {"score": 564, "count": 187, "cumulative": 11518}, {"score": 563, "count": 181, "cumulative": 11699}, {"score": 562, "count": 187, "cumulative": 11886}, {"score": 561, "count": 178, "cumulative": 12064}, {"score": 560, "count": 191, "cumulative": 12255}, {"score": 559, "count": 175, "cumulative": 12430}, {"score": 558, "count": 204, "cumulative": 12634}, {"score": 557, "count": 183, "cumulative": 12817}, {"score": 556, "count": 172, "cumulative": 12989}, {"score": 555, "count": 170, "cumulative": 13159}, {"score": 554, "count": 186, "cumulative": 13345}, {"score": 553, "count": 221, "cumulative": 13566}, {"score": 552, "count": 190, "cumulative": 13756}, {"score": 551, "count": 178, "cumulative": 13934}, {"score": 550, "count": 173, "cumulative": 14107}, {"score": 549, "count": 166, "cumulative": 14273}, {"score": 548, "count": 213, "cumulative": 14486}, {"score": 547, "count": 195, "cumulative": 14681}, {"score": 546, "count": 210, "cumulative": 14891}, {"score": 545, "count": 212, "cumulative": 15103}, {"score": 544, "count": 217, "cumulative": 15320}, {"score": 543, "count": 207, "cumulative": 15527}, {"score": 542, "count": 172, "cumulative": 15699}, {"score": 541, "count": 216, "cumulative": 15915}, {"score": 540, "count": 246, "cumulative": 16161}, {"score": 539, "count": 214, "cumulative": 16375}, {"score": 538, "count": 227, "cumulative": 16602}, {"score": 537, "count": 246, "cumulative": 16848}, {"score": 536, "count": 202, "cumulative": 17050}, {"score": 535, "count": 237, "cumulative": 17287}, {"score": 534, "count": 225, "cumulative": 17512}, {"score": 533, "count": 206, "cumulative": 17718}, {"score": 532, "count": 221, "cumulative": 17939}, {"score": 531, "count": 211, "cumulative": 18150}, {"score": 530, "count": 220, "cumulative": 18370}, {"score": 529, "count": 217, "cumulative": 18587}, {"score": 528, "count": 205, "cumulative": 18792}, {"score": 527, "count": 213, "cumulative": 19005}, {"score": 526, "count": 213, "cumulative": 19218}, {"score": 525, "count": 208, "cumulative": 19426}, {"score": 524, "count": 201, "cumulative": 19627}, {"score": 523, "count": 234, "cumulative": 19861}, {"score": 522, "count": 224, "cumulative": 20085}, {"score": 521, "count": 209, "cumulative": 20294}, {"score": 520, "count": 225, "cumulative": 20519}, {"score": 519, "count": 222, "cumulative": 20741}, {"score": 518, "count": 228, "cumulative": 20969}, {"score": 517, "count": 205, "cumulative": 21174}, {"score": 516, "count": 207, "cumulative": 21381}, {"score": 515, "count": 234, "cumulative": 21615}, {"score": 514, "count": 242, "cumulative": 21857}, {"score": 513, "count": 245, "cumulative": 22102}, {"score": 512, "count": 269, "cumulative": 22371}, {"score": 511, "count": 265, "cumulative": 22636}, {"score": 510, "count": 212, "cumulative": 22848}, {"score": 509, "count": 242, "cumulative": 23090}, {"score": 508, "count": 230, "cumulative": 23320}, {"score": 507, "count": 259, "cumulative": 23579}, {"score": 506, "count": 262, "cumulative": 23841}, {"score": 505, "count": 215, "cumulative": 24056}, {"score": 504, "count": 221, "cumulative": 24277}, {"score": 503, "count": 239, "cumulative": 24516}, {"score": 502, "count": 251, "cumulative": 24767}, {"score": 501, "count": 223, "cumulative": 24990}, {"score": 500, "count": 274, "cumulative": 25264}, {"score": 499, "count": 236, "cumulative": 25500}, {"score": 498, "count": 240, "cumulative": 25740}, {"score": 497, "count": 239, "cumulative": 25979}, {"score": 496, "count": 214, "cumulative": 26193}, {"score": 495, "count": 204, "cumulative": 26397}, {"score": 494, "count": 243, "cumulative": 26640}, {"score": 493, "count": 226, "cumulative": 26866}, {"score": 492, "count": 262, "cumulative": 27128}, {"score": 491, "count": 241, "cumulative": 27369}, {"score": 490, "count": 242, "cumulative": 27611}, {"score": 489, "count": 251, "cumulative": 27862}, {"score": 488, "count": 225, "cumulative": 28087}, {"score": 487, "count": 287, "cumulative": 28374}, {"score": 486, "count": 245, "cumulative": 28619}, {"score": 485, "count": 242, "cumulative": 28861}, {"score": 484, "count": 247, "cumulative": 29108}, {"score": 483, "count": 277, "cumulative": 29385}, {"score": 482, "count": 254, "cumulative": 29639}, {"score": 481, "count": 221, "cumulative": 29860}, {"score": 480, "count": 248, "cumulative": 30108}, {"score": 479, "count": 260, "cumulative": 30368}, {"score": 478, "count": 263, "cumulative": 30631}, {"score": 477, "count": 250, "cumulative": 30881}, {"score": 476, "count": 211, "cumulative": 31092}, {"score": 475, "count": 268, "cumulative": 31360}, {"score": 474, "count": 284, "cumulative": 31644}, {"score": 473, "count": 270, "cumulative": 31914}, {"score": 472, "count": 256, "cumulative": 32170}, {"score": 471, "count": 222, "cumulative": 32392}, {"score": 470, "count": 235, "cumulative": 32627}, {"score": 469, "count": 255, "cumulative": 32882}, {"score": 468, "count": 283, "cumulative": 33165}, {"score": 467, "count": 264, "cumulative": 33429}, {"score": 466, "count": 268, "cumulative": 33697}, {"score": 465, "count": 265, "cumulative": 33962}, {"score": 464, "count": 257, "cumulative": 34219}, {"score": 463, "count": 259, "cumulative": 34478}, {"score": 462, "count": 272, "cumulative": 34750}, {"score": 461, "count": 265, "cumulative": 35015}, {"score": 460, "count": 276, "cumulative": 35291}, {"score": 459, "count": 249, "cumulative": 35540}, {"score": 458, "count": 265, "cumulative": 35805}, {"score": 457, "count": 265, "cumulative": 36070}, {"score": 456, "count": 267, "cumulative": 36337}, {"score": 455, "count": 270, "cumulative": 36607}, {"score": 454, "count": 260, "cumulative": 36867}, {"score": 453, "count": 276, "cumulative": 37143}, {"score": 452, "count": 280, "cumulative": 37423}, {"score": 451, "count": 241, "cumulative": 37664}, {"score": 450, "count": 283, "cumulative": 37947}, {"score": 449, "count": 238, "cumulative": 38185}, {"score": 448, "count": 250, "cumulative": 38435}, {"score": 447, "count": 291, "cumulative": 38726}, {"score": 446, "count": 261, "cumulative": 38987}, {"score": 445, "count": 288, "cumulative": 39275}, {"score": 444, "count": 268, "cumulative": 39543}, {"score": 443, "count": 248, "cumulative": 39791}, {"score": 442, "count": 285, "cumulative": 40076}, {"score": 441, "count": 245, "cumulative": 40321}, {"score": 440, "count": 305, "cumulative": 40626}, {"score": 439, "count": 283, "cumulative": 40909}, {"score": 438, "count": 275, "cumulative": 41184}, {"score": 437, "count": 283, "cumulative": 41467}, {"score": 436, "count": 278, "cumulative": 41745}, {"score": 435, "count": 277, "cumulative": 42022}, {"score": 434, "count": 294, "cumulative": 42316}, {"score": 433, "count": 267, "cumulative": 42583}, {"score": 432, "count": 266, "cumulative": 42849}, {"score": 431, "count": 281, "cumulative": 43130}, {"score": 430, "count": 267, "cumulative": 43397}, {"score": 429, "count": 271, "cumulative": 43668}, {"score": 428, "count": 285, "cumulative": 43953}, {"score": 427, "count": 281, "cumulative": 44234}, {"score": 426, "count": 236, "cumulative": 44470}, {"score": 425, "count": 256, "cumulative": 44726}, {"score": 424, "count": 270, "cumulative": 44996}, {"score": 423, "count": 262, "cumulative": 45258}, {"score": 422, "count": 273, "cumulative": 45531}, {"score": 421, "count": 275, "cumulative": 45806}, {"score": 420, "count": 281, "cumulative": 46087}, {"score": 419, "count": 251, "cumulative": 46338}, {"score": 418, "count": 281, "cumulative": 46619}, {"score": 417, "count": 274, "cumulative": 46893}, {"score": 416, "count": 291, "cumulative": 47184}, {"score": 415, "count": 264, "cumulative": 47448}, {"score": 414, "count": 255, "cumulative": 47703}, {"score": 413, "count": 250, "cumulative": 47953}, {"score": 412, "count": 252, "cumulative": 48205}, {"score": 411, "count": 273, "cumulative": 48478}, {"score": 410, "count": 277, "cumulative": 48755}, {"score": 409, "count": 268, "cumulative": 49023}, {"score": 408, "count": 263, "cumulative": 49286}, {"score": 407, "count": 255, "cumulative": 49541}, {"score": 406, "count": 247, "cumulative": 49788}, {"score": 405, "count": 266, "cumulative": 50054}, {"score": 404, "count": 270, "cumulative": 50324}, {"score": 403, "count": 232, "cumulative": 50556}, {"score": 402, "count": 275, "cumulative": 50831}, {"score": 401, "count": 271, "cumulative": 51102}, {"score": 400, "count": 242, "cumulative": 51344}, {"score": 399, "count": 220, "cumulative": 51564}, {"score": 398, "count": 270, "cumulative": 51834}, {"score": 397, "count": 246, "cumulative": 52080}, {"score": 396, "count": 255, "cumulative": 52335}, {"score": 395, "count": 221, "cumulative": 52556}, {"score": 394, "count": 240, "cumulative": 52796}, {"score": 393, "count": 293, "cumulative": 53089}, {"score": 392, "count": 223, "cumulative": 53312}, {"score": 391, "count": 222, "cumulative": 53534}, {"score": 390, "count": 270, "cumulative": 53804}, {"score": 389, "count": 248, "cumulative": 54052}, {"score": 388, "count": 252, "cumulative": 54304}, {"score": 387, "count": 259, "cumulative": 54563}, {"score": 386, "count": 255, "cumulative": 54818}, {"score": 385, "count": 250, "cumulative": 55068}, {"score": 384, "count": 240, "cumulative": 55308}, {"score": 383, "count": 249, "cumulative": 55557}, {"score": 382, "count": 251, "cumulative": 55808}, {"score": 381, "count": 246, "cumulative": 56054}, {"score": 380, "count": 225, "cumulative": 56279}, {"score": 379, "count": 257, "cumulative": 56536}, {"score": 378, "count": 256, "cumulative": 56792}, {"score": 377, "count": 213, "cumulative": 57005}, {"score": 376, "count": 219, "cumulative": 57224}, {"score": 375, "count": 237, "cumulative": 57461}, {"score": 374, "count": 236, "cumulative": 57697}, {"score": 373, "count": 209, "cumulative": 57906}, {"score": 372, "count": 251, "cumulative": 58157}, {"score": 371, "count": 223, "cumulative": 58380}, {"score": 370, "count": 189, "cumulative": 58569}, {"score": 369, "count": 213, "cumulative": 58782}, {"score": 368, "count": 209, "cumulative": 58991}, {"score": 367, "count": 196, "cumulative": 59187}, {"score": 366, "count": 222, "cumulative": 59409}, {"score": 365, "count": 211, "cumulative": 59620}, {"score": 364, "count": 204, "cumulative": 59824}, {"score": 363, "count": 218, "cumulative": 60042}, {"score": 362, "count": 213, "cumulative": 60255}, {"score": 361, "count": 209, "cumulative": 60464}, {"score": 360, "count": 200, "cumulative": 60664}, {"score": 359, "count": 196, "cumulative": 60860}, {"score": 358, "count": 197, "cumulative": 61057}, {"score": 357, "count": 202, "cumulative": 61259}, {"score": 356, "count": 224, "cumulative": 61483}, {"score": 355, "count": 203, "cumulative": 61686}, {"score": 354, "count": 191, "cumulative": 61877}, {"score": 353, "count": 191, "cumulative": 62068}, {"score": 352, "count": 184, "cumulative": 62252}, {"score": 351, "count": 174, "cumulative": 62426}, {"score": 350, "count": 199, "cumulative": 62625}, {"score": 349, "count": 196, "cumulative": 62821}, {"score": 348, "count": 189, "cumulative": 63010}, {"score": 347, "count": 216, "cumulative": 63226}, {"score": 346, "count": 173, "cumulative": 63399}, {"score": 345, "count": 172, "cumulative": 63571}, {"score": 344, "count": 178, "cumulative": 63749}, {"score": 343, "count": 200, "cumulative": 63949}, {"score": 342, "count": 161, "cumulative": 64110}, {"score": 341, "count": 180, "cumulative": 64290}, {"score": 340, "count": 146, "cumulative": 64436}, {"score": 339, "count": 160, "cumulative": 64596}, {"score": 338, "count": 167, "cumulative": 64763}, {"score": 337, "count": 188, "cumulative": 64951}, {"score": 336, "count": 173, "cumulative": 65124}, {"score": 335, "count": 165, "cumulative": 65289}, {"score": 334, "count": 156, "cumulative": 65445}, {"score": 333, "count": 161, "cumulative": 65606}, {"score": 332, "count": 156, "cumulative": 65762}, {"score": 331, "count": 155, "cumulative": 65917}, {"score": 330, "count": 154, "cumulative": 66071}, {"score": 329, "count": 174, "cumulative": 66245}, {"score": 328, "count": 150, "cumulative": 66395}, {"score": 327, "count": 171, "cumulative": 66566}, {"score": 326, "count": 162, "cumulative": 66728}, {"score": 325, "count": 144, "cumulative": 66872}, {"score": 324, "count": 161, "cumulative": 67033}, {"score": 323, "count": 143, "cumulative": 67176}, {"score": 322, "count": 137, "cumulative": 67313}, {"score": 321, "count": 109, "cumulative": 67422}, {"score": 320, "count": 146, "cumulative": 67568}, {"score": 319, "count": 136, "cumulative": 67704}, {"score": 318, "count": 138, "cumulative": 67842}, {"score": 317, "count": 143, "cumulative": 67985}, {"score": 316, "count": 127, "cumulative": 68112}, {"score": 315, "count": 134, "cumulative": 68246}, {"score": 314, "count": 129, "cumulative": 68375}, {"score": 313, "count": 112, "cumulative": 68487}, {"score": 312, "count": 121, "cumulative": 68608}, {"score": 311, "count": 111, "cumulative": 68719}, {"score": 310, "count": 120, "cumulative": 68839}, {"score": 309, "count": 106, "cumulative": 68945}, {"score": 308, "count": 127, "cumulative": 69072}, {"score": 307, "count": 107, "cumulative": 69179}, {"score": 306, "count": 114, "cumulative": 69293}, {"score": 305, "count": 110, "cumulative": 69403}, {"score": 304, "count": 109, "cumulative": 69512}, {"score": 303, "count": 109, "cumulative": 69621}, {"score": 302, "count": 97, "cumulative": 69718}, {"score": 301, "count": 87, "cumulative": 69805}, {"score": 300, "count": 96, "cumulative": 69901}, {"score": 299, "count": 89, "cumulative": 69990}, {"score": 298, "count": 113, "cumulative": 70103}, {"score": 297, "count": 101, "cumulative": 70204}, {"score": 296, "count": 108, "cumulative": 70312}, {"score": 295, "count": 84, "cumulative": 70396}, {"score": 294, "count": 87, "cumulative": 70483}, {"score": 293, "count": 91, "cumulative": 70574}, {"score": 292, "count": 81, "cumulative": 70655}, {"score": 291, "count": 82, "cumulative": 70737}, {"score": 290, "count": 76, "cumulative": 70813}, {"score": 289, "count": 90, "cumulative": 70903}, {"score": 288, "count": 80, "cumulative": 70983}, {"score": 287, "count": 74, "cumulative": 71057}, {"score": 286, "count": 69, "cumulative": 71126}, {"score": 285, "count": 75, "cumulative": 71201}, {"score": 284, "count": 72, "cumulative": 71273}, {"score": 283, "count": 92, "cumulative": 71365}, {"score": 282, "count": 66, "cumulative": 71431}, {"score": 281, "count": 79, "cumulative": 71510}, {"score": 280, "count": 60, "cumulative": 71570}, {"score": 279, "count": 58, "cumulative": 71628}, {"score": 278, "count": 60, "cumulative": 71688}, {"score": 277, "count": 64, "cumulative": 71752}, {"score": 276, "count": 62, "cumulative": 71814}, {"score": 275, "count": 62, "cumulative": 71876}, {"score": 274, "count": 56, "cumulative": 71932}, {"score": 273, "count": 59, "cumulative": 71991}, {"score": 272, "count": 48, "cumulative": 72039}, {"score": 271, "count": 54, "cumulative": 72093}, {"score": 270, "count": 67, "cumulative": 72160}, {"score": 269, "count": 51, "cumulative": 72211}, {"score": 268, "count": 57, "cumulative": 72268}, {"score": 267, "count": 41, "cumulative": 72309}, {"score": 266, "count": 43, "cumulative": 72352}, {"score": 265, "count": 47, "cumulative": 72399}, {"score": 264, "count": 61, "cumulative": 72460}, {"score": 263, "count": 44, "cumulative": 72504}, {"score": 262, "count": 51, "cumulative": 72555}, {"score": 261, "count": 60, "cumulative": 72615}, {"score": 260, "count": 46, "cumulative": 72661}, {"score": 259, "count": 47, "cumulative": 72708}, {"score": 258, "count": 46, "cumulative": 72754}, {"score": 257, "count": 34, "cumulative": 72788}, {"score": 256, "count": 43, "cumulative": 72831}, {"score": 255, "count": 36, "cumulative": 72867}, {"score": 254, "count": 41, "cumulative": 72908}, {"score": 253, "count": 36, "cumulative": 72944}, {"score": 252, "count": 40, "cumulative": 72984}, {"score": 251, "count": 45, "cumulative": 73029}, {"score": 250, "count": 40, "cumulative": 73069}, {"score": 249, "count": 28, "cumulative": 73097}, {"score": 248, "count": 32, "cumulative": 73129}, {"score": 247, "count": 44, "cumulative": 73173}, {"score": 246, "count": 36, "cumulative": 73209}, {"score": 245, "count": 30, "cumulative": 73239}, {"score": 244, "count": 33, "cumulative": 73272}, {"score": 243, "count": 36, "cumulative": 73308}, {"score": 242, "count": 25, "cumulative": 73333}, {"score": 241, "count": 26, "cumulative": 73359}, {"score": 240, "count": 22, "cumulative": 73381}, {"score": 239, "count": 36, "cumulative": 73417}, {"score": 238, "count": 28, "cumulative": 73445}, {"score": 237, "count": 32, "cumulative": 73477}, {"score": 236, "count": 20, "cumulative": 73497}, {"score": 235, "count": 14, "cumulative": 73511}, {"score": 234, "count": 24, "cumulative": 73535}, {"score": 233, "count": 24, "cumulative": 73559}, {"score": 232, "count": 22, "cumulative": 73581}, {"score": 231, "count": 14, "cumulative": 73595}, {"score": 230, "count": 24, "cumulative": 73619}, {"score": 229, "count": 18, "cumulative": 73637}, {"score": 228, "count": 32, "cumulative": 73669}, {"score": 227, "count": 21, "cumulative": 73690}, {"score": 226, "count": 18, "cumulative": 73708}, {"score": 225, "count": 16, "cumulative": 73724}, {"score": 224, "count": 21, "cumulative": 73745}, {"score": 223, "count": 20, "cumulative": 73765}, {"score": 222, "count": 14, "cumulative": 73779}, {"score": 221, "count": 20, "cumulative": 73799}, {"score": 220, "count": 21, "cumulative": 73820}, {"score": 219, "count": 13, "cumulative": 73833}, {"score": 218, "count": 12, "cumulative": 73845}, {"score": 217, "count": 16, "cumulative": 73861}, {"score": 216, "count": 12, "cumulative": 73873}, {"score": 215, "count": 8, "cumulative": 73881}, {"score": 214, "count": 15, "cumulative": 73896}, {"score": 213, "count": 16, "cumulative": 73912}, {"score": 212, "count": 11, "cumulative": 73923}, {"score": 211, "count": 13, "cumulative": 73936}, {"score": 210, "count": 8, "cumulative": 73944}, {"score": 209, "count": 8, "cumulative": 73952}, {"score": 208, "count": 12, "cumulative": 73964}, {"score": 207, "count": 11, "cumulative": 73975}, {"score": 206, "count": 9, "cumulative": 73984}, {"score": 205, "count": 7, "cumulative": 73991}, {"score": 204, "count": 5, "cumulative": 73996}, {"score": 203, "count": 6, "cumulative": 74002}, {"score": 202, "count": 16, "cumulative": 74018}, {"score": 201, "count": 5, "cumulative": 74023}, {"score": 200, "count": 8, "cumulative": 74031}, {"score": 199, "count": 13, "cumulative": 74044}, {"score": 198, "count": 4, "cumulative": 74048}, {"score": 197, "count": 5, "cumulative": 74053}, {"score": 196, "count": 7, "cumulative": 74060}, {"score": 195, "count": 7, "cumulative": 74067}, {"score": 194, "count": 0, "cumulative": 74067}, {"score": 193, "count": 4, "cumulative": 74071}, {"score": 192, "count": 2, "cumulative": 74073}, {"score": 191, "count": 7, "cumulative": 74080}, {"score": 190, "count": 1, "cumulative": 74081}, {"score": 189, "count": 7, "cumulative": 74088}, {"score": 188, "count": 4, "cumulative": 74092}, {"score": 187, "count": 6, "cumulative": 74098}, {"score": 186, "count": 4, "cumulative": 74102}, {"score": 185, "count": 4, "cumulative": 74106}, {"score": 184, "count": 2, "cumulative": 74108}, {"score": 183, "count": 5, "cumulative": 74113}, {"score": 182, "count": 0, "cumulative": 74113}, {"score": 181, "count": 3, "cumulative": 74116}, {"score": 180, "count": 4, "cumulative": 74120}, {"score": 179, "count": 0, "cumulative": 74120}, {"score": 178, "count": 3, "cumulative": 74123}, {"score": 177, "count": 4, "cumulative": 74127}, {"score": 176, "count": 4, "cumulative": 74131}, {"score": 175, "count": 9, "cumulative": 74140}, {"score": 174, "count": 3, "cumulative": 74143}, {"score": 173, "count": 9, "cumulative": 74152}, {"score": 172, "count": 3, "cumulative": 74155}, {"score": 171, "count": 0, "cumulative": 74155}, {"score": 170, "count": 1, "cumulative": 74156}, {"score": 169, "count": 1, "cumulative": 74157}, {"score": 168, "count": 4, "cumulative": 74161}, {"score": 167, "count": 2, "cumulative": 74163}, {"score": 166, "count": 3, "cumulative": 74166}, {"score": 165, "count": 3, "cumulative": 74169}, {"score": 164, "count": 4, "cumulative": 74173}, {"score": 163, "count": 2, "cumulative": 74175}, {"score": 162, "count": 3, "cumulative": 74178}, {"score": 161, "count": 2, "cumulative": 74180}, {"score": 160, "count": 1, "cumulative": 74181}, {"score": 159, "count": 2, "cumulative": 74183}, {"score": 158, "count": 2, "cumulative": 74185}, {"score": 157, "count": 1, "cumulative": 74186}, {"score": 156, "count": 4, "cumulative": 74190}, {"score": 155, "count": 0, "cumulative": 74190}, {"score": 154, "count": 3, "cumulative": 74193}, {"score": 153, "count": 3, "cumulative": 74196}, {"score": 152, "count": 1, "cumulative": 74197}, {"score": 151, "count": 2, "cumulative": 74199}, {"score": 150, "count": 3, "cumulative": 74202}, {"score": 149, "count": 2, "cumulative": 74204}, {"score": 148, "count": 0, "cumulative": 74204}, {"score": 147, "count": 1, "cumulative": 74205}, {"score": 146, "count": 1, "cumulative": 74206}, {"score": 145, "count": 2, "cumulative": 74208}, {"score": 144, "count": 2, "cumulative": 74210}, {"score": 143, "count": 3, "cumulative": 74213}, {"score": 142, "count": 3, "cumulative": 74216}, {"score": 141, "count": 2, "cumulative": 74218}, {"score": 140, "count": 1, "cumulative": 74219}, {"score": 139, "count": 1, "cumulative": 74220}, {"score": 138, "count": 0, "cumulative": 74220}, {"score": 137, "count": 1, "cumulative": 74221}, {"score": 136, "count": 3, "cumulative": 74224}, {"score": 135, "count": 3, "cumulative": 74227}, {"score": 134, "count": 0, "cumulative": 74227}, {"score": 133, "count": 0, "cumulative": 74227}, {"score": 132, "count": 1, "cumulative": 74228}, {"score": 131, "count": 1, "cumulative": 74229}, {"score": 130, "count": 1, "cumulative": 74230}, {"score": 129, "count": 1, "cumulative": 74231}, {"score": 128, "count": 0, "cumulative": 74231}, {"score": 127, "count": 0, "cumulative": 74231}, {"score": 126, "count": 0, "cumulative": 74231}, {"score": 125, "count": 1, "cumulative": 74232}, {"score": 124, "count": 0, "cumulative": 74232}, {"score": 123, "count": 1, "cumulative": 74233}, {"score": 122, "count": 1, "cumulative": 74234}, {"score": 121, "count": 1, "cumulative": 74235}, {"score": 120, "count": 0, "cumulative": 74235}, {"score": 119, "count": 0, "cumulative": 74235}, {"score": 118, "count": 1, "cumulative": 74236}, {"score": 117, "count": 1, "cumulative": 74237}, {"score": 116, "count": 1, "cumulative": 74238}, {"score": 115, "count": 0, "cumulative": 74238}, {"score": 114, "count": 1, "cumulative": 74239}, {"score": 113, "count": 3, "cumulative": 74242}, {"score": 112, "count": 1, "cumulative": 74243}, {"score": 111, "count": 1, "cumulative": 74244}, {"score": 110, "count": 1, "cumulative": 74245}, {"score": 109, "count": 1, "cumulative": 74246}, {"score": 108, "count": 1, "cumulative": 74247}, {"score": 107, "count": 0, "cumulative": 74247}, {"score": 106, "count": 1, "cumulative": 74248}, {"score": 105, "count": 0, "cumulative": 74248}, {"score": 104, "count": 3, "cumulative": 74251}, {"score": 103, "count": 2, "cumulative": 74253}, {"score": 102, "count": 0, "cumulative": 74253}, {"score": 101, "count": 0, "cumulative": 74253}, {"score": 100, "count": 0, "cumulative": 74253}, {"score": 99, "count": 1, "cumulative": 74254}, {"score": 98, "count": 0, "cumulative": 74254}, {"score": 97, "count": 0, "cumulative": 74254}, {"score": 96, "count": 0, "cumulative": 74254}, {"score": 95, "count": 1, "cumulative": 74255}, {"score": 94, "count": 1, "cumulative": 74256}, {"score": 93, "count": 0, "cumulative": 74256}, {"score": 92, "count": 0, "cumulative": 74256}, {"score": 91, "count": 1, "cumulative": 74257}, {"score": 90, "count": 2, "cumulative": 74259}, {"score": 89, "count": 1, "cumulative": 74260}, {"score": 88, "count": 0, "cumulative": 74260}, {"score": 87, "count": 0, "cumulative": 74260}, {"score": 86, "count": 1, "cumulative": 74261}, {"score": 85, "count": 1, "cumulative": 74262}, {"score": 84, "count": 0, "cumulative": 74262}, {"score": 83, "count": 0, "cumulative": 74262}, {"score": 82, "count": 1, "cumulative": 74263}, {"score": 81, "count": 0, "cumulative": 74263}, {"score": 80, "count": 1, "cumulative": 74264}, {"score": 79, "count": 1, "cumulative": 74265}, {"score": 78, "count": 0, "cumulative": 74265}, {"score": 77, "count": 2, "cumulative": 74267}, {"score": 76, "count": 1, "cumulative": 74268}, {"score": 75, "count": 0, "cumulative": 74268}, {"score": 74, "count": 0, "cumulative": 74268}, {"score": 73, "count": 0, "cumulative": 74268}, {"score": 72, "count": 0, "cumulative": 74268}, {"score": 71, "count": 0, "cumulative": 74268}, {"score": 70, "count": 1, "cumulative": 74269}, {"score": 69, "count": 0, "cumulative": 74269}, {"score": 68, "count": 0, "cumulative": 74269}, {"score": 67, "count": 0, "cumulative": 74269}, {"score": 66, "count": 0, "cumulative": 74269}, {"score": 65, "count": 1, "cumulative": 74270}, {"score": 64, "count": 0, "cumulative": 74270}, {"score": 63, "count": 0, "cumulative": 74270}, {"score": 62, "count": 0, "cumulative": 74270}, {"score": 61, "count": 0, "cumulative": 74270}, {"score": 60, "count": 0, "cumulative": 74270}, {"score": 59, "count": 0, "cumulative": 74270}, {"score": 58, "count": 0, "cumulative": 74270}, {"score": 57, "count": 0, "cumulative": 74270}, {"score": 56, "count": 2, "cumulative": 74272}, {"score": 55, "count": 1, "cumulative": 74273}, {"score": 54, "count": 0, "cumulative": 74273}, {"score": 53, "count": 0, "cumulative": 74273}, {"score": 52, "count": 1, "cumulative": 74274}, {"score": 51, "count": 1, "cumulative": 74275}, {"score": 50, "count": 1, "cumulative": 74276}, {"score": 49, "count": 0, "cumulative": 74276}, {"score": 48, "count": 0, "cumulative": 74276}, {"score": 47, "count": 1, "cumulative": 74277}, {"score": 46, "count": 0, "cumulative": 74277}, {"score": 45, "count": 0, "cumulative": 74277}, {"score": 44, "count": 0, "cumulative": 74277}, {"score": 43, "count": 1, "cumulative": 74278}, {"score": 42, "count": 0, "cumulative": 74278}, {"score": 41, "count": 0, "cumulative": 74278}, {"score": 40, "count": 1, "cumulative": 74279}, {"score": 39, "count": 0, "cumulative": 74279}, {"score": 38, "count": 0, "cumulative": 74279}, {"score": 37, "count": 0, "cumulative": 74279}, {"score": 36, "count": 0, "cumulative": 74279}, {"score": 35, "count": 0, "cumulative": 74279}, {"score": 34, "count": 2, "cumulative": 74281}, {"score": 33, "count": 1, "cumulative": 74282}, {"score": 32, "count": 1, "cumulative": 74283}, {"score": 31, "count": 1, "cumulative": 74284}, {"score": 30, "count": 1, "cumulative": 74285}, {"score": 29, "count": 0, "cumulative": 74285}, {"score": 28, "count": 0, "cumulative": 74285}, {"score": 27, "count": 0, "cumulative": 74285}, {"score": 26, "count": 1, "cumulative": 74286}, {"score": 25, "count": 1, "cumulative": 74287}, {"score": 24, "count": 1, "cumulative": 74288}, {"score": 23, "count": 0, "cumulative": 74288}, {"score": 22, "count": 0, "cumulative": 74288}, {"score": 21, "count": 1, "cumulative": 74289}, {"score": 20, "count": 1, "cumulative": 74290}, {"score": 19, "count": 0, "cumulative": 74290}, {"score": 18, "count": 0, "cumulative": 74290}, {"score": 17, "count": 0, "cumulative": 74290}, {"score": 16, "count": 2, "cumulative": 74292}, {"score": 15, "count": 0, "cumulative": 74292}, {"score": 14, "count": 0, "cumulative": 74292}, {"score": 13, "count": 0, "cumulative": 74292}, {"score": 12, "count": 0, "cumulative": 74292}, {"score": 11, "count": 0, "cumulative": 74292}, {"score": 10, "count": 0, "cumulative": 74292}, {"score": 9, "count": 1, "cumulative": 74293}, {"score": 8, "count": 0, "cumulative": 74293}, {"score": 7, "count": 1, "cumulative": 74294}, {"score": 6, "count": 0, "cumulative": 74294}, {"score": 5, "count": 2, "cumulative": 74296}, {"score": 4, "count": 0, "cumulative": 74296}, {"score": 3, "count": 0, "cumulative": 74296}, {"score": 2, "count": 0, "cumulative": 74296}, {"score": 1, "count": 1, "cumulative": 74297}, {"score": 0, "count": 1254, "cumulative": 75551}]}
1
+ {"province": "jilin", "province_name": "吉林", "year": 2026, "track": "physics", "track_cn": "物理类", "source": "吉林省教育考试院 官方PDF《2026年吉林省普通高校招生考试物理-普通1分段表(含照顾分)》(经 eol.cn 入口页发现,pdftotext 文本层提取)", "source_url": "https://www.jleea.com.cn/u/cms/www/2026/06/25/2069968279602028546.pdf", "note": "源自吉林省教育考试院官方PDF《2026年吉林省普通高校招生考试物理-普通1分段表(含照顾分)》(https://www.jleea.com.cn/u/cms/www/2026/06/25/2069968279602028546.pdf),经eol.cn入口页(https://gaokao.eol.cn/ji_lin/dongtai/202606/t20260625_2749028.shtml)发现。PDF含文本层(非扫描),用pdftotext -layout提取tens×ones累计矩阵,按score=tens+ones逐分还原为[分数,累计人数]两列表,cumulative逐格取自官方PDF原值。顶部707=12为官方合并段(≥707累计12人),0分行=75551为官方0分/照顾分末段。本科线物理321→累计67422,特控线473→累计31914。;count 由 cumulative(位次) 反推(官方表为累计制/顶部分段合并)", "count": 708, "rows": [{"score": 707, "count": 12, "cumulative": 12}, {"score": 706, "count": 0, "cumulative": 12}, {"score": 705, "count": 2, "cumulative": 14}, {"score": 704, "count": 1, "cumulative": 15}, {"score": 703, "count": 3, "cumulative": 18}, {"score": 702, "count": 6, "cumulative": 24}, {"score": 701, "count": 6, "cumulative": 30}, {"score": 700, "count": 2, "cumulative": 32}, {"score": 699, "count": 6, "cumulative": 38}, {"score": 698, "count": 4, "cumulative": 42}, {"score": 697, "count": 4, "cumulative": 46}, {"score": 696, "count": 7, "cumulative": 53}, {"score": 695, "count": 4, "cumulative": 57}, {"score": 694, "count": 13, "cumulative": 70}, {"score": 693, "count": 9, "cumulative": 79}, {"score": 692, "count": 7, "cumulative": 86}, {"score": 691, "count": 15, "cumulative": 101}, {"score": 690, "count": 7, "cumulative": 108}, {"score": 689, "count": 12, "cumulative": 120}, {"score": 688, "count": 13, "cumulative": 133}, {"score": 687, "count": 16, "cumulative": 149}, {"score": 686, "count": 13, "cumulative": 162}, {"score": 685, "count": 21, "cumulative": 183}, {"score": 684, "count": 14, "cumulative": 197}, {"score": 683, "count": 10, "cumulative": 207}, {"score": 682, "count": 23, "cumulative": 230}, {"score": 681, "count": 15, "cumulative": 245}, {"score": 680, "count": 23, "cumulative": 268}, {"score": 679, "count": 21, "cumulative": 289}, {"score": 678, "count": 21, "cumulative": 310}, {"score": 677, "count": 21, "cumulative": 331}, {"score": 676, "count": 19, "cumulative": 350}, {"score": 675, "count": 19, "cumulative": 369}, {"score": 674, "count": 15, "cumulative": 384}, {"score": 673, "count": 21, "cumulative": 405}, {"score": 672, "count": 19, "cumulative": 424}, {"score": 671, "count": 25, "cumulative": 449}, {"score": 670, "count": 31, "cumulative": 480}, {"score": 669, "count": 30, "cumulative": 510}, {"score": 668, "count": 41, "cumulative": 551}, {"score": 667, "count": 22, "cumulative": 573}, {"score": 666, "count": 32, "cumulative": 605}, {"score": 665, "count": 33, "cumulative": 638}, {"score": 664, "count": 34, "cumulative": 672}, {"score": 663, "count": 31, "cumulative": 703}, {"score": 662, "count": 34, "cumulative": 737}, {"score": 661, "count": 45, "cumulative": 782}, {"score": 660, "count": 40, "cumulative": 822}, {"score": 659, "count": 45, "cumulative": 867}, {"score": 658, "count": 53, "cumulative": 920}, {"score": 657, "count": 41, "cumulative": 961}, {"score": 656, "count": 56, "cumulative": 1017}, {"score": 655, "count": 50, "cumulative": 1067}, {"score": 654, "count": 45, "cumulative": 1112}, {"score": 653, "count": 57, "cumulative": 1169}, {"score": 652, "count": 40, "cumulative": 1209}, {"score": 651, "count": 47, "cumulative": 1256}, {"score": 650, "count": 70, "cumulative": 1326}, {"score": 649, "count": 52, "cumulative": 1378}, {"score": 648, "count": 51, "cumulative": 1429}, {"score": 647, "count": 70, "cumulative": 1499}, {"score": 646, "count": 57, "cumulative": 1556}, {"score": 645, "count": 80, "cumulative": 1636}, {"score": 644, "count": 55, "cumulative": 1691}, {"score": 643, "count": 75, "cumulative": 1766}, {"score": 642, "count": 74, "cumulative": 1840}, {"score": 641, "count": 65, "cumulative": 1905}, {"score": 640, "count": 77, "cumulative": 1982}, {"score": 639, "count": 81, "cumulative": 2063}, {"score": 638, "count": 84, "cumulative": 2147}, {"score": 637, "count": 96, "cumulative": 2243}, {"score": 636, "count": 82, "cumulative": 2325}, {"score": 635, "count": 83, "cumulative": 2408}, {"score": 634, "count": 83, "cumulative": 2491}, {"score": 633, "count": 83, "cumulative": 2574}, {"score": 632, "count": 81, "cumulative": 2655}, {"score": 631, "count": 89, "cumulative": 2744}, {"score": 630, "count": 109, "cumulative": 2853}, {"score": 629, "count": 86, "cumulative": 2939}, {"score": 628, "count": 88, "cumulative": 3027}, {"score": 627, "count": 94, "cumulative": 3121}, {"score": 626, "count": 84, "cumulative": 3205}, {"score": 625, "count": 84, "cumulative": 3289}, {"score": 624, "count": 98, "cumulative": 3387}, {"score": 623, "count": 105, "cumulative": 3492}, {"score": 622, "count": 106, "cumulative": 3598}, {"score": 621, "count": 89, "cumulative": 3687}, {"score": 620, "count": 100, "cumulative": 3787}, {"score": 619, "count": 103, "cumulative": 3890}, {"score": 618, "count": 87, "cumulative": 3977}, {"score": 617, "count": 103, "cumulative": 4080}, {"score": 616, "count": 99, "cumulative": 4179}, {"score": 615, "count": 92, "cumulative": 4271}, {"score": 614, "count": 110, "cumulative": 4381}, {"score": 613, "count": 109, "cumulative": 4490}, {"score": 612, "count": 113, "cumulative": 4603}, {"score": 611, "count": 99, "cumulative": 4702}, {"score": 610, "count": 123, "cumulative": 4825}, {"score": 609, "count": 114, "cumulative": 4939}, {"score": 608, "count": 134, "cumulative": 5073}, {"score": 607, "count": 134, "cumulative": 5207}, {"score": 606, "count": 130, "cumulative": 5337}, {"score": 605, "count": 136, "cumulative": 5473}, {"score": 604, "count": 127, "cumulative": 5600}, {"score": 603, "count": 118, "cumulative": 5718}, {"score": 602, "count": 127, "cumulative": 5845}, {"score": 601, "count": 115, "cumulative": 5960}, {"score": 600, "count": 132, "cumulative": 6092}, {"score": 599, "count": 131, "cumulative": 6223}, {"score": 598, "count": 133, "cumulative": 6356}, {"score": 597, "count": 141, "cumulative": 6497}, {"score": 596, "count": 152, "cumulative": 6649}, {"score": 595, "count": 126, "cumulative": 6775}, {"score": 594, "count": 111, "cumulative": 6886}, {"score": 593, "count": 144, "cumulative": 7030}, {"score": 592, "count": 144, "cumulative": 7174}, {"score": 591, "count": 138, "cumulative": 7312}, {"score": 590, "count": 150, "cumulative": 7462}, {"score": 589, "count": 167, "cumulative": 7629}, {"score": 588, "count": 151, "cumulative": 7780}, {"score": 587, "count": 130, "cumulative": 7910}, {"score": 586, "count": 139, "cumulative": 8049}, {"score": 585, "count": 148, "cumulative": 8197}, {"score": 584, "count": 134, "cumulative": 8331}, {"score": 583, "count": 154, "cumulative": 8485}, {"score": 582, "count": 148, "cumulative": 8633}, {"score": 581, "count": 135, "cumulative": 8768}, {"score": 580, "count": 145, "cumulative": 8913}, {"score": 579, "count": 166, "cumulative": 9079}, {"score": 578, "count": 153, "cumulative": 9232}, {"score": 577, "count": 155, "cumulative": 9387}, {"score": 576, "count": 168, "cumulative": 9555}, {"score": 575, "count": 151, "cumulative": 9706}, {"score": 574, "count": 155, "cumulative": 9861}, {"score": 573, "count": 157, "cumulative": 10018}, {"score": 572, "count": 152, "cumulative": 10170}, {"score": 571, "count": 160, "cumulative": 10330}, {"score": 570, "count": 166, "cumulative": 10496}, {"score": 569, "count": 163, "cumulative": 10659}, {"score": 568, "count": 168, "cumulative": 10827}, {"score": 567, "count": 168, "cumulative": 10995}, {"score": 566, "count": 159, "cumulative": 11154}, {"score": 565, "count": 177, "cumulative": 11331}, {"score": 564, "count": 187, "cumulative": 11518}, {"score": 563, "count": 181, "cumulative": 11699}, {"score": 562, "count": 187, "cumulative": 11886}, {"score": 561, "count": 178, "cumulative": 12064}, {"score": 560, "count": 191, "cumulative": 12255}, {"score": 559, "count": 175, "cumulative": 12430}, {"score": 558, "count": 204, "cumulative": 12634}, {"score": 557, "count": 183, "cumulative": 12817}, {"score": 556, "count": 172, "cumulative": 12989}, {"score": 555, "count": 170, "cumulative": 13159}, {"score": 554, "count": 186, "cumulative": 13345}, {"score": 553, "count": 221, "cumulative": 13566}, {"score": 552, "count": 190, "cumulative": 13756}, {"score": 551, "count": 178, "cumulative": 13934}, {"score": 550, "count": 173, "cumulative": 14107}, {"score": 549, "count": 166, "cumulative": 14273}, {"score": 548, "count": 213, "cumulative": 14486}, {"score": 547, "count": 195, "cumulative": 14681}, {"score": 546, "count": 210, "cumulative": 14891}, {"score": 545, "count": 212, "cumulative": 15103}, {"score": 544, "count": 217, "cumulative": 15320}, {"score": 543, "count": 207, "cumulative": 15527}, {"score": 542, "count": 172, "cumulative": 15699}, {"score": 541, "count": 216, "cumulative": 15915}, {"score": 540, "count": 246, "cumulative": 16161}, {"score": 539, "count": 214, "cumulative": 16375}, {"score": 538, "count": 227, "cumulative": 16602}, {"score": 537, "count": 246, "cumulative": 16848}, {"score": 536, "count": 202, "cumulative": 17050}, {"score": 535, "count": 237, "cumulative": 17287}, {"score": 534, "count": 225, "cumulative": 17512}, {"score": 533, "count": 206, "cumulative": 17718}, {"score": 532, "count": 221, "cumulative": 17939}, {"score": 531, "count": 211, "cumulative": 18150}, {"score": 530, "count": 220, "cumulative": 18370}, {"score": 529, "count": 217, "cumulative": 18587}, {"score": 528, "count": 205, "cumulative": 18792}, {"score": 527, "count": 213, "cumulative": 19005}, {"score": 526, "count": 213, "cumulative": 19218}, {"score": 525, "count": 208, "cumulative": 19426}, {"score": 524, "count": 201, "cumulative": 19627}, {"score": 523, "count": 234, "cumulative": 19861}, {"score": 522, "count": 224, "cumulative": 20085}, {"score": 521, "count": 209, "cumulative": 20294}, {"score": 520, "count": 225, "cumulative": 20519}, {"score": 519, "count": 222, "cumulative": 20741}, {"score": 518, "count": 228, "cumulative": 20969}, {"score": 517, "count": 205, "cumulative": 21174}, {"score": 516, "count": 207, "cumulative": 21381}, {"score": 515, "count": 234, "cumulative": 21615}, {"score": 514, "count": 242, "cumulative": 21857}, {"score": 513, "count": 245, "cumulative": 22102}, {"score": 512, "count": 269, "cumulative": 22371}, {"score": 511, "count": 265, "cumulative": 22636}, {"score": 510, "count": 212, "cumulative": 22848}, {"score": 509, "count": 242, "cumulative": 23090}, {"score": 508, "count": 230, "cumulative": 23320}, {"score": 507, "count": 259, "cumulative": 23579}, {"score": 506, "count": 262, "cumulative": 23841}, {"score": 505, "count": 215, "cumulative": 24056}, {"score": 504, "count": 221, "cumulative": 24277}, {"score": 503, "count": 239, "cumulative": 24516}, {"score": 502, "count": 251, "cumulative": 24767}, {"score": 501, "count": 223, "cumulative": 24990}, {"score": 500, "count": 274, "cumulative": 25264}, {"score": 499, "count": 236, "cumulative": 25500}, {"score": 498, "count": 240, "cumulative": 25740}, {"score": 497, "count": 239, "cumulative": 25979}, {"score": 496, "count": 214, "cumulative": 26193}, {"score": 495, "count": 204, "cumulative": 26397}, {"score": 494, "count": 243, "cumulative": 26640}, {"score": 493, "count": 226, "cumulative": 26866}, {"score": 492, "count": 262, "cumulative": 27128}, {"score": 491, "count": 241, "cumulative": 27369}, {"score": 490, "count": 242, "cumulative": 27611}, {"score": 489, "count": 251, "cumulative": 27862}, {"score": 488, "count": 225, "cumulative": 28087}, {"score": 487, "count": 287, "cumulative": 28374}, {"score": 486, "count": 245, "cumulative": 28619}, {"score": 485, "count": 242, "cumulative": 28861}, {"score": 484, "count": 247, "cumulative": 29108}, {"score": 483, "count": 277, "cumulative": 29385}, {"score": 482, "count": 254, "cumulative": 29639}, {"score": 481, "count": 221, "cumulative": 29860}, {"score": 480, "count": 248, "cumulative": 30108}, {"score": 479, "count": 260, "cumulative": 30368}, {"score": 478, "count": 263, "cumulative": 30631}, {"score": 477, "count": 250, "cumulative": 30881}, {"score": 476, "count": 211, "cumulative": 31092}, {"score": 475, "count": 268, "cumulative": 31360}, {"score": 474, "count": 284, "cumulative": 31644}, {"score": 473, "count": 270, "cumulative": 31914}, {"score": 472, "count": 256, "cumulative": 32170}, {"score": 471, "count": 222, "cumulative": 32392}, {"score": 470, "count": 235, "cumulative": 32627}, {"score": 469, "count": 255, "cumulative": 32882}, {"score": 468, "count": 283, "cumulative": 33165}, {"score": 467, "count": 264, "cumulative": 33429}, {"score": 466, "count": 268, "cumulative": 33697}, {"score": 465, "count": 265, "cumulative": 33962}, {"score": 464, "count": 257, "cumulative": 34219}, {"score": 463, "count": 259, "cumulative": 34478}, {"score": 462, "count": 272, "cumulative": 34750}, {"score": 461, "count": 265, "cumulative": 35015}, {"score": 460, "count": 276, "cumulative": 35291}, {"score": 459, "count": 249, "cumulative": 35540}, {"score": 458, "count": 265, "cumulative": 35805}, {"score": 457, "count": 265, "cumulative": 36070}, {"score": 456, "count": 267, "cumulative": 36337}, {"score": 455, "count": 270, "cumulative": 36607}, {"score": 454, "count": 260, "cumulative": 36867}, {"score": 453, "count": 276, "cumulative": 37143}, {"score": 452, "count": 280, "cumulative": 37423}, {"score": 451, "count": 241, "cumulative": 37664}, {"score": 450, "count": 283, "cumulative": 37947}, {"score": 449, "count": 238, "cumulative": 38185}, {"score": 448, "count": 250, "cumulative": 38435}, {"score": 447, "count": 291, "cumulative": 38726}, {"score": 446, "count": 261, "cumulative": 38987}, {"score": 445, "count": 288, "cumulative": 39275}, {"score": 444, "count": 268, "cumulative": 39543}, {"score": 443, "count": 248, "cumulative": 39791}, {"score": 442, "count": 285, "cumulative": 40076}, {"score": 441, "count": 245, "cumulative": 40321}, {"score": 440, "count": 305, "cumulative": 40626}, {"score": 439, "count": 283, "cumulative": 40909}, {"score": 438, "count": 275, "cumulative": 41184}, {"score": 437, "count": 283, "cumulative": 41467}, {"score": 436, "count": 278, "cumulative": 41745}, {"score": 435, "count": 277, "cumulative": 42022}, {"score": 434, "count": 294, "cumulative": 42316}, {"score": 433, "count": 267, "cumulative": 42583}, {"score": 432, "count": 266, "cumulative": 42849}, {"score": 431, "count": 281, "cumulative": 43130}, {"score": 430, "count": 267, "cumulative": 43397}, {"score": 429, "count": 271, "cumulative": 43668}, {"score": 428, "count": 285, "cumulative": 43953}, {"score": 427, "count": 281, "cumulative": 44234}, {"score": 426, "count": 236, "cumulative": 44470}, {"score": 425, "count": 256, "cumulative": 44726}, {"score": 424, "count": 270, "cumulative": 44996}, {"score": 423, "count": 262, "cumulative": 45258}, {"score": 422, "count": 273, "cumulative": 45531}, {"score": 421, "count": 275, "cumulative": 45806}, {"score": 420, "count": 281, "cumulative": 46087}, {"score": 419, "count": 251, "cumulative": 46338}, {"score": 418, "count": 281, "cumulative": 46619}, {"score": 417, "count": 274, "cumulative": 46893}, {"score": 416, "count": 291, "cumulative": 47184}, {"score": 415, "count": 264, "cumulative": 47448}, {"score": 414, "count": 255, "cumulative": 47703}, {"score": 413, "count": 250, "cumulative": 47953}, {"score": 412, "count": 252, "cumulative": 48205}, {"score": 411, "count": 273, "cumulative": 48478}, {"score": 410, "count": 277, "cumulative": 48755}, {"score": 409, "count": 268, "cumulative": 49023}, {"score": 408, "count": 263, "cumulative": 49286}, {"score": 407, "count": 255, "cumulative": 49541}, {"score": 406, "count": 247, "cumulative": 49788}, {"score": 405, "count": 266, "cumulative": 50054}, {"score": 404, "count": 270, "cumulative": 50324}, {"score": 403, "count": 232, "cumulative": 50556}, {"score": 402, "count": 275, "cumulative": 50831}, {"score": 401, "count": 271, "cumulative": 51102}, {"score": 400, "count": 242, "cumulative": 51344}, {"score": 399, "count": 220, "cumulative": 51564}, {"score": 398, "count": 270, "cumulative": 51834}, {"score": 397, "count": 246, "cumulative": 52080}, {"score": 396, "count": 255, "cumulative": 52335}, {"score": 395, "count": 221, "cumulative": 52556}, {"score": 394, "count": 240, "cumulative": 52796}, {"score": 393, "count": 293, "cumulative": 53089}, {"score": 392, "count": 223, "cumulative": 53312}, {"score": 391, "count": 222, "cumulative": 53534}, {"score": 390, "count": 270, "cumulative": 53804}, {"score": 389, "count": 248, "cumulative": 54052}, {"score": 388, "count": 252, "cumulative": 54304}, {"score": 387, "count": 259, "cumulative": 54563}, {"score": 386, "count": 255, "cumulative": 54818}, {"score": 385, "count": 250, "cumulative": 55068}, {"score": 384, "count": 240, "cumulative": 55308}, {"score": 383, "count": 249, "cumulative": 55557}, {"score": 382, "count": 251, "cumulative": 55808}, {"score": 381, "count": 246, "cumulative": 56054}, {"score": 380, "count": 225, "cumulative": 56279}, {"score": 379, "count": 257, "cumulative": 56536}, {"score": 378, "count": 256, "cumulative": 56792}, {"score": 377, "count": 213, "cumulative": 57005}, {"score": 376, "count": 219, "cumulative": 57224}, {"score": 375, "count": 237, "cumulative": 57461}, {"score": 374, "count": 236, "cumulative": 57697}, {"score": 373, "count": 209, "cumulative": 57906}, {"score": 372, "count": 251, "cumulative": 58157}, {"score": 371, "count": 223, "cumulative": 58380}, {"score": 370, "count": 189, "cumulative": 58569}, {"score": 369, "count": 213, "cumulative": 58782}, {"score": 368, "count": 209, "cumulative": 58991}, {"score": 367, "count": 196, "cumulative": 59187}, {"score": 366, "count": 222, "cumulative": 59409}, {"score": 365, "count": 211, "cumulative": 59620}, {"score": 364, "count": 204, "cumulative": 59824}, {"score": 363, "count": 218, "cumulative": 60042}, {"score": 362, "count": 213, "cumulative": 60255}, {"score": 361, "count": 209, "cumulative": 60464}, {"score": 360, "count": 200, "cumulative": 60664}, {"score": 359, "count": 196, "cumulative": 60860}, {"score": 358, "count": 197, "cumulative": 61057}, {"score": 357, "count": 202, "cumulative": 61259}, {"score": 356, "count": 224, "cumulative": 61483}, {"score": 355, "count": 203, "cumulative": 61686}, {"score": 354, "count": 191, "cumulative": 61877}, {"score": 353, "count": 191, "cumulative": 62068}, {"score": 352, "count": 184, "cumulative": 62252}, {"score": 351, "count": 174, "cumulative": 62426}, {"score": 350, "count": 199, "cumulative": 62625}, {"score": 349, "count": 196, "cumulative": 62821}, {"score": 348, "count": 189, "cumulative": 63010}, {"score": 347, "count": 216, "cumulative": 63226}, {"score": 346, "count": 173, "cumulative": 63399}, {"score": 345, "count": 172, "cumulative": 63571}, {"score": 344, "count": 178, "cumulative": 63749}, {"score": 343, "count": 200, "cumulative": 63949}, {"score": 342, "count": 161, "cumulative": 64110}, {"score": 341, "count": 180, "cumulative": 64290}, {"score": 340, "count": 146, "cumulative": 64436}, {"score": 339, "count": 160, "cumulative": 64596}, {"score": 338, "count": 167, "cumulative": 64763}, {"score": 337, "count": 188, "cumulative": 64951}, {"score": 336, "count": 173, "cumulative": 65124}, {"score": 335, "count": 165, "cumulative": 65289}, {"score": 334, "count": 156, "cumulative": 65445}, {"score": 333, "count": 161, "cumulative": 65606}, {"score": 332, "count": 156, "cumulative": 65762}, {"score": 331, "count": 155, "cumulative": 65917}, {"score": 330, "count": 154, "cumulative": 66071}, {"score": 329, "count": 174, "cumulative": 66245}, {"score": 328, "count": 150, "cumulative": 66395}, {"score": 327, "count": 171, "cumulative": 66566}, {"score": 326, "count": 162, "cumulative": 66728}, {"score": 325, "count": 144, "cumulative": 66872}, {"score": 324, "count": 161, "cumulative": 67033}, {"score": 323, "count": 143, "cumulative": 67176}, {"score": 322, "count": 137, "cumulative": 67313}, {"score": 321, "count": 109, "cumulative": 67422}, {"score": 320, "count": 146, "cumulative": 67568}, {"score": 319, "count": 136, "cumulative": 67704}, {"score": 318, "count": 138, "cumulative": 67842}, {"score": 317, "count": 143, "cumulative": 67985}, {"score": 316, "count": 127, "cumulative": 68112}, {"score": 315, "count": 134, "cumulative": 68246}, {"score": 314, "count": 129, "cumulative": 68375}, {"score": 313, "count": 112, "cumulative": 68487}, {"score": 312, "count": 121, "cumulative": 68608}, {"score": 311, "count": 111, "cumulative": 68719}, {"score": 310, "count": 120, "cumulative": 68839}, {"score": 309, "count": 106, "cumulative": 68945}, {"score": 308, "count": 127, "cumulative": 69072}, {"score": 307, "count": 107, "cumulative": 69179}, {"score": 306, "count": 114, "cumulative": 69293}, {"score": 305, "count": 110, "cumulative": 69403}, {"score": 304, "count": 109, "cumulative": 69512}, {"score": 303, "count": 109, "cumulative": 69621}, {"score": 302, "count": 97, "cumulative": 69718}, {"score": 301, "count": 87, "cumulative": 69805}, {"score": 300, "count": 96, "cumulative": 69901}, {"score": 299, "count": 89, "cumulative": 69990}, {"score": 298, "count": 113, "cumulative": 70103}, {"score": 297, "count": 101, "cumulative": 70204}, {"score": 296, "count": 108, "cumulative": 70312}, {"score": 295, "count": 84, "cumulative": 70396}, {"score": 294, "count": 87, "cumulative": 70483}, {"score": 293, "count": 91, "cumulative": 70574}, {"score": 292, "count": 81, "cumulative": 70655}, {"score": 291, "count": 82, "cumulative": 70737}, {"score": 290, "count": 76, "cumulative": 70813}, {"score": 289, "count": 90, "cumulative": 70903}, {"score": 288, "count": 80, "cumulative": 70983}, {"score": 287, "count": 74, "cumulative": 71057}, {"score": 286, "count": 69, "cumulative": 71126}, {"score": 285, "count": 75, "cumulative": 71201}, {"score": 284, "count": 72, "cumulative": 71273}, {"score": 283, "count": 92, "cumulative": 71365}, {"score": 282, "count": 66, "cumulative": 71431}, {"score": 281, "count": 79, "cumulative": 71510}, {"score": 280, "count": 60, "cumulative": 71570}, {"score": 279, "count": 58, "cumulative": 71628}, {"score": 278, "count": 60, "cumulative": 71688}, {"score": 277, "count": 64, "cumulative": 71752}, {"score": 276, "count": 62, "cumulative": 71814}, {"score": 275, "count": 62, "cumulative": 71876}, {"score": 274, "count": 56, "cumulative": 71932}, {"score": 273, "count": 59, "cumulative": 71991}, {"score": 272, "count": 48, "cumulative": 72039}, {"score": 271, "count": 54, "cumulative": 72093}, {"score": 270, "count": 67, "cumulative": 72160}, {"score": 269, "count": 51, "cumulative": 72211}, {"score": 268, "count": 57, "cumulative": 72268}, {"score": 267, "count": 41, "cumulative": 72309}, {"score": 266, "count": 43, "cumulative": 72352}, {"score": 265, "count": 47, "cumulative": 72399}, {"score": 264, "count": 61, "cumulative": 72460}, {"score": 263, "count": 44, "cumulative": 72504}, {"score": 262, "count": 51, "cumulative": 72555}, {"score": 261, "count": 60, "cumulative": 72615}, {"score": 260, "count": 46, "cumulative": 72661}, {"score": 259, "count": 47, "cumulative": 72708}, {"score": 258, "count": 46, "cumulative": 72754}, {"score": 257, "count": 34, "cumulative": 72788}, {"score": 256, "count": 43, "cumulative": 72831}, {"score": 255, "count": 36, "cumulative": 72867}, {"score": 254, "count": 41, "cumulative": 72908}, {"score": 253, "count": 36, "cumulative": 72944}, {"score": 252, "count": 40, "cumulative": 72984}, {"score": 251, "count": 45, "cumulative": 73029}, {"score": 250, "count": 40, "cumulative": 73069}, {"score": 249, "count": 28, "cumulative": 73097}, {"score": 248, "count": 32, "cumulative": 73129}, {"score": 247, "count": 44, "cumulative": 73173}, {"score": 246, "count": 36, "cumulative": 73209}, {"score": 245, "count": 30, "cumulative": 73239}, {"score": 244, "count": 33, "cumulative": 73272}, {"score": 243, "count": 36, "cumulative": 73308}, {"score": 242, "count": 25, "cumulative": 73333}, {"score": 241, "count": 26, "cumulative": 73359}, {"score": 240, "count": 22, "cumulative": 73381}, {"score": 239, "count": 36, "cumulative": 73417}, {"score": 238, "count": 28, "cumulative": 73445}, {"score": 237, "count": 32, "cumulative": 73477}, {"score": 236, "count": 20, "cumulative": 73497}, {"score": 235, "count": 14, "cumulative": 73511}, {"score": 234, "count": 24, "cumulative": 73535}, {"score": 233, "count": 24, "cumulative": 73559}, {"score": 232, "count": 22, "cumulative": 73581}, {"score": 231, "count": 14, "cumulative": 73595}, {"score": 230, "count": 24, "cumulative": 73619}, {"score": 229, "count": 18, "cumulative": 73637}, {"score": 228, "count": 32, "cumulative": 73669}, {"score": 227, "count": 21, "cumulative": 73690}, {"score": 226, "count": 18, "cumulative": 73708}, {"score": 225, "count": 16, "cumulative": 73724}, {"score": 224, "count": 21, "cumulative": 73745}, {"score": 223, "count": 20, "cumulative": 73765}, {"score": 222, "count": 14, "cumulative": 73779}, {"score": 221, "count": 20, "cumulative": 73799}, {"score": 220, "count": 21, "cumulative": 73820}, {"score": 219, "count": 13, "cumulative": 73833}, {"score": 218, "count": 12, "cumulative": 73845}, {"score": 217, "count": 16, "cumulative": 73861}, {"score": 216, "count": 12, "cumulative": 73873}, {"score": 215, "count": 8, "cumulative": 73881}, {"score": 214, "count": 15, "cumulative": 73896}, {"score": 213, "count": 16, "cumulative": 73912}, {"score": 212, "count": 11, "cumulative": 73923}, {"score": 211, "count": 13, "cumulative": 73936}, {"score": 210, "count": 8, "cumulative": 73944}, {"score": 209, "count": 8, "cumulative": 73952}, {"score": 208, "count": 12, "cumulative": 73964}, {"score": 207, "count": 11, "cumulative": 73975}, {"score": 206, "count": 9, "cumulative": 73984}, {"score": 205, "count": 7, "cumulative": 73991}, {"score": 204, "count": 5, "cumulative": 73996}, {"score": 203, "count": 6, "cumulative": 74002}, {"score": 202, "count": 16, "cumulative": 74018}, {"score": 201, "count": 5, "cumulative": 74023}, {"score": 200, "count": 8, "cumulative": 74031}, {"score": 199, "count": 13, "cumulative": 74044}, {"score": 198, "count": 4, "cumulative": 74048}, {"score": 197, "count": 5, "cumulative": 74053}, {"score": 196, "count": 7, "cumulative": 74060}, {"score": 195, "count": 7, "cumulative": 74067}, {"score": 194, "count": 0, "cumulative": 74067}, {"score": 193, "count": 4, "cumulative": 74071}, {"score": 192, "count": 2, "cumulative": 74073}, {"score": 191, "count": 7, "cumulative": 74080}, {"score": 190, "count": 1, "cumulative": 74081}, {"score": 189, "count": 7, "cumulative": 74088}, {"score": 188, "count": 4, "cumulative": 74092}, {"score": 187, "count": 6, "cumulative": 74098}, {"score": 186, "count": 4, "cumulative": 74102}, {"score": 185, "count": 4, "cumulative": 74106}, {"score": 184, "count": 2, "cumulative": 74108}, {"score": 183, "count": 5, "cumulative": 74113}, {"score": 182, "count": 0, "cumulative": 74113}, {"score": 181, "count": 3, "cumulative": 74116}, {"score": 180, "count": 4, "cumulative": 74120}, {"score": 179, "count": 0, "cumulative": 74120}, {"score": 178, "count": 3, "cumulative": 74123}, {"score": 177, "count": 4, "cumulative": 74127}, {"score": 176, "count": 4, "cumulative": 74131}, {"score": 175, "count": 9, "cumulative": 74140}, {"score": 174, "count": 3, "cumulative": 74143}, {"score": 173, "count": 9, "cumulative": 74152}, {"score": 172, "count": 3, "cumulative": 74155}, {"score": 171, "count": 0, "cumulative": 74155}, {"score": 170, "count": 1, "cumulative": 74156}, {"score": 169, "count": 1, "cumulative": 74157}, {"score": 168, "count": 4, "cumulative": 74161}, {"score": 167, "count": 2, "cumulative": 74163}, {"score": 166, "count": 3, "cumulative": 74166}, {"score": 165, "count": 3, "cumulative": 74169}, {"score": 164, "count": 4, "cumulative": 74173}, {"score": 163, "count": 2, "cumulative": 74175}, {"score": 162, "count": 3, "cumulative": 74178}, {"score": 161, "count": 2, "cumulative": 74180}, {"score": 160, "count": 1, "cumulative": 74181}, {"score": 159, "count": 2, "cumulative": 74183}, {"score": 158, "count": 2, "cumulative": 74185}, {"score": 157, "count": 1, "cumulative": 74186}, {"score": 156, "count": 4, "cumulative": 74190}, {"score": 155, "count": 0, "cumulative": 74190}, {"score": 154, "count": 3, "cumulative": 74193}, {"score": 153, "count": 3, "cumulative": 74196}, {"score": 152, "count": 1, "cumulative": 74197}, {"score": 151, "count": 2, "cumulative": 74199}, {"score": 150, "count": 3, "cumulative": 74202}, {"score": 149, "count": 2, "cumulative": 74204}, {"score": 148, "count": 0, "cumulative": 74204}, {"score": 147, "count": 1, "cumulative": 74205}, {"score": 146, "count": 1, "cumulative": 74206}, {"score": 145, "count": 2, "cumulative": 74208}, {"score": 144, "count": 2, "cumulative": 74210}, {"score": 143, "count": 3, "cumulative": 74213}, {"score": 142, "count": 3, "cumulative": 74216}, {"score": 141, "count": 2, "cumulative": 74218}, {"score": 140, "count": 1, "cumulative": 74219}, {"score": 139, "count": 1, "cumulative": 74220}, {"score": 138, "count": 0, "cumulative": 74220}, {"score": 137, "count": 1, "cumulative": 74221}, {"score": 136, "count": 3, "cumulative": 74224}, {"score": 135, "count": 3, "cumulative": 74227}, {"score": 134, "count": 0, "cumulative": 74227}, {"score": 133, "count": 0, "cumulative": 74227}, {"score": 132, "count": 1, "cumulative": 74228}, {"score": 131, "count": 1, "cumulative": 74229}, {"score": 130, "count": 1, "cumulative": 74230}, {"score": 129, "count": 1, "cumulative": 74231}, {"score": 128, "count": 0, "cumulative": 74231}, {"score": 127, "count": 0, "cumulative": 74231}, {"score": 126, "count": 0, "cumulative": 74231}, {"score": 125, "count": 1, "cumulative": 74232}, {"score": 124, "count": 0, "cumulative": 74232}, {"score": 123, "count": 1, "cumulative": 74233}, {"score": 122, "count": 1, "cumulative": 74234}, {"score": 121, "count": 1, "cumulative": 74235}, {"score": 120, "count": 0, "cumulative": 74235}, {"score": 119, "count": 0, "cumulative": 74235}, {"score": 118, "count": 1, "cumulative": 74236}, {"score": 117, "count": 1, "cumulative": 74237}, {"score": 116, "count": 1, "cumulative": 74238}, {"score": 115, "count": 0, "cumulative": 74238}, {"score": 114, "count": 1, "cumulative": 74239}, {"score": 113, "count": 3, "cumulative": 74242}, {"score": 112, "count": 1, "cumulative": 74243}, {"score": 111, "count": 1, "cumulative": 74244}, {"score": 110, "count": 1, "cumulative": 74245}, {"score": 109, "count": 1, "cumulative": 74246}, {"score": 108, "count": 1, "cumulative": 74247}, {"score": 107, "count": 0, "cumulative": 74247}, {"score": 106, "count": 1, "cumulative": 74248}, {"score": 105, "count": 0, "cumulative": 74248}, {"score": 104, "count": 3, "cumulative": 74251}, {"score": 103, "count": 2, "cumulative": 74253}, {"score": 102, "count": 0, "cumulative": 74253}, {"score": 101, "count": 0, "cumulative": 74253}, {"score": 100, "count": 0, "cumulative": 74253}, {"score": 99, "count": 1, "cumulative": 74254}, {"score": 98, "count": 0, "cumulative": 74254}, {"score": 97, "count": 0, "cumulative": 74254}, {"score": 96, "count": 0, "cumulative": 74254}, {"score": 95, "count": 1, "cumulative": 74255}, {"score": 94, "count": 1, "cumulative": 74256}, {"score": 93, "count": 0, "cumulative": 74256}, {"score": 92, "count": 0, "cumulative": 74256}, {"score": 91, "count": 1, "cumulative": 74257}, {"score": 90, "count": 2, "cumulative": 74259}, {"score": 89, "count": 1, "cumulative": 74260}, {"score": 88, "count": 0, "cumulative": 74260}, {"score": 87, "count": 0, "cumulative": 74260}, {"score": 86, "count": 1, "cumulative": 74261}, {"score": 85, "count": 1, "cumulative": 74262}, {"score": 84, "count": 0, "cumulative": 74262}, {"score": 83, "count": 0, "cumulative": 74262}, {"score": 82, "count": 1, "cumulative": 74263}, {"score": 81, "count": 0, "cumulative": 74263}, {"score": 80, "count": 1, "cumulative": 74264}, {"score": 79, "count": 1, "cumulative": 74265}, {"score": 78, "count": 0, "cumulative": 74265}, {"score": 77, "count": 2, "cumulative": 74267}, {"score": 76, "count": 1, "cumulative": 74268}, {"score": 75, "count": 0, "cumulative": 74268}, {"score": 74, "count": 0, "cumulative": 74268}, {"score": 73, "count": 0, "cumulative": 74268}, {"score": 72, "count": 0, "cumulative": 74268}, {"score": 71, "count": 0, "cumulative": 74268}, {"score": 70, "count": 1, "cumulative": 74269}, {"score": 69, "count": 0, "cumulative": 74269}, {"score": 68, "count": 0, "cumulative": 74269}, {"score": 67, "count": 0, "cumulative": 74269}, {"score": 66, "count": 0, "cumulative": 74269}, {"score": 65, "count": 1, "cumulative": 74270}, {"score": 64, "count": 0, "cumulative": 74270}, {"score": 63, "count": 0, "cumulative": 74270}, {"score": 62, "count": 0, "cumulative": 74270}, {"score": 61, "count": 0, "cumulative": 74270}, {"score": 60, "count": 0, "cumulative": 74270}, {"score": 59, "count": 0, "cumulative": 74270}, {"score": 58, "count": 0, "cumulative": 74270}, {"score": 57, "count": 0, "cumulative": 74270}, {"score": 56, "count": 2, "cumulative": 74272}, {"score": 55, "count": 1, "cumulative": 74273}, {"score": 54, "count": 0, "cumulative": 74273}, {"score": 53, "count": 0, "cumulative": 74273}, {"score": 52, "count": 1, "cumulative": 74274}, {"score": 51, "count": 1, "cumulative": 74275}, {"score": 50, "count": 1, "cumulative": 74276}, {"score": 49, "count": 0, "cumulative": 74276}, {"score": 48, "count": 0, "cumulative": 74276}, {"score": 47, "count": 1, "cumulative": 74277}, {"score": 46, "count": 0, "cumulative": 74277}, {"score": 45, "count": 0, "cumulative": 74277}, {"score": 44, "count": 0, "cumulative": 74277}, {"score": 43, "count": 1, "cumulative": 74278}, {"score": 42, "count": 0, "cumulative": 74278}, {"score": 41, "count": 0, "cumulative": 74278}, {"score": 40, "count": 1, "cumulative": 74279}, {"score": 39, "count": 0, "cumulative": 74279}, {"score": 38, "count": 0, "cumulative": 74279}, {"score": 37, "count": 0, "cumulative": 74279}, {"score": 36, "count": 0, "cumulative": 74279}, {"score": 35, "count": 0, "cumulative": 74279}, {"score": 34, "count": 2, "cumulative": 74281}, {"score": 33, "count": 1, "cumulative": 74282}, {"score": 32, "count": 1, "cumulative": 74283}, {"score": 31, "count": 1, "cumulative": 74284}, {"score": 30, "count": 1, "cumulative": 74285}, {"score": 29, "count": 0, "cumulative": 74285}, {"score": 28, "count": 0, "cumulative": 74285}, {"score": 27, "count": 0, "cumulative": 74285}, {"score": 26, "count": 1, "cumulative": 74286}, {"score": 25, "count": 1, "cumulative": 74287}, {"score": 24, "count": 1, "cumulative": 74288}, {"score": 23, "count": 0, "cumulative": 74288}, {"score": 22, "count": 0, "cumulative": 74288}, {"score": 21, "count": 1, "cumulative": 74289}, {"score": 20, "count": 1, "cumulative": 74290}, {"score": 19, "count": 0, "cumulative": 74290}, {"score": 18, "count": 0, "cumulative": 74290}, {"score": 17, "count": 0, "cumulative": 74290}, {"score": 16, "count": 2, "cumulative": 74292}, {"score": 15, "count": 0, "cumulative": 74292}, {"score": 14, "count": 0, "cumulative": 74292}, {"score": 13, "count": 0, "cumulative": 74292}, {"score": 12, "count": 0, "cumulative": 74292}, {"score": 11, "count": 0, "cumulative": 74292}, {"score": 10, "count": 0, "cumulative": 74292}, {"score": 9, "count": 1, "cumulative": 74293}, {"score": 8, "count": 0, "cumulative": 74293}, {"score": 7, "count": 1, "cumulative": 74294}, {"score": 6, "count": 0, "cumulative": 74294}, {"score": 5, "count": 2, "cumulative": 74296}, {"score": 4, "count": 0, "cumulative": 74296}, {"score": 3, "count": 0, "cumulative": 74296}, {"score": 2, "count": 0, "cumulative": 74296}, {"score": 1, "count": 1, "cumulative": 74297}, {"score": 0, "count": 1254, "cumulative": 75551}]}
@@ -128,9 +128,26 @@ export type AdmissionScoreResponse = {
128
128
  item: AdmissionScoreItem[];
129
129
  };
130
130
  };
131
+ export declare class GaokaoDynamicError extends Error {
132
+ uri: string;
133
+ apiCode: string;
134
+ apiMessage: string;
135
+ constructor(uri: string, apiCode: string, apiMessage: string);
136
+ }
131
137
  export declare function getSchoolInfo(schoolId: number | string): Promise<SchoolInfo>;
132
- export declare function getAdmissionPlan(schoolId: number | string, year: number, provinceId: number | string): Promise<AdmissionPlanItem[]>;
133
- export declare function getAdmissionScores(schoolId: number | string, year: number, provinceId: number | string): Promise<AdmissionScoreItem[]>;
138
+ export type FetchListOpts = {
139
+ noCache?: boolean;
140
+ };
141
+ export declare function getAdmissionPlan(schoolId: number | string, year: number, provinceId: number | string, opts?: FetchListOpts): Promise<AdmissionPlanItem[]>;
142
+ export declare function getAdmissionScores(schoolId: number | string, year: number, provinceId: number | string, opts?: FetchListOpts): Promise<AdmissionScoreItem[]>;
143
+ export declare function checkSourceHealth(): Promise<{
144
+ ok: boolean;
145
+ checks: Array<{
146
+ name: string;
147
+ ok: boolean;
148
+ detail: string;
149
+ }>;
150
+ }>;
134
151
  export declare function extractHistoricalScores(info: SchoolInfo, provinceId: number | string): Array<{
135
152
  year: number;
136
153
  track: string;
package/dist/gaokao-cn.js CHANGED
@@ -232,18 +232,343 @@ function isTransientNetworkError(err) {
232
232
  // undici surfaces these as TypeError("fetch failed") with a .cause.
233
233
  return err.name === "TypeError" && /fetch failed|network|ECONN|ENOTFOUND|EAI_AGAIN|socket/i.test(`${err.message} ${err.cause?.code ?? ""} ${err.cause?.message ?? ""}`);
234
234
  }
235
+ // ---------------------------------------------------------------------------
236
+ // Dynamic API tier — api.zjzw.cn (掌上高考's app/web backend).
237
+ //
238
+ // WHY THIS EXISTS: as of 2026-06 the free static tier retired the per-school
239
+ // admission-plan and admission-score objects. Every
240
+ // static-data.gaokao.cn/www/2.0/schoolspecialplan/{id}/{year}/{prov}.json
241
+ // static-data.gaokao.cn/www/2.0/schoolspecialscore/{id}/{year}/{prov}.json
242
+ // now 404s at the OSS layer ("NoSuchKey"), for ALL years — not just 2026. Only
243
+ // /school/{id}/info.json survived (so the min-score corpus in school-index.json.gz,
244
+ // and therefore recommend/top/paiming, are unaffected). The granular per-major
245
+ // plan & score data moved to the dynamic host below, which:
246
+ // • is UNSIGNED for GET (no signsafe/md5 needed — a version param actually breaks it),
247
+ // • is keyed by local_province_id (the STUDENT's province), NOT the school's,
248
+ // • paginates via size/page and reports the total in data.numFound,
249
+ // • rate-limits aggressively → we serialize requests through a min-gap throttle.
250
+ //
251
+ // The item shapes come back field-compatible with the old static ones, modulo a
252
+ // few renames (score uses sp_scode not spcode; no top-level track `type`; num is
253
+ // a string) which mapPlanItem/mapScoreItem below normalize back to our types.
254
+ const DYNAMIC_BASE = "https://api.zjzw.cn/web/api/";
255
+ const DYNAMIC_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36";
256
+ const PLAN_URI = "apidata/api/gkv3/plan/school";
257
+ const SCORE_URI = "apidata/api/gk/score/special";
258
+ const DYNAMIC_PAGE_SIZE = 50;
259
+ // Cap on pages fetched per (school, year, province) — a backstop against a
260
+ // runaway numFound. 50 pages × 50 = 2500 majors, far above any real school.
261
+ const DYNAMIC_MAX_PAGES = 50;
262
+ // Minimum gap between dynamic requests (ms). The host returns empty bodies under
263
+ // load (a silent rate-limit), which would masquerade as "school has no plan" —
264
+ // exactly the kind of silent miss we must never ship. Override via env.
265
+ const DYNAMIC_MIN_GAP_MS = (() => {
266
+ const env = Number(process.env.GAOKAO_CN_DYNAMIC_GAP_MS);
267
+ return Number.isFinite(env) && env >= 0 ? env : 250;
268
+ })();
269
+ // Raised when the dynamic host answers with a non-success application code
270
+ // (e.g. 1064 "接口请求版本不存在" = the endpoint moved again). Distinct type so
271
+ // callers/health-checks can tell "the API changed" apart from "no data".
272
+ export class GaokaoDynamicError extends Error {
273
+ uri;
274
+ apiCode;
275
+ apiMessage;
276
+ constructor(uri, apiCode, apiMessage) {
277
+ super(`gaokao.cn dynamic endpoint '${uri}' returned code=${apiCode} (${apiMessage}). ` +
278
+ `The upstream API path likely changed again — update DYNAMIC_BASE/PLAN_URI/SCORE_URI in gaokao-cn.ts.`);
279
+ this.uri = uri;
280
+ this.apiCode = apiCode;
281
+ this.apiMessage = apiMessage;
282
+ this.name = "GaokaoDynamicError";
283
+ }
284
+ }
285
+ // Global serializing throttle. Every dynamic request awaits the previous one plus
286
+ // a min gap, so a fan-out (the bulk pull runs concurrency 8) can't stampede the host.
287
+ let dynamicChain = Promise.resolve();
288
+ let lastDynamicAt = 0;
289
+ function throttleDynamic() {
290
+ dynamicChain = dynamicChain.then(async () => {
291
+ const wait = lastDynamicAt + DYNAMIC_MIN_GAP_MS - Date.now();
292
+ if (wait > 0)
293
+ await sleep(wait);
294
+ lastDynamicAt = Date.now();
295
+ });
296
+ return dynamicChain;
297
+ }
298
+ // Fetch one page of a dynamic list endpoint. Returns { item, numFound }.
299
+ // `data: []` (as opposed to `{ item, numFound }`) is the host's shape for an
300
+ // empty result — mapped to numFound 0.
301
+ async function fetchDynamicPage(uri, params, opts = {}) {
302
+ const qs = new URLSearchParams();
303
+ for (const [k, v] of Object.entries(params))
304
+ qs.set(k, String(v));
305
+ qs.set("uri", uri);
306
+ const url = `${DYNAMIC_BASE}?${qs.toString()}`;
307
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
308
+ const retries = opts.retries ?? DEFAULT_RETRIES;
309
+ let lastErr;
310
+ for (let attempt = 0; attempt <= retries; attempt++) {
311
+ await throttleDynamic();
312
+ const controller = new AbortController();
313
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
314
+ let timedOut = false;
315
+ try {
316
+ const res = await fetch(url, {
317
+ headers: { "User-Agent": DYNAMIC_UA, Referer: "https://www.gaokao.cn/" },
318
+ signal: controller.signal
319
+ });
320
+ if (!res.ok)
321
+ throw new RetryableError(`gaokao.cn dynamic ${res.status} ${res.statusText} for ${url}`);
322
+ const text = await res.text();
323
+ let body;
324
+ try {
325
+ body = JSON.parse(text);
326
+ }
327
+ catch {
328
+ throw new RetryableError(`gaokao.cn dynamic returned non-JSON for ${url}: ${text.slice(0, 160)}`);
329
+ }
330
+ if (body.code !== "0000") {
331
+ // Application-level error — deterministic for this uri, don't retry.
332
+ throw new GaokaoDynamicError(uri, body.code ?? "?", body.message ?? "");
333
+ }
334
+ const data = body.data;
335
+ if (Array.isArray(data))
336
+ return { item: [], numFound: 0 };
337
+ const item = Array.isArray(data?.item)
338
+ ? (data.item)
339
+ : [];
340
+ const numFound = Number(data?.numFound) || item.length;
341
+ return { item, numFound };
342
+ }
343
+ catch (err) {
344
+ if (err instanceof Error && err.name === "AbortError") {
345
+ timedOut = true;
346
+ lastErr = new GaokaoTimeoutError(url, timeoutMs);
347
+ }
348
+ else {
349
+ lastErr = err;
350
+ }
351
+ const retryable = timedOut || lastErr instanceof RetryableError || isTransientNetworkError(err);
352
+ if (!retryable || attempt === retries)
353
+ throw lastErr;
354
+ await sleep(RETRY_BACKOFF_MS * (attempt + 1) + Math.floor(Math.random() * 100));
355
+ }
356
+ finally {
357
+ clearTimeout(timer);
358
+ }
359
+ }
360
+ throw lastErr instanceof Error ? lastErr : new Error(String(lastErr));
361
+ }
362
+ // Fetch every page of a dynamic list endpoint and concatenate the raw items.
363
+ async function fetchDynamicAll(uri, params) {
364
+ const first = await fetchDynamicPage(uri, { ...params, size: DYNAMIC_PAGE_SIZE, page: 1 });
365
+ const out = first.item.slice();
366
+ const total = first.numFound;
367
+ const pages = Math.min(DYNAMIC_MAX_PAGES, Math.ceil(total / DYNAMIC_PAGE_SIZE));
368
+ for (let page = 2; page <= pages && out.length < total; page++) {
369
+ const next = await fetchDynamicPage(uri, { ...params, size: DYNAMIC_PAGE_SIZE, page });
370
+ if (next.item.length === 0) {
371
+ // An empty page WHILE items are still missing is the host's silent
372
+ // rate-limit truncation, NOT a clean end-of-list. Surfacing it as an error
373
+ // (rather than returning a short list) stops an undercounted result from
374
+ // being cached/shipped as if the school simply had fewer majors.
375
+ throw new GaokaoDynamicError(uri, "EMPTY_MID_PAGE", `page ${page} came back empty while only ${out.length}/${total} items fetched — suspected rate-limit truncation`);
376
+ }
377
+ out.push(...next.item);
378
+ }
379
+ return out;
380
+ }
381
+ const str = (v) => (v == null ? "" : String(v));
382
+ const int = (v) => {
383
+ const n = Number(v);
384
+ return Number.isFinite(n) ? n : 0;
385
+ };
386
+ // 掌上高考's dynamic items carry local_type_name ("文科"/"物理"/…) rather than the
387
+ // numeric track `type` code the static tier used. Map it back so TRACK_NAMES lookups
388
+ // (and any track-based filtering) keep working.
389
+ const TRACK_CODE_BY_NAME = {
390
+ 理工: "1", 理科: "1",
391
+ 文史: "2", 文科: "2",
392
+ 综合改革: "3", 综合: "3", 不分文理: "3",
393
+ 物理类: "2073", 物理: "2073",
394
+ 历史类: "2074", 历史: "2074"
395
+ };
396
+ function trackCodeFromName(name) {
397
+ return TRACK_CODE_BY_NAME[str(name).trim()] ?? str(name);
398
+ }
399
+ // The dynamic tier writes "-" (and occasionally "") for 普通类/无特殊招生类型, whereas
400
+ // the old static tier returned the literal "普通类". Normalize it for DISPLAY so
401
+ // consumers don't surface a bare "-" (e.g. the pull's byZslx map keying 普通类 under
402
+ // "-"). The raw classification field (`zslx`) keeps "-" so isPutong() still matches.
403
+ function normZslxName(raw) {
404
+ const s = str(raw).trim();
405
+ return s === "" || s === "-" ? "普通类" : s;
406
+ }
407
+ // provinceId is the query key (the student's 生源省) — the dynamic payload carries
408
+ // only local_province_name, no numeric id, so we thread the queried id in to keep
409
+ // the item's `province` field populated the way the static tier's was.
410
+ function mapPlanItem(r, provinceId) {
411
+ const rawZslx = str(r.zslx ?? r.zslx_name);
412
+ return {
413
+ school_id: str(r.school_id),
414
+ special_id: str(r.special_id),
415
+ province: str(provinceId),
416
+ year: r.year != null ? str(r.year) : undefined,
417
+ type: trackCodeFromName(r.local_type_name ?? r.type),
418
+ // Keep the raw "-" in zslx (the zhaosheng pull's isPutong() keys off zslx === "-");
419
+ // expose a human label in zslx_name.
420
+ zslx: rawZslx,
421
+ zslx_name: normZslxName(r.zslx_name ?? rawZslx),
422
+ batch: str(r.local_batch_id ?? r.batch),
423
+ local_batch_name: str(r.local_batch_name),
424
+ num: int(r.num),
425
+ length: str(r.length),
426
+ tuition: str(r.tuition),
427
+ spcode: str(r.spcode ?? r.sp_scode),
428
+ spname: str(r.spname),
429
+ sp_name: str(r.sp_name),
430
+ info: str(r.info),
431
+ remark: str(r.remark),
432
+ level1_name: str(r.level1_name),
433
+ level2_name: str(r.level2_name),
434
+ level3_name: str(r.level3_name),
435
+ // API returns a NUMBER (0 or a group id). Old code compares `!== "0"`, so a raw
436
+ // numeric 0 would be mis-read as a real group — always stringify.
437
+ special_group: str(r.special_group ?? "0"),
438
+ sp_xuanke: str(r.sp_xuanke),
439
+ sp_fxk: str(r.sp_fxk),
440
+ sp_sxk: str(r.sp_sxk),
441
+ sp_info: str(r.sp_info),
442
+ sg_xuanke: str(r.sg_xuanke),
443
+ sg_fxk: str(r.sg_fxk),
444
+ sg_sxk: str(r.sg_sxk),
445
+ sg_info: str(r.sg_info),
446
+ sg_name: str(r.sg_name),
447
+ first_km: str(r.first_km)
448
+ };
449
+ }
450
+ function mapScoreItem(r, provinceId) {
451
+ const min = int(r.min);
452
+ const proscore = Number(r.proscore); // 批次控制线; used to derive 分差 (the old `diff`)
453
+ const rawZslx = str(r.zslx ?? r.zslx_name);
454
+ return {
455
+ school_id: str(r.school_id),
456
+ special_id: str(r.special_id),
457
+ province: str(provinceId),
458
+ type: trackCodeFromName(r.local_type_name ?? r.type),
459
+ zslx: rawZslx,
460
+ zslx_name: normZslxName(r.zslx_name ?? rawZslx),
461
+ batch: str(r.local_batch_id ?? r.batch),
462
+ local_batch_name: str(r.local_batch_name),
463
+ // dynamic score tier names it sp_scode, not spcode.
464
+ spcode: r.sp_scode != null ? str(r.sp_scode) : r.spcode != null ? str(r.spcode) : undefined,
465
+ spname: str(r.spname),
466
+ sp_name: str(r.sp_name),
467
+ info: str(r.info),
468
+ remark: str(r.remark),
469
+ level1_name: str(r.level1_name),
470
+ level2_name: str(r.level2_name),
471
+ level3_name: str(r.level3_name),
472
+ special_group: str(r.special_group ?? "0"),
473
+ max: int(r.max),
474
+ min,
475
+ average: int(r.average),
476
+ lq_num: str(r.lq_num), // 录取人数 — not exposed by the dynamic tier; blank → downstream treats as 0
477
+ min_section: str(r.min_section ?? "-"),
478
+ min_range: str(r.min_range),
479
+ min_rank_range: str(r.min_rank_range),
480
+ range_max_rank: str(r.range_max_rank),
481
+ is_score_range: str(r.is_score_range),
482
+ diff: Number.isFinite(proscore) && proscore > 0 ? min - proscore : int(r.diff),
483
+ first_km: str(r.first_km),
484
+ sp_type: str(r.sp_type),
485
+ sp_fxk: str(r.sp_fxk),
486
+ sp_sxk: str(r.sp_sxk),
487
+ sp_info: str(r.sp_info),
488
+ sp_xuanke: str(r.sp_xuanke),
489
+ sg_fxk: str(r.sg_fxk),
490
+ sg_sxk: str(r.sg_sxk),
491
+ sg_type: str(r.sg_type),
492
+ sg_name: str(r.sg_name),
493
+ sg_info: str(r.sg_info),
494
+ sg_xuanke: str(r.sg_xuanke)
495
+ };
496
+ }
235
497
  // ---- Client ----
236
498
  export async function getSchoolInfo(schoolId) {
237
499
  return fetchJson(`/school/${schoolId}/info.json`);
238
500
  }
239
- export async function getAdmissionPlan(schoolId, year, provinceId) {
240
- const raw = await fetchJson(`/schoolspecialplan/${schoolId}/${year}/${provinceId}.json`);
241
- // Flatten all buckets into a single array.
242
- return Object.values(raw).flatMap((bucket) => bucket?.item ?? []);
501
+ // NOTE ON EMPTY RESULTS: the dynamic host silently degrades to an empty result
502
+ // (`code:0000, data:[]`) under rate-limiting, indistinguishable from a genuine
503
+ // "this school has no plan here". We therefore NEVER write an empty array to the
504
+ // cache freezing a throttle-induced empty for 24h would durably poison the data
505
+ // (and read as 缩招). A real empty is rare and cheap to re-fetch.
506
+ // Per-school × per-year × per-province admission plan. Sourced from the dynamic
507
+ // tier (see the block above); non-empty results are cached under a synthetic key
508
+ // so the on-disk response cache still shares hits across CLI invocations.
509
+ export async function getAdmissionPlan(schoolId, year, provinceId, opts = {}) {
510
+ const cacheKey = `dyn/plan/${schoolId}/${year}/${provinceId}`;
511
+ if (!opts.noCache) {
512
+ const hit = readCache(cacheKey);
513
+ if (hit !== undefined)
514
+ return hit;
515
+ }
516
+ const raw = await fetchDynamicAll(PLAN_URI, {
517
+ school_id: schoolId,
518
+ year,
519
+ local_province_id: provinceId
520
+ });
521
+ const items = raw.map((r) => mapPlanItem(r, provinceId));
522
+ if (!opts.noCache && items.length > 0)
523
+ writeCache(cacheKey, items);
524
+ return items;
525
+ }
526
+ export async function getAdmissionScores(schoolId, year, provinceId, opts = {}) {
527
+ const cacheKey = `dyn/score/${schoolId}/${year}/${provinceId}`;
528
+ if (!opts.noCache) {
529
+ const hit = readCache(cacheKey);
530
+ if (hit !== undefined)
531
+ return hit;
532
+ }
533
+ const raw = await fetchDynamicAll(SCORE_URI, {
534
+ school_id: schoolId,
535
+ year,
536
+ local_province_id: provinceId
537
+ });
538
+ const items = raw.map((r) => mapScoreItem(r, provinceId));
539
+ if (!opts.noCache && items.length > 0)
540
+ writeCache(cacheKey, items);
541
+ return items;
243
542
  }
244
- export async function getAdmissionScores(schoolId, year, provinceId) {
245
- const raw = await fetchJson(`/schoolspecialscore/${schoolId}/${year}/${provinceId}.json`);
246
- return Object.values(raw).flatMap((bucket) => bucket?.item ?? []);
543
+ // End-to-end source health probe. Verifies the surviving static endpoint AND the
544
+ // two dynamic endpoints we now depend on, so a future upstream move is caught by a
545
+ // single command rather than by silently-empty query results.
546
+ export async function checkSourceHealth() {
547
+ const checks = [];
548
+ const errMsg = (e) => (e instanceof Error ? e.message : String(e));
549
+ try {
550
+ const info = await getSchoolInfo(31);
551
+ const ok = info.name === "北京大学" && !!info.pro_type_min;
552
+ checks.push({ name: "static school/info.json (min-score corpus)", ok, detail: info.name });
553
+ }
554
+ catch (e) {
555
+ checks.push({ name: "static school/info.json (min-score corpus)", ok: false, detail: errMsg(e) });
556
+ }
557
+ try {
558
+ const plan = await getAdmissionPlan(31, 2024, 41); // 北大 × 河南 × 2024 — must be non-empty
559
+ checks.push({ name: `dynamic 招生计划 (${PLAN_URI})`, ok: plan.length > 0, detail: `${plan.length} 专业` });
560
+ }
561
+ catch (e) {
562
+ checks.push({ name: `dynamic 招生计划 (${PLAN_URI})`, ok: false, detail: errMsg(e) });
563
+ }
564
+ try {
565
+ const scores = await getAdmissionScores(31, 2024, 41); // 北大 × 河南 × 2024 — must be non-empty
566
+ checks.push({ name: `dynamic 录取分 (${SCORE_URI})`, ok: scores.length > 0, detail: `${scores.length} 专业分` });
567
+ }
568
+ catch (e) {
569
+ checks.push({ name: `dynamic 录取分 (${SCORE_URI})`, ok: false, detail: errMsg(e) });
570
+ }
571
+ return { ok: checks.every((c) => c.ok), checks };
247
572
  }
248
573
  // Convenience: historical min-score series for a given (school, province).
249
574
  // Returns [{ year, track, minScore }] sorted by year descending.
package/dist/selftest.js CHANGED
@@ -1,10 +1,14 @@
1
- // selftest — 3-stage end-to-end smoke that confirms the whole stack works.
2
- // Stage 1: upstream API works (school/31/info.json).
3
- // Stage 2: local school index loads and has expected shape.
4
- // Stage 3: 一分一段 table loads and looks up correctly.
1
+ // selftest — end-to-end smoke that confirms the whole stack works.
2
+ // Stage 1: static upstream works (school/31/info.json — the min-score corpus).
3
+ // Stage 2: dynamic upstream works (per-major 招生计划 api.zjzw.cn). This is the
4
+ // tier that broke in 2026-06 when the static schoolspecialplan objects were
5
+ // retired; a dedicated stage means a future move surfaces here, not as
6
+ // silently-empty query results.
7
+ // Stage 3: local school index loads and has expected shape.
8
+ // Stage 4: 一分一段 table loads and looks up correctly.
5
9
  //
6
10
  // Designed to be the single command a new install runs to know it's healthy.
7
- import { getSchoolInfo } from "./gaokao-cn.js";
11
+ import { getSchoolInfo, getAdmissionPlan } from "./gaokao-cn.js";
8
12
  import { loadIndex } from "./index-loader.js";
9
13
  import { loadRankTable, scoreToRank } from "./rank-table.js";
10
14
  async function timed(stage, fn) {
@@ -27,6 +31,17 @@ export async function runSelftest() {
27
31
  throw new Error("pro_type_min missing");
28
32
  }
29
33
  }));
34
+ results.push(await timed("dynamic 招生计划 (api.zjzw.cn)", async () => {
35
+ // 北大 × 河南 × 2024 reliably carries ~50 majors. Empty here means the plan
36
+ // source is down/relocated or rate-limiting — the exact 2026-06 breakage.
37
+ const plan = await getAdmissionPlan(31, 2024, 41);
38
+ if (plan.length === 0) {
39
+ throw new Error("empty plan (source down/relocated or rate-limited) — see gaokao-cn.ts DYNAMIC_BASE/PLAN_URI");
40
+ }
41
+ if (!plan.some((p) => /^\d{6}[A-Z]?$/.test(p.spcode))) {
42
+ throw new Error("plan rows carry no valid 专业代码 — item shape may have changed");
43
+ }
44
+ }));
30
45
  results.push(await timed("local school index", () => {
31
46
  const idx = loadIndex();
32
47
  if (idx.rows.length < 2000)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gaokao-pro",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "中国高考志愿规划 CLI · 用 Claude Code / Codex / Cursor 帮你查招生数据、出冲稳保。",
5
5
  "type": "module",
6
6
  "bin": {