├── samples ├── k6_fr.png ├── k6_gv.png ├── k6_kk.png ├── bin_tree_fr.png ├── bin_tree_gv.png ├── bin_tree_kk.png ├── quad_tree_fr.png ├── quad_tree_gv.png ├── quad_tree_kk.png ├── thumbs │ ├── k6_fr.gif │ ├── k6_fr.png │ ├── k6_gv.png │ ├── k6_kk.png │ ├── bin_tree_fr.gif │ ├── bin_tree_fr.png │ ├── bin_tree_gv.png │ ├── bin_tree_kk.png │ ├── quad_tree_fr.gif │ ├── quad_tree_fr.png │ ├── quad_tree_gv.png │ ├── quad_tree_kk.png │ ├── small_dense_fr.gif │ ├── small_dense_fr.png │ ├── small_dense_gv.png │ ├── small_dense_kk.png │ ├── large_disconnected_fr.gif │ ├── large_disconnected_fr.png │ └── large_disconnected_gv.png ├── small_dense_fr.png ├── small_dense_gv.png ├── small_dense_kk.png ├── large_disconnected_fr.png ├── large_disconnected_gv.png ├── k6.dot ├── small_dense.dot ├── quad_tree.dot ├── bin_tree.dot └── large_disconnected.dot ├── .clang-format ├── demo ├── CMakeLists.txt └── dot2png.cpp ├── .gitignore ├── TODO ├── src ├── layout.hpp ├── fruchterman_reingold.hpp ├── algebra.hpp ├── CMakeLists.txt ├── kamada_kawai.hpp ├── nodesoup.cpp ├── layout.cpp ├── algebra.cpp ├── fruchterman_reingold.cpp └── kamada_kawai.cpp ├── LICENSE ├── include └── nodesoup.hpp ├── CMakeLists.txt ├── gen_samples.py └── README.md /samples/k6_fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/k6_fr.png -------------------------------------------------------------------------------- /samples/k6_gv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/k6_gv.png -------------------------------------------------------------------------------- /samples/k6_kk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/k6_kk.png -------------------------------------------------------------------------------- /samples/bin_tree_fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/bin_tree_fr.png -------------------------------------------------------------------------------- /samples/bin_tree_gv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/bin_tree_gv.png -------------------------------------------------------------------------------- /samples/bin_tree_kk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/bin_tree_kk.png -------------------------------------------------------------------------------- /samples/quad_tree_fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/quad_tree_fr.png -------------------------------------------------------------------------------- /samples/quad_tree_gv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/quad_tree_gv.png -------------------------------------------------------------------------------- /samples/quad_tree_kk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/quad_tree_kk.png -------------------------------------------------------------------------------- /samples/thumbs/k6_fr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/k6_fr.gif -------------------------------------------------------------------------------- /samples/thumbs/k6_fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/k6_fr.png -------------------------------------------------------------------------------- /samples/thumbs/k6_gv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/k6_gv.png -------------------------------------------------------------------------------- /samples/thumbs/k6_kk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/k6_kk.png -------------------------------------------------------------------------------- /samples/small_dense_fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/small_dense_fr.png -------------------------------------------------------------------------------- /samples/small_dense_gv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/small_dense_gv.png -------------------------------------------------------------------------------- /samples/small_dense_kk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/small_dense_kk.png -------------------------------------------------------------------------------- /samples/thumbs/bin_tree_fr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/bin_tree_fr.gif -------------------------------------------------------------------------------- /samples/thumbs/bin_tree_fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/bin_tree_fr.png -------------------------------------------------------------------------------- /samples/thumbs/bin_tree_gv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/bin_tree_gv.png -------------------------------------------------------------------------------- /samples/thumbs/bin_tree_kk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/bin_tree_kk.png -------------------------------------------------------------------------------- /samples/thumbs/quad_tree_fr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/quad_tree_fr.gif -------------------------------------------------------------------------------- /samples/thumbs/quad_tree_fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/quad_tree_fr.png -------------------------------------------------------------------------------- /samples/thumbs/quad_tree_gv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/quad_tree_gv.png -------------------------------------------------------------------------------- /samples/thumbs/quad_tree_kk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/quad_tree_kk.png -------------------------------------------------------------------------------- /samples/large_disconnected_fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/large_disconnected_fr.png -------------------------------------------------------------------------------- /samples/large_disconnected_gv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/large_disconnected_gv.png -------------------------------------------------------------------------------- /samples/thumbs/small_dense_fr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/small_dense_fr.gif -------------------------------------------------------------------------------- /samples/thumbs/small_dense_fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/small_dense_fr.png -------------------------------------------------------------------------------- /samples/thumbs/small_dense_gv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/small_dense_gv.png -------------------------------------------------------------------------------- /samples/thumbs/small_dense_kk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/small_dense_kk.png -------------------------------------------------------------------------------- /samples/thumbs/large_disconnected_fr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/large_disconnected_fr.gif -------------------------------------------------------------------------------- /samples/thumbs/large_disconnected_fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/large_disconnected_fr.png -------------------------------------------------------------------------------- /samples/thumbs/large_disconnected_gv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olvb/nodesoup/HEAD/samples/thumbs/large_disconnected_gv.png -------------------------------------------------------------------------------- /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | BasedOnStyle: WebKit 3 | BreakBeforeBraces: Attach 4 | MaxEmptyLinesToKeep: 1 5 | BreakConstructorInitializersBeforeComma: true 6 | SpaceAfterCStyleCast: true 7 | -------------------------------------------------------------------------------- /demo/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | find_package(PkgConfig REQUIRED) 2 | pkg_check_modules(CAIRO REQUIRED IMPORTED_TARGET cairo) 3 | 4 | add_executable(dot2png dot2png.cpp) 5 | 6 | target_link_libraries(dot2png PRIVATE nodesoup PkgConfig::CAIRO) 7 | -------------------------------------------------------------------------------- /samples/k6.dot: -------------------------------------------------------------------------------- 1 | graph { 2 | v0 -- v1; 3 | v1 -- v2; 4 | v2 -- v3; 5 | v3 -- v4; 6 | v4 -- v5; 7 | v0 -- v5; 8 | v0 -- v2; 9 | v0 -- v3; 10 | v0 -- v4; 11 | v1 -- v3; 12 | v1 -- v4; 13 | v1 -- v5; 14 | v2 -- v4; 15 | v2 -- v5; 16 | v3 -- v5; 17 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | .DS_Store 3 | Thumbs.db 4 | *.sublime-project 5 | *.sublime-workspace 6 | .gdb_history 7 | .vscode 8 | *.d 9 | *.o 10 | *.obj 11 | *.so 12 | *.dylib 13 | *.a 14 | *.lib 15 | *.out 16 | *.dSYM/ 17 | __pycache__/ 18 | *.py[cod] 19 | *$py.class 20 | 21 | 22 | build/ 23 | compile_commands.json -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | * rotate layout to maximize canvas occupation 2 | * detect edge intersection and use it to control temperature in FR 3 | * determine vertices diameters based on connectivity rather than degree 4 | * use std::set in dot reader to support more vertex labels 5 | * write README with examples 6 | * include graph generator 7 | * BUG: handle vertices with identicaly coords (distance == 0) in FR 8 | -------------------------------------------------------------------------------- /src/layout.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "nodesoup.hpp" 3 | #include 4 | 5 | namespace nodesoup { 6 | /** Distribute vertices equally on a 1.0 radius circle */ 7 | void circle(const adj_list_t& g, std::vector& positions); 8 | /** Center and scale vertices so the graph fits on a canvas of given dimensions */ 9 | void center_and_scale(const adj_list_t& g, unsigned int width, unsigned int height, std::vector& positions); 10 | } 11 | -------------------------------------------------------------------------------- /src/fruchterman_reingold.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "nodesoup.hpp" 3 | #include 4 | #include 5 | 6 | namespace nodesoup { 7 | class FruchtermanReingold { 8 | public: 9 | FruchtermanReingold(const adj_list_t& g, double k = 15.0); 10 | void operator()(std::vector& positions); 11 | 12 | private: 13 | const adj_list_t& g_; 14 | const double k_; 15 | const double k_squared_; 16 | double temp_; 17 | std::vector> edges_; 18 | std::vector mvmts_; 19 | }; 20 | } 21 | -------------------------------------------------------------------------------- /src/algebra.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "nodesoup.hpp" 3 | 4 | namespace nodesoup { 5 | 6 | Point2D operator+(const Point2D& point, const Vector2D& vector); 7 | Point2D operator-(const Point2D& point, const Vector2D& vector); 8 | Vector2D operator-(const Point2D& lhs, const Point2D& rhs); 9 | Vector2D operator+(const Vector2D lhs, const Vector2D& rhs); 10 | Vector2D operator-(const Vector2D& l, const Vector2D& rhs); 11 | Vector2D operator*(const Vector2D& vector, double scalar); 12 | Vector2D operator*(double scalar, const Vector2D& vector); 13 | Vector2D operator/(const Vector2D& vector, double scalar); 14 | }; 15 | -------------------------------------------------------------------------------- /samples/small_dense.dot: -------------------------------------------------------------------------------- 1 | graph { 2 | v0 -- v1; 3 | v0 -- v2; 4 | v0 -- v3; 5 | v1 -- v2; 6 | v1 -- v4; 7 | v2 -- v4; 8 | v2 -- v5; 9 | v3 -- v5; 10 | v3 -- v6; 11 | v4 -- v7; 12 | v5 -- v7; 13 | v5 -- v8; 14 | v5 -- v9; 15 | v5 -- v6; 16 | v6 -- v10; 17 | v7 -- v14; 18 | v7 -- v11; 19 | v8 -- v11; 20 | v8 -- v12; 21 | v8 -- v9; 22 | v9 -- v12; 23 | v9 -- v13; 24 | v9 -- v10; 25 | v10 -- v13; 26 | v10 -- v17; 27 | v11 -- v14; 28 | v11 -- v12; 29 | v12 -- v14; 30 | v12 -- v15; 31 | v12 -- v13; 32 | v13 -- v16; 33 | v13 -- v17; 34 | v14 -- v18; 35 | v14 -- v15; 36 | v15 -- v18; 37 | v15 -- v19; 38 | v15 -- v16; 39 | v16 -- v19; 40 | v16 -- v17; 41 | v17 -- v19; 42 | v18 -- v20; 43 | v19 -- v20; 44 | } -------------------------------------------------------------------------------- /src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_library(nodesoup algebra.cpp fruchterman_reingold.cpp kamada_kawai.cpp 2 | layout.cpp nodesoup.cpp) 3 | add_library(nodesoup::nodesoup ALIAS nodesoup) 4 | 5 | target_include_directories( 6 | nodesoup 7 | PUBLIC $ 8 | PRIVATE $) 9 | 10 | target_compile_features(nodesoup PUBLIC cxx_std_14) 11 | 12 | set_target_properties( 13 | nodesoup PROPERTIES POSITION_INDEPENDENT_CODE ON 14 | PUBLIC_HEADER ${nodesoup_SOURCE_DIR}/include/nodesoup.hpp) 15 | 16 | if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") 17 | target_compile_options(nodesoup PRIVATE -Wall -Wextra) 18 | elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") 19 | target_compile_options(nodesoup PRIVATE -Wall -Wextra) 20 | elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") 21 | target_compile_options(nodesoup PRIVATE /W4) 22 | target_compile_definitions(nodesoup PUBLIC _USE_MATH_DEFINES) 23 | endif() 24 | -------------------------------------------------------------------------------- /src/kamada_kawai.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "nodesoup.hpp" 3 | #include 4 | 5 | namespace nodesoup { 6 | // https://gist.github.com/terakun/b7eff90c889c1485898ec9256ca9f91d 7 | // https://graphsharp.codeplex.com/SourceControl/latest#Source/Graph#/Algorithms/Layout/Simple/FDP/KKLayoutAlgorithm.cs 8 | class KamadaKawai { 9 | public: 10 | struct Spring { 11 | double length; 12 | double strength; 13 | }; 14 | 15 | KamadaKawai(const adj_list_t& g, double k = 300.0, double energy_threshold = 1e-2); 16 | void operator()(std::vector& positions) const; 17 | 18 | private: 19 | const adj_list_t& g_; 20 | const double energy_threshold_; 21 | std::vector> springs_; 22 | 23 | static std::vector> floyd_warshall_(const adj_list_t& g); 24 | // p m 25 | double find_max_vertex_energy_(const std::vector& positions, vertex_id_t& max_energy_v_id) const; 26 | // delta m 27 | double compute_vertex_energy_(vertex_id_t v_id, const std::vector& positions) const; 28 | Point2D compute_next_vertex_position_(vertex_id_t v_id, const std::vector& positions) const; 29 | }; 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /include/nodesoup.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | #include 5 | 6 | namespace nodesoup { 7 | 8 | /** Simple adjaceny list graph structure */ 9 | 10 | using vertex_id_t = std::size_t; 11 | using adj_list_t = std::vector>; 12 | 13 | /** Algebra types */ 14 | 15 | struct Vector2D; 16 | 17 | struct Point2D { 18 | double x; 19 | double y; 20 | 21 | explicit operator Vector2D() const; 22 | Point2D& operator+=(const Vector2D& vector); 23 | Point2D& operator-=(const Vector2D& vector); 24 | }; 25 | 26 | struct Vector2D { 27 | double dx; 28 | double dy; 29 | 30 | double norm() const { 31 | return sqrt(dx * dx + dy * dy); 32 | } 33 | 34 | explicit operator Point2D() const; 35 | Vector2D& operator+=(const Vector2D& other); 36 | Vector2D& operator-=(const Vector2D& other); 37 | Vector2D& operator*=(double scalar); 38 | Vector2D& operator/=(double scalar); 39 | }; 40 | 41 | /** Main library functions */ 42 | 43 | using iter_callback_t = std::function&, int)>; 44 | 45 | /** 46 | Applies the Freuchterman Reingold algorithm to layout graph @p in a frame of dimensions 47 | @p width and @p height, in @p iter-count iterations 48 | */ 49 | std::vector fruchterman_reingold( 50 | const adj_list_t& g, 51 | unsigned int width, 52 | unsigned int height, 53 | unsigned int iters_count = 300, 54 | double k = 15.0, 55 | iter_callback_t iter_cb = nullptr); 56 | 57 | std::vector kamada_kawai( 58 | const adj_list_t& g, 59 | unsigned int width, 60 | unsigned int height, 61 | double k = 300.0, 62 | double energy_threshold = 1e-2); 63 | 64 | /** Assigns diameters to vertices based on their degree */ 65 | std::vector size_radiuses(const adj_list_t& g, double min_radius = 4.0, double k = 300.0); 66 | } 67 | -------------------------------------------------------------------------------- /src/nodesoup.cpp: -------------------------------------------------------------------------------- 1 | #include "nodesoup.hpp" 2 | #include "fruchterman_reingold.hpp" 3 | #include "kamada_kawai.hpp" 4 | #include "layout.hpp" 5 | #include 6 | #include 7 | 8 | namespace nodesoup { 9 | 10 | using std::vector; 11 | 12 | vector fruchterman_reingold( 13 | const adj_list_t& g, 14 | unsigned int width, 15 | unsigned int height, 16 | unsigned int iters_count, 17 | double k, 18 | iter_callback_t iter_cb) { 19 | vector positions(g.size()); 20 | // Initial layout on a circle 21 | circle(g, positions); 22 | 23 | FruchtermanReingold fr(g, k); 24 | for (unsigned int i = 0; i < iters_count; i++) { 25 | fr(positions); 26 | 27 | if (iter_cb != nullptr) { 28 | vector scaled_positions = positions; 29 | center_and_scale(g, width, height, scaled_positions); 30 | iter_cb(scaled_positions, i); 31 | } 32 | } 33 | 34 | center_and_scale(g, width, height, positions); 35 | return positions; 36 | } 37 | 38 | vector kamada_kawai( 39 | const adj_list_t& g, 40 | unsigned int width, 41 | unsigned int height, 42 | double k, 43 | double energy_threshold) { 44 | vector positions(g.size()); 45 | // Initial layout on a circle 46 | circle(g, positions); 47 | KamadaKawai kk(g, k, energy_threshold); 48 | kk(positions); 49 | center_and_scale(g, width, height, positions); 50 | 51 | return positions; 52 | } 53 | 54 | vector size_radiuses(const adj_list_t& g, double min_radius, double k) { 55 | vector radiuses; 56 | radiuses.reserve(g.size()); 57 | for (vertex_id_t v_id = 0; v_id < g.size(); v_id++) { 58 | double delta = log2(k * (double) g[v_id].size() / g.size()); 59 | double radius = min_radius + std::max(0.0, delta); 60 | radiuses.push_back(radius); 61 | } 62 | return radiuses; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/layout.cpp: -------------------------------------------------------------------------------- 1 | #include "layout.hpp" 2 | #include "algebra.hpp" 3 | #include 4 | #include 5 | 6 | namespace nodesoup { 7 | 8 | using std::vector; 9 | 10 | void circle(const adj_list_t& g, vector& positions) { 11 | double angle = 2.0 * M_PI / g.size(); 12 | for (vertex_id_t v_id = 0; v_id < g.size(); v_id++) { 13 | positions[v_id].x = cos(v_id * angle); 14 | positions[v_id].y = sin(v_id * angle); 15 | } 16 | } 17 | 18 | void center_and_scale(const adj_list_t& g, unsigned int width, unsigned int height, vector& positions) { 19 | // find current dimensions 20 | double x_min = std::numeric_limits::max(); 21 | double x_max = std::numeric_limits::lowest(); 22 | double y_min = std::numeric_limits::max(); 23 | double y_max = std::numeric_limits::lowest(); 24 | 25 | for (vertex_id_t v_id = 0; v_id < g.size(); v_id++) { 26 | if (positions[v_id].x < x_min) { 27 | x_min = positions[v_id].x; 28 | } 29 | if (positions[v_id].x > x_max) { 30 | x_max = positions[v_id].x; 31 | } 32 | 33 | if (positions[v_id].y < y_min) { 34 | y_min = positions[v_id].y; 35 | } 36 | if (positions[v_id].y > y_max) { 37 | y_max = positions[v_id].y; 38 | } 39 | } 40 | 41 | double cur_width = x_max - x_min; 42 | double cur_height = y_max - y_min; 43 | 44 | // compute scale factor (0.9: keep some margin) 45 | double x_scale = width / cur_width; 46 | double y_scale = height / cur_height; 47 | double scale = 0.9 * (x_scale < y_scale ? x_scale : y_scale); 48 | 49 | // compute offset and apply it to every position 50 | Vector2D center = { x_max + x_min, y_max + y_min }; 51 | Vector2D offset = center / 2.0 * scale; 52 | for (vertex_id_t v_id = 0; v_id < g.size(); v_id++) { 53 | positions[v_id] = (Point2D)((Vector2D) positions[v_id] * scale - offset); 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/algebra.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "algebra.hpp" 4 | 5 | namespace nodesoup { 6 | 7 | Point2D::operator Vector2D() const { 8 | return { x, y }; 9 | } 10 | 11 | Point2D& Point2D::operator+=(const Vector2D& vector) { 12 | x += vector.dx; 13 | y += vector.dy; 14 | return *this; 15 | } 16 | 17 | Point2D& Point2D::operator-=(const Vector2D& vector) { 18 | x -= vector.dx; 19 | y -= vector.dy; 20 | return *this; 21 | } 22 | 23 | Vector2D::operator Point2D() const { 24 | return { dx, dy }; 25 | } 26 | 27 | Vector2D& Vector2D::operator+=(const Vector2D& other) { 28 | dx += other.dx; 29 | dy += other.dy; 30 | return *this; 31 | } 32 | 33 | Vector2D& Vector2D::operator-=(const Vector2D& other) { 34 | dx -= other.dx; 35 | dy -= other.dy; 36 | return *this; 37 | } 38 | 39 | Vector2D& Vector2D::operator*=(double scalar) { 40 | dx *= scalar; 41 | dy *= scalar; 42 | return *this; 43 | } 44 | 45 | Vector2D& Vector2D::operator/=(double scalar) { 46 | dx /= scalar; 47 | dy /= scalar; 48 | return *this; 49 | } 50 | 51 | Point2D operator+(const Point2D& point, const Vector2D& vector) { 52 | return { point.x + vector.dx, point.y + vector.dy }; 53 | } 54 | 55 | Point2D operator-(const Point2D& point, const Vector2D& vector) { 56 | return { point.x - vector.dx, point.y - vector.dy }; 57 | } 58 | 59 | Vector2D operator-(const Point2D& lhs, const Point2D& rhs) { 60 | return { lhs.x - rhs.x, lhs.y - rhs.y }; 61 | } 62 | 63 | Vector2D operator+(const Vector2D& lhs, const Vector2D& rhs) { 64 | return { lhs.dx + rhs.dx, lhs.dy + rhs.dy }; 65 | } 66 | 67 | Vector2D operator-(const Vector2D& lhs, const Vector2D& rhs) { 68 | return { lhs.dx - rhs.dx, lhs.dy - rhs.dy }; 69 | } 70 | 71 | Vector2D operator*(const Vector2D& vector, double scalar) { 72 | return { vector.dx * scalar, vector.dy * scalar }; 73 | } 74 | 75 | Vector2D operator*(double scalar, const Vector2D& vector) { 76 | return vector * scalar; 77 | } 78 | 79 | Vector2D operator/(const Vector2D& vector, double scalar) { 80 | return { vector.dx / scalar, vector.dy / scalar }; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.14...3.18) 2 | 3 | project( 4 | nodesoup 5 | VERSION 0.1.0 6 | DESCRIPTION "Force-directed graph layout" 7 | HOMEPAGE_URL "https://github.com/olvb/nodesoup" 8 | LANGUAGES CXX) 9 | 10 | if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) 11 | option(BUILD_DEMO "Build the demo" ON) 12 | option(BUILD_SHARED_LIBS "Build shared libraries" OFF) 13 | endif() 14 | 15 | set(default_build_type "Release") 16 | if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) 17 | message( 18 | STATUS 19 | "Setting build type to '${default_build_type}' as none was specified.") 20 | set(CMAKE_BUILD_TYPE 21 | "${default_build_type}" 22 | CACHE STRING "Choose the type of build." FORCE) 23 | set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" 24 | "MinSizeRel" "RelWithDebInfo") 25 | endif() 26 | 27 | add_subdirectory(src) 28 | 29 | include(GNUInstallDirs) 30 | install( 31 | TARGETS nodesoup 32 | EXPORT nodesoup-targets 33 | LIBRARY DESTINATION lib 34 | ARCHIVE DESTINATION lib 35 | INCLUDES 36 | DESTINATION include 37 | PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/nodesoup) 38 | 39 | include(CMakePackageConfigHelpers) 40 | write_basic_package_version_file( 41 | nodesoup-config-version.cmake 42 | VERSION ${PACKAGE_VERSION} 43 | COMPATIBILITY AnyNewerVersion) 44 | 45 | install( 46 | EXPORT nodesoup-targets 47 | FILE nodesoup-config.cmake 48 | NAMESPACE nodesoup:: 49 | DESTINATION lib/cmake/nodesoup) 50 | 51 | export( 52 | TARGETS nodesoup 53 | NAMESPACE nodesoup:: 54 | FILE nodesoup-targets.cmake) 55 | 56 | if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) 57 | set(CPACK_PACKAGE_VENDOR "olvb") 58 | set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") 59 | set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md") 60 | set(CPACK_SOURCE_GENERATOR "TGZ;ZIP") 61 | set(CPACK_SOURCE_IGNORE_FILES /.clang-format /compile_commands.json /.git 62 | /dist /.*build.* /\\\\.DS_Store) 63 | include(CPack) 64 | endif() 65 | 66 | if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR nodesoup_BUILD_DEMO) 67 | AND BUILD_DEMO) 68 | add_subdirectory(demo) 69 | endif() 70 | -------------------------------------------------------------------------------- /samples/quad_tree.dot: -------------------------------------------------------------------------------- 1 | graph G { 2 | v0 3 | v0 -- v1 4 | v0 -- v2 5 | v0 -- v3 6 | v0 -- v4 7 | v1 8 | v1 -- v5 9 | v2 10 | v2 -- v6 11 | v2 -- v7 12 | v3 13 | v3 -- v8 14 | v3 -- v9 15 | v4 16 | v4 -- v10 17 | v4 -- v11 18 | v5 19 | v5 -- v12 20 | v5 -- v13 21 | v6 22 | v6 -- v14 23 | v6 -- v15 24 | v6 -- v16 25 | v6 -- v17 26 | v7 27 | v7 -- v18 28 | v7 -- v19 29 | v7 -- v20 30 | v8 31 | v8 -- v21 32 | v8 -- v22 33 | v8 -- v23 34 | v9 35 | v9 -- v24 36 | v10 37 | v10 -- v25 38 | v11 39 | v11 -- v26 40 | v11 -- v27 41 | v12 42 | v12 -- v28 43 | v12 -- v29 44 | v12 -- v30 45 | v12 -- v31 46 | v13 47 | v13 -- v32 48 | v13 -- v33 49 | v13 -- v34 50 | v14 51 | v14 -- v35 52 | v14 -- v36 53 | v15 54 | v15 -- v37 55 | v15 -- v38 56 | v15 -- v39 57 | v16 58 | v16 -- v40 59 | v17 60 | v17 -- v41 61 | v17 -- v42 62 | v17 -- v43 63 | v18 64 | v18 -- v44 65 | v18 -- v45 66 | v18 -- v46 67 | v19 68 | v19 -- v47 69 | v19 -- v48 70 | v20 71 | v20 -- v49 72 | v20 -- v50 73 | v20 -- v51 74 | v21 75 | v21 -- v52 76 | v22 77 | v22 -- v53 78 | v23 79 | v23 -- v54 80 | v23 -- v55 81 | v24 82 | v24 -- v56 83 | v24 -- v57 84 | v24 -- v58 85 | v25 86 | v25 -- v59 87 | v26 88 | v26 -- v60 89 | v26 -- v61 90 | v27 91 | v27 -- v62 92 | v27 -- v63 93 | v28 94 | v28 -- v64 95 | v28 -- v65 96 | v29 97 | v29 -- v66 98 | v29 -- v67 99 | v29 -- v68 100 | v29 -- v69 101 | v30 102 | v30 -- v70 103 | v30 -- v71 104 | v30 -- v72 105 | v31 106 | v31 -- v73 107 | v31 -- v74 108 | v31 -- v75 109 | v32 110 | v32 -- v76 111 | v33 112 | v33 -- v77 113 | v33 -- v78 114 | v33 -- v79 115 | v34 116 | v34 -- v80 117 | v35 118 | v35 -- v81 119 | v35 -- v82 120 | v36 121 | v36 -- v83 122 | v37 123 | v37 -- v84 124 | v37 -- v85 125 | v37 -- v86 126 | v38 127 | v38 -- v87 128 | v38 -- v88 129 | v38 -- v89 130 | v39 131 | v39 -- v90 132 | v39 -- v91 133 | v39 -- v92 134 | v40 135 | v40 -- v93 136 | v40 -- v94 137 | v41 138 | v41 -- v95 139 | v42 140 | v42 -- v96 141 | v42 -- v97 142 | v43 143 | v43 -- v98 144 | v43 -- v99 145 | v44 146 | v45 147 | v46 148 | v47 149 | v48 150 | v49 151 | v50 152 | v51 153 | v52 154 | v53 155 | v54 156 | v55 157 | v56 158 | v57 159 | v58 160 | v59 161 | v60 162 | v61 163 | v62 164 | v63 165 | v64 166 | v65 167 | v66 168 | v67 169 | v68 170 | v69 171 | v70 172 | v71 173 | v72 174 | v73 175 | v74 176 | v75 177 | v76 178 | v77 179 | v78 180 | v79 181 | v80 182 | v81 183 | v82 184 | v83 185 | v84 186 | v85 187 | v86 188 | v87 189 | v88 190 | v89 191 | v90 192 | v91 193 | v92 194 | v93 195 | v94 196 | v95 197 | v96 198 | v97 199 | v98 200 | v99 201 | } 202 | -------------------------------------------------------------------------------- /samples/bin_tree.dot: -------------------------------------------------------------------------------- 1 | graph G { 2 | v0 3 | v0 -- v1 4 | v1 5 | v1 -- v2 6 | v2 7 | v2 -- v3 8 | v2 -- v4 9 | v3 10 | v3 -- v5 11 | v3 -- v6 12 | v4 13 | v4 -- v7 14 | v4 -- v8 15 | v5 16 | v5 -- v9 17 | v5 -- v10 18 | v6 19 | v6 -- v11 20 | v6 -- v12 21 | v7 22 | v7 -- v13 23 | v7 -- v14 24 | v8 25 | v8 -- v15 26 | v9 27 | v9 -- v16 28 | v9 -- v17 29 | v10 30 | v10 -- v18 31 | v10 -- v19 32 | v11 33 | v11 -- v20 34 | v12 35 | v12 -- v21 36 | v13 37 | v13 -- v22 38 | v13 -- v23 39 | v14 40 | v14 -- v24 41 | v15 42 | v15 -- v25 43 | v16 44 | v16 -- v26 45 | v17 46 | v17 -- v27 47 | v18 48 | v18 -- v28 49 | v19 50 | v19 -- v29 51 | v20 52 | v20 -- v30 53 | v21 54 | v21 -- v31 55 | v21 -- v32 56 | v22 57 | v22 -- v33 58 | v22 -- v34 59 | v23 60 | v23 -- v35 61 | v24 62 | v24 -- v36 63 | v24 -- v37 64 | v25 65 | v25 -- v38 66 | v26 67 | v26 -- v39 68 | v27 69 | v27 -- v40 70 | v28 71 | v28 -- v41 72 | v29 73 | v29 -- v42 74 | v29 -- v43 75 | v30 76 | v30 -- v44 77 | v30 -- v45 78 | v31 79 | v31 -- v46 80 | v31 -- v47 81 | v32 82 | v32 -- v48 83 | v33 84 | v33 -- v49 85 | v34 86 | v34 -- v50 87 | v34 -- v51 88 | v35 89 | v35 -- v52 90 | v36 91 | v36 -- v53 92 | v37 93 | v37 -- v54 94 | v38 95 | v38 -- v55 96 | v38 -- v56 97 | v39 98 | v39 -- v57 99 | v39 -- v58 100 | v40 101 | v40 -- v59 102 | v41 103 | v41 -- v60 104 | v41 -- v61 105 | v42 106 | v42 -- v62 107 | v43 108 | v43 -- v63 109 | v44 110 | v44 -- v64 111 | v45 112 | v45 -- v65 113 | v46 114 | v46 -- v66 115 | v47 116 | v47 -- v67 117 | v47 -- v68 118 | v48 119 | v48 -- v69 120 | v49 121 | v49 -- v70 122 | v50 123 | v50 -- v71 124 | v50 -- v72 125 | v51 126 | v51 -- v73 127 | v52 128 | v52 -- v74 129 | v53 130 | v53 -- v75 131 | v54 132 | v54 -- v76 133 | v55 134 | v55 -- v77 135 | v55 -- v78 136 | v56 137 | v56 -- v79 138 | v56 -- v80 139 | v57 140 | v57 -- v81 141 | v57 -- v82 142 | v58 143 | v58 -- v83 144 | v59 145 | v59 -- v84 146 | v60 147 | v60 -- v85 148 | v61 149 | v61 -- v86 150 | v61 -- v87 151 | v62 152 | v62 -- v88 153 | v62 -- v89 154 | v63 155 | v63 -- v90 156 | v63 -- v91 157 | v64 158 | v64 -- v92 159 | v64 -- v93 160 | v65 161 | v65 -- v94 162 | v66 163 | v66 -- v95 164 | v67 165 | v67 -- v96 166 | v68 167 | v68 -- v97 168 | v68 -- v98 169 | v69 170 | v69 -- v99 171 | v70 172 | v71 173 | v72 174 | v73 175 | v74 176 | v75 177 | v76 178 | v77 179 | v78 180 | v79 181 | v80 182 | v81 183 | v82 184 | v83 185 | v84 186 | v85 187 | v86 188 | v87 189 | v88 190 | v89 191 | v90 192 | v91 193 | v92 194 | v93 195 | v94 196 | v95 197 | v96 198 | v97 199 | v98 200 | v99 201 | } 202 | -------------------------------------------------------------------------------- /src/fruchterman_reingold.cpp: -------------------------------------------------------------------------------- 1 | #include "fruchterman_reingold.hpp" 2 | #include "algebra.hpp" 3 | #include 4 | #include 5 | #include 6 | 7 | namespace nodesoup { 8 | 9 | using std::vector; 10 | 11 | FruchtermanReingold::FruchtermanReingold(const adj_list_t& g, double k) 12 | : g_(g) 13 | , k_(k) 14 | , k_squared_(k * k) 15 | , temp_(10 * sqrt(g.size())) 16 | , mvmts_(g_.size()) {} 17 | 18 | void FruchtermanReingold::operator()(vector& positions) { 19 | Vector2D zero = { 0.0, 0.0 }; 20 | fill(mvmts_.begin(), mvmts_.end(), zero); 21 | 22 | // Repulsion force between vertice pairs 23 | for (vertex_id_t v_id = 0; v_id < g_.size(); v_id++) { 24 | for (vertex_id_t other_id = v_id + 1; other_id < g_.size(); other_id++) { 25 | if (v_id == other_id) { 26 | continue; 27 | } 28 | 29 | Vector2D delta = positions[v_id] - positions[other_id]; 30 | double distance = delta.norm(); 31 | // TODO: handle distance == 0.0 32 | 33 | // > 1000.0: not worth computing 34 | if (distance > 1000.0) { 35 | continue; 36 | } 37 | 38 | double repulsion = k_squared_ / distance; 39 | 40 | mvmts_[v_id] += delta / distance * repulsion; 41 | mvmts_[other_id] -= delta / distance * repulsion; 42 | } 43 | 44 | // Attraction force between edges 45 | for (vertex_id_t adj_id : g_[v_id]) { 46 | if (adj_id > v_id) { 47 | continue; 48 | } 49 | 50 | Vector2D delta = positions[v_id] - positions[adj_id]; 51 | double distance = delta.norm(); 52 | if (distance == 0.0) { 53 | continue; 54 | } 55 | 56 | double attraction = distance * distance / k_; 57 | 58 | mvmts_[v_id] -= delta / distance * attraction; 59 | mvmts_[adj_id] += delta / distance * attraction; 60 | } 61 | } 62 | 63 | // Max movement capped by current temperature 64 | for (vertex_id_t v_id = 0; v_id < g_.size(); v_id++) { 65 | double mvmt_norm = mvmts_[v_id].norm(); 66 | // < 1.0: not worth computing 67 | if (mvmt_norm < 1.0) { 68 | continue; 69 | } 70 | double capped_mvmt_norm = std::min(mvmt_norm, temp_); 71 | Vector2D capped_mvmt = mvmts_[v_id] / mvmt_norm * capped_mvmt_norm; 72 | 73 | positions[v_id] += capped_mvmt; 74 | } 75 | 76 | // Cool down fast until we reach 1.5, then stay at low temperature 77 | if (temp_ > 1.5) { 78 | temp_ *= 0.85; 79 | } else { 80 | temp_ = 1.5; 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /gen_samples.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import os 4 | import subprocess 5 | import re 6 | 7 | FR_CMD = './bin/dot2png -m fr samples/{0}.dot samples/{0}_fr.png' 8 | KK_CMD = './bin/dot2png -m kk samples/{0}.dot samples/{0}_kk.png' 9 | GV_CMD = 'neato -Nshape=point -Nwidth=0.1 -Gsize=10,7\! -Gdpi=100 -Tpng samples/{0}.dot -o samples/{0}_gv.png' 10 | GV_RESIZE_CMD = 'convert samples/{0}_gv.png -resize 930x700 -gravity center -extent 1024x768 samples/{0}_gv.png' 11 | THUMB_CMD = 'convert samples/{0}.png -resize 50% samples/thumbs/{0}.png' 12 | ANIM_CMD = './bin/dot2png -a -m fr samples/{0}.dot samples/{0}_frame.png' 13 | ANIM_COMPILE_CMD = 'convert -colorspace gray -loop 256 -delay 5 {1} -delay 300 {2} -layers optimize samples/thumbs/{0}_fr.gif' 14 | 15 | def gen_fr(name): 16 | print('Generating ' + name + ' fr...') 17 | cmd = FR_CMD.format(name) 18 | subprocess.run([cmd], shell=True) 19 | gen_thumb(name + '_fr') 20 | 21 | def gen_kk(name): 22 | print('Generating ' + name + ' kk...') 23 | cmd = KK_CMD.format(name) 24 | subprocess.run([cmd], shell=True) 25 | gen_thumb(name + '_kk') 26 | 27 | def gen_graphviz(name): 28 | print('Generating ' + name + ' graphviz...') 29 | cmd = GV_CMD.format(name) 30 | subprocess.run([cmd], shell=True) 31 | cmd = GV_RESIZE_CMD.format(name) 32 | subprocess.run([cmd], shell=True) 33 | gen_thumb(name + '_gv') 34 | 35 | def gen_thumb(name): 36 | cmd = THUMB_CMD.format(name) 37 | subprocess.run([cmd], shell=True) 38 | 39 | def gen_fr_anim(name): 40 | print('Generating ' + name + ' anim...') 41 | # generate all frames 42 | cmd = ANIM_CMD.format(name) 43 | subprocess.run([cmd], shell=True) 44 | 45 | # identify frames 46 | frame_names = [] 47 | for file in os.scandir('samples/'): 48 | if not re.match(name + r'_frame_\d{3}.png', file.name): 49 | continue 50 | frame_name = file.name[:-len('.png')] 51 | frame_names.append(frame_name) 52 | 53 | # scale down all frames to thumbnail format 54 | for frame_name in frame_names: 55 | gen_thumb(frame_name) 56 | os.unlink('samples/' + frame_name + '.png') 57 | 58 | # compile all frames in one gif file 59 | frame_names.sort() 60 | frame_thumbs = ['samples/thumbs/' + fn + '.png' for fn in frame_names] 61 | cmd = ANIM_COMPILE_CMD.format(name, ' '.join(frame_thumbs), frame_thumbs[-1]) 62 | subprocess.run([cmd], shell=True) 63 | 64 | # delete frames thumb images 65 | for frame_thumb in frame_thumbs: 66 | os.unlink(frame_thumb) 67 | 68 | def main(): 69 | if not os.path.exists('samples/thumbs/'): 70 | os.makedirs('samples/thumbs/') 71 | 72 | for file in os.scandir('samples/'): 73 | if not file.name.endswith('.dot'): 74 | continue 75 | 76 | name = file.name[:-len('.dot')] 77 | 78 | gen_fr(name) 79 | if not 'large' in name: 80 | gen_kk(name) 81 | gen_graphviz(name) 82 | gen_fr_anim(name) 83 | 84 | main() 85 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Graph untangling 2 | 3 | Force-directed graph layout simulates forces to give motion to vertices and arrange them in a way that is visually pleasing and/or reveals structure. The [Fruchterman-Reingold algorithm][1] assigns a repelling force to vertices pair of the graph, effectively pushing apart vertices so they don't overlap, and a attraction force between each adjacent vertices pair, thus dragging closer connected vertices. The forces attenuate when the vertices get respectively further apart or closer, and a global temperature also serves as a simulated annealing, capping the maximum vertex displacement at each iteration. As the forces between each component and the temperature gradually diminish, the layout stabilizes. 4 | 5 | Another method, the [Kamada Kawai algorithm][1], relies on the simulation of springs between each vertex, which strength is determined by the length of the shortest path between both vertices. The potential energy of each vertex, ie the sum of the energy of all its springs, is then computed. The goal being to reduce the global energy of the layout, each vertex is moved step-by-step until its potential energy is considered low-enough, using a Newton-Raphson algorithm. 6 | 7 | [1]: http://citeseer.ist.psu.edu/viewdoc/download?doi=10.1.1.13.8444&rep=rep1&type=pdf 8 | [2]: http://citeseer.ist.psu.edu/viewdoc/download?doi=10.1.1.387.7401&rep=rep1&type=pdf 9 | 10 | ## Implementation 11 | 12 | This implementation of Fruchterman-Reingold starts by positioning all vertices on a circle as this appears to favor "unmangling" compared to random positions. The radius of the circle is alway 1.0, and all further computations are performed with floating point values, without knowledge of the canvas dimensions. In consequence, contrary to the original Fruchterman-Reingold algorithm, no bound checking is performed, and the layout can spread constraint-free. The final result is then scaled to fit into the canvas dimensions. 13 | 14 | A Kamada-Kawai algorithm is also provided, mostly for comparison purpose. Its complexity makes it rather unsuitable for larger graphs. 15 | 16 | 17 | ## Results 18 | 19 | *Click for full-scale image* 20 | 21 | ### K6 graph 22 | 23 | | Fruchterman-Reingold | Kamada-Kawai | Graphviz | 24 | | :-----------------------: | :-----------------------: | :-----------------------: | 25 | | [![][g1_fr_thumb]][g1_fr] | [![][g1_kk_thumb]][g1_kk] | [![][g1_gv_thumb]][g1_gv] | 26 | | x.xxs | x.xxs | x.xxs | 27 | 28 | [g1_fr]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/k6_fr.png 29 | [g1_fr_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/k6_fr.gif 30 | [g1_kk]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/k6_kk.png 31 | [g1_kk_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/k6_kk.png 32 | [g1_gv]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/k6_gv.png 33 | [g1_gv_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/k6_gv.png 34 | 35 | *DOT file from [graphs.grevian.org](http://graphs.grevian.org/example)* 36 | 37 | ### Small dense graph 38 | 39 | | Fruchterman-Reingold | Kamada-Kawai | Graphviz | 40 | | :-----------------------: | :-----------------------: | :-----------------------: | 41 | | [![][g2_fr_thumb]][g2_fr] | [![][g2_kk_thumb]][g2_kk] | [![][g2_gv_thumb]][g2_gv] | 42 | | x.xxs | x.xxs | x.xxs | 43 | 44 | [g2_fr]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/small_dense_fr.png 45 | [g2_fr_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/small_dense_fr.gif 46 | [g2_kk]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/small_dense_kk.png 47 | [g2_kk_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/small_dense_kk.png 48 | [g2_gv]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/small_dense_gv.png 49 | [g2_gv_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/small_dense_gv.png 50 | 51 | *DOT file from [graphs.grevian.org](http://graphs.grevian.org/example)* 52 | 53 | ### Binary tree 54 | 55 | | Fruchterman-Reingold | Kamada-Kawai | Graphviz | 56 | | :-----------------------: | :-----------------------: | :-----------------------: | 57 | | [![][g3_fr_thumb]][g3_fr] | [![][g3_kk_thumb]][g3_kk] | [![][g3_gv_thumb]][g3_gv] | 58 | | x.xxs | x.xxs | x.xxs | 59 | 60 | [g3_fr]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/bin_tree_fr.png 61 | [g3_fr_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/bin_tree_fr.gif 62 | [g3_kk]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/bin_tree_kk.png 63 | [g3_kk_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/bin_tree_kk.png 64 | [g3_gv]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/bin_tree_gv.png 65 | [g3_gv_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/bin_tree_gv.png 66 | 67 | ### Quad tree 68 | | Fruchterman-Reingold | Kamada-Kawai | Graphviz | 69 | | :-----------------------: | :-----------------------: | :-----------------------: | 70 | | [![][g4_fr_thumb]][g4_fr] | [![][g4_kk_thumb]][g4_kk] | [![][g4_gv_thumb]][g4_gv] | 71 | | x.xxs | x.xxs | x.xxs | 72 | 73 | [g4_fr]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/quad_tree_fr.png 74 | [g4_fr_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/quad_tree_fr.gif 75 | [g4_kk]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/quad_tree_kk.png 76 | [g4_kk_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/quad_tree_kk.png 77 | [g4_gv]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/quad_tree_gv.png 78 | [g4_gv_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/quad_tree_gv.png 79 | 80 | ### Large graph with disconnected components 81 | 82 | | Fruchterman-Reingold | Graphviz | 83 | | :-----------------------: | :-----------------------: | 84 | | [![][g5_fr_thumb]][g5_fr] | [![][g5_gv_thumb]][g5_gv] | 85 | | x.xxs | x.xxs | 86 | 87 | [g5_fr]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/large_disconnected_fr.png 88 | [g5_fr_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/large_disconnected_fr.gif 89 | [g5_kk]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/large_disconnected_kk.png 90 | [g5_kk_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/large_disconnected_kk.png 91 | [g5_gv]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/large_disconnected_gv.png 92 | [g5_gv_thumb]: https://raw.githubusercontent.com/olvb/nodesoup/master/samples/thumbs/large_disconnected_gv.png 93 | 94 | *GML file from [gephi](https://github.com/gephi/gephi/wiki/Datasets) based on dataset by M. E. J. Newman* 95 | 96 | It might take some twiddling with the *k* parameter (a constant used to compute attractive and repulsive forces between vertices), as well as of the number of iterations, in order to get a layout perfectly free of edge-crossing. A better solution could be to introduce a "fine-tuning" phase during which we slightly raise again the temperature (and possibly the *k* value?) so as to shake the layout a bit before cooling it down again. 97 | -------------------------------------------------------------------------------- /src/kamada_kawai.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #include "algebra.hpp" 7 | #include "kamada_kawai.hpp" 8 | 9 | namespace nodesoup { 10 | 11 | using std::vector; 12 | 13 | 14 | KamadaKawai::KamadaKawai(const adj_list_t& g, double k, double energy_threshold) 15 | : g_(g) 16 | , energy_threshold_(energy_threshold) { 17 | vector> distances = floyd_warshall_(g_); 18 | 19 | // find biggest distance 20 | size_t biggest_distance = 0; 21 | for (vertex_id_t v_id = 0; v_id < g_.size(); v_id++) { 22 | for (vertex_id_t other_id = 0; other_id < g_.size(); other_id++) { 23 | if (distances[v_id][other_id] > biggest_distance) { 24 | biggest_distance = distances[v_id][other_id]; 25 | } 26 | } 27 | } 28 | 29 | // Ideal length for all edges. we don't really care, the layout is going to be scaled. 30 | // Let's chose 1.0 as the initial positions will be on a 1.0 radius circle, so we're 31 | // on the same order of magnitude 32 | double length = 1.0 / biggest_distance; 33 | 34 | // init springs lengths and strengths matrices 35 | for (vertex_id_t v_id = 0; v_id < g_.size(); v_id++) { 36 | vector v_springs; 37 | 38 | for (vertex_id_t other_id = 0; other_id < g_.size(); other_id++) { 39 | Spring spring; 40 | if (v_id == other_id) { 41 | spring.length = 0.0; 42 | spring.strength = 0.0; 43 | } else { 44 | size_t distance = distances[v_id][other_id]; 45 | spring.length = distance * length; 46 | spring.strength = k / (distance * distance); 47 | } 48 | 49 | v_springs.push_back(spring); 50 | } 51 | springs_.push_back(v_springs); 52 | } 53 | } 54 | 55 | vector> KamadaKawai::floyd_warshall_(const adj_list_t& g) { 56 | // build adjacency matrix (infinity = no edge, 1 = edge) 57 | unsigned int infinity = std::numeric_limits::max() / 2; 58 | vector> distances(g.size(), vector(g.size(), infinity)); 59 | 60 | for (vertex_id_t v_id = 0; v_id < g.size(); v_id++) { 61 | distances[v_id][v_id] = 0; 62 | for (vertex_id_t adj_id : g[v_id]) { 63 | if (adj_id > v_id) { 64 | distances[v_id][adj_id] = 1; 65 | distances[adj_id][v_id] = 1; 66 | } 67 | } 68 | } 69 | 70 | // floyd warshall itself, find length of shortest path for each pair of vertices 71 | for (vertex_id_t k = 0; k < g.size(); k++) { 72 | for (vertex_id_t i = 0; i < g.size(); i++) { 73 | for (vertex_id_t j = 0; j < g.size(); j++) { 74 | distances[i][j] = std::min(distances[i][j], distances[i][k] + distances[k][j]); 75 | } 76 | } 77 | } 78 | 79 | return distances; 80 | } 81 | 82 | #define MAX_VERTEX_ITERS_COUNT 50 83 | #define MAX_STEADY_ENERGY_ITERS_COUNT 50 84 | 85 | /** 86 | Reduce the energy of the next vertex with most energy until all the vertices have 87 | a energy below energy_threshold 88 | */ 89 | void KamadaKawai::operator()(vector& positions) const { 90 | vertex_id_t v_id; 91 | unsigned int steady_energy_count = 0; 92 | double max_vertex_energy = find_max_vertex_energy_(positions, v_id); 93 | 94 | while (max_vertex_energy > energy_threshold_ && steady_energy_count < MAX_STEADY_ENERGY_ITERS_COUNT) { 95 | // move vertex step by step until its energy goes below threshold 96 | // (apparently this is equivalent to the newton raphson method) 97 | unsigned int vertex_count = 0; 98 | do { 99 | positions[v_id] = compute_next_vertex_position_(v_id, positions); 100 | vertex_count++; 101 | } while (compute_vertex_energy_(v_id, positions) > energy_threshold_ && vertex_count < MAX_VERTEX_ITERS_COUNT); 102 | 103 | double max_vertex_energy_prev = max_vertex_energy; 104 | max_vertex_energy = find_max_vertex_energy_(positions, v_id); 105 | if (std::abs(max_vertex_energy - max_vertex_energy_prev) < 1e-20) { 106 | steady_energy_count++; 107 | } else { 108 | steady_energy_count = 0; 109 | } 110 | } 111 | } 112 | 113 | /** 114 | Find @p max_energy_v_id with the most potential energy and @return its energy 115 | // https://gist.github.com/terakun/b7eff90c889c1485898ec9256ca9f91d 116 | */ 117 | double KamadaKawai::find_max_vertex_energy_(const vector& positions, vertex_id_t& max_energy_v_id) const { 118 | double max_energy = -1.0; 119 | for (vertex_id_t v_id = 0; v_id < g_.size(); v_id++) { 120 | double energy = compute_vertex_energy_(v_id, positions); 121 | if (energy > max_energy) { 122 | max_energy_v_id = v_id; 123 | max_energy = energy; 124 | } 125 | } 126 | assert(max_energy != -1.0); 127 | return max_energy; 128 | } 129 | 130 | /** @return the potential energies of springs between @p v_id and all other vertices */ 131 | double KamadaKawai::compute_vertex_energy_(vertex_id_t v_id, const vector& positions) const { 132 | double x_energy = 0.0; 133 | double y_energy = 0.0; 134 | 135 | for (vertex_id_t other_id = 0; other_id < g_.size(); other_id++) { 136 | if (v_id == other_id) { 137 | continue; 138 | } 139 | 140 | Vector2D delta = positions[v_id] - positions[other_id]; 141 | double distance = delta.norm(); 142 | 143 | // delta * k * (1 - l / distance) 144 | Spring spring = springs_[v_id][other_id]; 145 | x_energy += delta.dx * spring.strength * (1.0 - spring.length / distance); 146 | y_energy += delta.dy * spring.strength * (1.0 - spring.length / distance); 147 | } 148 | 149 | return sqrt(x_energy * x_energy + y_energy * y_energy); 150 | } 151 | 152 | /** 153 | @returns next position for @param v_id reducing its potential energy, ie the energy in the whole graph 154 | caused by its position. 155 | The position's delta depends on K (TODO bigger K = faster?). 156 | This is the complicated part of the algorithm. 157 | */ 158 | Point2D KamadaKawai::compute_next_vertex_position_(vertex_id_t v_id, const vector& positions) const { 159 | double xx_energy = 0.0, xy_energy = 0.0, yx_energy = 0.0, yy_energy = 0.0; 160 | double x_energy = 0.0, y_energy = 0.0; 161 | 162 | for (vertex_id_t other_id = 0; other_id < g_.size(); other_id++) { 163 | if (v_id == other_id) { 164 | continue; 165 | } 166 | 167 | Vector2D delta = positions[v_id] - positions[other_id]; 168 | double distance = delta.norm(); 169 | double cubed_distance = distance * distance * distance; 170 | 171 | Spring spring = springs_[v_id][other_id]; 172 | 173 | x_energy += delta.dx * spring.strength * (1.0 - spring.length / distance); 174 | y_energy += delta.dy * spring.strength * (1.0 - spring.length / distance); 175 | xy_energy += spring.strength * spring.length * delta.dx * delta.dy / cubed_distance; 176 | xx_energy += spring.strength * (1.0 - spring.length * delta.dy * delta.dy / cubed_distance); 177 | yy_energy += spring.strength * (1.0 - spring.length * delta.dx * delta.dx / cubed_distance); 178 | } 179 | yx_energy = xy_energy; 180 | 181 | Point2D position = positions[v_id]; 182 | double denom = xx_energy * yy_energy - xy_energy * yx_energy; 183 | position.x += (xy_energy * y_energy - yy_energy * x_energy) / denom; 184 | position.y += (xy_energy * x_energy - xx_energy * y_energy) / denom; 185 | 186 | return position; 187 | } 188 | } 189 | -------------------------------------------------------------------------------- /demo/dot2png.cpp: -------------------------------------------------------------------------------- 1 | #include "nodesoup.hpp" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | using namespace nodesoup; 17 | 18 | using std::string; 19 | using std::vector; 20 | using std::cout; 21 | using std::cerr; 22 | 23 | /** Read not-too-complicated dot files */ 24 | adj_list_t read_from_dot(string filename) { 25 | std::ifstream ifs(filename); 26 | if (!ifs.good()) { 27 | cerr << "Could not open file \"" << filename << "\"\n"; 28 | exit(EXIT_FAILURE); 29 | } 30 | 31 | adj_list_t g; 32 | std::unordered_map names; 33 | 34 | auto name_to_vertex_id = [&g, &names](string name) -> vertex_id_t { 35 | if (name[name.size() - 1] == ';') { 36 | name.erase(name.end() - 1, name.end()); 37 | } 38 | 39 | vertex_id_t v_id; 40 | auto it = names.find(name); 41 | if (it != names.end()) { 42 | return (*it).second; 43 | } 44 | 45 | v_id = g.size(); 46 | names.insert({ name, v_id }); 47 | g.resize(v_id + 1); 48 | return v_id; 49 | }; 50 | 51 | string line; 52 | // skip first line 53 | std::getline(ifs, line); 54 | 55 | while (std::getline(ifs, line)) { 56 | if (line[0] == '}') { 57 | break; 58 | } 59 | 60 | std::istringstream iss(line); 61 | string name, edge_sign, adj_name; 62 | iss >> name >> edge_sign >> adj_name; 63 | 64 | // add vertex if new 65 | vertex_id_t v_id = name_to_vertex_id(name); 66 | 67 | assert(edge_sign == "--" || edge_sign.size() == 0); 68 | if (edge_sign != "--") { 69 | continue; 70 | } 71 | 72 | // add adjacent vertex if new 73 | vertex_id_t adj_id = name_to_vertex_id(adj_name); 74 | 75 | // add edge if new 76 | if (find(g[v_id].begin(), g[v_id].end(), adj_id) == g[v_id].end()) { 77 | g[v_id].push_back(adj_id); 78 | g[adj_id].push_back(v_id); 79 | } 80 | } 81 | return g; 82 | } 83 | 84 | void write_to_png(adj_list_t& g, vector& positions, vector& radiuses, unsigned int width, unsigned int height, string filename) { 85 | // shift origin to 0, 0 86 | for (vertex_id_t v_id = 0; v_id < g.size(); v_id++) { 87 | positions[v_id].x += width / 2.0; 88 | positions[v_id].y += height / 2.0; 89 | } 90 | 91 | cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); 92 | cairo_t* cr = cairo_create(surface); 93 | 94 | cairo_set_source_rgb(cr, 255.0, 255.0, 255.0); 95 | cairo_paint(cr); 96 | cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); 97 | 98 | cairo_set_line_width(cr, 1.0); 99 | for (vertex_id_t v_id = 0; v_id < g.size(); v_id++) { 100 | Point2D v_pos = positions[v_id]; 101 | cairo_arc(cr, v_pos.x, v_pos.y, radiuses[v_id], 0.0, 2.0 * M_PI); 102 | cairo_fill(cr); 103 | 104 | for (auto adj_id : g[v_id]) { 105 | if (adj_id < v_id) { 106 | continue; 107 | } 108 | 109 | Point2D adj_pos = positions[adj_id]; 110 | cairo_move_to(cr, v_pos.x, v_pos.y); 111 | cairo_line_to(cr, adj_pos.x, adj_pos.y); 112 | cairo_stroke(cr); 113 | } 114 | } 115 | 116 | if (cairo_surface_write_to_png(surface, filename.c_str()) != CAIRO_STATUS_SUCCESS) { 117 | cerr << "Could not write to file \"" << filename << "\"\n"; 118 | exit(EXIT_FAILURE); 119 | } 120 | 121 | cairo_restore(cr); 122 | cairo_show_page(cr); 123 | } 124 | 125 | enum Method { fr, 126 | kk }; 127 | 128 | void dot_to_png( 129 | string dot_filename, 130 | string png_filename, 131 | Method method, 132 | unsigned int width, 133 | unsigned int height, 134 | double k, 135 | double energy_threshold, 136 | int iters_count, 137 | bool animated) { 138 | adj_list_t g = read_from_dot(dot_filename); 139 | 140 | vector positions; 141 | vector radiuses = size_radiuses(g); 142 | 143 | std::chrono::time_point start, end; 144 | cout << "Laying out graph...\n"; 145 | // Fruchterman-Reingold 146 | if (method == Method::fr) { 147 | iter_callback_t cback = nullptr; 148 | char* frame_filename = nullptr; 149 | string frame_filename_format; 150 | 151 | // support for outputing (almost) all frames 152 | if (animated) { 153 | size_t index = png_filename.rfind(".png"); 154 | if (index == string::npos) { 155 | frame_filename_format = png_filename + "_%03d"; 156 | } else { 157 | frame_filename_format = png_filename.substr(0, index) + "_%03d.png"; 158 | } 159 | frame_filename = new char[frame_filename_format.size()]; 160 | 161 | cback = [&g, &radiuses, width, height, iters_count, frame_filename, &frame_filename_format](vector positions, int iter) { 162 | if (iter % 2 != 0 && iter != 0 && iter != iters_count - 1) { 163 | return; 164 | } 165 | sprintf(frame_filename, frame_filename_format.c_str(), iter); 166 | write_to_png(g, positions, radiuses, width, height, frame_filename); 167 | }; 168 | } 169 | 170 | if (k == -1.0) { 171 | k = 15.0; 172 | } 173 | 174 | start = std::chrono::system_clock::now(); 175 | positions = fruchterman_reingold(g, width, height, iters_count, k, cback); 176 | end = std::chrono::system_clock::now(); 177 | 178 | if (animated) { 179 | delete[] frame_filename; 180 | } else { 181 | write_to_png(g, positions, radiuses, width, height, png_filename); 182 | } 183 | } 184 | // Kamada-Kawai 185 | else { 186 | if (k == -1.0) { 187 | k = 300.0; 188 | } 189 | 190 | start = std::chrono::system_clock::now(); 191 | positions = kamada_kawai(g, width, height, k, energy_threshold); 192 | end = std::chrono::system_clock::now(); 193 | 194 | write_to_png(g, positions, radiuses, width, height, png_filename); 195 | } 196 | 197 | unsigned int ms = std::chrono::duration_cast(end - start).count(); 198 | cout << "Layout computed in " << ms << "ms\n"; 199 | } 200 | 201 | void usage(string exec_name) { 202 | cerr << "Usage: " << exec_name << " [options] \n"; 203 | cerr << "Options:\n"; 204 | cerr << " -m \t\tLayout method to use between Fruchterman Reingold and Kamada Kawai [fr|kk, default: fr]\n"; 205 | cerr << " -w \t\tCanvas width in pixels [default: 1024]\n"; 206 | cerr << " -h \t\tCanvas height in pixels [default: 760]\n"; 207 | cerr << " -k \t\tStrength factor [default: 10 for fr, 300 for kk]\n"; 208 | cerr << " -i \tNumber of iterations for fr [default: 100]\n"; 209 | cerr << " -e \t\tEnergy threshold for kk [default: 1e-2]\n"; 210 | cerr << " -a\t\t\tOutput all intermediary frames for fr [default: false]\n"; 211 | } 212 | 213 | int main(int argc, char* argv[]) { 214 | Method method = fr; 215 | int width = 1024; 216 | int height = 768; 217 | double k = -1.0; 218 | double energy_threshold = 1e-2; 219 | int iters_count = 300; 220 | bool animated = false; 221 | 222 | char opt; 223 | while ((opt = getopt(argc, argv, "m:w:h:k:e:i:a")) != -1) { 224 | switch (opt) { 225 | case 'm': 226 | if (string(optarg) == "fr") { 227 | method = fr; 228 | } else if (string(optarg) == "kk") { 229 | method = kk; 230 | } else { 231 | cerr << "Invalid method: \"" << optarg << "\"\n"; 232 | usage(argv[0]); 233 | exit(EXIT_FAILURE); 234 | } 235 | break; 236 | case 'w': 237 | width = atoi(optarg); 238 | if (width <= 0) { 239 | cerr << "Invalid width: \"" << width << "\"\n"; 240 | usage(argv[0]); 241 | exit(EXIT_FAILURE); 242 | } 243 | break; 244 | case 'h': 245 | height = atoi(optarg); 246 | if (height <= 0) { 247 | cerr << "Invalid height: \"" << height << "\"\n"; 248 | usage(argv[0]); 249 | exit(EXIT_FAILURE); 250 | } 251 | break; 252 | case 'k': 253 | k = atof(optarg); 254 | if (k <= 0.0) { 255 | cerr << "Invalid k value: \"" << k << "\"\n"; 256 | usage(argv[0]); 257 | exit(EXIT_FAILURE); 258 | } 259 | break; 260 | case 'i': 261 | iters_count = atoi(optarg); 262 | if (iters_count <= 0) { 263 | cerr << "Invalid iterations: \"" << iters_count << "\"\n"; 264 | usage(argv[0]); 265 | exit(EXIT_FAILURE); 266 | } 267 | break; 268 | case 'e': 269 | energy_threshold = atof(optarg); 270 | if (energy_threshold <= 0) { 271 | cerr << "Invalid energy threshold: \"" << energy_threshold << "\"\n"; 272 | usage(argv[0]); 273 | exit(EXIT_FAILURE); 274 | } 275 | break; 276 | case 'a': 277 | animated = true; 278 | break; 279 | default: 280 | usage(argv[0]); 281 | exit(EXIT_FAILURE); 282 | } 283 | } 284 | 285 | if (argc - optind != 2) { 286 | cerr << "Missing positional arguments\n"; 287 | usage(argv[0]); 288 | exit(EXIT_FAILURE); 289 | } 290 | 291 | char* dot_filename = argv[optind]; 292 | char* png_filename = argv[optind + 1]; 293 | dot_to_png(dot_filename, png_filename, method, width, height, k, energy_threshold, iters_count, animated); 294 | } 295 | -------------------------------------------------------------------------------- /samples/large_disconnected.dot: -------------------------------------------------------------------------------- 1 | graph { 2 | 0; 3 | 1; 4 | 1 -- 0; 5 | 2; 6 | 3; 7 | 3 -- 2; 8 | 4; 9 | 4 -- 2; 10 | 4 -- 3; 11 | 5; 12 | 5 -- 2; 13 | 5 -- 3; 14 | 5 -- 4; 15 | 6; 16 | 6 -- 2; 17 | 6 -- 3; 18 | 6 -- 4; 19 | 6 -- 5; 20 | 7; 21 | 8; 22 | 8 -- 7; 23 | 9; 24 | 9 -- 7; 25 | 10; 26 | 10 -- 7; 27 | 10 -- 9; 28 | 11; 29 | 11 -- 7; 30 | 11 -- 9; 31 | 11 -- 10; 32 | 12; 33 | 13; 34 | 13 -- 12; 35 | 14; 36 | 14 -- 12; 37 | 14 -- 13; 38 | 15; 39 | 15 -- 12; 40 | 15 -- 13; 41 | 15 -- 14; 42 | 16; 43 | 17; 44 | 17 -- 16; 45 | 18; 46 | 18 -- 16; 47 | 18 -- 17; 48 | 19; 49 | 20; 50 | 21; 51 | 21 -- 20; 52 | 22; 53 | 22 -- 20; 54 | 22 -- 21; 55 | 23; 56 | 24; 57 | 24 -- 23; 58 | 25; 59 | 25 -- 23; 60 | 25 -- 24; 61 | 26; 62 | 27; 63 | 28; 64 | 28 -- 27; 65 | 29; 66 | 29 -- 27; 67 | 29 -- 28; 68 | 30; 69 | 31; 70 | 31 -- 30; 71 | 32; 72 | 32 -- 30; 73 | 32 -- 31; 74 | 33; 75 | 33 -- 30; 76 | 34; 77 | 34 -- 30; 78 | 34 -- 33; 79 | 35; 80 | 36; 81 | 36 -- 35; 82 | 37; 83 | 37 -- 35; 84 | 37 -- 36; 85 | 38; 86 | 38 -- 35; 87 | 38 -- 36; 88 | 38 -- 37; 89 | 39; 90 | 39 -- 35; 91 | 39 -- 36; 92 | 39 -- 37; 93 | 39 -- 38; 94 | 40; 95 | 40 -- 35; 96 | 40 -- 36; 97 | 40 -- 37; 98 | 40 -- 38; 99 | 40 -- 39; 100 | 41; 101 | 42; 102 | 43; 103 | 43 -- 42; 104 | 44; 105 | 45; 106 | 45 -- 44; 107 | 46; 108 | 46 -- 44; 109 | 46 -- 45; 110 | 47; 111 | 48; 112 | 48 -- 47; 113 | 49; 114 | 49 -- 47; 115 | 49 -- 48; 116 | 50; 117 | 50 -- 47; 118 | 50 -- 48; 119 | 50 -- 49; 120 | 51; 121 | 51 -- 33; 122 | 52; 123 | 52 -- 33; 124 | 52 -- 51; 125 | 53; 126 | 53 -- 33; 127 | 53 -- 34; 128 | 53 -- 51; 129 | 53 -- 52; 130 | 54; 131 | 54 -- 30; 132 | 54 -- 33; 133 | 54 -- 34; 134 | 54 -- 51; 135 | 54 -- 52; 136 | 54 -- 53; 137 | 55; 138 | 55 -- 51; 139 | 56; 140 | 56 -- 51; 141 | 56 -- 55; 142 | 57; 143 | 57 -- 51; 144 | 58; 145 | 58 -- 51; 146 | 58 -- 57; 147 | 59; 148 | 60; 149 | 60 -- 59; 150 | 61; 151 | 61 -- 59; 152 | 61 -- 60; 153 | 62; 154 | 63; 155 | 63 -- 62; 156 | 64; 157 | 64 -- 62; 158 | 64 -- 63; 159 | 65; 160 | 65 -- 62; 161 | 65 -- 63; 162 | 65 -- 64; 163 | 66; 164 | 67; 165 | 67 -- 66; 166 | 68; 167 | 68 -- 66; 168 | 68 -- 67; 169 | 69; 170 | 70; 171 | 70 -- 69; 172 | 71; 173 | 71 -- 69; 174 | 71 -- 70; 175 | 72; 176 | 72 -- 69; 177 | 72 -- 70; 178 | 72 -- 71; 179 | 73; 180 | 74; 181 | 74 -- 73; 182 | 75; 183 | 75 -- 73; 184 | 75 -- 74; 185 | 76; 186 | 76 -- 73; 187 | 76 -- 74; 188 | 76 -- 75; 189 | 77; 190 | 78; 191 | 78 -- 46; 192 | 78 -- 77; 193 | 79; 194 | 79 -- 77; 195 | 79 -- 78; 196 | 80; 197 | 80 -- 77; 198 | 80 -- 78; 199 | 80 -- 79; 200 | 81; 201 | 82; 202 | 82 -- 81; 203 | 83; 204 | 83 -- 81; 205 | 83 -- 82; 206 | 84; 207 | 85; 208 | 85 -- 84; 209 | 86; 210 | 86 -- 84; 211 | 86 -- 85; 212 | 87; 213 | 88; 214 | 88 -- 87; 215 | 89; 216 | 90; 217 | 90 -- 55; 218 | 91; 219 | 92; 220 | 92 -- 91; 221 | 93; 222 | 93 -- 91; 223 | 93 -- 92; 224 | 94; 225 | 95; 226 | 95 -- 94; 227 | 96; 228 | 96 -- 94; 229 | 96 -- 95; 230 | 97; 231 | 97 -- 69; 232 | 97 -- 94; 233 | 97 -- 95; 234 | 97 -- 96; 235 | 98; 236 | 98 -- 94; 237 | 98 -- 95; 238 | 98 -- 96; 239 | 98 -- 97; 240 | 99; 241 | 99 -- 94; 242 | 99 -- 96; 243 | 99 -- 97; 244 | 100; 245 | 100 -- 94; 246 | 100 -- 96; 247 | 100 -- 97; 248 | 100 -- 99; 249 | 101; 250 | 102; 251 | 103; 252 | 103 -- 102; 253 | 104; 254 | 104 -- 102; 255 | 104 -- 103; 256 | 105; 257 | 106; 258 | 106 -- 105; 259 | 107; 260 | 107 -- 105; 261 | 107 -- 106; 262 | 108; 263 | 109; 264 | 109 -- 108; 265 | 110; 266 | 111; 267 | 112; 268 | 112 -- 111; 269 | 113; 270 | 114; 271 | 114 -- 113; 272 | 115; 273 | 116; 274 | 117; 275 | 117 -- 116; 276 | 118; 277 | 119; 278 | 119 -- 118; 279 | 120; 280 | 121; 281 | 121 -- 78; 282 | 121 -- 120; 283 | 122; 284 | 123; 285 | 123 -- 122; 286 | 124; 287 | 124 -- 122; 288 | 124 -- 123; 289 | 125; 290 | 126; 291 | 127; 292 | 127 -- 126; 293 | 128; 294 | 128 -- 126; 295 | 128 -- 127; 296 | 129; 297 | 130; 298 | 130 -- 129; 299 | 131; 300 | 131 -- 30; 301 | 131 -- 33; 302 | 131 -- 34; 303 | 132; 304 | 132 -- 33; 305 | 132 -- 34; 306 | 132 -- 53; 307 | 132 -- 54; 308 | 133; 309 | 133 -- 33; 310 | 133 -- 34; 311 | 133 -- 53; 312 | 133 -- 54; 313 | 133 -- 132; 314 | 134; 315 | 134 -- 33; 316 | 134 -- 34; 317 | 134 -- 53; 318 | 134 -- 54; 319 | 134 -- 132; 320 | 134 -- 133; 321 | 135; 322 | 136; 323 | 136 -- 135; 324 | 137; 325 | 138; 326 | 138 -- 137; 327 | 139; 328 | 140; 329 | 140 -- 139; 330 | 141; 331 | 141 -- 139; 332 | 141 -- 140; 333 | 142; 334 | 142 -- 139; 335 | 142 -- 140; 336 | 142 -- 141; 337 | 143; 338 | 143 -- 139; 339 | 143 -- 140; 340 | 143 -- 141; 341 | 143 -- 142; 342 | 144; 343 | 144 -- 139; 344 | 144 -- 140; 345 | 144 -- 141; 346 | 144 -- 142; 347 | 144 -- 143; 348 | 145; 349 | 145 -- 139; 350 | 145 -- 140; 351 | 145 -- 141; 352 | 145 -- 142; 353 | 145 -- 143; 354 | 145 -- 144; 355 | 146; 356 | 146 -- 139; 357 | 146 -- 140; 358 | 146 -- 141; 359 | 146 -- 142; 360 | 146 -- 143; 361 | 146 -- 144; 362 | 146 -- 145; 363 | 147; 364 | 147 -- 139; 365 | 147 -- 140; 366 | 147 -- 141; 367 | 147 -- 142; 368 | 147 -- 143; 369 | 147 -- 144; 370 | 147 -- 145; 371 | 147 -- 146; 372 | 148; 373 | 148 -- 139; 374 | 148 -- 140; 375 | 148 -- 141; 376 | 148 -- 142; 377 | 148 -- 143; 378 | 148 -- 144; 379 | 148 -- 145; 380 | 148 -- 146; 381 | 148 -- 147; 382 | 149; 383 | 149 -- 71; 384 | 150; 385 | 150 -- 71; 386 | 150 -- 94; 387 | 150 -- 96; 388 | 150 -- 149; 389 | 151; 390 | 151 -- 71; 391 | 151 -- 127; 392 | 151 -- 149; 393 | 151 -- 150; 394 | 152; 395 | 152 -- 149; 396 | 153; 397 | 154; 398 | 154 -- 153; 399 | 155; 400 | 155 -- 153; 401 | 155 -- 154; 402 | 156; 403 | 156 -- 153; 404 | 156 -- 154; 405 | 156 -- 155; 406 | 157; 407 | 157 -- 71; 408 | 158; 409 | 158 -- 71; 410 | 158 -- 157; 411 | 159; 412 | 160; 413 | 161; 414 | 161 -- 160; 415 | 162; 416 | 163; 417 | 163 -- 162; 418 | 164; 419 | 165; 420 | 165 -- 164; 421 | 166; 422 | 167; 423 | 167 -- 166; 424 | 168; 425 | 169; 426 | 170; 427 | 170 -- 169; 428 | 171; 429 | 171 -- 169; 430 | 171 -- 170; 431 | 172; 432 | 173; 433 | 173 -- 172; 434 | 174; 435 | 174 -- 172; 436 | 174 -- 173; 437 | 175; 438 | 176; 439 | 176 -- 175; 440 | 177; 441 | 177 -- 175; 442 | 177 -- 176; 443 | 178; 444 | 179; 445 | 180; 446 | 180 -- 179; 447 | 181; 448 | 181 -- 179; 449 | 181 -- 180; 450 | 182; 451 | 183; 452 | 183 -- 182; 453 | 184; 454 | 184 -- 55; 455 | 184 -- 56; 456 | 185; 457 | 185 -- 184; 458 | 186; 459 | 186 -- 184; 460 | 186 -- 185; 461 | 187; 462 | 188; 463 | 188 -- 187; 464 | 189; 465 | 189 -- 187; 466 | 189 -- 188; 467 | 190; 468 | 190 -- 33; 469 | 191; 470 | 191 -- 46; 471 | 192; 472 | 192 -- 46; 473 | 192 -- 191; 474 | 193; 475 | 193 -- 46; 476 | 193 -- 191; 477 | 193 -- 192; 478 | 194; 479 | 194 -- 46; 480 | 194 -- 191; 481 | 195; 482 | 196; 483 | 196 -- 195; 484 | 197; 485 | 197 -- 195; 486 | 197 -- 196; 487 | 198; 488 | 198 -- 195; 489 | 198 -- 196; 490 | 198 -- 197; 491 | 199; 492 | 199 -- 195; 493 | 199 -- 196; 494 | 199 -- 197; 495 | 199 -- 198; 496 | 200; 497 | 201; 498 | 201 -- 24; 499 | 201 -- 25; 500 | 201 -- 200; 501 | 202; 502 | 202 -- 24; 503 | 202 -- 25; 504 | 202 -- 200; 505 | 202 -- 201; 506 | 203; 507 | 203 -- 131; 508 | 204; 509 | 205; 510 | 206; 511 | 206 -- 205; 512 | 207; 513 | 208; 514 | 208 -- 207; 515 | 209; 516 | 209 -- 207; 517 | 209 -- 208; 518 | 210; 519 | 211; 520 | 211 -- 210; 521 | 212; 522 | 212 -- 210; 523 | 212 -- 211; 524 | 213; 525 | 214; 526 | 214 -- 213; 527 | 215; 528 | 215 -- 213; 529 | 215 -- 214; 530 | 216; 531 | 216 -- 48; 532 | 216 -- 136; 533 | 217; 534 | 217 -- 48; 535 | 217 -- 216; 536 | 218; 537 | 218 -- 48; 538 | 218 -- 216; 539 | 218 -- 217; 540 | 219; 541 | 219 -- 216; 542 | 219 -- 218; 543 | 220; 544 | 220 -- 216; 545 | 220 -- 218; 546 | 220 -- 219; 547 | 221; 548 | 221 -- 216; 549 | 221 -- 219; 550 | 221 -- 220; 551 | 222; 552 | 222 -- 216; 553 | 222 -- 219; 554 | 222 -- 220; 555 | 222 -- 221; 556 | 223; 557 | 223 -- 136; 558 | 223 -- 216; 559 | 224; 560 | 224 -- 216; 561 | 224 -- 218; 562 | 224 -- 219; 563 | 224 -- 220; 564 | 225; 565 | 225 -- 94; 566 | 225 -- 96; 567 | 225 -- 150; 568 | 225 -- 151; 569 | 226; 570 | 227; 571 | 227 -- 226; 572 | 228; 573 | 229; 574 | 229 -- 228; 575 | 230; 576 | 230 -- 228; 577 | 230 -- 229; 578 | 231; 579 | 231 -- 228; 580 | 231 -- 229; 581 | 231 -- 230; 582 | 232; 583 | 233; 584 | 234; 585 | 234 -- 233; 586 | 235; 587 | 235 -- 72; 588 | 235 -- 233; 589 | 235 -- 234; 590 | 236; 591 | 237; 592 | 238; 593 | 238 -- 237; 594 | 239; 595 | 240; 596 | 240 -- 239; 597 | 241; 598 | 241 -- 239; 599 | 242; 600 | 243; 601 | 243 -- 242; 602 | 244; 603 | 245; 604 | 245 -- 244; 605 | 246; 606 | 246 -- 244; 607 | 247; 608 | 247 -- 244; 609 | 248; 610 | 249; 611 | 249 -- 248; 612 | 250; 613 | 250 -- 248; 614 | 250 -- 249; 615 | 251; 616 | 251 -- 216; 617 | 251 -- 217; 618 | 251 -- 218; 619 | 252; 620 | 252 -- 216; 621 | 252 -- 217; 622 | 252 -- 218; 623 | 252 -- 251; 624 | 253; 625 | 254; 626 | 255; 627 | 255 -- 254; 628 | 256; 629 | 256 -- 254; 630 | 256 -- 255; 631 | 257; 632 | 258; 633 | 259; 634 | 259 -- 258; 635 | 260; 636 | 261; 637 | 261 -- 260; 638 | 262; 639 | 263; 640 | 263 -- 262; 641 | 264; 642 | 264 -- 262; 643 | 264 -- 263; 644 | 265; 645 | 265 -- 262; 646 | 265 -- 263; 647 | 265 -- 264; 648 | 266; 649 | 266 -- 262; 650 | 266 -- 263; 651 | 266 -- 264; 652 | 266 -- 265; 653 | 267; 654 | 267 -- 262; 655 | 267 -- 263; 656 | 267 -- 264; 657 | 267 -- 265; 658 | 267 -- 266; 659 | 268; 660 | 268 -- 262; 661 | 268 -- 263; 662 | 268 -- 264; 663 | 268 -- 265; 664 | 268 -- 266; 665 | 268 -- 267; 666 | 269; 667 | 269 -- 262; 668 | 269 -- 263; 669 | 269 -- 264; 670 | 269 -- 265; 671 | 269 -- 266; 672 | 269 -- 267; 673 | 269 -- 268; 674 | 270; 675 | 271; 676 | 271 -- 270; 677 | 272; 678 | 273; 679 | 274; 680 | 274 -- 273; 681 | 275; 682 | 275 -- 273; 683 | 275 -- 274; 684 | 276; 685 | 277; 686 | 277 -- 276; 687 | 278; 688 | 278 -- 276; 689 | 278 -- 277; 690 | 279; 691 | 280; 692 | 280 -- 279; 693 | 281; 694 | 281 -- 78; 695 | 281 -- 150; 696 | 281 -- 279; 697 | 281 -- 280; 698 | 282; 699 | 282 -- 279; 700 | 282 -- 280; 701 | 282 -- 281; 702 | 283; 703 | 283 -- 279; 704 | 283 -- 280; 705 | 283 -- 281; 706 | 283 -- 282; 707 | 284; 708 | 284 -- 279; 709 | 284 -- 280; 710 | 284 -- 281; 711 | 284 -- 282; 712 | 284 -- 283; 713 | 285; 714 | 285 -- 279; 715 | 285 -- 280; 716 | 285 -- 281; 717 | 285 -- 282; 718 | 285 -- 283; 719 | 285 -- 284; 720 | 286; 721 | 287; 722 | 287 -- 286; 723 | 288; 724 | 288 -- 286; 725 | 288 -- 287; 726 | 289; 727 | 289 -- 286; 728 | 289 -- 288; 729 | 290; 730 | 291; 731 | 291 -- 290; 732 | 292; 733 | 292 -- 290; 734 | 292 -- 291; 735 | 293; 736 | 294; 737 | 294 -- 293; 738 | 295; 739 | 296; 740 | 297; 741 | 297 -- 296; 742 | 298; 743 | 298 -- 296; 744 | 299; 745 | 299 -- 296; 746 | 299 -- 298; 747 | 300; 748 | 300 -- 296; 749 | 300 -- 298; 750 | 300 -- 299; 751 | 301; 752 | 301 -- 150; 753 | 301 -- 151; 754 | 301 -- 162; 755 | 301 -- 203; 756 | 302; 757 | 302 -- 203; 758 | 302 -- 301; 759 | 303; 760 | 303 -- 203; 761 | 303 -- 301; 762 | 303 -- 302; 763 | 304; 764 | 304 -- 301; 765 | 304 -- 302; 766 | 305; 767 | 305 -- 78; 768 | 306; 769 | 306 -- 78; 770 | 306 -- 305; 771 | 307; 772 | 307 -- 78; 773 | 307 -- 265; 774 | 307 -- 266; 775 | 307 -- 268; 776 | 307 -- 305; 777 | 307 -- 306; 778 | 308; 779 | 308 -- 78; 780 | 308 -- 305; 781 | 308 -- 306; 782 | 308 -- 307; 783 | 309; 784 | 309 -- 78; 785 | 309 -- 305; 786 | 309 -- 308; 787 | 310; 788 | 310 -- 69; 789 | 310 -- 97; 790 | 311; 791 | 312; 792 | 312 -- 311; 793 | 313; 794 | 314; 795 | 314 -- 313; 796 | 315; 797 | 315 -- 313; 798 | 315 -- 314; 799 | 316; 800 | 316 -- 162; 801 | 316 -- 203; 802 | 316 -- 301; 803 | 317; 804 | 317 -- 203; 805 | 317 -- 301; 806 | 317 -- 316; 807 | 318; 808 | 319; 809 | 319 -- 318; 810 | 320; 811 | 321; 812 | 321 -- 320; 813 | 322; 814 | 322 -- 320; 815 | 322 -- 321; 816 | 323; 817 | 323 -- 320; 818 | 323 -- 321; 819 | 323 -- 322; 820 | 324; 821 | 324 -- 320; 822 | 324 -- 323; 823 | 325; 824 | 325 -- 320; 825 | 325 -- 323; 826 | 325 -- 324; 827 | 326; 828 | 327; 829 | 327 -- 30; 830 | 327 -- 326; 831 | 328; 832 | 328 -- 326; 833 | 328 -- 327; 834 | 329; 835 | 329 -- 326; 836 | 329 -- 327; 837 | 329 -- 328; 838 | 330; 839 | 330 -- 151; 840 | 331; 841 | 331 -- 151; 842 | 331 -- 330; 843 | 332; 844 | 333; 845 | 333 -- 332; 846 | 334; 847 | 334 -- 332; 848 | 334 -- 333; 849 | 335; 850 | 335 -- 332; 851 | 335 -- 333; 852 | 335 -- 334; 853 | 336; 854 | 337; 855 | 337 -- 336; 856 | 338; 857 | 339; 858 | 339 -- 338; 859 | 340; 860 | 340 -- 338; 861 | 340 -- 339; 862 | 341; 863 | 341 -- 338; 864 | 341 -- 339; 865 | 341 -- 340; 866 | 342; 867 | 343; 868 | 343 -- 219; 869 | 343 -- 221; 870 | 343 -- 342; 871 | 344; 872 | 344 -- 342; 873 | 344 -- 343; 874 | 345; 875 | 345 -- 216; 876 | 345 -- 252; 877 | 346; 878 | 346 -- 216; 879 | 346 -- 252; 880 | 346 -- 345; 881 | 347; 882 | 347 -- 216; 883 | 347 -- 252; 884 | 347 -- 345; 885 | 347 -- 346; 886 | 348; 887 | 349; 888 | 349 -- 348; 889 | 350; 890 | 350 -- 348; 891 | 350 -- 349; 892 | 351; 893 | 351 -- 348; 894 | 351 -- 349; 895 | 351 -- 350; 896 | 352; 897 | 352 -- 348; 898 | 352 -- 349; 899 | 352 -- 350; 900 | 352 -- 351; 901 | 353; 902 | 353 -- 348; 903 | 353 -- 349; 904 | 353 -- 350; 905 | 353 -- 351; 906 | 353 -- 352; 907 | 354; 908 | 355; 909 | 355 -- 354; 910 | 356; 911 | 356 -- 354; 912 | 356 -- 355; 913 | 357; 914 | 358; 915 | 358 -- 357; 916 | 359; 917 | 359 -- 357; 918 | 359 -- 358; 919 | 360; 920 | 360 -- 357; 921 | 360 -- 358; 922 | 361; 923 | 361 -- 357; 924 | 361 -- 358; 925 | 361 -- 360; 926 | 362; 927 | 362 -- 62; 928 | 363; 929 | 363 -- 362; 930 | 364; 931 | 364 -- 362; 932 | 365; 933 | 365 -- 362; 934 | 365 -- 364; 935 | 366; 936 | 367; 937 | 367 -- 366; 938 | 368; 939 | 368 -- 366; 940 | 368 -- 367; 941 | 369; 942 | 369 -- 24; 943 | 369 -- 25; 944 | 370; 945 | 370 -- 78; 946 | 371; 947 | 371 -- 78; 948 | 371 -- 309; 949 | 371 -- 370; 950 | 372; 951 | 373; 952 | 373 -- 372; 953 | 374; 954 | 374 -- 372; 955 | 374 -- 373; 956 | 375; 957 | 375 -- 33; 958 | 376; 959 | 376 -- 33; 960 | 376 -- 375; 961 | 377; 962 | 377 -- 33; 963 | 377 -- 375; 964 | 377 -- 376; 965 | 378; 966 | 378 -- 375; 967 | 378 -- 376; 968 | 378 -- 377; 969 | 379; 970 | 380; 971 | 380 -- 379; 972 | 381; 973 | 381 -- 379; 974 | 381 -- 380; 975 | 382; 976 | 383; 977 | 383 -- 382; 978 | 384; 979 | 384 -- 382; 980 | 384 -- 383; 981 | 385; 982 | 386; 983 | 386 -- 385; 984 | 387; 985 | 387 -- 385; 986 | 387 -- 386; 987 | 388; 988 | 388 -- 385; 989 | 388 -- 386; 990 | 388 -- 387; 991 | 389; 992 | 389 -- 385; 993 | 389 -- 386; 994 | 389 -- 387; 995 | 389 -- 388; 996 | 390; 997 | 390 -- 385; 998 | 390 -- 386; 999 | 390 -- 387; 1000 | 390 -- 388; 1001 | 390 -- 389; 1002 | 391; 1003 | 391 -- 385; 1004 | 391 -- 386; 1005 | 391 -- 387; 1006 | 391 -- 388; 1007 | 391 -- 389; 1008 | 391 -- 390; 1009 | 392; 1010 | 392 -- 385; 1011 | 392 -- 386; 1012 | 392 -- 387; 1013 | 392 -- 388; 1014 | 392 -- 389; 1015 | 392 -- 390; 1016 | 392 -- 391; 1017 | 393; 1018 | 394; 1019 | 394 -- 393; 1020 | 395; 1021 | 395 -- 393; 1022 | 395 -- 394; 1023 | 396; 1024 | 396 -- 393; 1025 | 396 -- 394; 1026 | 396 -- 395; 1027 | 397; 1028 | 398; 1029 | 398 -- 397; 1030 | 399; 1031 | 399 -- 397; 1032 | 399 -- 398; 1033 | 400; 1034 | 400 -- 397; 1035 | 400 -- 398; 1036 | 400 -- 399; 1037 | 401; 1038 | 401 -- 277; 1039 | 401 -- 278; 1040 | 402; 1041 | 402 -- 30; 1042 | 402 -- 277; 1043 | 402 -- 278; 1044 | 402 -- 327; 1045 | 402 -- 328; 1046 | 402 -- 401; 1047 | 403; 1048 | 403 -- 277; 1049 | 403 -- 278; 1050 | 403 -- 401; 1051 | 403 -- 402; 1052 | 404; 1053 | 404 -- 277; 1054 | 404 -- 278; 1055 | 404 -- 401; 1056 | 404 -- 402; 1057 | 404 -- 403; 1058 | 405; 1059 | 405 -- 277; 1060 | 405 -- 278; 1061 | 405 -- 401; 1062 | 405 -- 402; 1063 | 405 -- 403; 1064 | 405 -- 404; 1065 | 406; 1066 | 406 -- 166; 1067 | 407; 1068 | 408; 1069 | 409; 1070 | 409 -- 408; 1071 | 410; 1072 | 410 -- 408; 1073 | 410 -- 409; 1074 | 411; 1075 | 411 -- 408; 1076 | 411 -- 409; 1077 | 411 -- 410; 1078 | 412; 1079 | 412 -- 408; 1080 | 412 -- 409; 1081 | 412 -- 410; 1082 | 412 -- 411; 1083 | 413; 1084 | 413 -- 408; 1085 | 413 -- 410; 1086 | 413 -- 412; 1087 | 414; 1088 | 415; 1089 | 415 -- 247; 1090 | 415 -- 414; 1091 | 416; 1092 | 416 -- 327; 1093 | 416 -- 328; 1094 | 416 -- 402; 1095 | 417; 1096 | 417 -- 327; 1097 | 417 -- 402; 1098 | 418; 1099 | 419; 1100 | 419 -- 418; 1101 | 420; 1102 | 421; 1103 | 421 -- 319; 1104 | 422; 1105 | 423; 1106 | 423 -- 422; 1107 | 424; 1108 | 424 -- 422; 1109 | 424 -- 423; 1110 | 425; 1111 | 426; 1112 | 426 -- 425; 1113 | 427; 1114 | 427 -- 425; 1115 | 427 -- 426; 1116 | 428; 1117 | 428 -- 46; 1118 | 429; 1119 | 429 -- 428; 1120 | 430; 1121 | 431; 1122 | 431 -- 430; 1123 | 432; 1124 | 432 -- 430; 1125 | 433; 1126 | 434; 1127 | 434 -- 433; 1128 | 435; 1129 | 435 -- 244; 1130 | 435 -- 245; 1131 | 436; 1132 | 437; 1133 | 437 -- 436; 1134 | 438; 1135 | 438 -- 436; 1136 | 438 -- 437; 1137 | 439; 1138 | 439 -- 118; 1139 | 440; 1140 | 440 -- 439; 1141 | 441; 1142 | 441 -- 118; 1143 | 441 -- 439; 1144 | 442; 1145 | 443; 1146 | 443 -- 72; 1147 | 443 -- 442; 1148 | 444; 1149 | 445; 1150 | 445 -- 444; 1151 | 446; 1152 | 447; 1153 | 447 -- 446; 1154 | 448; 1155 | 448 -- 446; 1156 | 448 -- 447; 1157 | 449; 1158 | 449 -- 446; 1159 | 449 -- 447; 1160 | 449 -- 448; 1161 | 450; 1162 | 450 -- 282; 1163 | 451; 1164 | 452; 1165 | 453; 1166 | 453 -- 452; 1167 | 454; 1168 | 454 -- 452; 1169 | 454 -- 453; 1170 | 455; 1171 | 455 -- 452; 1172 | 455 -- 453; 1173 | 455 -- 454; 1174 | 456; 1175 | 456 -- 452; 1176 | 456 -- 453; 1177 | 456 -- 454; 1178 | 456 -- 455; 1179 | 457; 1180 | 457 -- 452; 1181 | 457 -- 453; 1182 | 457 -- 454; 1183 | 457 -- 455; 1184 | 457 -- 456; 1185 | 458; 1186 | 458 -- 452; 1187 | 458 -- 453; 1188 | 458 -- 454; 1189 | 458 -- 455; 1190 | 458 -- 456; 1191 | 458 -- 457; 1192 | 459; 1193 | 459 -- 452; 1194 | 459 -- 453; 1195 | 459 -- 454; 1196 | 459 -- 455; 1197 | 459 -- 456; 1198 | 459 -- 457; 1199 | 459 -- 458; 1200 | 460; 1201 | 461; 1202 | 461 -- 460; 1203 | 462; 1204 | 462 -- 460; 1205 | 462 -- 461; 1206 | 463; 1207 | 463 -- 301; 1208 | 463 -- 460; 1209 | 463 -- 461; 1210 | 463 -- 462; 1211 | 464; 1212 | 464 -- 33; 1213 | 465; 1214 | 465 -- 464; 1215 | 466; 1216 | 466 -- 464; 1217 | 466 -- 465; 1218 | 467; 1219 | 468; 1220 | 468 -- 467; 1221 | 469; 1222 | 469 -- 467; 1223 | 469 -- 468; 1224 | 470; 1225 | 470 -- 467; 1226 | 470 -- 468; 1227 | 470 -- 469; 1228 | 471; 1229 | 471 -- 467; 1230 | 471 -- 468; 1231 | 471 -- 469; 1232 | 471 -- 470; 1233 | 472; 1234 | 473; 1235 | 473 -- 219; 1236 | 473 -- 222; 1237 | 473 -- 472; 1238 | 474; 1239 | 474 -- 472; 1240 | 474 -- 473; 1241 | 475; 1242 | 476; 1243 | 476 -- 475; 1244 | 477; 1245 | 477 -- 475; 1246 | 478; 1247 | 478 -- 475; 1248 | 478 -- 477; 1249 | 479; 1250 | 480; 1251 | 480 -- 479; 1252 | 481; 1253 | 481 -- 479; 1254 | 481 -- 480; 1255 | 482; 1256 | 482 -- 479; 1257 | 482 -- 480; 1258 | 482 -- 481; 1259 | 483; 1260 | 484; 1261 | 484 -- 483; 1262 | 485; 1263 | 485 -- 33; 1264 | 486; 1265 | 487; 1266 | 487 -- 486; 1267 | 488; 1268 | 488 -- 33; 1269 | 488 -- 54; 1270 | 489; 1271 | 489 -- 33; 1272 | 489 -- 54; 1273 | 489 -- 488; 1274 | 490; 1275 | 490 -- 78; 1276 | 490 -- 309; 1277 | 491; 1278 | 491 -- 309; 1279 | 491 -- 490; 1280 | 492; 1281 | 492 -- 490; 1282 | 493; 1283 | 493 -- 309; 1284 | 493 -- 490; 1285 | 494; 1286 | 495; 1287 | 495 -- 494; 1288 | 496; 1289 | 496 -- 494; 1290 | 496 -- 495; 1291 | 497; 1292 | 498; 1293 | 498 -- 497; 1294 | 499; 1295 | 499 -- 303; 1296 | 500; 1297 | 500 -- 150; 1298 | 501; 1299 | 501 -- 500; 1300 | 502; 1301 | 502 -- 500; 1302 | 502 -- 501; 1303 | 503; 1304 | 503 -- 500; 1305 | 503 -- 502; 1306 | 504; 1307 | 505; 1308 | 506; 1309 | 506 -- 505; 1310 | 507; 1311 | 507 -- 33; 1312 | 507 -- 190; 1313 | 508; 1314 | 508 -- 33; 1315 | 508 -- 190; 1316 | 508 -- 507; 1317 | 509; 1318 | 509 -- 33; 1319 | 509 -- 190; 1320 | 509 -- 507; 1321 | 509 -- 508; 1322 | 510; 1323 | 511; 1324 | 512; 1325 | 512 -- 511; 1326 | 513; 1327 | 513 -- 244; 1328 | 513 -- 245; 1329 | 514; 1330 | 515; 1331 | 515 -- 514; 1332 | 516; 1333 | 516 -- 150; 1334 | 516 -- 151; 1335 | 516 -- 216; 1336 | 516 -- 225; 1337 | 516 -- 346; 1338 | 516 -- 514; 1339 | 516 -- 515; 1340 | 517; 1341 | 517 -- 127; 1342 | 517 -- 150; 1343 | 517 -- 151; 1344 | 517 -- 152; 1345 | 517 -- 225; 1346 | 517 -- 514; 1347 | 517 -- 515; 1348 | 517 -- 516; 1349 | 518; 1350 | 519; 1351 | 519 -- 518; 1352 | 520; 1353 | 521; 1354 | 521 -- 520; 1355 | 522; 1356 | 522 -- 76; 1357 | 523; 1358 | 523 -- 522; 1359 | 524; 1360 | 524 -- 522; 1361 | 524 -- 523; 1362 | 525; 1363 | 525 -- 522; 1364 | 525 -- 523; 1365 | 525 -- 524; 1366 | 526; 1367 | 526 -- 522; 1368 | 526 -- 523; 1369 | 526 -- 524; 1370 | 526 -- 525; 1371 | 527; 1372 | 527 -- 522; 1373 | 528; 1374 | 529; 1375 | 529 -- 528; 1376 | 530; 1377 | 531; 1378 | 531 -- 530; 1379 | 532; 1380 | 532 -- 530; 1381 | 532 -- 531; 1382 | 533; 1383 | 533 -- 530; 1384 | 533 -- 531; 1385 | 533 -- 532; 1386 | 534; 1387 | 535; 1388 | 535 -- 534; 1389 | 536; 1390 | 537; 1391 | 538; 1392 | 538 -- 537; 1393 | 539; 1394 | 539 -- 537; 1395 | 539 -- 538; 1396 | 540; 1397 | 540 -- 537; 1398 | 541; 1399 | 541 -- 537; 1400 | 541 -- 540; 1401 | 542; 1402 | 542 -- 537; 1403 | 542 -- 540; 1404 | 542 -- 541; 1405 | 543; 1406 | 544; 1407 | 545; 1408 | 545 -- 544; 1409 | 546; 1410 | 547; 1411 | 547 -- 55; 1412 | 547 -- 56; 1413 | 547 -- 329; 1414 | 547 -- 546; 1415 | 548; 1416 | 548 -- 121; 1417 | 549; 1418 | 549 -- 121; 1419 | 549 -- 548; 1420 | 550; 1421 | 550 -- 121; 1422 | 550 -- 548; 1423 | 550 -- 549; 1424 | 551; 1425 | 552; 1426 | 553; 1427 | 553 -- 552; 1428 | 554; 1429 | 554 -- 552; 1430 | 554 -- 553; 1431 | 555; 1432 | 556; 1433 | 557; 1434 | 557 -- 556; 1435 | 558; 1436 | 558 -- 556; 1437 | 558 -- 557; 1438 | 559; 1439 | 560; 1440 | 560 -- 559; 1441 | 561; 1442 | 561 -- 33; 1443 | 561 -- 34; 1444 | 561 -- 53; 1445 | 561 -- 54; 1446 | 561 -- 132; 1447 | 561 -- 133; 1448 | 561 -- 134; 1449 | 562; 1450 | 562 -- 33; 1451 | 562 -- 34; 1452 | 562 -- 53; 1453 | 562 -- 54; 1454 | 562 -- 132; 1455 | 562 -- 133; 1456 | 562 -- 134; 1457 | 562 -- 561; 1458 | 563; 1459 | 563 -- 82; 1460 | 564; 1461 | 564 -- 563; 1462 | 565; 1463 | 565 -- 563; 1464 | 565 -- 564; 1465 | 566; 1466 | 566 -- 563; 1467 | 566 -- 564; 1468 | 566 -- 565; 1469 | 567; 1470 | 567 -- 189; 1471 | 568; 1472 | 569; 1473 | 569 -- 568; 1474 | 570; 1475 | 571; 1476 | 571 -- 570; 1477 | 572; 1478 | 573; 1479 | 573 -- 572; 1480 | 574; 1481 | 574 -- 281; 1482 | 574 -- 283; 1483 | 575; 1484 | 575 -- 281; 1485 | 575 -- 574; 1486 | 576; 1487 | 576 -- 281; 1488 | 576 -- 574; 1489 | 577; 1490 | 578; 1491 | 578 -- 577; 1492 | 579; 1493 | 580; 1494 | 581; 1495 | 581 -- 580; 1496 | 582; 1497 | 582 -- 580; 1498 | 582 -- 581; 1499 | 583; 1500 | 584; 1501 | 584 -- 583; 1502 | 585; 1503 | 585 -- 136; 1504 | 586; 1505 | 586 -- 136; 1506 | 586 -- 585; 1507 | 587; 1508 | 587 -- 136; 1509 | 587 -- 585; 1510 | 587 -- 586; 1511 | 588; 1512 | 589; 1513 | 590; 1514 | 590 -- 307; 1515 | 590 -- 589; 1516 | 591; 1517 | 591 -- 589; 1518 | 591 -- 590; 1519 | 592; 1520 | 592 -- 589; 1521 | 592 -- 590; 1522 | 592 -- 591; 1523 | 593; 1524 | 594; 1525 | 594 -- 593; 1526 | 595; 1527 | 595 -- 277; 1528 | 595 -- 278; 1529 | 595 -- 403; 1530 | 596; 1531 | 596 -- 46; 1532 | 596 -- 327; 1533 | 596 -- 416; 1534 | 597; 1535 | 598; 1536 | 598 -- 597; 1537 | 599; 1538 | 600; 1539 | 600 -- 599; 1540 | 601; 1541 | 602; 1542 | 603; 1543 | 603 -- 602; 1544 | 604; 1545 | 605; 1546 | 606; 1547 | 606 -- 275; 1548 | 607; 1549 | 607 -- 275; 1550 | 607 -- 606; 1551 | 608; 1552 | 608 -- 275; 1553 | 608 -- 606; 1554 | 608 -- 607; 1555 | 609; 1556 | 609 -- 45; 1557 | 610; 1558 | 610 -- 45; 1559 | 610 -- 609; 1560 | 611; 1561 | 611 -- 45; 1562 | 611 -- 609; 1563 | 612; 1564 | 612 -- 45; 1565 | 612 -- 609; 1566 | 612 -- 611; 1567 | 613; 1568 | 614; 1569 | 615; 1570 | 615 -- 614; 1571 | 616; 1572 | 617; 1573 | 617 -- 616; 1574 | 618; 1575 | 619; 1576 | 619 -- 618; 1577 | 620; 1578 | 620 -- 618; 1579 | 620 -- 619; 1580 | 621; 1581 | 622; 1582 | 622 -- 621; 1583 | 623; 1584 | 624; 1585 | 624 -- 623; 1586 | 625; 1587 | 626; 1588 | 626 -- 625; 1589 | 627; 1590 | 627 -- 625; 1591 | 627 -- 626; 1592 | 628; 1593 | 628 -- 625; 1594 | 628 -- 626; 1595 | 628 -- 627; 1596 | 629; 1597 | 630; 1598 | 630 -- 629; 1599 | 631; 1600 | 631 -- 337; 1601 | 631 -- 629; 1602 | 631 -- 630; 1603 | 632; 1604 | 633; 1605 | 633 -- 632; 1606 | 634; 1607 | 635; 1608 | 636; 1609 | 636 -- 635; 1610 | 637; 1611 | 637 -- 635; 1612 | 637 -- 636; 1613 | 638; 1614 | 638 -- 162; 1615 | 638 -- 301; 1616 | 638 -- 316; 1617 | 638 -- 463; 1618 | 639; 1619 | 639 -- 162; 1620 | 639 -- 301; 1621 | 639 -- 316; 1622 | 639 -- 638; 1623 | 640; 1624 | 640 -- 638; 1625 | 641; 1626 | 641 -- 78; 1627 | 642; 1628 | 643; 1629 | 643 -- 642; 1630 | 644; 1631 | 645; 1632 | 646; 1633 | 646 -- 78; 1634 | 647; 1635 | 648; 1636 | 648 -- 647; 1637 | 649; 1638 | 650; 1639 | 650 -- 189; 1640 | 650 -- 567; 1641 | 651; 1642 | 651 -- 189; 1643 | 651 -- 567; 1644 | 651 -- 650; 1645 | 652; 1646 | 652 -- 34; 1647 | 653; 1648 | 653 -- 652; 1649 | 654; 1650 | 654 -- 34; 1651 | 654 -- 55; 1652 | 654 -- 56; 1653 | 654 -- 652; 1654 | 654 -- 653; 1655 | 655; 1656 | 655 -- 34; 1657 | 655 -- 652; 1658 | 655 -- 653; 1659 | 655 -- 654; 1660 | 656; 1661 | 656 -- 652; 1662 | 656 -- 654; 1663 | 656 -- 655; 1664 | 657; 1665 | 657 -- 34; 1666 | 657 -- 652; 1667 | 657 -- 654; 1668 | 657 -- 655; 1669 | 658; 1670 | 659; 1671 | 659 -- 658; 1672 | 660; 1673 | 660 -- 658; 1674 | 660 -- 659; 1675 | 661; 1676 | 661 -- 658; 1677 | 661 -- 659; 1678 | 661 -- 660; 1679 | 662; 1680 | 663; 1681 | 663 -- 662; 1682 | 664; 1683 | 664 -- 662; 1684 | 664 -- 663; 1685 | 665; 1686 | 665 -- 662; 1687 | 665 -- 663; 1688 | 665 -- 664; 1689 | 666; 1690 | 666 -- 662; 1691 | 666 -- 663; 1692 | 666 -- 664; 1693 | 666 -- 665; 1694 | 667; 1695 | 668; 1696 | 668 -- 667; 1697 | 669; 1698 | 670; 1699 | 670 -- 669; 1700 | 671; 1701 | 671 -- 669; 1702 | 672; 1703 | 673; 1704 | 673 -- 672; 1705 | 674; 1706 | 674 -- 515; 1707 | 674 -- 516; 1708 | 675; 1709 | 675 -- 443; 1710 | 676; 1711 | 676 -- 443; 1712 | 676 -- 675; 1713 | 677; 1714 | 677 -- 662; 1715 | 677 -- 663; 1716 | 678; 1717 | 679; 1718 | 679 -- 678; 1719 | 680; 1720 | 680 -- 678; 1721 | 680 -- 679; 1722 | 681; 1723 | 682; 1724 | 682 -- 681; 1725 | 683; 1726 | 683 -- 681; 1727 | 683 -- 682; 1728 | 684; 1729 | 684 -- 681; 1730 | 684 -- 682; 1731 | 684 -- 683; 1732 | 685; 1733 | 685 -- 57; 1734 | 686; 1735 | 686 -- 350; 1736 | 687; 1737 | 688; 1738 | 689; 1739 | 689 -- 537; 1740 | 689 -- 539; 1741 | 690; 1742 | 690 -- 537; 1743 | 690 -- 539; 1744 | 690 -- 689; 1745 | 691; 1746 | 692; 1747 | 692 -- 342; 1748 | 693; 1749 | 694; 1750 | 694 -- 693; 1751 | 695; 1752 | 695 -- 693; 1753 | 695 -- 694; 1754 | 696; 1755 | 696 -- 693; 1756 | 696 -- 694; 1757 | 696 -- 695; 1758 | 697; 1759 | 697 -- 219; 1760 | 697 -- 343; 1761 | 697 -- 693; 1762 | 697 -- 694; 1763 | 697 -- 695; 1764 | 697 -- 696; 1765 | 698; 1766 | 698 -- 693; 1767 | 698 -- 694; 1768 | 698 -- 695; 1769 | 698 -- 696; 1770 | 698 -- 697; 1771 | 699; 1772 | 699 -- 445; 1773 | 700; 1774 | 700 -- 96; 1775 | 701; 1776 | 701 -- 96; 1777 | 701 -- 700; 1778 | 702; 1779 | 702 -- 96; 1780 | 702 -- 700; 1781 | 702 -- 701; 1782 | 703; 1783 | 704; 1784 | 705; 1785 | 705 -- 704; 1786 | 706; 1787 | 706 -- 704; 1788 | 706 -- 705; 1789 | 707; 1790 | 707 -- 704; 1791 | 707 -- 705; 1792 | 707 -- 706; 1793 | 708; 1794 | 708 -- 94; 1795 | 708 -- 96; 1796 | 708 -- 97; 1797 | 708 -- 99; 1798 | 709; 1799 | 709 -- 69; 1800 | 709 -- 71; 1801 | 709 -- 72; 1802 | 709 -- 97; 1803 | 710; 1804 | 710 -- 69; 1805 | 710 -- 97; 1806 | 710 -- 709; 1807 | 711; 1808 | 711 -- 87; 1809 | 711 -- 88; 1810 | 712; 1811 | 712 -- 642; 1812 | 713; 1813 | 713 -- 642; 1814 | 713 -- 712; 1815 | 714; 1816 | 715; 1817 | 715 -- 695; 1818 | 716; 1819 | 716 -- 695; 1820 | 716 -- 715; 1821 | 717; 1822 | 717 -- 695; 1823 | 717 -- 715; 1824 | 717 -- 716; 1825 | 718; 1826 | 718 -- 695; 1827 | 718 -- 715; 1828 | 718 -- 716; 1829 | 718 -- 717; 1830 | 719; 1831 | 720; 1832 | 720 -- 719; 1833 | 721; 1834 | 721 -- 670; 1835 | 722; 1836 | 723; 1837 | 724; 1838 | 724 -- 723; 1839 | 725; 1840 | 725 -- 723; 1841 | 725 -- 724; 1842 | 726; 1843 | 726 -- 723; 1844 | 726 -- 724; 1845 | 726 -- 725; 1846 | 727; 1847 | 728; 1848 | 729; 1849 | 729 -- 136; 1850 | 729 -- 587; 1851 | 730; 1852 | 731; 1853 | 731 -- 730; 1854 | 732; 1855 | 733; 1856 | 733 -- 732; 1857 | 734; 1858 | 734 -- 732; 1859 | 734 -- 733; 1860 | 735; 1861 | 736; 1862 | 736 -- 71; 1863 | 737; 1864 | 737 -- 71; 1865 | 737 -- 736; 1866 | 738; 1867 | 738 -- 72; 1868 | 738 -- 443; 1869 | 739; 1870 | 739 -- 443; 1871 | 740; 1872 | 741; 1873 | 742; 1874 | 742 -- 293; 1875 | 742 -- 294; 1876 | 742 -- 523; 1877 | 743; 1878 | 743 -- 293; 1879 | 743 -- 294; 1880 | 743 -- 742; 1881 | 744; 1882 | 744 -- 293; 1883 | 744 -- 294; 1884 | 744 -- 742; 1885 | 744 -- 743; 1886 | 745; 1887 | 745 -- 742; 1888 | 746; 1889 | 746 -- 294; 1890 | 746 -- 523; 1891 | 746 -- 742; 1892 | 747; 1893 | 748; 1894 | 748 -- 747; 1895 | 749; 1896 | 750; 1897 | 751; 1898 | 751 -- 750; 1899 | 752; 1900 | 752 -- 719; 1901 | 753; 1902 | 753 -- 719; 1903 | 753 -- 752; 1904 | 754; 1905 | 755; 1906 | 755 -- 754; 1907 | 756; 1908 | 756 -- 34; 1909 | 756 -- 78; 1910 | 757; 1911 | 757 -- 69; 1912 | 757 -- 72; 1913 | 757 -- 756; 1914 | 758; 1915 | 758 -- 69; 1916 | 758 -- 72; 1917 | 758 -- 756; 1918 | 758 -- 757; 1919 | 759; 1920 | 759 -- 78; 1921 | 759 -- 371; 1922 | 759 -- 756; 1923 | 760; 1924 | 760 -- 34; 1925 | 760 -- 756; 1926 | 761; 1927 | 761 -- 34; 1928 | 761 -- 756; 1929 | 762; 1930 | 762 -- 34; 1931 | 762 -- 756; 1932 | 762 -- 761; 1933 | 763; 1934 | 763 -- 34; 1935 | 763 -- 756; 1936 | 763 -- 761; 1937 | 763 -- 762; 1938 | 764; 1939 | 764 -- 121; 1940 | 764 -- 756; 1941 | 764 -- 761; 1942 | 765; 1943 | 765 -- 121; 1944 | 765 -- 756; 1945 | 765 -- 761; 1946 | 765 -- 764; 1947 | 766; 1948 | 767; 1949 | 767 -- 766; 1950 | 768; 1951 | 768 -- 766; 1952 | 768 -- 767; 1953 | 769; 1954 | 769 -- 766; 1955 | 769 -- 767; 1956 | 769 -- 768; 1957 | 770; 1958 | 770 -- 126; 1959 | 770 -- 127; 1960 | 771; 1961 | 771 -- 126; 1962 | 771 -- 127; 1963 | 771 -- 770; 1964 | 772; 1965 | 772 -- 126; 1966 | 772 -- 127; 1967 | 772 -- 770; 1968 | 772 -- 771; 1969 | 773; 1970 | 773 -- 126; 1971 | 773 -- 127; 1972 | 773 -- 770; 1973 | 773 -- 771; 1974 | 773 -- 772; 1975 | 774; 1976 | 774 -- 654; 1977 | 774 -- 657; 1978 | 774 -- 761; 1979 | 775; 1980 | 775 -- 756; 1981 | 775 -- 761; 1982 | 775 -- 764; 1983 | 775 -- 765; 1984 | 775 -- 774; 1985 | 776; 1986 | 776 -- 761; 1987 | 776 -- 774; 1988 | 776 -- 775; 1989 | 777; 1990 | 778; 1991 | 778 -- 777; 1992 | 779; 1993 | 780; 1994 | 780 -- 496; 1995 | 781; 1996 | 781 -- 496; 1997 | 781 -- 780; 1998 | 782; 1999 | 783; 2000 | 783 -- 631; 2001 | 784; 2002 | 784 -- 631; 2003 | 784 -- 783; 2004 | 785; 2005 | 786; 2006 | 786 -- 785; 2007 | 787; 2008 | 787 -- 785; 2009 | 787 -- 786; 2010 | 788; 2011 | 788 -- 216; 2012 | 788 -- 346; 2013 | 788 -- 516; 2014 | 789; 2015 | 789 -- 597; 2016 | 790; 2017 | 790 -- 597; 2018 | 790 -- 789; 2019 | 791; 2020 | 792; 2021 | 792 -- 662; 2022 | 793; 2023 | 793 -- 662; 2024 | 793 -- 792; 2025 | 794; 2026 | 794 -- 662; 2027 | 794 -- 792; 2028 | 794 -- 793; 2029 | 795; 2030 | 795 -- 64; 2031 | 796; 2032 | 796 -- 64; 2033 | 796 -- 795; 2034 | 797; 2035 | 797 -- 64; 2036 | 797 -- 795; 2037 | 797 -- 796; 2038 | 798; 2039 | 798 -- 64; 2040 | 798 -- 795; 2041 | 798 -- 796; 2042 | 798 -- 797; 2043 | 799; 2044 | 800; 2045 | 800 -- 799; 2046 | 801; 2047 | 801 -- 799; 2048 | 801 -- 800; 2049 | 802; 2050 | 802 -- 799; 2051 | 802 -- 800; 2052 | 802 -- 801; 2053 | 803; 2054 | 803 -- 799; 2055 | 803 -- 800; 2056 | 803 -- 801; 2057 | 803 -- 802; 2058 | 804; 2059 | 804 -- 799; 2060 | 804 -- 800; 2061 | 804 -- 801; 2062 | 804 -- 802; 2063 | 804 -- 803; 2064 | 805; 2065 | 805 -- 62; 2066 | 805 -- 362; 2067 | 806; 2068 | 806 -- 62; 2069 | 806 -- 362; 2070 | 806 -- 805; 2071 | 807; 2072 | 807 -- 62; 2073 | 807 -- 362; 2074 | 807 -- 805; 2075 | 807 -- 806; 2076 | 808; 2077 | 808 -- 62; 2078 | 808 -- 805; 2079 | 808 -- 806; 2080 | 808 -- 807; 2081 | 809; 2082 | 810; 2083 | 810 -- 809; 2084 | 811; 2085 | 812; 2086 | 813; 2087 | 813 -- 812; 2088 | 814; 2089 | 815; 2090 | 815 -- 814; 2091 | 816; 2092 | 816 -- 814; 2093 | 816 -- 815; 2094 | 817; 2095 | 818; 2096 | 818 -- 817; 2097 | 819; 2098 | 820; 2099 | 820 -- 819; 2100 | 821; 2101 | 822; 2102 | 822 -- 821; 2103 | 823; 2104 | 823 -- 821; 2105 | 823 -- 822; 2106 | 824; 2107 | 824 -- 821; 2108 | 824 -- 822; 2109 | 824 -- 823; 2110 | 825; 2111 | 826; 2112 | 826 -- 825; 2113 | 827; 2114 | 827 -- 825; 2115 | 827 -- 826; 2116 | 828; 2117 | 828 -- 825; 2118 | 828 -- 826; 2119 | 828 -- 827; 2120 | 829; 2121 | 829 -- 825; 2122 | 829 -- 826; 2123 | 829 -- 827; 2124 | 829 -- 828; 2125 | 830; 2126 | 830 -- 825; 2127 | 830 -- 826; 2128 | 830 -- 827; 2129 | 830 -- 828; 2130 | 830 -- 829; 2131 | 831; 2132 | 831 -- 825; 2133 | 831 -- 826; 2134 | 831 -- 827; 2135 | 831 -- 828; 2136 | 831 -- 829; 2137 | 831 -- 830; 2138 | 832; 2139 | 832 -- 825; 2140 | 832 -- 826; 2141 | 832 -- 827; 2142 | 832 -- 828; 2143 | 832 -- 829; 2144 | 832 -- 830; 2145 | 832 -- 831; 2146 | 833; 2147 | 833 -- 825; 2148 | 833 -- 826; 2149 | 833 -- 827; 2150 | 833 -- 828; 2151 | 833 -- 829; 2152 | 833 -- 830; 2153 | 833 -- 831; 2154 | 833 -- 832; 2155 | 834; 2156 | 834 -- 825; 2157 | 834 -- 826; 2158 | 834 -- 827; 2159 | 834 -- 828; 2160 | 834 -- 829; 2161 | 834 -- 830; 2162 | 834 -- 831; 2163 | 834 -- 832; 2164 | 834 -- 833; 2165 | 835; 2166 | 836; 2167 | 836 -- 835; 2168 | 837; 2169 | 837 -- 835; 2170 | 837 -- 836; 2171 | 838; 2172 | 839; 2173 | 839 -- 33; 2174 | 839 -- 34; 2175 | 839 -- 54; 2176 | 840; 2177 | 840 -- 30; 2178 | 840 -- 33; 2179 | 840 -- 34; 2180 | 840 -- 54; 2181 | 841; 2182 | 842; 2183 | 842 -- 841; 2184 | 843; 2185 | 843 -- 841; 2186 | 843 -- 842; 2187 | 844; 2188 | 845; 2189 | 845 -- 844; 2190 | 846; 2191 | 846 -- 844; 2192 | 846 -- 845; 2193 | 847; 2194 | 847 -- 844; 2195 | 847 -- 845; 2196 | 847 -- 846; 2197 | 848; 2198 | 849; 2199 | 849 -- 848; 2200 | 850; 2201 | 851; 2202 | 851 -- 850; 2203 | 852; 2204 | 852 -- 850; 2205 | 852 -- 851; 2206 | 853; 2207 | 853 -- 78; 2208 | 853 -- 646; 2209 | 854; 2210 | 855; 2211 | 856; 2212 | 856 -- 855; 2213 | 857; 2214 | 857 -- 855; 2215 | 857 -- 856; 2216 | 858; 2217 | 859; 2218 | 859 -- 106; 2219 | 860; 2220 | 860 -- 294; 2221 | 861; 2222 | 861 -- 860; 2223 | 862; 2224 | 862 -- 860; 2225 | 862 -- 861; 2226 | 863; 2227 | 863 -- 654; 2228 | 864; 2229 | 864 -- 654; 2230 | 864 -- 863; 2231 | 865; 2232 | 865 -- 34; 2233 | 865 -- 654; 2234 | 866; 2235 | 866 -- 371; 2236 | 867; 2237 | 867 -- 371; 2238 | 867 -- 866; 2239 | 868; 2240 | 869; 2241 | 870; 2242 | 871; 2243 | 871 -- 870; 2244 | 872; 2245 | 872 -- 870; 2246 | 872 -- 871; 2247 | 873; 2248 | 873 -- 870; 2249 | 873 -- 871; 2250 | 873 -- 872; 2251 | 874; 2252 | 874 -- 870; 2253 | 874 -- 871; 2254 | 874 -- 872; 2255 | 874 -- 873; 2256 | 875; 2257 | 876; 2258 | 877; 2259 | 878; 2260 | 878 -- 877; 2261 | 879; 2262 | 879 -- 877; 2263 | 879 -- 878; 2264 | 880; 2265 | 880 -- 877; 2266 | 880 -- 878; 2267 | 880 -- 879; 2268 | 881; 2269 | 881 -- 877; 2270 | 881 -- 878; 2271 | 881 -- 879; 2272 | 881 -- 880; 2273 | 882; 2274 | 883; 2275 | 884; 2276 | 884 -- 883; 2277 | 885; 2278 | 885 -- 883; 2279 | 885 -- 884; 2280 | 886; 2281 | 887; 2282 | 887 -- 886; 2283 | 888; 2284 | 889; 2285 | 889 -- 888; 2286 | 890; 2287 | 890 -- 888; 2288 | 890 -- 889; 2289 | 891; 2290 | 892; 2291 | 892 -- 756; 2292 | 892 -- 761; 2293 | 892 -- 764; 2294 | 892 -- 765; 2295 | 892 -- 775; 2296 | 893; 2297 | 893 -- 55; 2298 | 893 -- 56; 2299 | 893 -- 652; 2300 | 893 -- 654; 2301 | 893 -- 655; 2302 | 894; 2303 | 894 -- 30; 2304 | 894 -- 327; 2305 | 894 -- 402; 2306 | 895; 2307 | 896; 2308 | 896 -- 895; 2309 | 897; 2310 | 897 -- 895; 2311 | 897 -- 896; 2312 | 898; 2313 | 898 -- 895; 2314 | 898 -- 896; 2315 | 898 -- 897; 2316 | 899; 2317 | 899 -- 895; 2318 | 899 -- 896; 2319 | 899 -- 897; 2320 | 899 -- 898; 2321 | 900; 2322 | 901; 2323 | 901 -- 900; 2324 | 902; 2325 | 902 -- 900; 2326 | 902 -- 901; 2327 | 903; 2328 | 904; 2329 | 904 -- 903; 2330 | 905; 2331 | 905 -- 903; 2332 | 905 -- 904; 2333 | 906; 2334 | 907; 2335 | 907 -- 906; 2336 | 908; 2337 | 908 -- 265; 2338 | 908 -- 266; 2339 | 908 -- 268; 2340 | 908 -- 307; 2341 | 909; 2342 | 910; 2343 | 910 -- 909; 2344 | 911; 2345 | 911 -- 909; 2346 | 911 -- 910; 2347 | 912; 2348 | 913; 2349 | 913 -- 912; 2350 | 914; 2351 | 914 -- 912; 2352 | 914 -- 913; 2353 | 915; 2354 | 915 -- 912; 2355 | 915 -- 913; 2356 | 915 -- 914; 2357 | 916; 2358 | 916 -- 912; 2359 | 916 -- 913; 2360 | 916 -- 914; 2361 | 916 -- 915; 2362 | 917; 2363 | 917 -- 912; 2364 | 917 -- 913; 2365 | 917 -- 914; 2366 | 917 -- 915; 2367 | 917 -- 916; 2368 | 918; 2369 | 918 -- 171; 2370 | 919; 2371 | 920; 2372 | 921; 2373 | 921 -- 920; 2374 | 922; 2375 | 922 -- 415; 2376 | 923; 2377 | 924; 2378 | 924 -- 923; 2379 | 925; 2380 | 925 -- 923; 2381 | 925 -- 924; 2382 | 926; 2383 | 926 -- 177; 2384 | 927; 2385 | 927 -- 243; 2386 | 928; 2387 | 929; 2388 | 930; 2389 | 930 -- 929; 2390 | 931; 2391 | 931 -- 293; 2392 | 931 -- 294; 2393 | 931 -- 742; 2394 | 931 -- 743; 2395 | 932; 2396 | 932 -- 293; 2397 | 932 -- 294; 2398 | 932 -- 742; 2399 | 932 -- 743; 2400 | 932 -- 931; 2401 | 933; 2402 | 933 -- 931; 2403 | 934; 2404 | 934 -- 55; 2405 | 934 -- 56; 2406 | 935; 2407 | 935 -- 117; 2408 | 936; 2409 | 936 -- 117; 2410 | 936 -- 935; 2411 | 937; 2412 | 937 -- 117; 2413 | 937 -- 935; 2414 | 937 -- 936; 2415 | 938; 2416 | 938 -- 117; 2417 | 938 -- 935; 2418 | 938 -- 936; 2419 | 938 -- 937; 2420 | 939; 2421 | 940; 2422 | 940 -- 478; 2423 | 941; 2424 | 942; 2425 | 942 -- 941; 2426 | 943; 2427 | 943 -- 941; 2428 | 943 -- 942; 2429 | 944; 2430 | 944 -- 263; 2431 | 944 -- 265; 2432 | 944 -- 266; 2433 | 944 -- 268; 2434 | 945; 2435 | 945 -- 263; 2436 | 945 -- 265; 2437 | 945 -- 266; 2438 | 945 -- 268; 2439 | 945 -- 944; 2440 | 946; 2441 | 946 -- 1; 2442 | 947; 2443 | 948; 2444 | 948 -- 947; 2445 | 949; 2446 | 950; 2447 | 950 -- 949; 2448 | 951; 2449 | 952; 2450 | 952 -- 951; 2451 | 953; 2452 | 953 -- 951; 2453 | 953 -- 952; 2454 | 954; 2455 | 954 -- 951; 2456 | 954 -- 952; 2457 | 954 -- 953; 2458 | 955; 2459 | 955 -- 194; 2460 | 956; 2461 | 956 -- 194; 2462 | 956 -- 955; 2463 | 957; 2464 | 958; 2465 | 958 -- 957; 2466 | 959; 2467 | 959 -- 957; 2468 | 959 -- 958; 2469 | 960; 2470 | 961; 2471 | 961 -- 960; 2472 | 962; 2473 | 962 -- 960; 2474 | 962 -- 961; 2475 | 963; 2476 | 963 -- 151; 2477 | 963 -- 517; 2478 | 964; 2479 | 964 -- 151; 2480 | 964 -- 517; 2481 | 964 -- 963; 2482 | 965; 2483 | 966; 2484 | 966 -- 965; 2485 | 967; 2486 | 967 -- 965; 2487 | 967 -- 966; 2488 | 968; 2489 | 968 -- 965; 2490 | 968 -- 966; 2491 | 968 -- 967; 2492 | 969; 2493 | 969 -- 965; 2494 | 969 -- 966; 2495 | 969 -- 967; 2496 | 969 -- 968; 2497 | 970; 2498 | 970 -- 965; 2499 | 970 -- 966; 2500 | 970 -- 967; 2501 | 970 -- 968; 2502 | 970 -- 969; 2503 | 971; 2504 | 972; 2505 | 973; 2506 | 973 -- 300; 2507 | 973 -- 972; 2508 | 974; 2509 | 975; 2510 | 975 -- 974; 2511 | 976; 2512 | 976 -- 88; 2513 | 976 -- 974; 2514 | 976 -- 975; 2515 | 977; 2516 | 977 -- 69; 2517 | 977 -- 72; 2518 | 977 -- 757; 2519 | 977 -- 758; 2520 | 978; 2521 | 979; 2522 | 979 -- 978; 2523 | 980; 2524 | 981; 2525 | 981 -- 980; 2526 | 982; 2527 | 982 -- 980; 2528 | 982 -- 981; 2529 | 983; 2530 | 984; 2531 | 984 -- 472; 2532 | 984 -- 473; 2533 | 984 -- 983; 2534 | 985; 2535 | 985 -- 473; 2536 | 985 -- 983; 2537 | 985 -- 984; 2538 | 986; 2539 | 986 -- 983; 2540 | 986 -- 984; 2541 | 987; 2542 | 988; 2543 | 988 -- 987; 2544 | 989; 2545 | 989 -- 973; 2546 | 990; 2547 | 991; 2548 | 991 -- 88; 2549 | 992; 2550 | 993; 2551 | 993 -- 992; 2552 | 994; 2553 | 995; 2554 | 995 -- 994; 2555 | 996; 2556 | 996 -- 994; 2557 | 996 -- 995; 2558 | 997; 2559 | 997 -- 994; 2560 | 997 -- 995; 2561 | 997 -- 996; 2562 | 998; 2563 | 998 -- 994; 2564 | 998 -- 995; 2565 | 998 -- 996; 2566 | 998 -- 997; 2567 | 999; 2568 | 1000; 2569 | 1000 -- 254; 2570 | 1000 -- 255; 2571 | 1000 -- 913; 2572 | 1000 -- 916; 2573 | 1000 -- 999; 2574 | 1001; 2575 | 1002; 2576 | 1002 -- 973; 2577 | 1003; 2578 | 1003 -- 973; 2579 | 1003 -- 1002; 2580 | 1004; 2581 | 1004 -- 973; 2582 | 1004 -- 1002; 2583 | 1004 -- 1003; 2584 | 1005; 2585 | 1005 -- 78; 2586 | 1006; 2587 | 1007; 2588 | 1007 -- 1006; 2589 | 1008; 2590 | 1008 -- 33; 2591 | 1008 -- 51; 2592 | 1009; 2593 | 1010; 2594 | 1010 -- 1009; 2595 | 1011; 2596 | 1012; 2597 | 1012 -- 1011; 2598 | 1013; 2599 | 1014; 2600 | 1014 -- 1013; 2601 | 1015; 2602 | 1016; 2603 | 1016 -- 62; 2604 | 1016 -- 806; 2605 | 1017; 2606 | 1018; 2607 | 1018 -- 1017; 2608 | 1019; 2609 | 1020; 2610 | 1021; 2611 | 1021 -- 127; 2612 | 1021 -- 128; 2613 | 1022; 2614 | 1022 -- 127; 2615 | 1022 -- 128; 2616 | 1022 -- 1021; 2617 | 1023; 2618 | 1023 -- 127; 2619 | 1023 -- 128; 2620 | 1023 -- 1021; 2621 | 1023 -- 1022; 2622 | 1024; 2623 | 1024 -- 53; 2624 | 1025; 2625 | 1025 -- 53; 2626 | 1025 -- 1024; 2627 | 1026; 2628 | 1026 -- 303; 2629 | 1027; 2630 | 1027 -- 1026; 2631 | 1028; 2632 | 1028 -- 294; 2633 | 1028 -- 746; 2634 | 1029; 2635 | 1029 -- 294; 2636 | 1029 -- 746; 2637 | 1029 -- 1028; 2638 | 1030; 2639 | 1030 -- 121; 2640 | 1030 -- 550; 2641 | 1031; 2642 | 1032; 2643 | 1032 -- 1031; 2644 | 1033; 2645 | 1034; 2646 | 1034 -- 1033; 2647 | 1035; 2648 | 1036; 2649 | 1036 -- 1035; 2650 | 1037; 2651 | 1037 -- 1035; 2652 | 1038; 2653 | 1038 -- 1035; 2654 | 1038 -- 1037; 2655 | 1039; 2656 | 1039 -- 308; 2657 | 1040; 2658 | 1040 -- 308; 2659 | 1040 -- 1039; 2660 | 1041; 2661 | 1041 -- 216; 2662 | 1041 -- 218; 2663 | 1041 -- 224; 2664 | 1042; 2665 | 1043; 2666 | 1043 -- 1042; 2667 | 1044; 2668 | 1044 -- 1042; 2669 | 1044 -- 1043; 2670 | 1045; 2671 | 1045 -- 1010; 2672 | 1046; 2673 | 1046 -- 482; 2674 | 1047; 2675 | 1047 -- 12; 2676 | 1048; 2677 | 1048 -- 12; 2678 | 1048 -- 1047; 2679 | 1049; 2680 | 1049 -- 12; 2681 | 1049 -- 1047; 2682 | 1049 -- 1048; 2683 | 1050; 2684 | 1050 -- 12; 2685 | 1050 -- 1047; 2686 | 1050 -- 1048; 2687 | 1050 -- 1049; 2688 | 1051; 2689 | 1052; 2690 | 1053; 2691 | 1053 -- 1052; 2692 | 1054; 2693 | 1055; 2694 | 1055 -- 1054; 2695 | 1056; 2696 | 1056 -- 1054; 2697 | 1057; 2698 | 1057 -- 1054; 2699 | 1057 -- 1056; 2700 | 1058; 2701 | 1058 -- 1054; 2702 | 1058 -- 1056; 2703 | 1058 -- 1057; 2704 | 1059; 2705 | 1060; 2706 | 1061; 2707 | 1061 -- 1060; 2708 | 1062; 2709 | 1062 -- 1060; 2710 | 1062 -- 1061; 2711 | 1063; 2712 | 1063 -- 1060; 2713 | 1063 -- 1061; 2714 | 1063 -- 1062; 2715 | 1064; 2716 | 1064 -- 1060; 2717 | 1064 -- 1061; 2718 | 1064 -- 1062; 2719 | 1064 -- 1063; 2720 | 1065; 2721 | 1065 -- 1060; 2722 | 1065 -- 1061; 2723 | 1065 -- 1062; 2724 | 1065 -- 1063; 2725 | 1065 -- 1064; 2726 | 1066; 2727 | 1066 -- 1060; 2728 | 1066 -- 1061; 2729 | 1066 -- 1062; 2730 | 1066 -- 1063; 2731 | 1066 -- 1064; 2732 | 1066 -- 1065; 2733 | 1067; 2734 | 1067 -- 1060; 2735 | 1067 -- 1061; 2736 | 1067 -- 1062; 2737 | 1067 -- 1063; 2738 | 1067 -- 1064; 2739 | 1067 -- 1065; 2740 | 1067 -- 1066; 2741 | 1068; 2742 | 1068 -- 1060; 2743 | 1068 -- 1061; 2744 | 1068 -- 1062; 2745 | 1068 -- 1063; 2746 | 1068 -- 1064; 2747 | 1068 -- 1065; 2748 | 1068 -- 1066; 2749 | 1068 -- 1067; 2750 | 1069; 2751 | 1069 -- 1060; 2752 | 1069 -- 1061; 2753 | 1069 -- 1062; 2754 | 1069 -- 1063; 2755 | 1069 -- 1064; 2756 | 1069 -- 1065; 2757 | 1069 -- 1066; 2758 | 1069 -- 1067; 2759 | 1069 -- 1068; 2760 | 1070; 2761 | 1070 -- 62; 2762 | 1070 -- 805; 2763 | 1070 -- 806; 2764 | 1070 -- 807; 2765 | 1071; 2766 | 1071 -- 62; 2767 | 1071 -- 362; 2768 | 1071 -- 805; 2769 | 1071 -- 806; 2770 | 1071 -- 807; 2771 | 1071 -- 1016; 2772 | 1071 -- 1070; 2773 | 1072; 2774 | 1072 -- 62; 2775 | 1072 -- 805; 2776 | 1072 -- 806; 2777 | 1072 -- 807; 2778 | 1072 -- 1070; 2779 | 1072 -- 1071; 2780 | 1073; 2781 | 1073 -- 62; 2782 | 1073 -- 805; 2783 | 1073 -- 806; 2784 | 1073 -- 807; 2785 | 1073 -- 1070; 2786 | 1073 -- 1071; 2787 | 1073 -- 1072; 2788 | 1074; 2789 | 1074 -- 227; 2790 | 1075; 2791 | 1076; 2792 | 1077; 2793 | 1078; 2794 | 1079; 2795 | 1079 -- 1078; 2796 | 1080; 2797 | 1081; 2798 | 1081 -- 281; 2799 | 1082; 2800 | 1082 -- 69; 2801 | 1083; 2802 | 1083 -- 69; 2803 | 1083 -- 1082; 2804 | 1084; 2805 | 1084 -- 0; 2806 | 1084 -- 1; 2807 | 1085; 2808 | 1086; 2809 | 1086 -- 516; 2810 | 1087; 2811 | 1087 -- 516; 2812 | 1087 -- 1086; 2813 | 1088; 2814 | 1088 -- 151; 2815 | 1088 -- 516; 2816 | 1088 -- 1087; 2817 | 1089; 2818 | 1089 -- 516; 2819 | 1089 -- 1087; 2820 | 1090; 2821 | 1091; 2822 | 1091 -- 472; 2823 | 1091 -- 473; 2824 | 1091 -- 984; 2825 | 1092; 2826 | 1092 -- 473; 2827 | 1092 -- 984; 2828 | 1092 -- 985; 2829 | 1093; 2830 | 1094; 2831 | 1094 -- 1093; 2832 | 1095; 2833 | 1095 -- 1093; 2834 | 1095 -- 1094; 2835 | 1096; 2836 | 1096 -- 1093; 2837 | 1096 -- 1094; 2838 | 1096 -- 1095; 2839 | 1097; 2840 | 1098; 2841 | 1098 -- 1097; 2842 | 1099; 2843 | 1099 -- 1097; 2844 | 1099 -- 1098; 2845 | 1100; 2846 | 1101; 2847 | 1102; 2848 | 1102 -- 1101; 2849 | 1103; 2850 | 1103 -- 1101; 2851 | 1103 -- 1102; 2852 | 1104; 2853 | 1105; 2854 | 1106; 2855 | 1106 -- 1105; 2856 | 1107; 2857 | 1107 -- 1105; 2858 | 1107 -- 1106; 2859 | 1108; 2860 | 1108 -- 1105; 2861 | 1108 -- 1106; 2862 | 1108 -- 1107; 2863 | 1109; 2864 | 1109 -- 1105; 2865 | 1109 -- 1106; 2866 | 1109 -- 1107; 2867 | 1109 -- 1108; 2868 | 1110; 2869 | 1110 -- 1105; 2870 | 1110 -- 1106; 2871 | 1110 -- 1107; 2872 | 1110 -- 1108; 2873 | 1110 -- 1109; 2874 | 1111; 2875 | 1111 -- 1105; 2876 | 1111 -- 1106; 2877 | 1111 -- 1107; 2878 | 1111 -- 1108; 2879 | 1111 -- 1109; 2880 | 1111 -- 1110; 2881 | 1112; 2882 | 1112 -- 1105; 2883 | 1112 -- 1106; 2884 | 1112 -- 1107; 2885 | 1112 -- 1108; 2886 | 1112 -- 1109; 2887 | 1112 -- 1110; 2888 | 1112 -- 1111; 2889 | 1113; 2890 | 1113 -- 1105; 2891 | 1113 -- 1106; 2892 | 1113 -- 1107; 2893 | 1113 -- 1108; 2894 | 1113 -- 1109; 2895 | 1113 -- 1110; 2896 | 1113 -- 1111; 2897 | 1113 -- 1112; 2898 | 1114; 2899 | 1115; 2900 | 1115 -- 1114; 2901 | 1116; 2902 | 1117; 2903 | 1117 -- 1116; 2904 | 1118; 2905 | 1118 -- 1116; 2906 | 1118 -- 1117; 2907 | 1119; 2908 | 1119 -- 1116; 2909 | 1119 -- 1117; 2910 | 1119 -- 1118; 2911 | 1120; 2912 | 1120 -- 1116; 2913 | 1120 -- 1117; 2914 | 1120 -- 1118; 2915 | 1120 -- 1119; 2916 | 1121; 2917 | 1121 -- 78; 2918 | 1122; 2919 | 1122 -- 78; 2920 | 1122 -- 1121; 2921 | 1123; 2922 | 1123 -- 78; 2923 | 1123 -- 756; 2924 | 1124; 2925 | 1124 -- 247; 2926 | 1124 -- 415; 2927 | 1125; 2928 | 1125 -- 247; 2929 | 1125 -- 415; 2930 | 1125 -- 1124; 2931 | 1126; 2932 | 1127; 2933 | 1128; 2934 | 1128 -- 1127; 2935 | 1129; 2936 | 1129 -- 976; 2937 | 1130; 2938 | 1130 -- 34; 2939 | 1130 -- 654; 2940 | 1130 -- 657; 2941 | 1130 -- 774; 2942 | 1131; 2943 | 1132; 2944 | 1132 -- 1131; 2945 | 1133; 2946 | 1134; 2947 | 1134 -- 1133; 2948 | 1135; 2949 | 1135 -- 194; 2950 | 1135 -- 956; 2951 | 1136; 2952 | 1136 -- 194; 2953 | 1136 -- 956; 2954 | 1136 -- 1135; 2955 | 1137; 2956 | 1137 -- 194; 2957 | 1137 -- 956; 2958 | 1137 -- 1135; 2959 | 1137 -- 1136; 2960 | 1138; 2961 | 1138 -- 194; 2962 | 1138 -- 956; 2963 | 1138 -- 1135; 2964 | 1139; 2965 | 1140; 2966 | 1140 -- 1139; 2967 | 1141; 2968 | 1142; 2969 | 1142 -- 1141; 2970 | 1143; 2971 | 1144; 2972 | 1145; 2973 | 1145 -- 219; 2974 | 1145 -- 221; 2975 | 1145 -- 343; 2976 | 1145 -- 697; 2977 | 1146; 2978 | 1147; 2979 | 1147 -- 1146; 2980 | 1148; 2981 | 1148 -- 1146; 2982 | 1148 -- 1147; 2983 | 1149; 2984 | 1149 -- 1146; 2985 | 1149 -- 1147; 2986 | 1149 -- 1148; 2987 | 1150; 2988 | 1150 -- 1146; 2989 | 1150 -- 1147; 2990 | 1150 -- 1148; 2991 | 1150 -- 1149; 2992 | 1151; 2993 | 1152; 2994 | 1153; 2995 | 1153 -- 1152; 2996 | 1154; 2997 | 1154 -- 1152; 2998 | 1154 -- 1153; 2999 | 1155; 3000 | 1155 -- 1152; 3001 | 1155 -- 1153; 3002 | 1155 -- 1154; 3003 | 1156; 3004 | 1156 -- 1152; 3005 | 1156 -- 1153; 3006 | 1156 -- 1154; 3007 | 1156 -- 1155; 3008 | 1157; 3009 | 1157 -- 1152; 3010 | 1157 -- 1153; 3011 | 1157 -- 1154; 3012 | 1157 -- 1155; 3013 | 1157 -- 1156; 3014 | 1158; 3015 | 1158 -- 1152; 3016 | 1158 -- 1153; 3017 | 1158 -- 1154; 3018 | 1158 -- 1155; 3019 | 1158 -- 1156; 3020 | 1158 -- 1157; 3021 | 1159; 3022 | 1159 -- 1152; 3023 | 1159 -- 1153; 3024 | 1159 -- 1154; 3025 | 1159 -- 1155; 3026 | 1159 -- 1156; 3027 | 1159 -- 1157; 3028 | 1159 -- 1158; 3029 | 1160; 3030 | 1160 -- 1152; 3031 | 1160 -- 1153; 3032 | 1160 -- 1154; 3033 | 1160 -- 1155; 3034 | 1160 -- 1156; 3035 | 1160 -- 1157; 3036 | 1160 -- 1158; 3037 | 1160 -- 1159; 3038 | 1161; 3039 | 1162; 3040 | 1162 -- 114; 3041 | 1162 -- 186; 3042 | 1163; 3043 | 1163 -- 114; 3044 | 1163 -- 1162; 3045 | 1164; 3046 | 1165; 3047 | 1165 -- 1164; 3048 | 1166; 3049 | 1166 -- 258; 3050 | 1166 -- 259; 3051 | 1167; 3052 | 1167 -- 258; 3053 | 1167 -- 259; 3054 | 1167 -- 1166; 3055 | 1168; 3056 | 1169; 3057 | 1169 -- 1168; 3058 | 1170; 3059 | 1170 -- 820; 3060 | 1171; 3061 | 1172; 3062 | 1172 -- 78; 3063 | 1173; 3064 | 1174; 3065 | 1175; 3066 | 1175 -- 931; 3067 | 1176; 3068 | 1176 -- 931; 3069 | 1176 -- 1175; 3070 | 1177; 3071 | 1177 -- 96; 3072 | 1177 -- 150; 3073 | 1178; 3074 | 1178 -- 150; 3075 | 1178 -- 281; 3076 | 1179; 3077 | 1180; 3078 | 1180 -- 589; 3079 | 1180 -- 590; 3080 | 1180 -- 591; 3081 | 1181; 3082 | 1181 -- 589; 3083 | 1181 -- 590; 3084 | 1181 -- 591; 3085 | 1181 -- 1180; 3086 | 1182; 3087 | 1182 -- 302; 3088 | 1183; 3089 | 1184; 3090 | 1185; 3091 | 1185 -- 1184; 3092 | 1186; 3093 | 1186 -- 1184; 3094 | 1186 -- 1185; 3095 | 1187; 3096 | 1188; 3097 | 1189; 3098 | 1189 -- 327; 3099 | 1189 -- 328; 3100 | 1190; 3101 | 1190 -- 33; 3102 | 1190 -- 34; 3103 | 1190 -- 54; 3104 | 1190 -- 840; 3105 | 1191; 3106 | 1191 -- 33; 3107 | 1191 -- 34; 3108 | 1191 -- 54; 3109 | 1191 -- 840; 3110 | 1191 -- 1190; 3111 | 1192; 3112 | 1193; 3113 | 1194; 3114 | 1194 -- 1193; 3115 | 1195; 3116 | 1195 -- 78; 3117 | 1196; 3118 | 1196 -- 78; 3119 | 1196 -- 1195; 3120 | 1197; 3121 | 1197 -- 78; 3122 | 1197 -- 1195; 3123 | 1197 -- 1196; 3124 | 1198; 3125 | 1199; 3126 | 1199 -- 1198; 3127 | 1200; 3128 | 1200 -- 1198; 3129 | 1200 -- 1199; 3130 | 1201; 3131 | 1201 -- 913; 3132 | 1201 -- 914; 3133 | 1201 -- 915; 3134 | 1201 -- 916; 3135 | 1201 -- 1000; 3136 | 1202; 3137 | 1202 -- 913; 3138 | 1202 -- 916; 3139 | 1202 -- 1000; 3140 | 1202 -- 1201; 3141 | 1203; 3142 | 1203 -- 913; 3143 | 1203 -- 916; 3144 | 1203 -- 1000; 3145 | 1203 -- 1201; 3146 | 1203 -- 1202; 3147 | 1204; 3148 | 1204 -- 913; 3149 | 1204 -- 916; 3150 | 1204 -- 1000; 3151 | 1204 -- 1201; 3152 | 1204 -- 1202; 3153 | 1204 -- 1203; 3154 | 1205; 3155 | 1205 -- 913; 3156 | 1205 -- 916; 3157 | 1205 -- 1000; 3158 | 1205 -- 1201; 3159 | 1205 -- 1202; 3160 | 1205 -- 1203; 3161 | 1205 -- 1204; 3162 | 1206; 3163 | 1206 -- 913; 3164 | 1206 -- 914; 3165 | 1206 -- 915; 3166 | 1206 -- 916; 3167 | 1206 -- 1201; 3168 | 1207; 3169 | 1207 -- 913; 3170 | 1207 -- 914; 3171 | 1207 -- 915; 3172 | 1207 -- 916; 3173 | 1207 -- 1201; 3174 | 1207 -- 1206; 3175 | 1208; 3176 | 1208 -- 913; 3177 | 1208 -- 914; 3178 | 1208 -- 915; 3179 | 1208 -- 916; 3180 | 1208 -- 1201; 3181 | 1208 -- 1206; 3182 | 1208 -- 1207; 3183 | 1209; 3184 | 1210; 3185 | 1210 -- 1209; 3186 | 1211; 3187 | 1211 -- 1209; 3188 | 1211 -- 1210; 3189 | 1212; 3190 | 1212 -- 1209; 3191 | 1212 -- 1210; 3192 | 1212 -- 1211; 3193 | 1213; 3194 | 1214; 3195 | 1214 -- 330; 3196 | 1215; 3197 | 1215 -- 330; 3198 | 1215 -- 1214; 3199 | 1216; 3200 | 1216 -- 330; 3201 | 1216 -- 1214; 3202 | 1216 -- 1215; 3203 | 1217; 3204 | 1217 -- 330; 3205 | 1217 -- 1214; 3206 | 1217 -- 1215; 3207 | 1217 -- 1216; 3208 | 1218; 3209 | 1219; 3210 | 1219 -- 1218; 3211 | 1220; 3212 | 1221; 3213 | 1221 -- 150; 3214 | 1221 -- 500; 3215 | 1222; 3216 | 1223; 3217 | 1223 -- 1222; 3218 | 1224; 3219 | 1224 -- 1222; 3220 | 1224 -- 1223; 3221 | 1225; 3222 | 1226; 3223 | 1226 -- 1225; 3224 | 1227; 3225 | 1227 -- 1225; 3226 | 1228; 3227 | 1228 -- 33; 3228 | 1228 -- 54; 3229 | 1228 -- 132; 3230 | 1229; 3231 | 1229 -- 33; 3232 | 1229 -- 54; 3233 | 1229 -- 132; 3234 | 1229 -- 1228; 3235 | 1230; 3236 | 1230 -- 244; 3237 | 1231; 3238 | 1232; 3239 | 1232 -- 1231; 3240 | 1233; 3241 | 1233 -- 415; 3242 | 1234; 3243 | 1234 -- 415; 3244 | 1234 -- 1233; 3245 | 1235; 3246 | 1235 -- 481; 3247 | 1236; 3248 | 1236 -- 481; 3249 | 1236 -- 1235; 3250 | 1237; 3251 | 1238; 3252 | 1238 -- 1237; 3253 | 1239; 3254 | 1239 -- 547; 3255 | 1240; 3256 | 1241; 3257 | 1241 -- 1240; 3258 | 1242; 3259 | 1243; 3260 | 1243 -- 1242; 3261 | 1244; 3262 | 1244 -- 482; 3263 | 1245; 3264 | 1245 -- 482; 3265 | 1245 -- 1244; 3266 | 1246; 3267 | 1246 -- 482; 3268 | 1246 -- 1244; 3269 | 1246 -- 1245; 3270 | 1247; 3271 | 1247 -- 482; 3272 | 1247 -- 1244; 3273 | 1247 -- 1245; 3274 | 1247 -- 1246; 3275 | 1248; 3276 | 1249; 3277 | 1249 -- 1248; 3278 | 1250; 3279 | 1250 -- 481; 3280 | 1251; 3281 | 1251 -- 481; 3282 | 1251 -- 1250; 3283 | 1252; 3284 | 1253; 3285 | 1253 -- 1252; 3286 | 1254; 3287 | 1254 -- 1252; 3288 | 1254 -- 1253; 3289 | 1255; 3290 | 1255 -- 121; 3291 | 1255 -- 764; 3292 | 1255 -- 765; 3293 | 1256; 3294 | 1256 -- 916; 3295 | 1256 -- 1201; 3296 | 1257; 3297 | 1257 -- 916; 3298 | 1257 -- 1201; 3299 | 1257 -- 1256; 3300 | 1258; 3301 | 1259; 3302 | 1259 -- 1258; 3303 | 1260; 3304 | 1261; 3305 | 1261 -- 1260; 3306 | 1262; 3307 | 1262 -- 1260; 3308 | 1262 -- 1261; 3309 | 1263; 3310 | 1263 -- 375; 3311 | 1263 -- 376; 3312 | 1263 -- 377; 3313 | 1264; 3314 | 1265; 3315 | 1265 -- 1264; 3316 | 1266; 3317 | 1266 -- 1264; 3318 | 1266 -- 1265; 3319 | 1267; 3320 | 1267 -- 1264; 3321 | 1267 -- 1265; 3322 | 1267 -- 1266; 3323 | 1268; 3324 | 1268 -- 872; 3325 | 1269; 3326 | 1270; 3327 | 1270 -- 320; 3328 | 1270 -- 321; 3329 | 1271; 3330 | 1271 -- 947; 3331 | 1272; 3332 | 1272 -- 947; 3333 | 1272 -- 1271; 3334 | 1273; 3335 | 1273 -- 843; 3336 | 1274; 3337 | 1274 -- 843; 3338 | 1274 -- 1273; 3339 | 1275; 3340 | 1275 -- 843; 3341 | 1275 -- 1273; 3342 | 1275 -- 1274; 3343 | 1276; 3344 | 1276 -- 843; 3345 | 1276 -- 1273; 3346 | 1276 -- 1274; 3347 | 1276 -- 1275; 3348 | 1277; 3349 | 1278; 3350 | 1278 -- 293; 3351 | 1278 -- 294; 3352 | 1278 -- 742; 3353 | 1278 -- 743; 3354 | 1278 -- 744; 3355 | 1279; 3356 | 1279 -- 744; 3357 | 1280; 3358 | 1280 -- 744; 3359 | 1280 -- 1279; 3360 | 1281; 3361 | 1281 -- 744; 3362 | 1281 -- 1279; 3363 | 1281 -- 1280; 3364 | 1282; 3365 | 1282 -- 219; 3366 | 1282 -- 1145; 3367 | 1283; 3368 | 1283 -- 219; 3369 | 1283 -- 1145; 3370 | 1283 -- 1282; 3371 | 1284; 3372 | 1285; 3373 | 1286; 3374 | 1287; 3375 | 1287 -- 1286; 3376 | 1288; 3377 | 1288 -- 1286; 3378 | 1288 -- 1287; 3379 | 1289; 3380 | 1289 -- 1286; 3381 | 1289 -- 1287; 3382 | 1289 -- 1288; 3383 | 1290; 3384 | 1290 -- 1286; 3385 | 1290 -- 1287; 3386 | 1290 -- 1288; 3387 | 1290 -- 1289; 3388 | 1291; 3389 | 1292; 3390 | 1293; 3391 | 1293 -- 1292; 3392 | 1294; 3393 | 1294 -- 1292; 3394 | 1294 -- 1293; 3395 | 1295; 3396 | 1295 -- 33; 3397 | 1295 -- 375; 3398 | 1295 -- 376; 3399 | 1295 -- 377; 3400 | 1296; 3401 | 1297; 3402 | 1298; 3403 | 1299; 3404 | 1299 -- 1298; 3405 | 1300; 3406 | 1301; 3407 | 1302; 3408 | 1303; 3409 | 1303 -- 1018; 3410 | 1304; 3411 | 1304 -- 1018; 3412 | 1304 -- 1303; 3413 | 1305; 3414 | 1305 -- 1018; 3415 | 1306; 3416 | 1306 -- 1017; 3417 | 1306 -- 1018; 3418 | 1307; 3419 | 1307 -- 1017; 3420 | 1307 -- 1018; 3421 | 1307 -- 1306; 3422 | 1308; 3423 | 1308 -- 1017; 3424 | 1308 -- 1018; 3425 | 1308 -- 1306; 3426 | 1308 -- 1307; 3427 | 1309; 3428 | 1309 -- 1017; 3429 | 1309 -- 1018; 3430 | 1309 -- 1306; 3431 | 1309 -- 1307; 3432 | 1309 -- 1308; 3433 | 1310; 3434 | 1311; 3435 | 1311 -- 1310; 3436 | 1312; 3437 | 1313; 3438 | 1313 -- 1312; 3439 | 1314; 3440 | 1314 -- 1312; 3441 | 1314 -- 1313; 3442 | 1315; 3443 | 1315 -- 53; 3444 | 1315 -- 1312; 3445 | 1315 -- 1313; 3446 | 1315 -- 1314; 3447 | 1316; 3448 | 1316 -- 1312; 3449 | 1316 -- 1313; 3450 | 1316 -- 1314; 3451 | 1316 -- 1315; 3452 | 1317; 3453 | 1318; 3454 | 1318 -- 900; 3455 | 1319; 3456 | 1320; 3457 | 1321; 3458 | 1321 -- 1320; 3459 | 1322; 3460 | 1322 -- 524; 3461 | 1323; 3462 | 1324; 3463 | 1324 -- 1323; 3464 | 1325; 3465 | 1325 -- 1323; 3466 | 1325 -- 1324; 3467 | 1326; 3468 | 1327; 3469 | 1327 -- 1326; 3470 | 1328; 3471 | 1329; 3472 | 1329 -- 1328; 3473 | 1330; 3474 | 1331; 3475 | 1332; 3476 | 1332 -- 1331; 3477 | 1333; 3478 | 1333 -- 1331; 3479 | 1333 -- 1332; 3480 | 1334; 3481 | 1335; 3482 | 1336; 3483 | 1336 -- 1335; 3484 | 1337; 3485 | 1337 -- 1335; 3486 | 1337 -- 1336; 3487 | 1338; 3488 | 1338 -- 1335; 3489 | 1338 -- 1336; 3490 | 1338 -- 1337; 3491 | 1339; 3492 | 1339 -- 882; 3493 | 1340; 3494 | 1341; 3495 | 1341 -- 517; 3496 | 1342; 3497 | 1342 -- 150; 3498 | 1342 -- 281; 3499 | 1342 -- 1178; 3500 | 1343; 3501 | 1343 -- 281; 3502 | 1344; 3503 | 1344 -- 281; 3504 | 1344 -- 1343; 3505 | 1345; 3506 | 1345 -- 1225; 3507 | 1346; 3508 | 1346 -- 721; 3509 | 1347; 3510 | 1347 -- 377; 3511 | 1348; 3512 | 1348 -- 377; 3513 | 1348 -- 1347; 3514 | 1349; 3515 | 1349 -- 362; 3516 | 1350; 3517 | 1350 -- 362; 3518 | 1350 -- 1349; 3519 | 1351; 3520 | 1351 -- 362; 3521 | 1351 -- 1349; 3522 | 1351 -- 1350; 3523 | 1352; 3524 | 1352 -- 362; 3525 | 1352 -- 1349; 3526 | 1352 -- 1350; 3527 | 1352 -- 1351; 3528 | 1353; 3529 | 1354; 3530 | 1355; 3531 | 1355 -- 1354; 3532 | 1356; 3533 | 1356 -- 523; 3534 | 1356 -- 742; 3535 | 1356 -- 746; 3536 | 1356 -- 931; 3537 | 1357; 3538 | 1357 -- 1107; 3539 | 1357 -- 1356; 3540 | 1358; 3541 | 1358 -- 1107; 3542 | 1358 -- 1356; 3543 | 1358 -- 1357; 3544 | 1359; 3545 | 1359 -- 1356; 3546 | 1360; 3547 | 1361; 3548 | 1361 -- 46; 3549 | 1361 -- 428; 3550 | 1362; 3551 | 1362 -- 46; 3552 | 1362 -- 428; 3553 | 1362 -- 1361; 3554 | 1363; 3555 | 1363 -- 46; 3556 | 1364; 3557 | 1364 -- 1286; 3558 | 1365; 3559 | 1365 -- 1286; 3560 | 1365 -- 1364; 3561 | 1366; 3562 | 1366 -- 1286; 3563 | 1366 -- 1364; 3564 | 1366 -- 1365; 3565 | 1367; 3566 | 1367 -- 1286; 3567 | 1367 -- 1364; 3568 | 1367 -- 1365; 3569 | 1367 -- 1366; 3570 | 1368; 3571 | 1368 -- 293; 3572 | 1368 -- 294; 3573 | 1368 -- 931; 3574 | 1368 -- 932; 3575 | 1369; 3576 | 1369 -- 293; 3577 | 1369 -- 294; 3578 | 1369 -- 931; 3579 | 1369 -- 932; 3580 | 1369 -- 1368; 3581 | 1370; 3582 | 1371; 3583 | 1371 -- 1370; 3584 | 1372; 3585 | 1373; 3586 | 1373 -- 1372; 3587 | 1374; 3588 | 1375; 3589 | 1375 -- 1374; 3590 | 1376; 3591 | 1376 -- 1374; 3592 | 1376 -- 1375; 3593 | 1377; 3594 | 1377 -- 1294; 3595 | 1378; 3596 | 1378 -- 1294; 3597 | 1378 -- 1377; 3598 | 1379; 3599 | 1380; 3600 | 1381; 3601 | 1381 -- 76; 3602 | 1381 -- 522; 3603 | 1382; 3604 | 1383; 3605 | 1384; 3606 | 1384 -- 194; 3607 | 1385; 3608 | 1385 -- 194; 3609 | 1385 -- 1384; 3610 | 1386; 3611 | 1387; 3612 | 1387 -- 1386; 3613 | 1388; 3614 | 1389; 3615 | 1389 -- 329; 3616 | 1389 -- 547; 3617 | 1390; 3618 | 1391; 3619 | 1391 -- 1390; 3620 | 1392; 3621 | 1392 -- 1390; 3622 | 1392 -- 1391; 3623 | 1393; 3624 | 1394; 3625 | 1394 -- 219; 3626 | 1394 -- 343; 3627 | 1394 -- 697; 3628 | 1394 -- 1145; 3629 | 1395; 3630 | 1395 -- 219; 3631 | 1395 -- 343; 3632 | 1395 -- 697; 3633 | 1395 -- 1145; 3634 | 1395 -- 1394; 3635 | 1396; 3636 | 1396 -- 219; 3637 | 1396 -- 343; 3638 | 1396 -- 697; 3639 | 1396 -- 1145; 3640 | 1396 -- 1394; 3641 | 1396 -- 1395; 3642 | 1397; 3643 | 1397 -- 219; 3644 | 1397 -- 343; 3645 | 1397 -- 697; 3646 | 1397 -- 1145; 3647 | 1397 -- 1394; 3648 | 1397 -- 1395; 3649 | 1397 -- 1396; 3650 | 1398; 3651 | 1398 -- 314; 3652 | 1399; 3653 | 1400; 3654 | 1400 -- 1399; 3655 | 1401; 3656 | 1401 -- 1399; 3657 | 1401 -- 1400; 3658 | 1402; 3659 | 1402 -- 1399; 3660 | 1402 -- 1400; 3661 | 1402 -- 1401; 3662 | 1403; 3663 | 1403 -- 1399; 3664 | 1403 -- 1400; 3665 | 1403 -- 1401; 3666 | 1403 -- 1402; 3667 | 1404; 3668 | 1404 -- 327; 3669 | 1404 -- 416; 3670 | 1405; 3671 | 1405 -- 327; 3672 | 1405 -- 416; 3673 | 1405 -- 1404; 3674 | 1406; 3675 | 1406 -- 327; 3676 | 1406 -- 416; 3677 | 1406 -- 1404; 3678 | 1406 -- 1405; 3679 | 1407; 3680 | 1407 -- 327; 3681 | 1407 -- 416; 3682 | 1407 -- 1404; 3683 | 1407 -- 1405; 3684 | 1407 -- 1406; 3685 | 1408; 3686 | 1408 -- 327; 3687 | 1408 -- 416; 3688 | 1408 -- 1404; 3689 | 1408 -- 1405; 3690 | 1408 -- 1406; 3691 | 1408 -- 1407; 3692 | 1409; 3693 | 1409 -- 496; 3694 | 1410; 3695 | 1410 -- 496; 3696 | 1410 -- 1409; 3697 | 1411; 3698 | 1411 -- 1107; 3699 | 1411 -- 1357; 3700 | 1411 -- 1358; 3701 | 1412; 3702 | 1412 -- 1060; 3703 | 1413; 3704 | 1413 -- 186; 3705 | 1413 -- 1162; 3706 | 1414; 3707 | 1414 -- 186; 3708 | 1414 -- 1162; 3709 | 1414 -- 1413; 3710 | 1415; 3711 | 1415 -- 186; 3712 | 1415 -- 1162; 3713 | 1415 -- 1413; 3714 | 1415 -- 1414; 3715 | 1416; 3716 | 1416 -- 303; 3717 | 1416 -- 1026; 3718 | 1417; 3719 | 1417 -- 303; 3720 | 1417 -- 1026; 3721 | 1417 -- 1416; 3722 | 1418; 3723 | 1418 -- 930; 3724 | 1419; 3725 | 1419 -- 1336; 3726 | 1420; 3727 | 1421; 3728 | 1421 -- 1420; 3729 | 1422; 3730 | 1422 -- 1420; 3731 | 1422 -- 1421; 3732 | 1423; 3733 | 1423 -- 1420; 3734 | 1423 -- 1421; 3735 | 1423 -- 1422; 3736 | 1424; 3737 | 1424 -- 9; 3738 | 1425; 3739 | 1425 -- 9; 3740 | 1425 -- 1424; 3741 | 1426; 3742 | 1427; 3743 | 1427 -- 1426; 3744 | 1428; 3745 | 1428 -- 1426; 3746 | 1428 -- 1427; 3747 | 1429; 3748 | 1429 -- 645; 3749 | 1430; 3750 | 1430 -- 645; 3751 | 1430 -- 1429; 3752 | 1431; 3753 | 1431 -- 645; 3754 | 1431 -- 1429; 3755 | 1431 -- 1430; 3756 | 1432; 3757 | 1432 -- 645; 3758 | 1432 -- 1429; 3759 | 1432 -- 1430; 3760 | 1432 -- 1431; 3761 | 1433; 3762 | 1433 -- 645; 3763 | 1433 -- 1429; 3764 | 1433 -- 1430; 3765 | 1433 -- 1431; 3766 | 1433 -- 1432; 3767 | 1434; 3768 | 1434 -- 645; 3769 | 1434 -- 1429; 3770 | 1434 -- 1430; 3771 | 1434 -- 1431; 3772 | 1434 -- 1432; 3773 | 1434 -- 1433; 3774 | 1435; 3775 | 1435 -- 645; 3776 | 1435 -- 1429; 3777 | 1435 -- 1430; 3778 | 1435 -- 1431; 3779 | 1435 -- 1432; 3780 | 1435 -- 1433; 3781 | 1435 -- 1434; 3782 | 1436; 3783 | 1436 -- 645; 3784 | 1436 -- 1429; 3785 | 1436 -- 1430; 3786 | 1436 -- 1431; 3787 | 1436 -- 1432; 3788 | 1436 -- 1433; 3789 | 1436 -- 1434; 3790 | 1436 -- 1435; 3791 | 1437; 3792 | 1437 -- 645; 3793 | 1437 -- 1429; 3794 | 1437 -- 1430; 3795 | 1437 -- 1431; 3796 | 1437 -- 1432; 3797 | 1437 -- 1433; 3798 | 1437 -- 1434; 3799 | 1437 -- 1435; 3800 | 1437 -- 1436; 3801 | 1438; 3802 | 1438 -- 645; 3803 | 1438 -- 1429; 3804 | 1438 -- 1430; 3805 | 1438 -- 1431; 3806 | 1438 -- 1432; 3807 | 1438 -- 1433; 3808 | 1438 -- 1434; 3809 | 1438 -- 1435; 3810 | 1438 -- 1436; 3811 | 1438 -- 1437; 3812 | 1439; 3813 | 1439 -- 645; 3814 | 1439 -- 1429; 3815 | 1439 -- 1430; 3816 | 1439 -- 1431; 3817 | 1439 -- 1432; 3818 | 1439 -- 1433; 3819 | 1439 -- 1434; 3820 | 1439 -- 1435; 3821 | 1439 -- 1436; 3822 | 1439 -- 1437; 3823 | 1439 -- 1438; 3824 | 1440; 3825 | 1440 -- 645; 3826 | 1440 -- 1429; 3827 | 1440 -- 1430; 3828 | 1440 -- 1431; 3829 | 1440 -- 1432; 3830 | 1440 -- 1433; 3831 | 1440 -- 1434; 3832 | 1440 -- 1435; 3833 | 1440 -- 1436; 3834 | 1440 -- 1437; 3835 | 1440 -- 1438; 3836 | 1440 -- 1439; 3837 | 1441; 3838 | 1441 -- 645; 3839 | 1441 -- 1429; 3840 | 1441 -- 1430; 3841 | 1441 -- 1431; 3842 | 1441 -- 1432; 3843 | 1441 -- 1433; 3844 | 1441 -- 1434; 3845 | 1441 -- 1435; 3846 | 1441 -- 1436; 3847 | 1441 -- 1437; 3848 | 1441 -- 1438; 3849 | 1441 -- 1439; 3850 | 1441 -- 1440; 3851 | 1442; 3852 | 1442 -- 645; 3853 | 1442 -- 1429; 3854 | 1442 -- 1430; 3855 | 1442 -- 1431; 3856 | 1442 -- 1432; 3857 | 1442 -- 1433; 3858 | 1442 -- 1434; 3859 | 1442 -- 1435; 3860 | 1442 -- 1436; 3861 | 1442 -- 1437; 3862 | 1442 -- 1438; 3863 | 1442 -- 1439; 3864 | 1442 -- 1440; 3865 | 1442 -- 1441; 3866 | 1443; 3867 | 1443 -- 645; 3868 | 1443 -- 1429; 3869 | 1443 -- 1430; 3870 | 1443 -- 1431; 3871 | 1443 -- 1432; 3872 | 1443 -- 1433; 3873 | 1443 -- 1434; 3874 | 1443 -- 1435; 3875 | 1443 -- 1436; 3876 | 1443 -- 1437; 3877 | 1443 -- 1438; 3878 | 1443 -- 1439; 3879 | 1443 -- 1440; 3880 | 1443 -- 1441; 3881 | 1443 -- 1442; 3882 | 1444; 3883 | 1444 -- 645; 3884 | 1444 -- 1429; 3885 | 1444 -- 1430; 3886 | 1444 -- 1431; 3887 | 1444 -- 1432; 3888 | 1444 -- 1433; 3889 | 1444 -- 1434; 3890 | 1444 -- 1435; 3891 | 1444 -- 1436; 3892 | 1444 -- 1437; 3893 | 1444 -- 1438; 3894 | 1444 -- 1439; 3895 | 1444 -- 1440; 3896 | 1444 -- 1441; 3897 | 1444 -- 1442; 3898 | 1444 -- 1443; 3899 | 1445; 3900 | 1445 -- 645; 3901 | 1445 -- 1429; 3902 | 1445 -- 1430; 3903 | 1445 -- 1431; 3904 | 1445 -- 1432; 3905 | 1445 -- 1433; 3906 | 1445 -- 1434; 3907 | 1445 -- 1435; 3908 | 1445 -- 1436; 3909 | 1445 -- 1437; 3910 | 1445 -- 1438; 3911 | 1445 -- 1439; 3912 | 1445 -- 1440; 3913 | 1445 -- 1441; 3914 | 1445 -- 1442; 3915 | 1445 -- 1443; 3916 | 1445 -- 1444; 3917 | 1446; 3918 | 1446 -- 645; 3919 | 1446 -- 1429; 3920 | 1446 -- 1430; 3921 | 1446 -- 1431; 3922 | 1446 -- 1432; 3923 | 1446 -- 1433; 3924 | 1446 -- 1434; 3925 | 1446 -- 1435; 3926 | 1446 -- 1436; 3927 | 1446 -- 1437; 3928 | 1446 -- 1438; 3929 | 1446 -- 1439; 3930 | 1446 -- 1440; 3931 | 1446 -- 1441; 3932 | 1446 -- 1442; 3933 | 1446 -- 1443; 3934 | 1446 -- 1444; 3935 | 1446 -- 1445; 3936 | 1447; 3937 | 1447 -- 645; 3938 | 1447 -- 1429; 3939 | 1447 -- 1430; 3940 | 1447 -- 1431; 3941 | 1447 -- 1432; 3942 | 1447 -- 1433; 3943 | 1447 -- 1434; 3944 | 1447 -- 1435; 3945 | 1447 -- 1436; 3946 | 1447 -- 1437; 3947 | 1447 -- 1438; 3948 | 1447 -- 1439; 3949 | 1447 -- 1440; 3950 | 1447 -- 1441; 3951 | 1447 -- 1442; 3952 | 1447 -- 1443; 3953 | 1447 -- 1444; 3954 | 1447 -- 1445; 3955 | 1447 -- 1446; 3956 | 1448; 3957 | 1448 -- 1429; 3958 | 1448 -- 1430; 3959 | 1448 -- 1431; 3960 | 1449; 3961 | 1450; 3962 | 1450 -- 1449; 3963 | 1451; 3964 | 1451 -- 281; 3965 | 1451 -- 283; 3966 | 1452; 3967 | 1452 -- 216; 3968 | 1453; 3969 | 1453 -- 1360; 3970 | 1454; 3971 | 1454 -- 721; 3972 | 1455; 3973 | 1455 -- 482; 3974 | 1456; 3975 | 1457; 3976 | 1457 -- 1456; 3977 | 1458; 3978 | 1458 -- 1456; 3979 | 1458 -- 1457; 3980 | 1459; 3981 | 1459 -- 1456; 3982 | 1459 -- 1457; 3983 | 1459 -- 1458; 3984 | 1460; 3985 | 1460 -- 127; 3986 | 1460 -- 151; 3987 | 1460 -- 517; 3988 | 1461; 3989 | 1461 -- 55; 3990 | 1461 -- 56; 3991 | 1462; 3992 | 1463; 3993 | 1464; 3994 | 1464 -- 294; 3995 | 1464 -- 860; 3996 | 1465; 3997 | 1465 -- 294; 3998 | 1465 -- 860; 3999 | 1465 -- 1464; 4000 | 1466; 4001 | 1466 -- 294; 4002 | 1466 -- 860; 4003 | 1466 -- 1464; 4004 | 1466 -- 1465; 4005 | 1467; 4006 | 1467 -- 294; 4007 | 1467 -- 860; 4008 | 1467 -- 1464; 4009 | 1467 -- 1465; 4010 | 1467 -- 1466; 4011 | 1468; 4012 | 1468 -- 53; 4013 | 1468 -- 1315; 4014 | 1469; 4015 | 1469 -- 53; 4016 | 1469 -- 1315; 4017 | 1469 -- 1468; 4018 | 1470; 4019 | 1470 -- 53; 4020 | 1470 -- 1315; 4021 | 1470 -- 1468; 4022 | 1470 -- 1469; 4023 | 1471; 4024 | 1472; 4025 | 1472 -- 1471; 4026 | 1473; 4027 | 1473 -- 1471; 4028 | 1473 -- 1472; 4029 | 1474; 4030 | 1475; 4031 | 1475 -- 1474; 4032 | 1476; 4033 | 1476 -- 1474; 4034 | 1476 -- 1475; 4035 | 1477; 4036 | 1477 -- 207; 4037 | 1478; 4038 | 1478 -- 207; 4039 | 1478 -- 1477; 4040 | 1479; 4041 | 1480; 4042 | 1480 -- 1479; 4043 | 1481; 4044 | 1481 -- 96; 4045 | 1482; 4046 | 1482 -- 96; 4047 | 1482 -- 1481; 4048 | 1483; 4049 | 1484; 4050 | 1484 -- 1483; 4051 | 1485; 4052 | 1485 -- 1483; 4053 | 1485 -- 1484; 4054 | 1486; 4055 | 1487; 4056 | 1487 -- 1486; 4057 | 1488; 4058 | 1488 -- 1142; 4059 | 1489; 4060 | 1489 -- 1142; 4061 | 1489 -- 1488; 4062 | 1490; 4063 | 1491; 4064 | 1492; 4065 | 1492 -- 1491; 4066 | 1493; 4067 | 1493 -- 1491; 4068 | 1494; 4069 | 1494 -- 1493; 4070 | 1495; 4071 | 1496; 4072 | 1496 -- 1495; 4073 | 1497; 4074 | 1497 -- 300; 4075 | 1498; 4076 | 1498 -- 82; 4077 | 1499; 4078 | 1500; 4079 | 1500 -- 239; 4080 | 1501; 4081 | 1501 -- 239; 4082 | 1501 -- 1500; 4083 | 1502; 4084 | 1502 -- 239; 4085 | 1502 -- 1500; 4086 | 1502 -- 1501; 4087 | 1503; 4088 | 1503 -- 239; 4089 | 1503 -- 1500; 4090 | 1503 -- 1501; 4091 | 1503 -- 1502; 4092 | 1504; 4093 | 1504 -- 1000; 4094 | 1505; 4095 | 1505 -- 1504; 4096 | 1506; 4097 | 1506 -- 1504; 4098 | 1506 -- 1505; 4099 | 1507; 4100 | 1507 -- 1504; 4101 | 1507 -- 1505; 4102 | 1507 -- 1506; 4103 | 1508; 4104 | 1508 -- 1504; 4105 | 1508 -- 1505; 4106 | 1508 -- 1506; 4107 | 1508 -- 1507; 4108 | 1509; 4109 | 1509 -- 1504; 4110 | 1509 -- 1505; 4111 | 1509 -- 1506; 4112 | 1509 -- 1507; 4113 | 1509 -- 1508; 4114 | 1510; 4115 | 1511; 4116 | 1512; 4117 | 1512 -- 1511; 4118 | 1513; 4119 | 1513 -- 1511; 4120 | 1513 -- 1512; 4121 | 1514; 4122 | 1514 -- 1000; 4123 | 1514 -- 1504; 4124 | 1515; 4125 | 1515 -- 1120; 4126 | 1516; 4127 | 1516 -- 1120; 4128 | 1516 -- 1515; 4129 | 1517; 4130 | 1517 -- 1120; 4131 | 1517 -- 1515; 4132 | 1517 -- 1516; 4133 | 1518; 4134 | 1518 -- 243; 4135 | 1518 -- 927; 4136 | 1519; 4137 | 1519 -- 243; 4138 | 1519 -- 927; 4139 | 1519 -- 1518; 4140 | 1520; 4141 | 1520 -- 243; 4142 | 1520 -- 927; 4143 | 1520 -- 1518; 4144 | 1520 -- 1519; 4145 | 1521; 4146 | 1522; 4147 | 1523; 4148 | 1523 -- 1522; 4149 | 1524; 4150 | 1525; 4151 | 1526; 4152 | 1526 -- 1525; 4153 | 1527; 4154 | 1528; 4155 | 1529; 4156 | 1529 -- 33; 4157 | 1529 -- 54; 4158 | 1530; 4159 | 1531; 4160 | 1531 -- 1530; 4161 | 1532; 4162 | 1532 -- 9; 4163 | 1533; 4164 | 1533 -- 530; 4165 | 1533 -- 531; 4166 | 1533 -- 532; 4167 | 1534; 4168 | 1534 -- 530; 4169 | 1534 -- 531; 4170 | 1534 -- 532; 4171 | 1534 -- 1533; 4172 | 1535; 4173 | 1535 -- 530; 4174 | 1535 -- 531; 4175 | 1535 -- 532; 4176 | 1535 -- 1533; 4177 | 1535 -- 1534; 4178 | 1536; 4179 | 1536 -- 843; 4180 | 1537; 4181 | 1538; 4182 | 1538 -- 1537; 4183 | 1539; 4184 | 1539 -- 1537; 4185 | 1539 -- 1538; 4186 | 1540; 4187 | 1540 -- 1491; 4188 | 1540 -- 1493; 4189 | 1541; 4190 | 1541 -- 1491; 4191 | 1541 -- 1493; 4192 | 1541 -- 1540; 4193 | 1542; 4194 | 1542 -- 1491; 4195 | 1542 -- 1493; 4196 | 1542 -- 1540; 4197 | 1542 -- 1541; 4198 | 1543; 4199 | 1544; 4200 | 1544 -- 1543; 4201 | 1545; 4202 | 1546; 4203 | 1546 -- 1545; 4204 | 1547; 4205 | 1547 -- 1545; 4206 | 1547 -- 1546; 4207 | 1548; 4208 | 1548 -- 1545; 4209 | 1548 -- 1546; 4210 | 1548 -- 1547; 4211 | 1549; 4212 | 1549 -- 308; 4213 | 1550; 4214 | 1550 -- 33; 4215 | 1550 -- 34; 4216 | 1550 -- 54; 4217 | 1551; 4218 | 1551 -- 33; 4219 | 1551 -- 34; 4220 | 1551 -- 1550; 4221 | 1552; 4222 | 1553; 4223 | 1553 -- 294; 4224 | 1554; 4225 | 1554 -- 294; 4226 | 1554 -- 1553; 4227 | 1555; 4228 | 1555 -- 294; 4229 | 1555 -- 1553; 4230 | 1555 -- 1554; 4231 | 1556; 4232 | 1556 -- 676; 4233 | 1557; 4234 | 1557 -- 676; 4235 | 1557 -- 1556; 4236 | 1558; 4237 | 1558 -- 676; 4238 | 1558 -- 1556; 4239 | 1558 -- 1557; 4240 | 1559; 4241 | 1560; 4242 | 1560 -- 219; 4243 | 1560 -- 1145; 4244 | 1561; 4245 | 1561 -- 219; 4246 | 1561 -- 1145; 4247 | 1561 -- 1560; 4248 | 1562; 4249 | 1562 -- 62; 4250 | 1562 -- 63; 4251 | 1563; 4252 | 1563 -- 62; 4253 | 1563 -- 63; 4254 | 1563 -- 1562; 4255 | 1564; 4256 | 1564 -- 62; 4257 | 1564 -- 63; 4258 | 1564 -- 1562; 4259 | 1564 -- 1563; 4260 | 1565; 4261 | 1565 -- 62; 4262 | 1565 -- 63; 4263 | 1565 -- 1562; 4264 | 1565 -- 1563; 4265 | 1565 -- 1564; 4266 | 1566; 4267 | 1566 -- 62; 4268 | 1566 -- 63; 4269 | 1566 -- 1562; 4270 | 1566 -- 1563; 4271 | 1566 -- 1564; 4272 | 1566 -- 1565; 4273 | 1567; 4274 | 1567 -- 62; 4275 | 1567 -- 63; 4276 | 1567 -- 1562; 4277 | 1567 -- 1563; 4278 | 1567 -- 1564; 4279 | 1567 -- 1565; 4280 | 1567 -- 1566; 4281 | 1568; 4282 | 1569; 4283 | 1569 -- 1568; 4284 | 1570; 4285 | 1570 -- 337; 4286 | 1570 -- 631; 4287 | 1571; 4288 | 1571 -- 337; 4289 | 1571 -- 631; 4290 | 1571 -- 1570; 4291 | 1572; 4292 | 1572 -- 337; 4293 | 1572 -- 631; 4294 | 1572 -- 1570; 4295 | 1572 -- 1571; 4296 | 1573; 4297 | 1573 -- 337; 4298 | 1573 -- 631; 4299 | 1573 -- 1570; 4300 | 1573 -- 1571; 4301 | 1573 -- 1572; 4302 | 1574; 4303 | 1574 -- 631; 4304 | 1574 -- 783; 4305 | 1575; 4306 | 1576; 4307 | 1576 -- 1575; 4308 | 1577; 4309 | 1577 -- 1575; 4310 | 1577 -- 1576; 4311 | 1578; 4312 | 1578 -- 1575; 4313 | 1578 -- 1576; 4314 | 1578 -- 1577; 4315 | 1579; 4316 | 1579 -- 630; 4317 | 1579 -- 631; 4318 | 1580; 4319 | 1581; 4320 | 1581 -- 1580; 4321 | 1582; 4322 | 1583; 4323 | 1584; 4324 | 1584 -- 1583; 4325 | 1585; 4326 | 1586; 4327 | 1586 -- 1585; 4328 | 1587; 4329 | 1587 -- 1585; 4330 | 1588; 4331 | 1588 -- 76; 4332 | 1588 -- 522; 4333 | } 4334 | --------------------------------------------------------------------------------