From d9b52227d1696d5e0b4d2ad58e62ec80735f5473 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Thu, 30 May 2024 17:09:08 +0200 Subject: LAYOUT --- data.js | 2863 +++++++++ tools/layout.svg | 16734 ++++++++++++++++++++++++++++++++++++++++++++++++ tools/parse-layout.js | 461 ++ 3 files changed, 20058 insertions(+) create mode 100644 data.js create mode 100644 tools/layout.svg create mode 100644 tools/parse-layout.js diff --git a/data.js b/data.js new file mode 100644 index 0000000..828f758 --- /dev/null +++ b/data.js @@ -0,0 +1,2863 @@ +const data = { + type: { + objective_prussia: [ 31, 34, 35, 36, 37, 38, 43, 47, 48, 51, 61, 63, 66, 69 ], + objective_russia: [ 3, 13, 17, 27, 39, 40, 44, 45, 50, 65 ], + objective1_sweden: [ 1, 10, 19, 22, 30 ], + objective2_sweden: [ 14, 15, 28, 53, 67 ], + objective1_austria: [ 4, 8, 9, 21, 26, 29, 49, 52, 55, 56, 62, 68 ], + objective2_austria: [ 0, 6, 11, 23 ], + objective1_imperial: [ 2, 7, 20, 46, 64 ], + objective2_imperial: [ 12, 16, 18, 25, 33 ], + objective_france: [ 5, 24, 32, 41, 42, 54, 57, 58, 59, 60 ], + depot: [ 130, 192, 198, 229, 270, 348, 490, 531, 556, 658 ], + }, + suit: { + clubs: [ + [ 0, 18 ], + [ 70, 221 ], + ], + diamonds: [ + [ 19, 32 ], + [ 222, 375 ], + ], + hearts: [ + [ 33, 52 ], + [ 376, 523 ], + ], + spades: [ + [ 53, 69 ], + [ 524, 671 ], + ], + }, + country: { + Austria: [ + 31, 34, 35, 36, 37, 38, 43, 47, 48, 51, 61, 63, 66, 69, 227, 229, 249, 250, 314, 325, 326, 339, 350, 356, 357, + 362, 372, 381, 393, 406, 410, 424, 425, 427, 429, 431, 437, 441, 448, 450, 456, 457, 458, 464, 467, 469, 473, 477, + 482, 490, 491, 493, 498, 526, 530, 534, 572, 575, 576, 586, 588, 594, 605, 611, 621, 626, 627, 632, 638, 651, 652, + ], + Sweden: [ 87, 114, 198, 214, 262, 364 ], + Poland: [ + 86, 88, 91, 97, 110, 116, 131, 133, 140, 149, 150, 158, 159, 173, 176, 184, 192, 195, 203, 207, 217, 219, 220, + 226, 230, 232, 233, 234, 235, 236, 257, 260, 273, 276, 278, 280, 281, 282, 283, 284, 291, 297, 300, 301, 302, 306, + 311, 317, 318, 322, 323, 327, 328, 329, 333, 343, 349, 352, 354, 355, 361, 365, 366, 367, 368, 369, 373, 374, 375, + 376, 385, 387, 391, 404, 415, 416, 428, 430, 432, 434, 436, 443, 446, 452, 453, 459, 461, 465, 470, 481, 483, 486, + 489, 496, 497, 499, 501, 503, 504, 508, 510, 511, 512, 514, 519, 520, 521, 522, 523, 533, 535, 537, 540, 541, 548, + 554, 555, 562, 577, 578, 579, 580, 583, 598, 609, 613, 614, 616, 618, 619, 622, 624, 628, 629, 636, 637, 639, 642, + 646, 647, 649, 654, 656, 658, 660, 668, 669, 670, 671, + ], + Prussia: [ + 0, 1, 3, 4, 8, 9, 10, 13, 14, 15, 17, 19, 21, 22, 26, 27, 28, 30, 39, 40, 41, 42, 44, 45, 49, 50, 53, 55, 56, 58, + 62, 65, 67, 68, 73, 75, 78, 80, 93, 94, 98, 99, 100, 101, 104, 108, 109, 111, 115, 117, 120, 121, 123, 126, 129, + 132, 134, 135, 137, 139, 143, 144, 152, 154, 155, 163, 165, 168, 171, 177, 178, 179, 180, 183, 186, 187, 193, 196, + 197, 199, 202, 205, 215, 216, 237, 248, 254, 258, 259, 263, 265, 275, 277, 285, 298, 309, 315, 319, 320, 330, 336, + 358, 371, 383, 386, 390, 394, 396, 401, 403, 408, 409, 413, 418, 419, 420, 422, 423, 439, 454, 462, 471, 474, 479, + 480, 484, 485, 487, 492, 495, 507, 515, 516, 518, 525, 528, 529, 531, 532, 536, 538, 545, 550, 551, 553, 557, 559, + 561, 563, 564, 570, 571, 581, 582, 584, 585, 590, 591, 592, 595, 599, 600, 601, 607, 608, 610, 617, 620, 625, 630, + 635, 640, 643, 644, 645, 648, 650, 653, 655, 657, 659, 661, 663, 666, 667, + ], + Hanover: [ + 5, 24, 32, 54, 57, 59, 60, 70, 85, 103, 105, 145, 164, 188, 200, 201, 213, 224, 231, 243, 246, 252, 255, 268, 288, + 295, 296, 303, 304, 310, 334, 337, 338, 344, 346, 348, 359, 360, 363, 370, 421, 500, 524, 558, 568, 569, 587, 597, + 604, 612, 615, 634, 641, 664, + ], + Saxony: [ + 2, 6, 7, 11, 12, 16, 18, 20, 23, 25, 29, 33, 46, 52, 64, 76, 77, 82, 102, 113, 118, 136, 142, 147, 157, 160, 167, + 170, 175, 194, 210, 218, 221, 223, 225, 238, 239, 241, 245, 247, 264, 269, 271, 286, 287, 290, 292, 293, 316, 332, + 342, 347, 378, 380, 402, 411, 478, 506, 517, 542, 543, 549, 593, 596, + ], + Empire: [ + 71, 72, 74, 79, 81, 83, 84, 89, 90, 92, 95, 96, 106, 107, 112, 119, 122, 124, 125, 127, 128, 130, 138, 141, 146, + 148, 151, 153, 156, 161, 162, 166, 169, 172, 174, 181, 182, 185, 189, 190, 191, 204, 206, 208, 209, 211, 212, 222, + 228, 240, 242, 244, 251, 253, 256, 261, 266, 267, 270, 272, 274, 279, 289, 294, 299, 305, 307, 308, 312, 313, 321, + 324, 331, 335, 340, 341, 345, 351, 353, 377, 379, 382, 384, 388, 389, 392, 395, 397, 398, 399, 400, 405, 407, 412, + 414, 417, 426, 433, 435, 438, 440, 442, 444, 445, 447, 449, 451, 455, 460, 463, 466, 468, 472, 475, 476, 488, 494, + 502, 505, 509, 513, 527, 539, 544, 546, 547, 552, 556, 560, 565, 566, 567, 573, 574, 589, 602, 603, 606, 623, 631, + 633, 662, 665, + ], + }, + cities: { + name: [ + "Bunzlau", + "Cammin", + "Chemnitz", + "Colberg", + "Cosel", + "Diepholz", + "Görlitz", + "Leipzig", + "Liegnitz", + "Lublinitz", + "Malchin", + "Muskau", + "Naumburg", + "Neu Stettin", + "Neuruppin", + "Pritzwalk", + "Rochlitz", + "Stargard", + "Zwickau", + "Anklam", + "Dresden", + "Glatz", + "Greifenhagen", + "Kamenz", + "Kassel", + "Meißen", + "Neisse", + "Ortelsburg", + "Prenzlau", + "Radeberg", + "Stettin", + "Trübau", + "Wittingen", + "Bitterfeld", + "Eger", + "Friedland", + "Jungbunzlau", + "Kolin", + "Königgrätz", + "Königsberg", + "Küstrin", + "Magdeburg", + "Minden", + "Prag", + "Pyritz", + "Riesenburg", + "Torgau", + "Trautenau", + "Tschaslau", + "Waldenburg", + "Woldenberg", + "Wotitz", + "Zittau", + "Angermünde", + "Braunschweig", + "Breslau", + "Brieg", + "Göttingen", + "Halberstadt", + "Hameln", + "Hannover", + "Karlsbad", + "Oels", + "Pilsen", + "Pirna", + "Rastenburg", + "Saaz", + "Schwedt", + "Schweidnitz", + "Teplitz", + "Achim", + "Alsfeld", + "Altenburg", + "Altentreptow", + "Apolda", + "Arnswalde", + "Artern", + "Aue", + "Belgard", + "Betzdorf", + "Beuthen", + "Biedenkopf", + "Borna", + "Bramsche", + "Bremen", + "Bremervörde", + "Brodnica", + "Bützow", + "Ciechocinek", + "Cloppenburg", + "Corbach", + "Częstochowa", + "Delmenhorst", + "Demmin", + "Deutsch Eylau", + "Dillenburg", + "Doberan", + "Dobrzyń", + "Dömitz", + "Emden", + "Falkenburg", + "Fehrbellin", + "Forst", + "Frankenberg", + "Freystadt", + "Gardelegen", + "Gera", + "Gießen", + "Gleiwitz", + "Glogau", + "Gostynin", + "Greifenberg", + "Greiz", + "Grimma", + "Grimmen", + "Groß Strehlitz", + "Grudziądz", + "Grünberg", + "Guben", + "Güstrow", + "Havelberg", + "Haynau", + "Heide", + "Hirschberg", + "Hof", + "Homburg", + "Jauer", + "Jena", + "Jever", + "Kattowitz", + "Koblenz", + "Koniecpol", + "Kreuzburg", + "Krzepice", + "Kyritz", + "Köslin", + "Lauban", + "Leer", + "Limburg", + "Lingen", + "Lipno", + "Ludwigslust", + "Löbau", + "Löwenberg", + "Lüben", + "Marburg", + "Meppen", + "Merseburg", + "Meschede", + "Myszków", + "Mława", + "Naila", + "Naugard", + "Nauheim", + "Neidenburg", + "Neusalz", + "Neustrelitz", + "Niesky", + "Nowe", + "Nowy Miasto", + "Oelsnitz", + "Oldenburg", + "Olpe", + "Osterode", + "Otterndorf", + "Papenburg", + "Parchim", + "Penzig", + "Perleberg", + "Plau", + "Plauen", + "Priebus", + "Pößneck", + "Płock", + "Quakenbrück", + "Querfurt", + "Radomsko", + "Rathenow", + "Ratibor", + "Regenwalde", + "Rosenberg", + "Rostock", + "Rudolstadt", + "Rybnik", + "Rypin", + "Saalfeld", + "Schivelbein", + "Schlawe", + "Schnackenburg", + "Schwaan", + "Schwerin", + "Siegen", + "Sierpc", + "Soldau", + "Sorau", + "Sosnowiec", + "Sprottau", + "Stendal", + "Stralsund", + "Striegau", + "Sulingen", + "Syke", + "Tichau", + "Toruń", + "Waldbröl", + "Wangerin", + "Waren", + "Wałcz", + "Weilburg", + "Weimar", + "Weißwasser", + "Wetzlar", + "Wildeshausen", + "Wildungen", + "Wismar", + "Wittenberge", + "Wittstock", + "Wolbrom", + "Wurzen", + "Włocławek", + "Zawiercie", + "Zeitz", + "Arnstadt", + "Bautzen", + "Bebra", + "Bischofswerda", + "Bochnia", + "Boskowitz", + "Brückenau", + "Brünn", + "Busko-Zdrój", + "Celle", + "Chodzież", + "Chorzele", + "Chęciny", + "Ciechanów", + "Cmielnik", + "Cottbus", + "Dahme", + "Döbeln", + "Eisenach", + "Elsterwerda", + "Erfurt", + "Eschwege", + "Eutin", + "Falkenberg", + "Fallingbostel", + "Finsterwalde", + "Frankenstein", + "Freiwaldau", + "Freudenthal", + "Friedland", + "Fritzlar", + "Fulda", + "Gartz", + "Geesthacht", + "Glückstadt", + "Gniezno", + "Goldberge", + "Gollnow", + "Gostyń", + "Gotha", + "Greifswald", + "Grottkau", + "Großenhain", + "Habelschwert", + "Hagenow", + "Hamburg", + "Hersfeld", + "Herzberg", + "Hildburghausen", + "Hoyerswerda", + "Hünfeld", + "Inowrocław", + "Itzehoe", + "Jarmen", + "Jarocin", + "Jüterbog", + "Jędrzejów", + "Kiel", + "Kielce", + "Kolno", + "Konin", + "Kościan", + "Kraków", + "Krappitz", + "Langensalza", + "Lauchhammer", + "Lauenburg", + "Lauterbach", + "Leisnig", + "Leszno", + "Luckau", + "Lübben", + "Lübeck", + "Lüchow", + "Lüneburg", + "Maków", + "Massow", + "Meiningen", + "Miechów", + "Mielec", + "Mogilno", + "Munster", + "Mölln", + "Mühlhausen", + "Nasielsk", + "Neubrandenburg", + "Neumünster", + "Neurode", + "Nienburg", + "Nowy Dwór", + "Oldenburg", + "Oldesloe", + "Olmütz", + "Oppeln", + "Oschatz", + "Ostrowiec", + "Ostrów", + "Pasewalk", + "Patschkau", + "Pinneberg", + "Pińczów", + "Poznań", + "Preetz", + "Prerau", + "Proßnitz", + "Przedbórz", + "Pułtusk", + "Płońsk", + "Reichenbach", + "Rendsburg", + "Riesa", + "Rogaźno", + "Rotenburg", + "Salzungen", + "Salzwedel", + "Schlüchtern", + "Schmalkalden", + "Schönberg", + "Schönberg", + "Segeberg", + "Senftenberg", + "Solec", + "Soltau", + "Sonneberg", + "Sontra", + "Spremberg", + "Stade", + "Starachowice", + "Sternberg", + "Suhl", + "Szamotuły", + "Sömmerda", + "Słomniki", + "Tarnów", + "Trebitsch", + "Troppau", + "Ueckermünde", + "Uelzen", + "Verden", + "Wapno", + "Wildenschwert", + "Winsen", + "Wolgast", + "Wołomin", + "Września", + "Wyszków", + "Wągrwiec", + "Włoszczowa", + "Zeven", + "Ziegenhals", + "Zwittau", + "Łomża", + "Śrem", + "Środa", + "Aleksandrów", + "Aschaffenburg", + "Aschersleben", + "Bayreuth", + "Belzig", + "Beneschau", + "Bensheim", + "Berlinchen", + "Bernburg", + "Bełchatów", + "Bielefeld", + "Bielsko Biala", + "Bingen", + "Boppard", + "Brandenburg", + "Braniewo", + "Brilon", + "Brod", + "Burg", + "Büren", + "Crossen", + "Darmstadt", + "Dessau", + "Detmold", + "Driburg", + "Drossen", + "Eilenburg", + "Eisleben", + "Elbląg", + "Erbach", + "Falkenau", + "Frankfurt", + "Frankfurt", + "Friedeberg", + "Friedek Mistek", + "Fürstenberg", + "Gelnhausen", + "Genthin", + "Greven", + "Griew", + "Grodzisk", + "Gütersloh", + "Haldensleben", + "Halle", + "Hamm", + "Hanau", + "Heiligenbeil", + "Herford", + "Hlinsko", + "Hohenelbe", + "Iserlohn", + "Jitschin", + "Kalisz", + "Karwin", + "Koluszki", + "Kosteletz", + "Koło", + "Kronach", + "Krzyż", + "Kulmbach", + "Kutno", + "Kuttenberg", + "Köthen", + "Landsberg", + "Lauf", + "Leipa", + "Lemgo", + "Lidzbark Warmiński", + "Lippstadt", + "Mainz", + "Malbork", + "Mannheim", + "Marienbad", + "Marktredwitz", + "Melnik", + "Miltenberg", + "Międzychód", + "Międzyrzecz", + "Mohrungen", + "Münster", + "Nachod", + "Neutitschein", + "Nimburg", + "Olsztyn", + "Oppenheim", + "Orneta", + "Oschersleben", + "Osnabrück", + "Ostrau", + "Pabianice", + "Paderborn", + "Pardubitz", + "Pegnitz", + "Pilgram", + "Pjotrków", + "Preußisch Eylau", + "Quedlinburg", + "Reichenberg", + "Reppen", + "Rheine", + "Rinteln", + "Rumburg", + "Sangerhausen", + "Schwiebus", + "Schönebeck", + "Sieradz", + "Sillein", + "Skwierzyna", + "Soest", + "Soldin", + "Sompolno", + "Staßfurt", + "Sulzbach", + "Sztum", + "Tabor", + "Tachau", + "Tangermünde", + "Teschen", + "Tirschenreuth", + "Treuenbrietzen", + "Trzcianka", + "Turek", + "Turnau", + "Ustroń", + "Warburg", + "Warta", + "Weiden", + "Wieluń", + "Wieruszów", + "Wiesbaden", + "Wittenberg", + "Wolmirstedt", + "Wolsztyn", + "Worms", + "Wronki", + "Wschowa", + "Zduńska Wola", + "Zerbst", + "Zgierz", + "Zielenzig", + "Zinten", + "Zschornewitz", + "Züllichau", + "Złoczew", + "Łask", + "Łowicz", + "Łódź", + "Żywiec", + "Alfeld", + "Angerburg", + "Aussig", + "Bamberg", + "Bartenstein", + "Beeskow", + "Beraun", + "Berlin", + "Bernau", + "Biskupiec", + "Brüx", + "Bydgoszcz", + "Bütow", + "Chojnice", + "Chorin", + "Coburg", + "Czersk", + "Człuchów", + "Deuben", + "Dippoldiswalde", + "Duderstadt", + "Eberswalde", + "Erlangen", + "Forchheim", + "Fordon", + "Freiberg", + "Freienwalde", + "Friedland", + "Fürstenberg", + "Fürstenwalde", + "Garwolin", + "Gdańsk", + "Gemünden", + "Gerdauen", + "Gifhorn", + "Goldap", + "Goslar", + "Groß Neuendorf", + "Grójec", + "Guhrau", + "Gumbinnen", + "Haßfurt", + "Heiligenstadt", + "Hildesheim", + "Hofgeismar", + "Holzminden", + "Insterburg", + "Johannisburg", + "Kaaden", + "Kissingen", + "Kitzingen", + "Kladno", + "Komotau", + "Kozienice", + "Końskie", + "Kościerzyna", + "Krotoszyn", + "Königs Wusterhausen", + "Königsberg", + "Kępno", + "Labiau", + "Lauenburg", + "Laun", + "Lehrte", + "Leitmeritz", + "Lohr", + "Luckenwalde", + "Lyck", + "Lötzen", + "Marienberg", + "Mies", + "Militsch", + "Mittweida", + "Münden", + "Naklo", + "Namslau", + "Neudamm", + "Neumarkt", + "Neustadt", + "Nordhausen", + "Northeim", + "Nürschan", + "Ochsenfurt", + "Oebisfelde", + "Ohlau", + "Opoczno", + "Oranienburg", + "Orlik", + "Osterode", + "Ostrów", + "Otwock", + "Peine", + "Pelplin", + "Pillkallen", + "Piła", + "Pleszew", + "Potsdam", + "Pribram", + "Pruszków", + "Pyrmont", + "Radom", + "Ragnit", + "Rakonitz", + "Raudnitz", + "Rawa", + "Rawicz", + "Rummelsburg", + "Salzgitter", + "Schlan", + "Schweinfurt", + "Schöningen", + "Sensburg", + "Skarżysko", + "Skierniewice", + "Slapy", + "Sochaczew", + "Spandau", + "Springe", + "Starogard", + "Steinau", + "Stolpe", + "Strehlen", + "Sulejów", + "Szydłowiec", + "Tapiau", + "Tczew", + "Templin", + "Tepl", + "Tetschen", + "Tilsit", + "Tomaszów", + "Trebnitz", + "Tuchola", + "Velten", + "Warszawa", + "Wehlau", + "Wejherowo", + "Wernigerode", + "Wertheim", + "Wohlau", + "Wunstorf", + "Würzburg", + "Zehdenick", + "Zossen", + "Zwoleń", + "Złotów", + "Świecie", + "Żyrardów", + ], + x: [ + 1400, 1257, 891, 1323, 1864, 210, 1295, 822, 1479, 1925, 840, 1242, 709, 1506, 892, 752, 878, 1249, 824, 1002, + 1070, 1605, 1183, 1151, 345, 1028, 1721, 2208, 1053, 1111, 1142, 1567, 518, 831, 826, 1350, 1308, 1339, 1458, + 2067, 1241, 708, 256, 1240, 1243, 1920, 894, 1494, 1423, 1496, 1404, 1255, 1284, 1122, 518, 1644, 1731, 416, 591, + 336, 392, 939, 1710, 1069, 1118, 2252, 1044, 1148, 1557, 1086, 284, 281, 800, 895, 666, 1346, 634, 882, 1426, 71, + 1942, 171, 821, 136, 240, 276, 1981, 728, 1854, 120, 230, 2033, 212, 880, 1910, 136, 727, 1896, 636, 59, 1428, + 892, 1244, 226, 1397, 651, 751, 218, 1925, 1485, 2032, 1284, 784, 862, 877, 1876, 1861, 1386, 1258, 780, 760, + 1450, 281, 1422, 745, 184, 1489, 699, 136, 1995, 58, 2114, 1851, 1972, 807, 1426, 1349, 72, 104, 71, 1940, 654, + 1248, 1407, 1493, 222, 60, 768, 159, 2072, 2113, 715, 1251, 211, 2119, 1441, 887, 1286, 1856, 1977, 818, 176, 68, + 2033, 249, 57, 698, 1344, 697, 755, 783, 1311, 700, 2063, 126, 688, 2069, 824, 1864, 1315, 1875, 783, 629, 1939, + 2021, 636, 1388, 1494, 631, 782, 630, 116, 2058, 2076, 1330, 2066, 1414, 719, 880, 1505, 244, 249, 1995, 1859, 57, + 1324, 830, 1484, 141, 624, 1240, 171, 175, 263, 656, 678, 841, 2116, 885, 1925, 2095, 748, 577, 1203, 408, 1161, + 2287, 1588, 415, 1632, 2363, 446, 1584, 2232, 2250, 2189, 2343, 1154, 1008, 993, 481, 1013, 577, 447, 490, 966, + 389, 1062, 1632, 1708, 1762, 974, 327, 362, 1113, 453, 331, 1708, 2207, 1180, 1670, 526, 941, 1737, 1058, 1610, + 574, 389, 359, 951, 533, 1173, 372, 1807, 327, 938, 1737, 945, 2216, 437, 2281, 2383, 1805, 1585, 2176, 1809, 527, + 1093, 466, 327, 939, 1572, 1055, 1102, 509, 582, 470, 2254, 1182, 494, 2199, 2419, 1761, 473, 499, 505, 2266, 936, + 408, 1584, 324, 2242, 528, 446, 1752, 1813, 939, 2416, 2398, 1067, 1662, 377, 2302, 1606, 469, 1807, 1741, 2163, + 2293, 2163, 1590, 375, 982, 1596, 350, 470, 588, 347, 510, 1646, 555, 445, 1105, 1808, 413, 585, 433, 1196, 330, + 2372, 1754, 548, 1559, 583, 2222, 2377, 1550, 1811, 1100, 521, 324, 1693, 1560, 400, 997, 2348, 1731, 2369, 1652, + 2177, 330, 1744, 1583, 2420, 1655, 1703, 1989, 275, 667, 682, 849, 1309, 210, 1320, 710, 2031, 216, 2049, 62, 57, + 863, 1990, 222, 1473, 758, 196, 1314, 199, 818, 258, 279, 1269, 853, 688, 1937, 254, 886, 165, 1243, 1367, 1927, + 1240, 266, 804, 99, 1857, 1505, 159, 647, 757, 62, 227, 2037, 241, 1482, 1429, 76, 1405, 1856, 1938, 2119, 1505, + 1924, 630, 1440, 668, 2016, 1379, 762, 1310, 631, 1241, 284, 2088, 145, 98, 1861, 156, 880, 773, 1259, 283, 1452, + 1434, 1986, 78, 1502, 1866, 1317, 2107, 75, 2041, 633, 161, 1872, 2034, 219, 1453, 667, 1386, 2096, 2120, 628, + 1340, 1290, 72, 285, 1238, 632, 1352, 730, 1914, 1995, 1396, 118, 1241, 1861, 677, 715, 1898, 1286, 883, 746, + 1995, 813, 899, 1490, 1863, 1379, 2049, 279, 1906, 780, 1941, 1867, 111, 872, 683, 1483, 111, 1484, 1509, 1960, + 783, 2036, 1321, 2090, 864, 1377, 1932, 2004, 2104, 2073, 2103, 416, 2337, 1131, 579, 2176, 1167, 1167, 1012, + 1036, 2171, 1042, 1780, 1619, 1652, 1090, 579, 1695, 1619, 1028, 1046, 458, 1055, 541, 584, 1796, 981, 1132, 2202, + 935, 1161, 2410, 1787, 360, 2280, 532, 2393, 511, 1167, 2235, 1555, 2391, 527, 493, 450, 327, 351, 2318, 2369, + 966, 445, 422, 1186, 1011, 2413, 2253, 1682, 1726, 1075, 1193, 1810, 2165, 1655, 1122, 444, 1170, 327, 955, 2415, + 2350, 967, 951, 1687, 946, 379, 1734, 1781, 1190, 1598, 482, 547, 432, 1008, 387, 584, 1688, 2216, 985, 1200, 496, + 1798, 2371, 487, 1811, 2399, 1552, 1802, 949, 1122, 2278, 324, 2352, 2324, 1075, 1195, 2189, 1626, 1549, 509, + 1165, 467, 576, 2271, 2320, 2166, 1194, 2178, 965, 363, 1759, 1566, 1578, 1639, 2163, 2309, 2167, 1807, 1029, 952, + 1179, 2233, 2165, 1641, 1705, 951, 2316, 2243, 1753, 553, 327, 1559, 335, 384, 970, 1011, 2420, 1593, 1801, 2231, + ], + y: [ + 1096, 309, 1286, 263, 1356, 735, 1177, 1132, 1099, 1221, 412, 1059, 1176, 381, 637, 602, 1212, 503, 1307, 409, + 1185, 1325, 541, 1132, 1140, 1160, 1285, 446, 539, 1177, 499, 1445, 703, 1043, 1461, 1234, 1322, 1437, 1368, 140, + 754, 885, 819, 1419, 598, 393, 1068, 1284, 1493, 1232, 608, 1545, 1231, 646, 876, 1113, 1175, 1048, 962, 874, 796, + 1433, 1080, 1540, 1230, 244, 1438, 598, 1182, 1319, 616, 1281, 1227, 439, 1239, 549, 1135, 1356, 318, 1282, 1292, + 1207, 1179, 736, 606, 492, 526, 388, 659, 640, 1130, 1224, 575, 392, 450, 1267, 325, 548, 592, 479, 474, 690, 997, + 1192, 993, 719, 1261, 1305, 1342, 978, 743, 349, 1338, 1167, 334, 1306, 490, 950, 952, 404, 687, 1062, 297, 1184, + 1407, 1413, 1140, 1261, 434, 1342, 1379, 1220, 1146, 1179, 657, 222, 1161, 544, 1373, 733, 638, 532, 1169, 1140, + 1037, 1237, 680, 1135, 1131, 1265, 568, 1372, 398, 1372, 451, 957, 539, 1132, 441, 478, 1405, 519, 1166, 439, 424, + 602, 489, 1122, 595, 481, 1377, 1063, 1304, 702, 693, 1129, 1140, 741, 1402, 398, 1190, 311, 1285, 1395, 576, + 1334, 383, 203, 628, 360, 451, 1232, 632, 501, 1005, 1365, 1035, 714, 255, 1176, 697, 654, 1391, 607, 1230, 464, + 489, 519, 1357, 1242, 1110, 1323, 625, 1169, 389, 647, 591, 1351, 1130, 714, 1313, 1212, 1277, 1159, 1208, 1172, + 1410, 1548, 1386, 1596, 1344, 724, 606, 544, 1228, 606, 1238, 1004, 976, 1191, 1205, 1090, 1231, 1134, 317, 1056, + 682, 1018, 1270, 1376, 1392, 454, 1182, 1337, 546, 449, 387, 702, 494, 401, 907, 1231, 326, 1242, 1116, 1379, 495, + 442, 1235, 1011, 1382, 1090, 1279, 644, 342, 396, 878, 948, 1277, 253, 1165, 458, 809, 831, 1410, 1304, 1187, + 1091, 492, 1311, 1170, 906, 976, 953, 371, 639, 538, 585, 452, 1343, 1340, 1367, 670, 614, 423, 1134, 685, 483, + 324, 1279, 734, 726, 267, 397, 1498, 1238, 1121, 1201, 603, 494, 1296, 399, 1320, 756, 284, 1558, 1552, 1140, 629, + 682, 1239, 270, 1140, 667, 571, 1257, 683, 1388, 1299, 1434, 386, 354, 1053, 594, 632, 1387, 1174, 1052, 441, + 1137, 1436, 1328, 721, 1189, 1378, 1408, 1584, 1451, 444, 623, 666, 592, 1402, 488, 346, 737, 773, 685, 641, 1196, + 518, 1330, 1485, 517, 820, 811, 898, 1522, 1040, 1517, 903, 1509, 1584, 618, 1000, 1062, 917, 1451, 1495, 1449, + 839, 233, 1084, 1544, 868, 1048, 901, 1527, 989, 970, 1009, 795, 1087, 1076, 268, 1570, 1452, 1482, 856, 679, + 1554, 905, 1448, 854, 870, 381, 798, 962, 810, 1071, 1040, 1490, 189, 880, 1501, 1270, 1094, 1343, 973, 1480, 941, + 1390, 828, 1449, 659, 1473, 805, 1470, 1009, 707, 1600, 1298, 914, 309, 1031, 1525, 287, 1602, 1518, 1489, 1360, + 1599, 758, 819, 325, 938, 1338, 1551, 1381, 368, 1562, 268, 900, 813, 1481, 973, 1008, 1429, 1562, 1593, 1026, + 216, 990, 1285, 837, 806, 857, 1231, 1082, 836, 925, 1002, 1597, 781, 1067, 662, 786, 950, 1601, 337, 1597, 1589, + 787, 1482, 1556, 905, 606, 875, 1307, 1525, 1076, 936, 1592, 1096, 1074, 1482, 964, 833, 853, 1592, 702, 902, 983, + 955, 885, 781, 172, 1005, 892, 1042, 1011, 863, 932, 1490, 932, 239, 1292, 1511, 235, 894, 1483, 798, 748, 342, + 1343, 549, 268, 397, 684, 1450, 374, 437, 1227, 1273, 1067, 708, 1604, 1559, 510, 1276, 733, 181, 584, 842, 863, + 216, 1481, 173, 783, 188, 961, 775, 915, 961, 120, 1489, 1090, 871, 1071, 970, 116, 376, 1392, 1447, 1567, 1439, + 1376, 909, 1089, 300, 953, 848, 631, 1062, 85, 155, 1403, 810, 1322, 1498, 903, 313, 287, 1330, 1569, 1003, 1235, + 1084, 527, 1131, 705, 1052, 1593, 1067, 1005, 1583, 1595, 790, 1145, 1055, 716, 1601, 1026, 1006, 828, 828, 361, + 68, 545, 947, 838, 1575, 828, 922, 979, 49, 1489, 1359, 937, 954, 313, 928, 1406, 1487, 900, 320, 1089, 891, 1535, + 813, 788, 828, 340, 1013, 175, 1181, 1075, 1043, 132, 295, 590, 1513, 1273, 47, 998, 1033, 428, 749, 787, 124, + 153, 988, 1567, 1079, 793, 1531, 632, 886, 1014, 487, 461, 869, + ], + adjacent: [ + [ 121, 143, 167 ], + [ 3, 259 ], + [ 18, 77, 549, 596 ], + [ 1, 78, 111 ], + [ 108, 178, 285 ], + [ 174, 200, 212, 463 ], + [ 136, 142, 157, 167 ], + [ 82, 113, 147, 218, 402, 419 ], + [ 121, 126, 663 ], + [ 80, 91, 180, 315 ], + [ 93, 119 ], + [ 102, 171, 210 ], + [ 74, 76, 147, 221 ], + [ 78, 100, 541, 630 ], + [ 101, 216, 666 ], + [ 134, 168, 169, 216 ], + [ 82, 596 ], + [ 22, 75, 205, 298 ], + [ 2, 72, 112 ], + [ 251, 275, 358, 364 ], + [ 25, 29, 64, 542 ], + [ 47, 265, 309, 320, 456 ], + [ 17, 30, 44 ], + [ 29, 271 ], + [ 224, 252, 568, 597 ], + [ 20, 239, 264, 332 ], + [ 263, 320, 371 ], + [ 258, 459, 571 ], + [ 53, 319, 650 ], + [ 20, 23, 225, 264 ], + [ 22, 254, 319 ], + [ 339, 362, 372, 424 ], + [ 359, 558 ], + [ 46, 398, 419, 517 ], + [ 160, 406, 448, 449 ], + [ 52, 136, 473 ], + [ 441, 450, 458, 473 ], + [ 43, 437, 458, 467 ], + [ 427, 431, 456, 467 ], + [ 422, 516, 584, 648 ], + [ 401, 439, 600 ], + [ 394, 462, 480, 507 ], + [ 310, 423, 463, 476, 664 ], + [ 37, 381, 450, 530, 575, 627 ], + [ 22, 485 ], + [ 94, 415, 454, 489 ], + [ 33, 245, 316, 402 ], + [ 21, 49, 425 ], + [ 381, 393, 437 ], + [ 47, 68, 123, 309 ], + [ 75, 100, 409, 434 ], + [ 381, 490, 638 ], + [ 35, 142, 477 ], + [ 28, 67, 538 ], + [ 558, 615, 631, 634 ], + [ 62, 68, 601, 608, 645, 663 ], + [ 315, 599, 608, 645 ], + [ 243, 544, 569, 597, 604 ], + [ 462, 472, 661 ], + [ 623, 641 ], + [ 231, 246, 587, 641, 664 ], + [ 406, 572, 651 ], + [ 55, 583, 595, 599 ], + [ 530, 605, 621, 626 ], + [ 20, 652 ], + [ 528, 533, 557, 592 ], + [ 572, 586, 626 ], + [ 53, 254, 582 ], + [ 49, 55, 199, 330 ], + [ 526, 534, 543 ], + [ 84, 85, 334, 360 ], + [ 145, 252, 272, 289 ], + [ 18, 82, 106 ], + [ 93, 307 ], + [ 12, 127, 209 ], + [ 17, 50, 383 ], + [ 12, 175, 353, 603 ], + [ 2, 160 ], + [ 3, 13, 135, 186 ], + [ 130, 191, 204 ], + [ 9, 108 ], + [ 145, 191 ], + [ 7, 16, 72 ], + [ 174, 463 ], + [ 70, 92, 201 ], + [ 70, 164, 370 ], + [ 159, 184 ], + [ 189, 190 ], + [ 203, 219, 486 ], + [ 161, 174, 212 ], + [ 103, 392, 500 ], + [ 9, 131, 133, 149, 176 ], + [ 84, 161, 212 ], + [ 10, 73, 114, 181, 275 ], + [ 45, 97, 159, 163 ], + [ 145, 191, 211 ], + [ 181, 214 ], + [ 94, 116, 203 ], + [ 215, 266 ], + [ 137 ], + [ 13, 50, 205, 207 ], + [ 14, 134, 657 ], + [ 11, 118, 237 ], + [ 90, 145, 213 ], + [ 117, 196 ], + [ 197, 336, 607 ], + [ 72, 112, 127, 172, 221 ], + [ 145, 153, 211, 289 ], + [ 4, 80, 115, 129, 183 ], + [ 155, 196, 511, 563, 643 ], + [ 173, 436 ], + [ 3, 152 ], + [ 18, 106, 170 ], + [ 7, 290 ], + [ 93, 198 ], + [ 108, 315 ], + [ 97, 548 ], + [ 104, 155, 194, 396, 518 ], + [ 102, 194, 411 ], + [ 10, 169, 189, 206 ], + [ 134, 197 ], + [ 0, 8, 144, 196 ], + [ 274, 331 ], + [ 49, 136, 143 ], + [ 151, 170, 435, 449 ], + [ 153, 407 ], + [ 8, 199 ], + [ 74, 106, 182 ], + [ 161 ], + [ 108, 195 ], + [ 79, 138, 389 ], + [ 91, 278, 369 ], + [ 180, 599 ], + [ 91, 180, 385, 503 ], + [ 15, 101, 120, 215 ], + [ 78, 187 ], + [ 6, 35, 123 ], + [ 99, 161, 165 ], + [ 130, 208, 505 ], + [ 146, 475 ], + [ 192, 203 ], + [ 166, 168, 266 ], + [ 6, 52, 223 ], + [ 0, 123 ], + [ 121, 643 ], + [ 71, 81, 95, 103, 107 ], + [ 139, 165, 174 ], + [ 7, 12, 175, 419 ], + [ 162, 392 ], + [ 91, 220 ], + [ 193, 235 ], + [ 124, 185 ], + [ 111, 179, 298 ], + [ 107, 125, 421 ], + [ 193, 258 ], + [ 109, 117 ], + [ 206, 216, 307, 552 ], + [ 6, 210 ], + [ 616, 670 ], + [ 86, 94, 193 ], + [ 34, 77, 170 ], + [ 89, 92, 128, 137 ], + [ 148, 191, 204, 426 ], + [ 94, 193, 459 ], + [ 85, 348 ], + [ 137, 146 ], + [ 141, 169, 190 ], + [ 0, 6 ], + [ 15, 141, 215 ], + [ 15, 119, 166 ], + [ 112, 124, 160 ], + [ 11, 196 ], + [ 106, 185 ], + [ 110, 219, 329 ], + [ 5, 83, 89, 146 ], + [ 76, 147 ], + [ 91, 327, 385, 470 ], + [ 492, 657 ], + [ 4, 183, 357 ], + [ 152, 186 ], + [ 9, 132, 133 ], + [ 93, 96, 189, 198 ], + [ 127, 185, 222 ], + [ 108, 178, 202 ], + [ 86, 192 ], + [ 151, 172, 182, 345 ], + [ 78, 179, 205 ], + [ 135, 644 ], + [ 215, 295 ], + [ 87, 119, 181 ], + [ 87, 166, 214, 266, 340 ], + [ 79, 81, 95, 162 ], + [ 140, 184, 235, 329 ], + [ 150, 154, 159, 163 ], + [ 117, 118 ], + [ 129, 202, 217 ], + [ 104, 109, 121, 171 ], + [ 105, 120, 215, 418, 492 ], + [ 114, 181, 262 ], + [ 68, 126 ], + [ 5, 201 ], + [ 84, 200, 360 ], + [ 183, 195, 387 ], + [ 88, 97, 140, 273, 343 ], + [ 79, 162 ], + [ 17, 100, 186 ], + [ 119, 156 ], + [ 100, 618 ], + [ 138, 211 ], + [ 74, 242 ], + [ 11, 157, 223 ], + [ 95, 107, 208 ], + [ 5, 89, 92 ], + [ 103, 252 ], + [ 96, 190 ], + [ 98, 134, 168, 188, 197 ], + [ 14, 15, 156 ], + [ 195, 220, 284 ], + [ 7, 316 ], + [ 88, 173 ], + [ 149, 217 ], + [ 12, 106 ], + [ 182, 242 ], + [ 142, 210, 225, 271 ], + [ 24, 268, 335, 346 ], + [ 29, 223 ], + [ 284, 355 ], + [ 356, 372 ], + [ 253, 573 ], + [ 326, 356 ], + [ 236, 301, 322 ], + [ 60, 359 ], + [ 333, 618 ], + [ 235, 258, 297, 373 ], + [ 278, 280 ], + [ 150, 192, 233, 306 ], + [ 230, 280, 317 ], + [ 102, 293, 342, 347 ], + [ 277, 292 ], + [ 25, 290, 596 ], + [ 261, 335, 346 ], + [ 245, 264 ], + [ 209, 222, 261, 353 ], + [ 57, 346, 566 ], + [ 294, 312, 324 ], + [ 46, 241, 247, 269 ], + [ 60, 344 ], + [ 245, 292, 342 ], + [ 320, 330 ], + [ 339, 371 ], + [ 350, 357, 371 ], + [ 19, 307, 319 ], + [ 24, 71, 213 ], + [ 228, 272, 289, 337 ], + [ 30, 67 ], + [ 267, 288 ], + [ 274, 321 ], + [ 302, 323, 368 ], + [ 27, 154, 233 ], + [ 1, 298 ], + [ 291, 374, 580 ], + [ 240, 242, 286 ], + [ 198, 364 ], + [ 26, 315, 645 ], + [ 25, 29, 241, 287 ], + [ 21, 362 ], + [ 98, 141, 190, 288 ], + [ 255, 313, 321, 363 ], + [ 224, 272 ], + [ 245, 277, 506 ], + [ 299, 345 ], + [ 23, 223, 342, 347 ], + [ 71, 253, 268, 335 ], + [ 203, 302 ], + [ 122, 256 ], + [ 19, 93 ], + [ 374, 619 ], + [ 238, 269, 590 ], + [ 131, 234, 300, 322 ], + [ 324, 331 ], + [ 234, 236, 369, 636 ], + [ 373, 571 ], + [ 366, 432, 486, 497 ], + [ 291, 374, 508 ], + [ 217, 226, 354, 523 ], + [ 4, 315, 371 ], + [ 261, 305 ], + [ 264, 342 ], + [ 255, 266, 296, 304 ], + [ 71, 107, 253 ], + [ 113, 239 ], + [ 260, 283, 511, 629 ], + [ 238, 247, 293, 667 ], + [ 237, 292, 529 ], + [ 244, 304, 313, 340 ], + [ 188, 336, 359 ], + [ 288, 359, 363 ], + [ 233, 328 ], + [ 17, 152, 259 ], + [ 270, 335, 351, 573 ], + [ 278, 354 ], + [ 230, 355 ], + [ 257, 273 ], + [ 344, 359 ], + [ 288, 294 ], + [ 286, 566, 603 ], + [ 235, 311, 328 ], + [ 73, 156, 251 ], + [ 321, 331, 341 ], + [ 21, 49, 330 ], + [ 42, 360 ], + [ 306, 329, 658 ], + [ 244 ], + [ 267, 294, 341 ], + [ 326, 339, 350 ], + [ 9, 56, 115, 263, 285 ], + [ 46, 218, 332 ], + [ 236, 349 ], + [ 367, 373 ], + [ 28, 30, 251, 358 ], + [ 21, 26, 248 ], + [ 256, 267, 308 ], + [ 230, 278 ], + [ 257, 352, 366, 416 ], + [ 244, 279 ], + [ 326, 457 ], + [ 229, 314, 325 ], + [ 176, 369, 646 ], + [ 297, 306, 367 ], + [ 173, 192, 311 ], + [ 68, 248, 309, 645 ], + [ 122, 279, 308 ], + [ 25, 316 ], + [ 232, 352, 368 ], + [ 70, 363, 370 ], + [ 224, 240, 272, 299, 338 ], + [ 105, 295 ], + [ 253, 412, 556 ], + [ 335, 351 ], + [ 31, 249, 314 ], + [ 190, 294 ], + [ 308, 313 ], + [ 237, 247, 271, 287 ], + [ 203, 535 ], + [ 246, 303, 360, 363 ], + [ 185, 270, 433, 539 ], + [ 224, 240, 243 ], + [ 237, 271 ], + [ 164, 363, 370 ], + [ 317, 636, 668 ], + [ 250, 314 ], + [ 299, 338 ], + [ 323, 333, 416, 510 ], + [ 76, 242 ], + [ 284, 300 ], + [ 226, 301 ], + [ 227, 229, 393 ], + [ 178, 250, 464 ], + [ 19, 319 ], + [ 32, 231, 295, 296, 303 ], + [ 70, 201, 310, 344 ], + [ 368, 535 ], + [ 31, 265, 431 ], + [ 267, 296, 334, 344, 348 ], + [ 19, 262 ], + [ 367, 658 ], + [ 282, 323, 375 ], + [ 318, 328, 365 ], + [ 257, 333, 361 ], + [ 131, 280, 327 ], + [ 85, 334, 348 ], + [ 26, 249, 250, 285 ], + [ 31, 227 ], + [ 233, 281, 318 ], + [ 260, 276, 283, 375 ], + [ 366, 374 ], + [ 501, 514 ], + [ 397, 421, 451, 589 ], + [ 384, 403, 472, 487 ], + [ 435, 468 ], + [ 390, 398, 495 ], + [ 43, 48, 51, 469 ], + [ 397, 405, 447 ], + [ 75, 409, 485 ], + [ 378, 438 ], + [ 133, 176, 520 ], + [ 417, 423 ], + [ 202, 523 ], + [ 389, 445 ], + [ 130, 388 ], + [ 380, 413, 620 ], + [ 404, 422, 461 ], + [ 90, 148, 395 ], + [ 48, 356, 424, 469 ], + [ 41, 413 ], + [ 392, 444, 466 ], + [ 117, 408, 474 ], + [ 377, 382, 407 ], + [ 33, 380, 438, 513 ], + [ 466, 623 ], + [ 466, 569 ], + [ 40, 474, 515 ], + [ 7, 46 ], + [ 378, 419, 478 ], + [ 391, 446 ], + [ 382, 451 ], + [ 34, 61 ], + [ 125, 397, 421, 505 ], + [ 396, 474, 529, 553, 561 ], + [ 50, 383, 439 ], + [ 457, 482, 493 ], + [ 118, 529 ], + [ 337, 421 ], + [ 390, 394, 492, 513 ], + [ 455, 463, 475 ], + [ 45, 616 ], + [ 323, 352, 453, 508 ], + [ 386, 420, 455, 466 ], + [ 197, 507, 607 ], + [ 7, 33, 147, 403, 438 ], + [ 417, 455, 484 ], + [ 153, 377, 407, 412 ], + [ 39, 391 ], + [ 42, 386, 442, 463 ], + [ 31, 393, 467 ], + [ 47, 498 ], + [ 162, 484 ], + [ 38, 498 ], + [ 481, 613 ], + [ 464, 493 ], + [ 470, 522, 637, 654 ], + [ 38, 362 ], + [ 282, 436 ], + [ 345, 435 ], + [ 50, 496, 510 ], + [ 124, 379, 433, 527 ], + [ 110, 432, 514, 521 ], + [ 37, 48 ], + [ 384, 398, 419, 480 ], + [ 40, 409 ], + [ 468, 546 ], + [ 36, 652 ], + [ 423, 476, 623 ], + [ 459, 461, 528 ], + [ 395, 484 ], + [ 388, 460, 505 ], + [ 404, 489, 649 ], + [ 382, 509 ], + [ 34, 491, 594, 651 ], + [ 34, 124, 468, 502 ], + [ 36, 43 ], + [ 377, 405, 662 ], + [ 453, 483, 510 ], + [ 416, 452, 479 ], + [ 45, 461 ], + [ 414, 417, 420 ], + [ 21, 38 ], + [ 325, 410, 464 ], + [ 36, 37, 498 ], + [ 27, 163, 443, 533 ], + [ 445, 509 ], + [ 391, 443, 454 ], + [ 41, 58, 634 ], + [ 5, 42, 83, 414, 423, 475 ], + [ 357, 429, 457 ], + [ 520, 522 ], + [ 395, 399, 400, 417, 500 ], + [ 37, 38, 424 ], + [ 379, 440, 449, 488 ], + [ 381, 393, 490 ], + [ 176, 430 ], + [ 516, 528, 551 ], + [ 58, 378 ], + [ 35, 36, 498 ], + [ 396, 401, 408, 479 ], + [ 139, 414, 463 ], + [ 42, 442 ], + [ 52, 652 ], + [ 403, 603 ], + [ 453, 474, 518 ], + [ 41, 438, 487, 513 ], + [ 428, 501, 512, 519 ], + [ 410, 499 ], + [ 452, 515 ], + [ 420, 426, 444 ], + [ 44, 383, 600 ], + [ 88, 282 ], + [ 378, 480 ], + [ 468, 502 ], + [ 45, 446 ], + [ 51, 469 ], + [ 448, 494 ], + [ 177, 197, 413 ], + [ 410, 429, 499, 523 ], + [ 491, 502 ], + [ 380, 506, 590 ], + [ 434, 618 ], + [ 282, 501 ], + [ 425, 427, 458, 473 ], + [ 482, 493 ], + [ 90, 466, 568 ], + [ 376, 481, 497 ], + [ 449, 488, 494 ], + [ 133, 504, 519 ], + [ 503, 583 ], + [ 138, 407, 445 ], + [ 269, 495, 517 ], + [ 41, 418 ], + [ 283, 416, 518 ], + [ 447, 460 ], + [ 352, 434, 452 ], + [ 109, 291 ], + [ 481, 520 ], + [ 398, 413, 480 ], + [ 376, 436, 522 ], + [ 401, 483 ], + [ 39, 471 ], + [ 33, 506 ], + [ 117, 479, 508 ], + [ 481, 503 ], + [ 385, 465, 512 ], + [ 436, 637, 639 ], + [ 430, 465, 514 ], + [ 284, 387, 493 ], + [ 567, 604, 623 ], + [ 557, 559, 592 ], + [ 69, 588, 652 ], + [ 435, 539, 547, 565, 602 ], + [ 65, 443, 471 ], + [ 293, 408, 411 ], + [ 43, 63, 638 ], + [ 532, 581, 620, 640 ], + [ 531, 545 ], + [ 65, 459, 635 ], + [ 69, 576, 586 ], + [ 343, 361, 548, 598 ], + [ 579, 644 ], + [ 540, 541, 656 ], + [ 53, 545 ], + [ 345, 527 ], + [ 537, 579 ], + [ 13, 537, 669 ], + [ 20, 543, 549 ], + [ 69, 542 ], + [ 57, 566 ], + [ 532, 538, 550, 610 ], + [ 440, 547, 602 ], + [ 527, 546 ], + [ 116, 535, 670 ], + [ 2, 542, 593 ], + [ 545, 561 ], + [ 471, 557 ], + [ 156, 666 ], + [ 408, 581 ], + [ 577, 614 ], + [ 649, 660 ], + [ 337, 573, 589, 665 ], + [ 65, 525, 551, 570 ], + [ 32, 54, 587, 607 ], + [ 525, 564 ], + [ 604, 631, 661 ], + [ 408, 550, 600 ], + [ 624, 628, 671 ], + [ 109, 629 ], + [ 559, 570, 617 ], + [ 527, 633 ], + [ 243, 305, 544 ], + [ 524, 587 ], + [ 24, 500 ], + [ 57, 400, 623 ], + [ 557, 564, 653, 659 ], + [ 27, 281, 591 ], + [ 61, 66, 576, 593 ], + [ 228, 299, 556, 633 ], + [ 602, 606, 665 ], + [ 43, 632 ], + [ 534, 572 ], + [ 554, 624 ], + [ 609, 636 ], + [ 536, 540, 642 ], + [ 260, 613 ], + [ 531, 553, 667 ], + [ 67, 600 ], + [ 62, 504, 613 ], + [ 39, 653 ], + [ 644, 660 ], + [ 66, 534, 627, 632 ], + [ 60, 558, 567, 615 ], + [ 526, 627 ], + [ 377, 556 ], + [ 277, 495, 667 ], + [ 571, 592 ], + [ 65, 525, 591, 635 ], + [ 549, 572 ], + [ 448, 605 ], + [ 62, 629, 655 ], + [ 2, 16, 239 ], + [ 24, 57 ], + [ 535, 656, 669 ], + [ 56, 62, 132 ], + [ 40, 485, 561, 582 ], + [ 55, 643 ], + [ 527, 546, 574 ], + [ 76, 305, 478, 612 ], + [ 57, 524, 560, 612 ], + [ 63, 594 ], + [ 574, 662 ], + [ 105, 418, 558 ], + [ 55, 56 ], + [ 578, 628, 646, 654 ], + [ 545, 657, 666 ], + [ 621, 638 ], + [ 603, 604 ], + [ 428, 580, 583, 619 ], + [ 554, 658 ], + [ 54, 587 ], + [ 158, 415, 642, 649 ], + [ 564, 625 ], + [ 207, 232, 496, 669 ], + [ 276, 613 ], + [ 390, 531, 640, 667 ], + [ 63, 611 ], + [ 639, 658, 671 ], + [ 59, 399, 442, 524, 569 ], + [ 562, 577, 647, 668 ], + [ 617, 653 ], + [ 63, 66 ], + [ 43, 586, 588 ], + [ 562, 609, 637 ], + [ 291, 563, 595 ], + [ 13, 644 ], + [ 54, 560 ], + [ 575, 586 ], + [ 565, 573, 665 ], + [ 54, 462 ], + [ 533, 592 ], + [ 280, 349, 578, 647 ], + [ 430, 521, 628, 671 ], + [ 51, 530, 611 ], + [ 521, 622 ], + [ 531, 620, 657 ], + [ 59, 60 ], + [ 579, 616 ], + [ 109, 144, 601, 655 ], + [ 187, 536, 585, 630 ], + [ 55, 56, 263, 330 ], + [ 327, 609 ], + [ 624, 636 ], + [ 39, 659 ], + [ 446, 555, 616 ], + [ 28, 666 ], + [ 61, 448 ], + [ 64, 441, 477, 526 ], + [ 570, 584, 625 ], + [ 430, 609 ], + [ 595, 643 ], + [ 537, 598 ], + [ 101, 177, 610, 640 ], + [ 311, 365, 614, 622 ], + [ 570, 648 ], + [ 555, 585 ], + [ 58, 560 ], + [ 451, 606, 665 ], + [ 8, 55 ], + [ 42, 60 ], + [ 556, 574, 633, 662 ], + [ 14, 552, 610, 650 ], + [ 292, 581, 590, 620 ], + [ 349, 624 ], + [ 541, 598, 618 ], + [ 158, 548 ], + [ 562, 622, 637 ], + ], + major_roads: [ + [], + [], + [], + [], + [], + [ 200, 463 ], + [], + [ 147, 218, 419 ], + [], + [], + [], + [], + [ 74, 147 ], + [], + [], + [], + [], + [], + [], + [], + [ 25, 29 ], + [], + [], + [ 29, 271 ], + [ 252, 597 ], + [ 20, 332 ], + [], + [], + [], + [ 20, 23, 225 ], + [ 254 ], + [ 362 ], + [], + [], + [ 448 ], + [], + [], + [ 43, 437, 467 ], + [ 431, 456, 467 ], + [], + [ 401, 439 ], + [ 462, 480 ], + [], + [ 37, 530, 627 ], + [], + [], + [], + [], + [ 393, 437 ], + [], + [ 409 ], + [], + [], + [ 67, 538 ], + [ 615, 634 ], + [ 601, 608 ], + [ 315, 608 ], + [ 597, 604 ], + [], + [ 623, 641 ], + [ 587, 641 ], + [], + [], + [ 530, 605 ], + [], + [], + [], + [ 53, 254 ], + [], + [], + [ 84, 334 ], + [ 145, 252 ], + [], + [], + [ 12, 127, 209 ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ 70, 201 ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ 181, 214 ], + [], + [], + [], + [], + [ 134, 657 ], + [], + [], + [], + [], + [ 127 ], + [ 145, 153, 211 ], + [ 115 ], + [ 155, 643 ], + [], + [], + [], + [], + [], + [ 108, 315 ], + [], + [ 155, 396 ], + [], + [ 189, 206 ], + [], + [], + [], + [], + [ 435 ], + [ 153, 407 ], + [], + [ 74, 106 ], + [], + [], + [], + [], + [], + [], + [ 101, 215 ], + [], + [], + [], + [], + [], + [], + [], + [ 223 ], + [], + [], + [ 71, 107 ], + [], + [ 7, 12 ], + [], + [], + [], + [], + [], + [ 107, 125 ], + [], + [ 109, 117 ], + [ 206, 552 ], + [], + [ 616, 670 ], + [], + [], + [], + [ 426 ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ 96, 189, 198 ], + [], + [], + [], + [], + [], + [], + [], + [ 119, 181 ], + [ 214, 340 ], + [], + [], + [], + [], + [], + [], + [], + [ 181 ], + [], + [ 5, 201 ], + [ 84, 200 ], + [], + [ 343 ], + [], + [], + [ 119, 156 ], + [], + [], + [ 74, 242 ], + [], + [ 107 ], + [], + [], + [ 96, 190 ], + [ 134 ], + [], + [], + [ 7, 316 ], + [], + [], + [], + [], + [ 142, 225 ], + [], + [ 29, 223 ], + [], + [], + [], + [ 356 ], + [], + [], + [], + [], + [ 278, 280 ], + [], + [], + [ 342 ], + [], + [], + [ 261 ], + [], + [ 209, 261 ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ 24, 71 ], + [], + [ 30, 67 ], + [], + [], + [], + [], + [], + [], + [ 240, 242 ], + [], + [], + [], + [], + [], + [ 313, 363 ], + [], + [], + [], + [ 23, 342 ], + [], + [], + [], + [], + [], + [], + [ 234, 300 ], + [], + [ 234, 636 ], + [], + [ 366, 432 ], + [], + [ 354 ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ 313, 340 ], + [], + [], + [], + [], + [], + [ 278, 354 ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ 267, 294 ], + [], + [ 56, 115 ], + [ 218, 332 ], + [], + [], + [], + [], + [], + [], + [ 352, 366 ], + [], + [], + [], + [], + [], + [], + [], + [], + [ 25, 316 ], + [], + [ 70, 363 ], + [], + [], + [], + [], + [], + [ 190, 294 ], + [], + [ 237, 271 ], + [ 203, 535 ], + [], + [], + [], + [], + [], + [], + [], + [], + [ 323 ], + [], + [ 284, 300 ], + [], + [ 229, 393 ], + [], + [], + [], + [], + [], + [ 31, 431 ], + [ 267, 334 ], + [], + [], + [ 282, 323 ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ 421, 589 ], + [], + [ 435, 468 ], + [], + [], + [ 397, 447 ], + [], + [], + [], + [ 417, 423 ], + [], + [], + [], + [], + [], + [], + [ 48, 356 ], + [], + [], + [ 117, 408, 474 ], + [ 382, 407 ], + [], + [], + [], + [ 40, 474 ], + [], + [], + [], + [], + [], + [ 125, 397, 421, 505 ], + [ 396, 553 ], + [ 50, 439 ], + [], + [], + [], + [], + [], + [], + [], + [ 386, 420 ], + [], + [ 7, 438 ], + [ 417, 484 ], + [ 377, 407 ], + [], + [ 386, 442 ], + [], + [], + [ 162, 484 ], + [], + [], + [], + [], + [ 38, 362 ], + [ 282, 436 ], + [], + [], + [ 124, 379, 527 ], + [ 432, 521 ], + [ 37, 48 ], + [ 419, 480 ], + [ 40, 409 ], + [ 468, 546 ], + [], + [ 423, 623 ], + [], + [], + [ 460, 505 ], + [], + [ 382, 509 ], + [ 34, 594 ], + [], + [], + [], + [], + [], + [], + [], + [ 38 ], + [], + [], + [], + [ 445, 509 ], + [], + [ 41, 634 ], + [ 5 ], + [], + [], + [], + [ 37, 38 ], + [ 379, 440 ], + [], + [], + [], + [], + [], + [ 396, 401 ], + [], + [], + [], + [], + [], + [ 41, 438 ], + [], + [], + [], + [ 420, 426 ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ 407, 445 ], + [], + [], + [], + [ 447, 460 ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ 436, 637 ], + [], + [], + [ 604, 623 ], + [], + [], + [ 435, 547 ], + [], + [], + [ 43, 63 ], + [ 532, 581, 640 ], + [ 531, 545 ], + [], + [], + [ 343, 548 ], + [], + [], + [ 53, 545 ], + [], + [], + [], + [], + [], + [], + [ 532, 538 ], + [ 440, 547, 602 ], + [ 527, 546 ], + [ 535, 670 ], + [], + [], + [], + [ 156, 666 ], + [ 408, 581 ], + [], + [ 649 ], + [ 589, 665 ], + [], + [], + [], + [], + [], + [ 624, 671 ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ 602, 665 ], + [], + [], + [], + [], + [], + [], + [ 531, 553 ], + [], + [], + [], + [], + [], + [ 60, 615 ], + [ 627 ], + [ 377, 556 ], + [], + [], + [], + [], + [ 448, 605 ], + [], + [], + [ 24, 57 ], + [], + [], + [], + [ 55, 643 ], + [ 546, 574 ], + [], + [ 57, 524 ], + [ 63, 594 ], + [], + [], + [ 55, 56 ], + [], + [ 657, 666 ], + [], + [], + [], + [], + [ 54, 587 ], + [ 158, 649 ], + [], + [], + [], + [], + [], + [ 658, 671 ], + [ 59, 442, 524 ], + [ 562, 647 ], + [], + [], + [ 43, 588 ], + [], + [], + [], + [], + [], + [], + [ 54, 462 ], + [], + [ 280, 647 ], + [ 521, 671 ], + [], + [], + [ 531, 657 ], + [ 59, 60 ], + [], + [ 109, 601 ], + [], + [], + [], + [ 624, 636 ], + [], + [ 555, 616 ], + [], + [], + [], + [], + [], + [], + [], + [ 101, 610, 640 ], + [ 622 ], + [], + [], + [], + [], + [], + [], + [ 556, 574 ], + [ 552, 610 ], + [], + [], + [], + [ 158, 548 ], + [ 562, 622, 637 ], + ], + roads: [ + [ 121, 143, 167 ], + [ 3, 259 ], + [ 18, 77, 549, 596 ], + [ 1, 78, 111 ], + [ 108, 178, 285 ], + [ 174, 212 ], + [ 136, 142, 157, 167 ], + [ 82, 113, 402 ], + [ 121, 126, 663 ], + [ 80, 91, 180, 315 ], + [ 93, 119 ], + [ 102, 171, 210 ], + [ 76, 221 ], + [ 78, 100, 541, 630 ], + [ 101, 216, 666 ], + [ 134, 168, 169, 216 ], + [ 82, 596 ], + [ 22, 75, 205, 298 ], + [ 2, 72, 112 ], + [ 251, 275, 358, 364 ], + [ 64, 542 ], + [ 47, 265, 309, 320, 456 ], + [ 17, 30, 44 ], + [], + [ 224, 568 ], + [ 239, 264 ], + [ 263, 320, 371 ], + [ 258, 459, 571 ], + [ 53, 319, 650 ], + [ 264 ], + [ 22, 319 ], + [ 339, 372, 424 ], + [ 359, 558 ], + [ 46, 398, 419, 517 ], + [ 160, 406, 449 ], + [ 52, 136, 473 ], + [ 441, 450, 458, 473 ], + [ 458 ], + [ 427 ], + [ 422, 516, 584, 648 ], + [ 600 ], + [ 394, 507 ], + [ 310, 423, 463, 476, 664 ], + [ 381, 450, 575 ], + [ 22, 485 ], + [ 94, 415, 454, 489 ], + [ 33, 245, 316, 402 ], + [ 21, 49, 425 ], + [ 381 ], + [ 47, 68, 123, 309 ], + [ 75, 100, 434 ], + [ 381, 490, 638 ], + [ 35, 142, 477 ], + [ 28 ], + [ 558, 631 ], + [ 62, 68, 645, 663 ], + [ 599, 645 ], + [ 243, 544, 569 ], + [ 462, 472, 661 ], + [], + [ 231, 246, 664 ], + [ 406, 572, 651 ], + [ 55, 583, 595, 599 ], + [ 621, 626 ], + [ 20, 652 ], + [ 528, 533, 557, 592 ], + [ 572, 586, 626 ], + [ 582 ], + [ 49, 55, 199, 330 ], + [ 526, 534, 543 ], + [ 85, 360 ], + [ 272, 289 ], + [ 18, 82, 106 ], + [ 93, 307 ], + [], + [ 17, 50, 383 ], + [ 12, 175, 353, 603 ], + [ 2, 160 ], + [ 3, 13, 135, 186 ], + [ 130, 191, 204 ], + [ 9, 108 ], + [ 145, 191 ], + [ 7, 16, 72 ], + [ 174, 463 ], + [ 92 ], + [ 70, 164, 370 ], + [ 159, 184 ], + [ 189, 190 ], + [ 203, 219, 486 ], + [ 161, 174, 212 ], + [ 103, 392, 500 ], + [ 9, 131, 133, 149, 176 ], + [ 84, 161, 212 ], + [ 10, 73, 114, 181, 275 ], + [ 45, 97, 159, 163 ], + [ 145, 191, 211 ], + [], + [ 94, 116, 203 ], + [ 215, 266 ], + [ 137 ], + [ 13, 50, 205, 207 ], + [ 14 ], + [ 11, 118, 237 ], + [ 90, 145, 213 ], + [ 117, 196 ], + [ 197, 336, 607 ], + [ 72, 112, 172, 221 ], + [ 289 ], + [ 4, 80, 129, 183 ], + [ 196, 511, 563 ], + [ 173, 436 ], + [ 3, 152 ], + [ 18, 106, 170 ], + [ 7, 290 ], + [ 93, 198 ], + [], + [ 97, 548 ], + [ 104, 194, 518 ], + [ 102, 194, 411 ], + [ 10, 169 ], + [ 134, 197 ], + [ 0, 8, 144, 196 ], + [ 274, 331 ], + [ 49, 136, 143 ], + [ 151, 170, 449 ], + [], + [ 8, 199 ], + [ 182 ], + [ 161 ], + [ 108, 195 ], + [ 79, 138, 389 ], + [ 91, 278, 369 ], + [ 180, 599 ], + [ 91, 180, 385, 503 ], + [ 15, 120 ], + [ 78, 187 ], + [ 6, 35, 123 ], + [ 99, 161, 165 ], + [ 130, 208, 505 ], + [ 146, 475 ], + [ 192, 203 ], + [ 166, 168, 266 ], + [ 6, 52 ], + [ 0, 123 ], + [ 121, 643 ], + [ 81, 95, 103 ], + [ 139, 165, 174 ], + [ 175, 419 ], + [ 162, 392 ], + [ 91, 220 ], + [ 193, 235 ], + [ 124, 185 ], + [ 111, 179, 298 ], + [ 421 ], + [ 193, 258 ], + [], + [ 216, 307 ], + [ 6, 210 ], + [], + [ 86, 94, 193 ], + [ 34, 77, 170 ], + [ 89, 92, 128, 137 ], + [ 148, 191, 204 ], + [ 94, 193, 459 ], + [ 85, 348 ], + [ 137, 146 ], + [ 141, 169, 190 ], + [ 0, 6 ], + [ 15, 141, 215 ], + [ 15, 119, 166 ], + [ 112, 124, 160 ], + [ 11, 196 ], + [ 106, 185 ], + [ 110, 219, 329 ], + [ 5, 83, 89, 146 ], + [ 76, 147 ], + [ 91, 327, 385, 470 ], + [ 492, 657 ], + [ 4, 183, 357 ], + [ 152, 186 ], + [ 9, 132, 133 ], + [ 93 ], + [ 127, 185, 222 ], + [ 108, 178, 202 ], + [ 86, 192 ], + [ 151, 172, 182, 345 ], + [ 78, 179, 205 ], + [ 135, 644 ], + [ 215, 295 ], + [ 87 ], + [ 87, 166, 266 ], + [ 79, 81, 95, 162 ], + [ 140, 184, 235, 329 ], + [ 150, 154, 159, 163 ], + [ 117, 118 ], + [ 129, 202, 217 ], + [ 104, 109, 121, 171 ], + [ 105, 120, 215, 418, 492 ], + [ 114, 262 ], + [ 68, 126 ], + [], + [ 360 ], + [ 183, 195, 387 ], + [ 88, 97, 140, 273 ], + [ 79, 162 ], + [ 17, 100, 186 ], + [], + [ 100, 618 ], + [ 138, 211 ], + [], + [ 11, 157, 223 ], + [ 95, 208 ], + [ 5, 89, 92 ], + [ 103, 252 ], + [], + [ 98, 168, 188, 197 ], + [ 14, 15, 156 ], + [ 195, 220, 284 ], + [], + [ 88, 173 ], + [ 149, 217 ], + [ 12, 106 ], + [ 182, 242 ], + [ 210, 271 ], + [ 24, 268, 335, 346 ], + [], + [ 284, 355 ], + [ 356, 372 ], + [ 253, 573 ], + [ 326 ], + [ 236, 301, 322 ], + [ 60, 359 ], + [ 333, 618 ], + [ 235, 258, 297, 373 ], + [], + [ 150, 192, 233, 306 ], + [ 230, 280, 317 ], + [ 102, 293, 347 ], + [ 277, 292 ], + [ 25, 290, 596 ], + [ 335, 346 ], + [ 245, 264 ], + [ 222, 353 ], + [ 57, 346, 566 ], + [ 294, 312, 324 ], + [ 46, 241, 247, 269 ], + [ 60, 344 ], + [ 245, 292, 342 ], + [ 320, 330 ], + [ 339, 371 ], + [ 350, 357, 371 ], + [ 19, 307, 319 ], + [ 213 ], + [ 228, 272, 289, 337 ], + [], + [ 267, 288 ], + [ 274, 321 ], + [ 302, 323, 368 ], + [ 27, 154, 233 ], + [ 1, 298 ], + [ 291, 374, 580 ], + [ 286 ], + [ 198, 364 ], + [ 26, 315, 645 ], + [ 25, 29, 241, 287 ], + [ 21, 362 ], + [ 98, 141, 190, 288 ], + [ 255, 321 ], + [ 224, 272 ], + [ 245, 277, 506 ], + [ 299, 345 ], + [ 223, 347 ], + [ 71, 253, 268, 335 ], + [ 203, 302 ], + [ 122, 256 ], + [ 19, 93 ], + [ 374, 619 ], + [ 238, 269, 590 ], + [ 131, 322 ], + [ 324, 331 ], + [ 236, 369 ], + [ 373, 571 ], + [ 486, 497 ], + [ 291, 374, 508 ], + [ 217, 226, 523 ], + [ 4, 315, 371 ], + [ 261, 305 ], + [ 264, 342 ], + [ 255, 266, 296, 304 ], + [ 71, 107, 253 ], + [ 113, 239 ], + [ 260, 283, 511, 629 ], + [ 238, 247, 293, 667 ], + [ 237, 292, 529 ], + [ 244, 304 ], + [ 188, 336, 359 ], + [ 288, 359, 363 ], + [ 233, 328 ], + [ 17, 152, 259 ], + [ 270, 335, 351, 573 ], + [], + [ 230, 355 ], + [ 257, 273 ], + [ 344, 359 ], + [ 288, 294 ], + [ 286, 566, 603 ], + [ 235, 311, 328 ], + [ 73, 156, 251 ], + [ 321, 331, 341 ], + [ 21, 49, 330 ], + [ 42, 360 ], + [ 306, 329, 658 ], + [ 244 ], + [ 341 ], + [ 326, 339, 350 ], + [ 9, 263, 285 ], + [ 46 ], + [ 236, 349 ], + [ 367, 373 ], + [ 28, 30, 251, 358 ], + [ 21, 26, 248 ], + [ 256, 267, 308 ], + [ 230, 278 ], + [ 257, 416 ], + [ 244, 279 ], + [ 326, 457 ], + [ 229, 314, 325 ], + [ 176, 369, 646 ], + [ 297, 306, 367 ], + [ 173, 192, 311 ], + [ 68, 248, 309, 645 ], + [ 122, 279, 308 ], + [], + [ 232, 352, 368 ], + [ 370 ], + [ 224, 240, 272, 299, 338 ], + [ 105, 295 ], + [ 253, 412, 556 ], + [ 335, 351 ], + [ 31, 249, 314 ], + [], + [ 308, 313 ], + [ 247, 287 ], + [], + [ 246, 303, 360, 363 ], + [ 185, 270, 433, 539 ], + [ 224, 240, 243 ], + [ 237, 271 ], + [ 164, 363, 370 ], + [ 317, 636, 668 ], + [ 250, 314 ], + [ 299, 338 ], + [ 333, 416, 510 ], + [ 76, 242 ], + [], + [ 226, 301 ], + [ 227 ], + [ 178, 250, 464 ], + [ 19, 319 ], + [ 32, 231, 295, 296, 303 ], + [ 70, 201, 310, 344 ], + [ 368, 535 ], + [ 265 ], + [ 296, 344, 348 ], + [ 19, 262 ], + [ 367, 658 ], + [ 375 ], + [ 318, 328, 365 ], + [ 257, 333, 361 ], + [ 131, 280, 327 ], + [ 85, 334, 348 ], + [ 26, 249, 250, 285 ], + [ 31, 227 ], + [ 233, 281, 318 ], + [ 260, 276, 283, 375 ], + [ 366, 374 ], + [ 501, 514 ], + [ 397, 451 ], + [ 384, 403, 472, 487 ], + [], + [ 390, 398, 495 ], + [ 43, 48, 51, 469 ], + [ 405 ], + [ 75, 409, 485 ], + [ 378, 438 ], + [ 133, 176, 520 ], + [], + [ 202, 523 ], + [ 389, 445 ], + [ 130, 388 ], + [ 380, 413, 620 ], + [ 404, 422, 461 ], + [ 90, 148, 395 ], + [ 424, 469 ], + [ 41, 413 ], + [ 392, 444, 466 ], + [], + [ 377 ], + [ 33, 380, 438, 513 ], + [ 466, 623 ], + [ 466, 569 ], + [ 515 ], + [ 7, 46 ], + [ 378, 419, 478 ], + [ 391, 446 ], + [ 382, 451 ], + [ 34, 61 ], + [], + [ 474, 529, 561 ], + [ 383 ], + [ 457, 482, 493 ], + [ 118, 529 ], + [ 337, 421 ], + [ 390, 394, 492, 513 ], + [ 455, 463, 475 ], + [ 45, 616 ], + [ 323, 352, 453, 508 ], + [ 455, 466 ], + [ 197, 507, 607 ], + [ 33, 147, 403 ], + [ 455 ], + [ 153, 412 ], + [ 39, 391 ], + [ 42, 463 ], + [ 31, 393, 467 ], + [ 47, 498 ], + [], + [ 38, 498 ], + [ 481, 613 ], + [ 464, 493 ], + [ 470, 522, 637, 654 ], + [], + [], + [ 345, 435 ], + [ 50, 496, 510 ], + [ 433 ], + [ 110, 514 ], + [], + [ 384, 398 ], + [], + [], + [ 36, 652 ], + [ 476 ], + [ 459, 461, 528 ], + [ 395, 484 ], + [ 388 ], + [ 404, 489, 649 ], + [], + [ 491, 651 ], + [ 34, 124, 468, 502 ], + [ 36, 43 ], + [ 377, 405, 662 ], + [ 453, 483, 510 ], + [ 416, 452, 479 ], + [ 45, 461 ], + [ 414, 417, 420 ], + [ 21 ], + [ 325, 410, 464 ], + [ 36, 37, 498 ], + [ 27, 163, 443, 533 ], + [], + [ 391, 443, 454 ], + [ 58 ], + [ 42, 83, 414, 423, 475 ], + [ 357, 429, 457 ], + [ 520, 522 ], + [ 395, 399, 400, 417, 500 ], + [ 424 ], + [ 449, 488 ], + [ 381, 393, 490 ], + [ 176, 430 ], + [ 516, 528, 551 ], + [ 58, 378 ], + [ 35, 36, 498 ], + [ 408, 479 ], + [ 139, 414, 463 ], + [ 42, 442 ], + [ 52, 652 ], + [ 403, 603 ], + [ 453, 474, 518 ], + [ 487, 513 ], + [ 428, 501, 512, 519 ], + [ 410, 499 ], + [ 452, 515 ], + [ 444 ], + [ 44, 383, 600 ], + [ 88, 282 ], + [ 378, 480 ], + [ 468, 502 ], + [ 45, 446 ], + [ 51, 469 ], + [ 448, 494 ], + [ 177, 197, 413 ], + [ 410, 429, 499, 523 ], + [ 491, 502 ], + [ 380, 506, 590 ], + [ 434, 618 ], + [ 282, 501 ], + [ 425, 427, 458, 473 ], + [ 482, 493 ], + [ 90, 466, 568 ], + [ 376, 481, 497 ], + [ 449, 488, 494 ], + [ 133, 504, 519 ], + [ 503, 583 ], + [ 138 ], + [ 269, 495, 517 ], + [ 41, 418 ], + [ 283, 416, 518 ], + [], + [ 352, 434, 452 ], + [ 109, 291 ], + [ 481, 520 ], + [ 398, 413, 480 ], + [ 376, 436, 522 ], + [ 401, 483 ], + [ 39, 471 ], + [ 33, 506 ], + [ 117, 479, 508 ], + [ 481, 503 ], + [ 385, 465, 512 ], + [ 639 ], + [ 430, 465, 514 ], + [ 284, 387, 493 ], + [ 567 ], + [ 557, 559, 592 ], + [ 69, 588, 652 ], + [ 539, 565, 602 ], + [ 65, 443, 471 ], + [ 293, 408, 411 ], + [ 638 ], + [ 620 ], + [], + [ 65, 459, 635 ], + [ 69, 576, 586 ], + [ 361, 598 ], + [ 579, 644 ], + [ 540, 541, 656 ], + [], + [ 345, 527 ], + [ 537, 579 ], + [ 13, 537, 669 ], + [ 20, 543, 549 ], + [ 69, 542 ], + [ 57, 566 ], + [ 550, 610 ], + [], + [], + [ 116 ], + [ 2, 542, 593 ], + [ 545, 561 ], + [ 471, 557 ], + [], + [], + [ 577, 614 ], + [ 660 ], + [ 337, 573 ], + [ 65, 525, 551, 570 ], + [ 32, 54, 587, 607 ], + [ 525, 564 ], + [ 604, 631, 661 ], + [ 408, 550, 600 ], + [ 628 ], + [ 109, 629 ], + [ 559, 570, 617 ], + [ 527, 633 ], + [ 243, 305, 544 ], + [ 524, 587 ], + [ 24, 500 ], + [ 57, 400, 623 ], + [ 557, 564, 653, 659 ], + [ 27, 281, 591 ], + [ 61, 66, 576, 593 ], + [ 228, 299, 556, 633 ], + [ 606 ], + [ 43, 632 ], + [ 534, 572 ], + [ 554, 624 ], + [ 609, 636 ], + [ 536, 540, 642 ], + [ 260, 613 ], + [ 667 ], + [ 67, 600 ], + [ 62, 504, 613 ], + [ 39, 653 ], + [ 644, 660 ], + [ 66, 534, 627, 632 ], + [ 558, 567 ], + [ 526 ], + [], + [ 277, 495, 667 ], + [ 571, 592 ], + [ 65, 525, 591, 635 ], + [ 549, 572 ], + [], + [ 62, 629, 655 ], + [ 2, 16, 239 ], + [], + [ 535, 656, 669 ], + [ 56, 62, 132 ], + [ 40, 485, 561, 582 ], + [], + [ 527 ], + [ 76, 305, 478, 612 ], + [ 560, 612 ], + [], + [ 574, 662 ], + [ 105, 418, 558 ], + [], + [ 578, 628, 646, 654 ], + [ 545 ], + [ 621, 638 ], + [ 603, 604 ], + [ 428, 580, 583, 619 ], + [ 554, 658 ], + [], + [ 415, 642 ], + [ 564, 625 ], + [ 207, 232, 496, 669 ], + [ 276, 613 ], + [ 390, 531, 640, 667 ], + [ 63, 611 ], + [ 639 ], + [ 399, 569 ], + [ 577, 668 ], + [ 617, 653 ], + [ 63, 66 ], + [ 586 ], + [ 562, 609, 637 ], + [ 291, 563, 595 ], + [ 13, 644 ], + [ 54, 560 ], + [ 575, 586 ], + [ 565, 573, 665 ], + [], + [ 533, 592 ], + [ 349, 578 ], + [ 430, 628 ], + [ 51, 530, 611 ], + [ 521, 622 ], + [ 620 ], + [], + [ 579, 616 ], + [ 144, 655 ], + [ 187, 536, 585, 630 ], + [ 55, 56, 263, 330 ], + [ 327, 609 ], + [], + [ 39, 659 ], + [ 446 ], + [ 28, 666 ], + [ 61, 448 ], + [ 64, 441, 477, 526 ], + [ 570, 584, 625 ], + [ 430, 609 ], + [ 595, 643 ], + [ 537, 598 ], + [ 177 ], + [ 311, 365, 614 ], + [ 570, 648 ], + [ 555, 585 ], + [ 58, 560 ], + [ 451, 606, 665 ], + [ 8, 55 ], + [ 42, 60 ], + [ 633, 662 ], + [ 14, 650 ], + [ 292, 581, 590, 620 ], + [ 349, 624 ], + [ 541, 598, 618 ], + [], + [], + ], + }, + sectors: { + hearts_south_of_koblenz: [ 377, 382, 388, 389, 397, 405, 407, 412, 421, 445, 447, 451, 460, 505, 509 ], + diamonds_stade: [ + 32, 231, 244, 246, 255, 256, 266, 267, 274, 279, 288, 294, 295, 296, 303, 304, 308, 310, 312, 313, 321, 324, 331, + 334, 336, 340, 341, 344, 348, 359, 360, 363, 370, + ], + diamonds_brunn: [ + 21, 26, 31, 227, 229, 248, 249, 250, 263, 265, 285, 309, 314, 315, 320, 325, 326, 330, 339, 350, 356, 357, 362, + 371, 372, + ], + spades_berlin: [ + 53, 67, 529, 531, 532, 538, 545, 550, 552, 553, 561, 581, 582, 590, 600, 610, 620, 640, 650, 657, 666, 667, + ], + spades_south_of_hildburghausen: [ 527, 539, 546, 547, 556, 565, 573, 574, 589, 602, 606, 633, 662, 665 ], + spades_warszawa: [ 554, 562, 577, 578, 609, 614, 622, 624, 628, 636, 637, 639, 646, 647, 654, 658, 668, 671 ], + }, +} +if (typeof module === 'object') module.exports = data diff --git a/tools/layout.svg b/tools/layout.svg new file mode 100644 index 0000000..3e7c511 --- /dev/null +++ b/tools/layout.svg @@ -0,0 +1,16734 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/parse-layout.js b/tools/parse-layout.js new file mode 100644 index 0000000..3e6cf0f --- /dev/null +++ b/tools/parse-layout.js @@ -0,0 +1,461 @@ +"use strict" + +const fs = require("fs") + +let points = {} +let rects = {} +let edges = {} +let mode, name, subname, x, y, w, h, cx, cy, rx, ry, x2, y2 +let labels = [] +let sectors = {} + +function array_insert(array, index, item) { + for (let i = array.length; i > index; --i) + array[i] = array[i - 1] + array[index] = item +} + +function set_add(set, item) { + let a = 0 + let b = set.length - 1 + while (a <= b) { + let m = (a + b) >> 1 + let x = set[m] + if (item < x) + b = m - 1 + else if (item > x) + a = m + 1 + else + return + } + array_insert(set, a, item) +} + +function add_point(x, y) { + if (name in points) + points[name].push([x,y]) + else + points[name] = [ [x,y] ] +} + +function add_rect(x, y, w, h) { + if (name in rects) + rects[name].push([x,y,x+w,y+h]) + else + rects[name] = [ [x,y,x+w,y+h] ] +} + +function add_edge(x1, y1, x2, y2) { + if (name in edges) + edges[name].push({x1,y1,x2,y2}) + else + edges[name] = [ {x1,y1,x2,y2} ] +} + +function flush() { + if (mode === 'path') { + add_edge(x, y, x2, y2) + } + if (mode === 'rect') { + if (subname && subname.startsWith("#")) + sectors[subname.slice(1)] = [x, y, x+w, y+h] + if (name.startsWith("$")) + add_rect(x, y, w, h) + else + add_point( x + w/2, y + h/2 ) + } + if (mode === 'circle') { + add_point( cx, cy ) + } + x = y = x2 = y2 = w = h = cx = cy = rx = ry = 0 + subname = null +} + +function parse_path_data(path) { + let cx = 0 + let cy = 0 + let abs = 0 + for (let i = 0; i < path.length;) { + switch (path[i]) { + case 'M': + x2 = x = cx = Number(path[i+1]) + y2 = y = cy = Number(path[i+2]) + i += 3 + abs = true + break + case 'm': + x2 = x = cx = cx + Number(path[i+1]) + y2 = y = cy = cy + Number(path[i+2]) + i += 3 + abs = false + break + case 'C': + x2 = cx = Number(path[i+5]) + y2 = cy = Number(path[i+6]) + i += 7 + abs = true + break + case 'L': + i += 1 + abs = true + break + case 'H': + x2 = cx = Number(path[i+1]) + i += 2 + abs = true + break + case 'V': + y2 = cy = Number(path[i+1]) + i += 2 + abs = true + break + case 'c': + x2 = cx = cx + Number(path[i+5]) + y2 = cy = cy + Number(path[i+6]) + i += 7 + abs = false + break + case 'l': + i += 1 + abs = false + break + case 'h': + x2 = cx = cx + Number(path[i+1]) + i += 2 + abs = false + break + case 'v': + y2 = cy = cy + Number(path[i+1]) + i += 2 + abs = false + break + default: + if (abs) { + x2 = cx = Number(path[i+0]) + y2 = cy = Number(path[i+1]) + } else { + x2 = cx = cx + Number(path[i+0]) + y2 = cy = cy + Number(path[i+1]) + } + i += 2 + break + } + } +} + +for (let line of fs.readFileSync("tools/layout.svg", "utf-8").split("\n")) { + line = line.trim() + if (line.startsWith("")) { + let name = line.replace(/^[^>]*>/, "").replace(/<\/tspan.*/, "") + labels.push({x, y, name}) + } +} + +flush() + +function find_closest_node(list, x, y) { + let nd = Infinity, nn = null + + for (let n of list) { + let d = Math.hypot(n.x - x, n.y - y) + if (d < nd) { + nd = d + nn = n + } + } + + if (!nn) { + console.log("NOT FOUND", x, y) + return [ null, 0 ] + } + + return [ nn, nd ] +} + +function find_closest_city(x, y) { + let nd = Infinity, nn = -1 + + for (let i = 0; i < cities.length; ++i) { + let n = cities[i] + let d = Math.hypot(n.x - x, n.y - y) + if (d < nd) { + nd = d + nn = i + } + } + + return nn +} + +function find_enclosing_rect(list, x, y) { + for (let [x1, y1, x2, y2] of list) { + if (x >= x1 && x <= x2) + if (y >= y1 && y <= y2) + return true + } + return false +} + +const CLUBS = "clubs" +const HEARTS = "hearts" +const SPADES = "spades" +const DIAMONDS = "diamonds" + +const AUSTRIA = "Austria" +const SAXONY = "Saxony" +const EMPIRE = "Empire" +const HANOVER = "Hanover" +const PRUSSIA = "Prussia" +const SWEDEN = "Sweden" +const POLAND = "Poland" + +// FIND and label all points! +let all_labels = labels.slice() +let cities = [] +for (let key in points) { + for (let [x, y] of points[key]) { + let [ node, dist ] = find_closest_node(labels, x, y) + if (dist > 15) { + console.log("DISTANCE TOO FAR", key,x,y, "dist=" + dist, "name=" + node.name) + } + if (node) { + labels = labels.filter(x => x !== node) + let suit = "UNKNOWN" + + if (find_enclosing_rect(rects.$CLUBS, x, y)) + suit = CLUBS + else if (find_enclosing_rect(rects.$HEARTS, x, y)) + suit = HEARTS + else if (find_enclosing_rect(rects.$DIAMONDS, x, y)) + suit = DIAMONDS + else if (find_enclosing_rect(rects.$SPADES, x, y)) + suit = SPADES + else + console.log("NOT ASSIGNED SUIT", x, y) + + let country = "UNKNOWN" + if (find_enclosing_rect(rects.$Empire, x, y)) { + country = EMPIRE + } + else if (find_enclosing_rect(rects.$Austria, x, y)) { + country = AUSTRIA + } + else if (find_enclosing_rect(rects.$Hanover, x, y)) { + country = HANOVER + } + else if (find_enclosing_rect(rects.$Saxony, x, y)) { + country = SAXONY + } + else if (find_enclosing_rect(rects.$Sweden, x, y)) { + country = SWEDEN + } + else if (find_enclosing_rect(rects.$Poland, x, y)) { + country = POLAND + } + else if (find_enclosing_rect(rects.$Prussia, x, y)) { + country = PRUSSIA + } + + if (country === "UNKNOWN") + console.log("no country:", node) + + cities.push({ + name: node.name, + country, + suit, + type: key, + x: Math.round(x), + y: Math.round(y), + adjacent: [], + major_roads: [], + roads: [], + }) + } else { + let [ dupname, dupdist ] = find_closest_node(all_labels, x, y) + console.log("ALREADY USED", dupname, dupdist, x, y) + } + } +} + +cities.sort((a,b) => { + let a_obj = a.type.includes("objective") + let b_obj = b.type.includes("objective") + + if (a_obj && !b_obj) return -1 + if (!a_obj && b_obj) return 1 + + // if (a.type === "depot" && b.type !== "depot") return -1 + // if (a.type !== "depot" && b.type === "depot") return 1 + + if (a.suit < b.suit) return -1 + if (a.suit > b.suit) return 1 + + // if (a.country < b.country) return -1 + // if (a.country > b.country) return 1 + + //if (a.type === "major_fortress" && b.type !== "major_fortress") return -1 + //if (a.type !== "major_fortress" && b.type === "major_fortress") return 1 + //if (a.type === "minor_fortress" && b.type !== "minor_fortress") return -1 + //if (a.type !== "minor_fortress" && b.type === "minor_fortress") return 1 + + if (a.name < b.name) return -1 + if (a.name > b.name) return 1 + return b.y - a.y +}) + +for (let e of edges.major_road) { + let a = find_closest_city(e.x1, e.y1) + let b = find_closest_city(e.x2, e.y2) + set_add(cities[a].major_roads, b) + set_add(cities[b].major_roads, a) + set_add(cities[a].adjacent, b) + set_add(cities[b].adjacent, a) +} + +for (let e of edges.road) { + let a = find_closest_city(e.x1, e.y1) + let b = find_closest_city(e.x2, e.y2) + set_add(cities[a].roads, b) + set_add(cities[b].roads, a) + set_add(cities[a].adjacent, b) + set_add(cities[b].adjacent, a) +} + +let arrays = { + name: [], + // country: [], + // suit: [], + // type: [], + x: [], + y: [], + adjacent: [], + major_roads: [], + roads: [], +} + +let sets = { + type: { + objective_prussia: [], + objective_russia: [], + objective1_sweden: [], + objective2_sweden: [], + objective1_austria: [], + objective2_austria: [], + objective1_imperial: [], + objective2_imperial: [], + objective_france: [], + depot: [], + city: [], + }, + suit: { + clubs: [], + diamonds: [], + hearts: [], + spades: [], + }, + country: { + Austria: [], + Sweden: [], + Poland: [], + Prussia: [], + Hanover: [], + Saxony: [], + Empire: [], + }, +} + +for (let i = 0; i < cities.length; ++i) { + let city = cities[i] + for (let key in city) { + if (arrays[key]) + arrays[key].push(city[key]) + if (sets[key]) + sets[key][city[key]].push(i) + } +} + +function map_to_range(x) { + let pairs = [] + let a = 0, b = 1 + for (; b < x.length; ++b) { + if (x[b-1] + 1 === x[b]) + continue + pairs.push([x[a],x[b-1]]) + a = b + } + pairs.push([x[a],x[b-1]]) + return pairs +} + +function remap_to_range(obj) { + for (let key in obj) + obj[key] = map_to_range(obj[key]) +} + +remap_to_range(sets.suit) +//remap_to_range(sets.country) + +delete sets.type.city + +sets.cities = arrays + +function list_cities_in_rect(rect) { + let [ x1, y1, x2, y2 ] = rect + let list = [] + for (let i = 0; i < sets.cities.name.length; ++i) { + let x = sets.cities.x[i] + let y = sets.cities.y[i] + if (x >= x1 && x <= x2 && y >= y1 && y <= y2) + list.push(i) + } + return list +} + +sets.sectors = {} +for (let key in sectors) + sets.sectors[key] = list_cities_in_rect(sectors[key]) + +console.log("const data = " + JSON.stringify(sets)) +console.log("if (typeof module === 'object') module.exports = data") -- cgit v1.2.3