cpp_dependency_graph 0.1.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f5439e5df96869f8e42239ae1dd7963b1c8f12bb72f66b9931e19ffa7ba8f48f
4
- data.tar.gz: 7793b519e5fd0915479f6181b84954cd06525da8b59bc6e1e67d3bb8eb053c5e
3
+ metadata.gz: 49dbf00badc862586088263651f5b0eeb26b9953fae870baa86e14e9d96dee36
4
+ data.tar.gz: e935e59934e696511cde583c8b89b60b201cafc84e65e3dab487829769f3f9ad
5
5
  SHA512:
6
- metadata.gz: 834d2e3aa16613a92bc308b726d32bed789fa770e0562cee8aee8ce308bbee69888698ebc276b315c74f62207c0bf7f66163f365eb407170044c865dadc60233
7
- data.tar.gz: 0a83134a6ce392d0f582354f21c8a641e0d58fb70b810b136defb0e92236c68db4d4e46cbf12366f2ab07202784936a0750148a36e6c35cb77e1a117967863bf
6
+ metadata.gz: 203cf7a07370d1fde0cb90e376d1b45ec605aa7332dff34247e99463099b1e496d3f05c831589df73c03c50c776a3838db201acd759468062db49c87560de48f
7
+ data.tar.gz: 4e122ad96022ba802effbc94c9ac9c185810838ed762514380444d2227ede7f25a97c66eafd7f8436a59d984f5816dad39fc35379dc2131ff8b0012a5d2e8ce8
data/README.md CHANGED
@@ -37,8 +37,6 @@ A huge shout out to the people behind these projects.
37
37
 
38
38
  ### dep-matrix
39
39
 
40
-
41
-
42
40
  ## Usage
43
41
 
44
42
  ### Installation
@@ -53,7 +51,7 @@ A huge shout out to the people behind these projects.
53
51
 
54
52
  To generate the overall component dependency graph for a project, use it like so -
55
53
 
56
- `cpp_dependency_graph visualise -r spec\test\example_project\ -o deps.dot -f dot`
54
+ `cpp_dependency_graph visualise_project -r spec\test\example_project\ -o deps.dot -f dot`
57
55
 
58
56
  Below is the overall `dot` and `d3` component dependency visualisations for [leveldb](https://github.com/google/leveldb)
59
57
 
@@ -69,7 +67,7 @@ Below is the overall `dot` and `d3` component dependency visualisations for [lev
69
67
 
70
68
  This will highlight the dependencies coming in and going out of a specific component. This allows you to filter out extraneous detail and study individual components in more detail.
71
69
 
72
- `cpp_dependency_graph visualise -r spec\test\example_project\ -c Engine -o deps.dot -f dot`
70
+ `cpp_dependency_graph visualise_component -r spec\test\example_project\ --component Engine -o deps.dot -f dot`
73
71
 
74
72
  Here's a component dependency visualisation generated for the `queue` component in [rethinkdb](https://github.com/rethinkdb/rethinkdb)
75
73
 
@@ -81,7 +79,7 @@ Here's a component dependency visualisation generated for the `queue` component
81
79
 
82
80
  This will highlight dependencies of includes within a specific component
83
81
 
84
- `cpp_dependency_graph visualise_includes -r spec\test\example_project\ -c Engine`
82
+ `cpp_dependency_graph visualise_component_includes -r spec\test\example_project\ --component Engine`
85
83
 
86
84
  Here's a component include dependency visualisation generated for the `queue` component in [rethinkdb](https://github.com/rethinkdb/rethinkdb)
87
85
 
@@ -89,6 +87,16 @@ Here's a component include dependency visualisation generated for the `queue` co
89
87
 
90
88
  ![Queue include graph d3](docs/examples/rethinkdb_queue_include_d3.svg)
91
89
 
90
+ ### Header file include dependency graph
91
+
92
+ This will highlight include dependencies of header files globally within the project
93
+
94
+ `cpp_dependency_graph visualise_header_includes -r spec\test\example_project\ --header Engine.h`
95
+
96
+ Here's a component include dependency visualisation generated for the `errors.hpp` header file in [rethinkdb](https://github.com/rethinkdb/rethinkdb)
97
+
98
+ ![Errors.hpp include graph dot](docs/examples/rethinkdb_errors_header_include.svg)
99
+
92
100
  ### Cyclic dependencies only graph
93
101
 
94
102
  This will highlight cyclic dependencies between components within a project. This is especially useful for targeted refactoring activities to reduce coupling between components.
@@ -103,7 +111,15 @@ Here's the cyclic dependencies only visualisation generated for [rethinkdb](http
103
111
 
104
112
  ## Development
105
113
 
106
- `bundle exec cpp_dependency_graph visualise -r <dir>`
114
+ `bundle exec cpp_dependency_graph <cmd> -r <dir> ...`
115
+
116
+ ### Running all unit tests
117
+
118
+ `rake spec`
119
+
120
+ ### Running a single test
121
+
122
+ `rake spec SPEC=<path_to_spec_file>`
107
123
 
108
124
  ## License
109
125
 
data/Rakefile CHANGED
@@ -4,8 +4,8 @@ require 'bundler/gem_tasks'
4
4
  require 'rspec/core/rake_task'
5
5
  require 'rubocop/rake_task'
6
6
 
7
- RSpec::Core::RakeTask.new(:spec)
8
-
9
- # task default: spec
10
-
11
7
  RuboCop::RakeTask.new
8
+
9
+ RSpec::Core::RakeTask.new(:spec) do |t|
10
+ t.pattern = Dir.glob('spec/**/*_spec.rb')
11
+ end
@@ -25,21 +25,20 @@ Gem::Specification.new do |s|
25
25
  s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
26
  s.require_paths = ['lib']
27
27
 
28
- s.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
29
- s.rubygems_version = '2.7.6'
28
+ s.required_ruby_version = Gem::Requirement.new('>= 2.7.0')
29
+ s.rubygems_version = '3.1.2'
30
30
 
31
31
  s.add_runtime_dependency 'docopt', '~> 0.6'
32
- s.add_runtime_dependency 'graphviz', '~> 1.0'
33
- s.add_runtime_dependency 'json', '~> 2.1'
34
- s.add_runtime_dependency 'parallel', '~> 1.12'
32
+ s.add_runtime_dependency 'ruby-graphviz', '~> 1.2'
33
+ s.add_runtime_dependency 'json', '~> 2.3.0'
35
34
 
36
- s.add_development_dependency 'bundler', '~> 1.16'
35
+ s.add_development_dependency 'bundler', '~> 2.1'
37
36
  s.add_development_dependency 'debase', '~> 0.2'
38
- s.add_development_dependency 'rake', '~> 12.3'
39
- s.add_development_dependency 'rspec', '~> 3.7'
40
- s.add_development_dependency 'rubocop', '~> 0.55'
41
- s.add_development_dependency 'ruby-debug-ide', '~> 0.6'
42
- s.add_development_dependency 'ruby-prof', '~> 0.17'
43
- s.add_development_dependency 'simplecov', '~> 0.16'
37
+ s.add_development_dependency 'rake', '~> 13.0'
38
+ s.add_development_dependency 'rspec', '~> 3.9'
39
+ s.add_development_dependency 'rubocop', '~> 0.81'
40
+ s.add_development_dependency 'ruby-debug-ide', '~> 0.7'
41
+ s.add_development_dependency 'ruby-prof', '~> 0.18'
42
+ s.add_development_dependency 'simplecov', '~> 0.18'
44
43
  s.add_development_dependency 'simplecov-console', '~> 0.4'
45
44
  end
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="1536" height="722" style="perspective-origin:768px 361px;transform-origin:768px 361px;" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><rect width="1536" height="722" style="overflow-x:visible;overflow-y:visible;pointer-events:all;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform-origin:0px 0px;fill:none;"/><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><defs style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><marker id="default" orient="auto" class="marker" viewBox="0 -5 10 10" refX="10" refY="0" markerWidth="10" markerHeight="10" style="pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 153, 153);stroke:rgb(153, 153, 153);"><path d="M0,-5L10,0L0,5" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 153, 153);stroke:rgb(153, 153, 153);d:path(&quot;M 0 -5 L 10 0 L 0 5&quot;);"/></marker><marker id="dependency" orient="auto" class="marker" viewBox="0 -5 10 10" refX="10" refY="0" markerWidth="10" markerHeight="10" style="pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 0, 0);stroke:rgb(153, 0, 0);"><path d="M0,-5L10,0L0,5" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 0, 0);stroke:rgb(153, 0, 0);d:path(&quot;M 0 -5 L 10 0 L 0 5&quot;);"/></marker><marker id="dependants" orient="auto" class="marker" viewBox="0 -5 10 10" refX="10" refY="0" markerWidth="10" markerHeight="10" style="pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(0, 153, 0);stroke:rgb(0, 153, 0);"><path d="M0,-5L10,0L0,5" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(0, 153, 0);stroke:rgb(0, 153, 0);d:path(&quot;M 0 -5 L 10 0 L 0 5&quot;);"/></marker></defs><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><path class="link" marker-end="url(#default)" d="M824.7314577733719,445.17013158385123L751.4924954629396,358.5668145800863" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 824.731 445.17 L 751.492 358.567&quot;);"/><path class="link" marker-end="url(#default)" d="M713.5730534613863,258.55472427001047L735.9248725180471,330.21644200176974" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 713.573 258.555 L 735.925 330.216&quot;);"/><path class="link" marker-end="url(#default)" d="M782.2238931080286,431.7884418218213L748.0050054986211,360.8301389161922" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 782.224 431.788 L 748.005 360.83&quot;);"/><path class="link" marker-end="url(#default)" d="M726.1431020308893,295.0242542349266L736.2649017326157,330.1143851044905" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 726.143 295.024 L 736.265 330.114&quot;);"/><path class="link" marker-end="url(#default)" d="M750.593913473179,257.30589302857874L742.6426032304965,329.5670088476135" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 750.594 257.306 L 742.643 329.567&quot;);"/><path class="link" marker-end="url(#default)" d="M675.3052592209143,345.0892290973707L724.3393884296817,345.74677303144796" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 675.305 345.089 L 724.339 345.747&quot;);"/><path class="link" marker-end="url(#default)" d="M685.6661884990369,285.4134785288226L729.72534171606,333.77125764724855" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 685.666 285.413 L 729.725 333.771&quot;);"/><path class="link" marker-end="url(#default)" d="M830.0576421153336,484.05733105803847L749.7921988404297,359.8269714951077" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 830.058 484.057 L 749.792 359.827&quot;);"/><path class="link" marker-end="url(#default)" d="M699.7529915777192,320.33819398280787L726.8385492202722,337.2348596095234" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 699.753 320.338 L 726.839 337.235&quot;);"/><path class="link" marker-end="url(#default)" d="M743.2084230279708,221.62432307321768L741.1524078699999,329.4710144876581" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 743.208 221.624 L 741.152 329.471&quot;);"/><path class="link" marker-end="url(#default)" d="M814.4977954452266,402.3851096711924L753.9371733686743,356.0009212418831" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 814.498 402.385 L 753.937 356.001&quot;);"/><path class="link" marker-end="url(#default)" d="M656.9666465488115,310.7047184649909L725.6276209913405,339.5729204472052" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 656.967 310.705 L 725.628 339.573&quot;);"/><path class="link" marker-end="url(#default)" d="M831.5615276140223,330.33526962123113L757.0982746823878,343.1661639413176" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 831.562 330.335 L 757.098 343.166&quot;);"/><path class="link" marker-end="url(#default)" d="M645.2059969145175,380.5087776749402L725.3191294697248,351.5731577388932" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 645.206 380.509 L 725.319 351.573&quot;);"/><path class="link" marker-end="url(#default)" d="M702.7072678837017,221.9506600617466L735.988805326902,330.19664307548317" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 702.707 221.951 L 735.989 330.197&quot;);"/><path class="link" marker-end="url(#default)" d="M888.2519826140206,477.89590322091584L753.1330984986355,356.9715716901176" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 888.252 477.896 L 753.133 356.972&quot;);"/><path class="link" marker-end="url(#default)" d="M609.0431127551606,370.48022442445006L724.6160876575423,348.9850750524088" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 609.043 370.48 L 724.616 348.985&quot;);"/><path class="link" marker-end="url(#default)" d="M817.9639035022202,227.21337190893755L749.8249269811121,332.13026283422545" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 817.964 227.213 L 749.825 332.13&quot;);"/><path class="link" marker-end="url(#default)" d="M780.1206590752068,395.0708536376371L751.1454508842684,358.8522902091525" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 780.121 395.071 L 751.145 358.852&quot;);"/><path class="link" marker-end="url(#default)" d="M645.5457796253468,276.9002996170178L727.4780620877252,336.2848048304035" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 645.546 276.9 L 727.478 336.285&quot;);"/><path class="link" marker-end="url(#default)" d="M847.0530885987478,420.2109607774105L754.3616699622363,355.42094145542023" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 847.053 420.211 L 754.362 355.421&quot;);"/><path class="link" marker-end="url(#default)" d="M590.1474820071631,401.2046842547474L725.3458980622185,351.64672439584683" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 590.147 401.205 L 725.346 351.647&quot;);"/><path class="link" marker-end="url(#default)" d="M728.571491303343,188.5917641970646L739.5557305404275,329.51790963303466" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 728.571 188.592 L 739.556 329.518&quot;);"/><path class="link" marker-end="url(#default)" d="M762.4731416838355,464.36090153052015L743.8040130934229,362.1992276547444" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 762.473 464.361 L 743.804 362.199&quot;);"/><path class="link" marker-end="url(#default)" d="M637.6406555310864,342.9297302501012L724.345051557658,345.4824417664399" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 637.641 342.93 L 724.345 345.482&quot;);"/><path class="link" marker-end="url(#default)" d="M826.957698245014,369.1343708043198L756.7714817475214,350.2541729794686" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 826.958 369.134 L 756.771 350.254&quot;);"/><path class="link" marker-end="url(#default)" d="M712.1722727514934,365.1179190287549L727.1178028675088,355.13364810351726" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 712.172 365.118 L 727.118 355.134&quot;);"/><path class="link" marker-end="url(#default)" d="M676.0432234766016,249.5024421672299L731.6378004216814,332.27100718765126" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 676.043 249.502 L 731.638 332.271&quot;);"/><path class="link" marker-end="url(#default)" d="M863.3998711437758,456.3604778822772L753.0979455615617,357.01072520054277" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 863.4 456.36 L 753.098 357.011&quot;);"/><path class="link" marker-end="url(#default)" d="M621.1074108364091,461.73131625208873L728.9757762913279,357.43710145543486" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 621.107 461.731 L 728.976 357.437&quot;);"/><path class="link" marker-end="url(#default)" d="M782.7353052941318,224.21414476351922L746.2068215358672,330.36594215011826" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 782.735 224.214 L 746.207 330.366&quot;);"/><path class="link" marker-end="url(#default)" d="M741.3686397206018,434.11909197029195L740.9372454653039,362.46771783296913" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 741.369 434.119 L 740.937 362.468&quot;);"/><path class="link" marker-end="url(#default)" d="M617.4715467937516,307.9118282765489L725.0710512081287,341.10424062616715" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 617.472 307.912 L 725.071 341.104&quot;);"/><path class="link" marker-end="url(#default)" d="M863.0454272526651,348.8841643812061L757.3332094590363,346.36163210104536" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 863.045 348.884 L 757.333 346.362&quot;);"/><path class="link" marker-end="url(#default)" d="M645.5195291518605,439.5286611179817L729.0625760674949,357.5262012980832" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 645.52 439.529 L 729.063 357.526&quot;);"/><path class="link" marker-end="url(#default)" d="M691.1623526185913,185.44673707227815L735.9599843203335,330.20553328252663" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 691.162 185.447 L 735.96 330.206&quot;);"/><path class="link" marker-end="url(#default)" d="M791.4688895181879,501.646560570478L745.941057553539,361.6590281516335" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 791.469 501.647 L 745.941 361.659&quot;);"/><path class="link" marker-end="url(#default)" d="M594.2859109720567,335.4166173499794L724.3805047305577,344.7831226926528" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 594.286 335.417 L 724.38 344.783&quot;);"/><path class="link" marker-end="url(#default)" d="M760.2535956745775,298.2993138086093L747.0619586682575,330.6869450362976" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 760.254 298.299 L 747.062 330.687&quot;);"/><path class="link" marker-end="url(#default)" d="M746.8363507094721,396.7960047461888L742.7717262513393,362.35430186686193" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 746.836 396.796 L 742.772 362.354&quot;);"/><path class="link" marker-end="url(#default)" d="M645.8639446569878,235.28805823158137L730.0929733109095,333.44617829436663" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 645.864 235.288 L 730.093 333.446&quot;);"/><path class="link" marker-end="url(#default)" d="M861.0699707238473,384.14675797024665L756.564084573695,350.96174074796136" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 861.07 384.147 L 756.564 350.962&quot;);"/><path class="link" marker-end="url(#default)" d="M675.8514566472609,415.24103344712347L729.5489019399677,358.0016534245455" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 675.851 415.241 L 729.549 358.002&quot;);"/><path class="link" marker-end="url(#default)" d="M805.2320282295434,191.78768809483066L747.1968732312911,330.7425932796914" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 805.232 191.788 L 747.197 330.743&quot;);"/><path class="link" marker-end="url(#default)" d="M796.4669199020715,466.2068441893844L747.7661377832193,360.94298237067613" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 796.467 466.207 L 747.766 360.943&quot;);"/><path class="link" marker-end="url(#default)" d="M573.8908647115677,305.7658526795704L724.7964601900107,342.10511042018567" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 573.891 305.766 L 724.796 342.105&quot;);"/><path class="link" marker-end="url(#default)" d="M788.4723110216162,360.236282005276L756.6440517172418,350.70254198988283" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 788.472 360.236 L 756.644 350.703&quot;);"/><path class="link" marker-end="url(#default)" d="M624.7680391516108,413.5167729626643L726.5770760422746,354.2673394798982" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 624.768 413.517 L 726.577 354.267&quot;);"/><path class="link" marker-end="url(#default)" d="M662.7023005262081,205.78091279598647L732.804859134037,331.5555162979163" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 662.702 205.781 L 732.805 331.556&quot;);"/><path class="link" marker-end="url(#default)" d="M899.7997849863265,375.6039601271753L757.0584187026662,348.99207662361283" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 899.8 375.604 L 757.058 348.992&quot;);"/><path class="link" marker-end="url(#default)" d="M590.6148439020802,437.7998292027239L726.7599571009215,354.573909114637" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 590.615 437.8 L 726.76 354.574&quot;);"/><path class="link" marker-end="url(#default)" d="M833.1296490695308,173.80992536543587L748.6337713938336,331.4258551379049" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 833.13 173.81 L 748.634 331.426&quot;);"/><path class="link" marker-end="url(#default)" d="M656.2773879551258,528.357965648133L733.8977076619668,360.9374410525468" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 656.277 528.358 L 733.898 360.937&quot;);"/><path class="link" marker-end="url(#default)" d="M615.7911550106287,256.5541212271794L727.4161165267112,336.37085102706976" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 615.791 256.554 L 727.416 336.371&quot;);"/><path class="link" marker-end="url(#default)" d="M900.0105208147527,249.07867521977175L754.9321158505779,337.3887848457041" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 900.01 249.079 L 754.932 337.389&quot;);"/><path class="link" marker-end="url(#default)" d="M678.1009366352123,381.6121093349265L726.4916840431775,354.1188415269405" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 678.101 381.612 L 726.492 354.119&quot;);"/><path class="link" marker-end="url(#default)" d="M767.3163328995299,188.03237786176265L743.5661082270468,329.6951281550821" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 767.316 188.032 L 743.566 329.695&quot;);"/><path class="link" marker-end="url(#default)" d="M754.2788596951001,507.03056197221406L742.2100894943086,362.41086061044325" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 754.279 507.031 L 742.21 362.411&quot;);"/><path class="link" marker-end="url(#default)" d="M544.7595265137402,323.48450723256013L724.4453202475912,344.0883458967887" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 544.76 323.484 L 724.445 344.088&quot;);"/><path class="link" marker-end="url(#default)" d="M787.1538488243145,328.1028590821421L756.2323836987119,340.0300014227419" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 787.154 328.103 L 756.232 340.03&quot;);"/><path class="link" marker-end="url(#default)" d="M710.2456248213821,447.4498774603711L736.0755718805899,361.7658073170537" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 710.246 447.45 L 736.076 361.766&quot;);"/><path class="link" marker-end="url(#default)" d="M620.87532712937,183.80890291182436L731.0248543496745,332.70325017943577" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 620.875 183.809 L 731.025 332.703&quot;);"/><path class="link" marker-end="url(#default)" d="M935.3854001361425,339.0582349989623L757.3275077620682,345.3823523993668" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 935.385 339.058 L 757.328 345.382&quot;);"/><path class="link" marker-end="url(#default)" d="M579.598093612069,469.4420793220624L727.7377872861932,355.99981204432635" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 579.598 469.442 L 727.738 356&quot;);"/><path class="link" marker-end="url(#default)" d="M849.9265866679459,224.44377181748757L751.8600085578432,333.6894487815133" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 849.927 224.444 L 751.86 333.689&quot;);"/><path class="link" marker-end="url(#default)" d="M686.7042039473516,530.6304165950736L736.1962705392264,361.8016907740022" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 686.704 530.63 L 736.196 361.802&quot;);"/><path class="link" marker-end="url(#default)" d="M591.6768309346432,276.1130643850879L725.8953580392528,338.97013946127794" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 591.677 276.113 L 725.895 338.97&quot;);"/><path class="link" marker-end="url(#default)" d="M880.4014718865939,283.51213846135835L755.8986198642091,339.2282194268921" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 880.401 283.512 L 755.899 339.228&quot;);"/><path class="link" marker-end="url(#default)" d="M713.4929061450166,405.1812073177273L733.9201430236881,360.94782223222353" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 713.493 405.181 L 733.92 360.948&quot;);"/><path class="link" marker-end="url(#default)" d="M691.6427278783292,151.0899210773598L736.7993269412059,329.96989553126775" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 691.643 151.09 L 736.799 329.97&quot;);"/><path class="link" marker-end="url(#default)" d="M882.3827554663139,413.46371026231856L755.7312873709641,353.0699295452346" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 882.383 413.464 L 755.731 353.07&quot;);"/><path class="link" marker-end="url(#default)" d="M570.4284796281877,363.2463539756299L724.4220712596838,347.6324688885029" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 570.428 363.246 L 724.422 347.632&quot;);"/><path class="link" marker-end="url(#default)" d="M782.9127956115566,263.29820197654834L748.3220420759326,331.2629941615034" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 782.913 263.298 L 748.322 331.263&quot;);"/><path class="link" marker-end="url(#default)" d="M637.5613153607127,502.69695341659474L731.7590846008109,359.74571694303086" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 637.561 502.697 L 731.759 359.746&quot;);"/><path class="link" marker-end="url(#default)" d="M616.8932839556962,217.28367811360627L729.3915537684903,334.0839501533301" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 616.893 217.284 L 729.392 334.084&quot;);"/><path class="link" marker-end="url(#default)" d="M876.7378649765803,314.4196392453757L756.910504370885,342.23685733722306" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 876.738 314.42 L 756.911 342.237&quot;);"/><path class="link" marker-end="url(#default)" d="M607.6560214728046,494.90868224631066L729.8394970304206,358.2678144697506" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 607.656 494.909 L 729.839 358.268&quot;);"/><path class="link" marker-end="url(#default)" d="M863.0686090203529,192.26484090389528L751.1078360648113,333.0537411661423" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 863.069 192.265 L 751.108 333.054&quot;);"/><path class="link" marker-end="url(#default)" d="M855.9390854173638,503.33844153896655L750.5786790300623,359.28594924954655" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 855.939 503.338 L 750.579 359.286&quot;);"/><path class="link" marker-end="url(#default)" d="M546.6702673691783,281.92670539080933L725.168215782844,340.7997640039345" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 546.67 281.927 L 725.168 340.8&quot;);"/><path class="link" marker-end="url(#default)" d="M799.9385131522453,299.15503743586015L753.7719983190178,335.72305559856267" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 799.939 299.155 L 753.772 335.723&quot;);"/><path class="link" marker-end="url(#default)" d="M716.2478096839545,534.6136987048719L738.7051613561711,362.32960006517845" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 716.248 534.614 L 738.705 362.33&quot;);"/><path class="link" marker-end="url(#default)" d="M726.0336061961648,151.49352243229558L739.5854723315342,329.51561850784014" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 726.034 151.494 L 739.585 329.516&quot;);"/><path class="link" marker-end="url(#default)" d="M933.2126867745937,379.0997258853288L757.098511246983,348.76849658826114" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 933.213 379.1 L 757.099 348.768&quot;);"/><path class="link" marker-end="url(#default)" d="M554.7194111710263,426.5331316224501L725.6956788786565,352.52263251701663" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 554.719 426.533 L 725.696 352.523&quot;);"/><path class="link" marker-end="url(#default)" d="M817.3142865921532,265.775512107367L752.2252212622793,334.0273707592818" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 817.314 265.776 L 752.225 334.027&quot;);"/><path class="link" marker-end="url(#default)" d="M784.6722873292106,537.481806667243L744.5192871450176,362.0520905564851" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 784.672 537.482 L 744.519 362.052&quot;);"/><path class="link" marker-end="url(#default)" d="M585.3262847332461,218.87772961558863L728.0617131939721,335.52680424702953" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 585.326 218.878 L 728.062 335.527&quot;);"/><path class="link" marker-end="url(#default)" d="M921.4085641190868,272.9820456878837L756.1355354649249,339.7847730613398" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 921.409 272.982 L 756.136 339.785&quot;);"/><path class="link" marker-end="url(#default)" d="M677.3521921164136,451.0852063532129L732.3077206352112,360.09196652740656" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 677.352 451.085 L 732.308 360.092&quot;);"/><path class="link" marker-end="url(#default)" d="M794.4118477470804,156.2172362520737L745.3212217128013,330.0887891978043" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 794.412 156.217 L 745.321 330.089&quot;);"/><path class="link" marker-end="url(#default)" d="M902.6152066275354,444.64142281066046L754.9244306740827,354.5598616345319" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 902.615 444.641 L 754.924 354.56&quot;);"/><path class="link" marker-end="url(#default)" d="M536.8775771611803,356.43911724682295L724.3596065635495,346.8139947206574" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 536.878 356.439 L 724.36 346.814&quot;);"/><path class="link" marker-end="url(#default)" d="M899.7254493561412,340.36849888272604L757.3276680998024,345.3868843244541" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 899.725 340.368 L 757.328 345.387&quot;);"/><path class="link" marker-end="url(#default)" d="M701.0829329727036,492.7472178404881L736.52432005773,361.89418981757893" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 701.083 492.747 L 736.524 361.894&quot;);"/><path class="link" marker-end="url(#default)" d="M653.7252108389373,166.45189652708044L733.6343995995064,331.1235058080787" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 653.725 166.452 L 733.634 331.124&quot;);"/><path class="link" marker-end="url(#default)" d="M924.4448466586906,304.87614462440484L756.9395815677734,342.36440566600675" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 924.445 304.876 L 756.94 342.364&quot;);"/><path class="link" marker-end="url(#default)" d="M666.4631016071132,483.82340413223784L733.0034214051935,360.48941026472306" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 666.463 483.823 L 733.003 360.489&quot;);"/><path class="link" marker-end="url(#default)" d="M888.0222092976525,220.2375219101071L753.3836258653321,335.2509795300344" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 888.022 220.238 L 753.384 335.251&quot;);"/><path class="link" marker-end="url(#default)" d="M821.2656880259049,522.7881280255958L747.6695255820672,360.9873031864699" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 821.266 522.788 L 747.67 360.987&quot;);"/><path class="link" marker-end="url(#default)" d="M565.969107842046,248.14037667829814L726.4380857296751,337.91226098185325" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 565.969 248.14 L 726.438 337.912&quot;);"/><path class="link" marker-end="url(#default)" d="M857.0617997392701,258.15043265635865L754.0024993516234,336.0209842957952" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 857.062 258.15 L 754.003 336.021&quot;);"/><path class="link" marker-end="url(#default)" d="M731.2094871463279,481.995016565376L739.6728981274613,362.42683697405425" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 731.209 481.995 L 739.673 362.427&quot;);"/><path class="link" marker-end="url(#default)" d="M759.2421031276996,150.85437243916095L742.3873984283767,329.5409334424622" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 759.242 150.854 L 742.387 329.541&quot;);"/><path class="link" marker-end="url(#default)" d="M921.139916235731,414.44544276033156L756.2628945743297,351.826318566419" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 921.14 414.445 L 756.263 351.826&quot;);"/><path class="link" marker-end="url(#default)" d="M549.2397559829851,392.169122220146L724.797656846597,349.83588930696146" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 549.24 392.169 L 724.798 349.836&quot;);"/><path class="link" marker-end="url(#default)" d="M839.1042593245974,294.9455564520048L755.4816180182485,338.36461823779223" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 839.104 294.946 L 755.482 338.365&quot;);"/><path class="link" marker-end="url(#default)" d="M747.2064709518922,542.8179643293549L741.3714403210618,362.4593885689429" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url(&quot;#default&quot;);stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path(&quot;M 747.206 542.818 L 741.371 362.459&quot;);"/></g><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 836.355, 458.914);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(836.3546472986317,458.9142745276615)"/><circle class="node" r="16.5" source="1" dest="108" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 740.838, 345.968);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:16.5px;" transform="translate(740.8379050647848,345.96801688159354)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 708.213, 241.371);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(708.2133815922178,241.37118803747543)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 790.043, 448.002);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(790.0425481267592,448.00166585956526)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 721.154, 277.729);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(721.1543711230685,277.7293832053597)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 752.563, 239.414);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(752.562675108501,239.41388426423694)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 657.307, 344.848);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(657.3068774371656,344.8478721699392)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 673.543, 272.108);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(673.54339211861,272.10792300044625)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 839.826, 499.176);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(839.8259625978553,499.1761906364176)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 684.481, 310.811);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(684.4809670200691,310.81111332236776)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 743.552, 203.628);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(743.5515169972964,203.62759318892446)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 828.788, 413.33);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(828.7879063221969,413.33009624605376)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 640.374, 303.728);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(640.3736093777813,303.7282496274763)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 849.3, 327.279);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(849.3001126514074,327.27870277729374)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 628.276, 386.623);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(628.2764235380885,386.6234767919944)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 697.417, 204.746);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(697.4173408969205,204.74552500053525)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 901.665, 489.9);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(901.6649209054941,489.89978119385125)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 591.347, 373.772);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(591.3465846745323,373.771560610794)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 827.768, 212.118);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(827.767927410941,212.1176402208996)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 791.365, 409.126);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(791.3652545146434,409.1264245404287)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 630.971, 266.337);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(630.9714054685545,266.33679556117414)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 861.806, 430.523);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(861.806286668695,430.523242130676)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 573.247, 407.4);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(573.2471107316363,407.3996379066601)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 727.173, 170.646);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(727.1727554585897,170.6461926531822)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 765.709, 482.068);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(765.7088958968952,482.067676919412)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 619.648, 342.4);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(619.6484517051299,342.40001194266085)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 844.34, 373.81);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(844.3397818989084,373.81017745654714)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 697.205, 375.117);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(697.2048885362833,375.1167894526717)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 666.007, 234.56);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(666.0067456841252,234.56024977383834)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 876.775, 468.407);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(876.7744607766234,468.40706877567635)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 608.167, 474.243);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(608.1669067199107,474.24304487809746)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 788.592, 207.194);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(788.5923050807672,207.19369960190983)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 741.477, 452.119);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(741.4770110666227,452.11876573542895)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 600.271, 302.606);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(600.2713425864904,302.60589054335645)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 881.04, 349.314);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(881.0403047736669,349.3135628024263)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 632.674, 452.138);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(632.6737157002716,452.13758957233404)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 685.841, 168.251);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(685.8409845337354,168.25130041875065)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 797.036, 518.764);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(797.0359649604652,518.7640274105216)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 576.332, 334.124);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(576.3323833347182,334.1240055074986)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 767.043, 281.629);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(767.0434723329114,281.62905361374095)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 748.946, 414.672);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(748.945973822077,414.6719520028453)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 634.142, 221.628);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(634.1422009254876,221.6278706818793)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 878.226, 389.594);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(878.2258029153858,389.594456733557)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 663.536, 428.369);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(663.5361805110967,428.3686369485256)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 812.169, 175.178);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(812.1690844111868,175.1781350745738)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 804.025, 482.543);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(804.0249919585455,482.5431701774745)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 556.391, 301.552);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(556.3911066663597,301.55177290348905)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 805.715, 365.401);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(805.7153800970239,365.4012184870461)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 609.211, 422.571);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(609.2107711270542,422.5705794335421)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 653.939, 190.058);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(653.938977692665,190.05818488652042)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 917.495, 378.903);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(917.4948907731062,378.90293439119637)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 575.257, 447.188);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(575.2570824869566,447.18807527513496)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 841.634, 157.946);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(841.6342305194023,157.94574891777552)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 648.706, 544.688);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(648.7062635156881,544.6882465619002)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 601.149, 246.085);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(601.1492038781848,246.08448574951709)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 915.386, 239.72);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(915.3860234901634,239.71951299880143)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 662.45, 390.504);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(662.4505137025499,390.50391803894144)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 770.293, 170.28);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(770.2925545310885,170.28013561465926)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 755.776, 524.968);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(755.7757881636716,524.9682096764137)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 526.877, 321.434);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(526.8767067131655,321.43395706731854)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 803.948, 321.625);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(803.9478255158714,321.62502403612217)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 705.05, 464.684);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(705.0503522568059,464.6838306626913)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 610.17, 169.338);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(610.1701808947042,169.33824832765225)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 953.374, 338.419);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(953.3740576240881,338.41932829107856)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 565.307, 480.386);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(565.3070560354237,480.3858558632255)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 861.951, 211.049);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(861.9506995694643,211.0489702537637)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 681.641, 547.904);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(681.6406026467424,547.9035153867922)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 575.376, 268.479);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(575.3758705431537,268.4790162901981)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 896.831, 276.16);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(896.8313425768749,276.1596321471386)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 705.946, 421.523);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(705.9462566456384,421.52281315477813)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 687.237, 133.637);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(687.2370062889704,133.63742505882257)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 898.63, 421.211);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(898.6300816185096,421.21125134992695)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 552.52, 365.062);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(552.5202972953502,365.0621198013492)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 791.077, 247.256);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(791.077308714627,247.25635900917726)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 627.657, 517.727);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(627.6571475818321,517.7271716654354)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 604.406, 204.319);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(604.4063552688295,204.3192416827734)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 894.272, 310.349);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(894.2716096741442,310.3492833787897)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 595.658, 508.327);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(595.6577581625892,508.3266432515729)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 874.272, 178.177);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(874.272170111291,178.17654012340302)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 866.565, 517.867);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(866.5653842885757,517.867095031279)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 529.576, 276.289);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(529.5760608797884,276.28861134245403)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 814.048, 287.979);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(814.0484330659541,287.9787160361901)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 713.921, 552.463);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(713.9211801836486,552.46269854151)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 724.667, 133.545);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(724.6673159417097,133.54545147911008)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 950.952, 382.155);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(950.9515298824464,382.1547946562389)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 538.201, 433.684);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(538.2006189679773,433.683621406548)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 829.737, 252.749);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(829.7368133530563,252.7493527012087)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 788.688, 555.028);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(788.6883405076464,555.0280688580337)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 571.389, 207.487);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(571.3886208741777,207.4873158324279)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 938.097, 266.237);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(938.0968881919671,266.2366887930615)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 668.046, 466.493);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(668.0465363750607,466.4931514213726)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 799.303, 138.894);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(799.3027386358257,138.8944424152127)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 917.982, 454.014);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(917.9823254740421,454.0143443593205)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 518.901, 357.362);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(518.9012515234691,357.3620021621653)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 917.714, 339.735);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(917.7142817579786,339.7345360931194)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 696.377, 510.121);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(696.3772038740984,510.12122467974484)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 645.867, 150.258);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(645.8668412404518,150.25788444688243)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 942.01, 300.945);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(942.0103119346783,300.9449323892193)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 657.916, 499.665);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(657.9163921602865,499.664924186561)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 901.708, 208.546);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(901.7084501709768,208.54620843567892)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 828.718, 539.173);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(828.7183649538492,539.1728039945518)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 550.26, 239.352);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(550.2602140219263,239.3522793331269)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 871.423, 247.299);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(871.4231753249123,247.29912438094226)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 729.939, 499.95);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(729.9385704874295,499.9500930298786)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 760.932, 132.934);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(760.9324595243454,132.93391777829038)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 937.967, 420.836);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(937.9671775188709,420.8363173255957)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 531.741, 396.389);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(531.7413033813257,396.38861941145643)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 855.079, 286.651);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(855.0792189101941,286.65093974967607)"/><circle class="node" r="18" source="2" dest="0" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 747.789, 560.809);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(747.7885094132854,560.8085516246451)"/></g><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"/><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><text visibility="visible" transform="translate(836.3546472986317,458.9142745276615)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 836.355, 458.914);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">paths.hpp</text><text visibility="visible" transform="translate(740.8379050647848,345.96801688159354)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 740.838, 345.968);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">errors.hpp</text><text visibility="visible" transform="translate(708.2133815922178,241.37118803747543)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 708.213, 241.371);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">random.hpp</text><text visibility="visible" transform="translate(790.0425481267592,448.00166585956526)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 790.043, 448.002);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">stl_utils.hpp</text><text visibility="visible" transform="translate(721.1543711230685,277.7293832053597)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 721.154, 277.729);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">threading.hpp</text><text visibility="visible" transform="translate(752.562675108501,239.41388426423694)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 752.563, 239.414);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">thread_local.hpp</text><text visibility="visible" transform="translate(657.3068774371656,344.8478721699392)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 657.307, 344.848);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">utils.hpp</text><text visibility="visible" transform="translate(673.54339211861,272.10792300044625)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 673.543, 272.108);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">errors.cc</text><text visibility="visible" transform="translate(839.8259625978553,499.1761906364176)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 839.826, 499.176);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">math.cc</text><text visibility="visible" transform="translate(684.4809670200691,310.81111332236776)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 684.481, 310.811);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">memory_utils.cc</text><text visibility="visible" transform="translate(743.5515169972964,203.62759318892446)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 743.552, 203.628);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">rethinkdb_backtrace.cc</text><text visibility="visible" transform="translate(828.7879063221969,413.33009624605376)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.075px 0px;transform:matrix(1, 0, 0, 1, 828.788, 413.33);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">threading.cc</text><text visibility="visible" transform="translate(640.3736093777813,303.7282496274763)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.075px 0px;transform:matrix(1, 0, 0, 1, 640.374, 303.728);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">time.cc</text><text visibility="visible" transform="translate(849.3001126514074,327.27870277729374)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 849.3, 327.279);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">utils.cc</text><text visibility="visible" transform="translate(628.2764235380885,386.6234767919944)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 628.276, 386.623);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">address.hpp</text><text visibility="visible" transform="translate(697.4173408969205,204.74552500053525)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 697.417, 204.746);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">barrier.hpp</text><text visibility="visible" transform="translate(901.6649209054941,489.89978119385125)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 901.665, 489.9);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">fd_send_recv.hpp</text><text visibility="visible" transform="translate(591.3465846745323,373.771560610794)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 591.347, 373.772);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">filesystem.hpp</text><text visibility="visible" transform="translate(827.767927410941,212.1176402208996)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 827.768, 212.118);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">spinlock.hpp</text><text visibility="visible" transform="translate(791.3652545146434,409.1264245404287)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 791.365, 409.126);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">types.hpp</text><text visibility="visible" transform="translate(630.9714054685545,266.33679556117414)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 630.971, 266.337);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">concurrency.hpp</text><text visibility="visible" transform="translate(861.806286668695,430.523242130676)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 861.806, 430.523);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">event_watcher.hpp</text><text visibility="visible" transform="translate(573.2471107316363,407.3996379066601)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 573.247, 407.4);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">network.cc</text><text visibility="visible" transform="translate(727.1727554585897,170.6461926531822)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.075px 0px;transform:matrix(1, 0, 0, 1, 727.173, 170.646);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">filestat.cc</text><text visibility="visible" transform="translate(765.7088958968952,482.067676919412)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 765.709, 482.068);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">callable_action.hpp</text><text visibility="visible" transform="translate(619.6484517051299,342.40001194266085)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 619.648, 342.4);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">context_switching.hpp</text><text visibility="visible" transform="translate(844.3397818989084,373.81017745654714)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 844.34, 373.81);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">context_switching.cc</text><text visibility="visible" transform="translate(697.2048885362833,375.1167894526717)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.075px 0px;transform:matrix(1, 0, 0, 1, 697.205, 375.117);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">thread_pool.cc</text><text visibility="visible" transform="translate(666.0067456841252,234.56024977383834)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 666.007, 234.56);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">poll.hpp</text><text visibility="visible" transform="translate(876.7744607766234,468.40706877567635)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 876.775, 468.407);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">kqueue.cc</text><text visibility="visible" transform="translate(608.1669067199107,474.24304487809746)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 608.167, 474.243);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">eventfd_event.hpp</text><text visibility="visible" transform="translate(788.5923050807672,207.19369960190983)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 788.592, 207.194);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">pipe_event.hpp</text><text visibility="visible" transform="translate(741.4770110666227,452.11876573542895)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 741.477, 452.119);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">eventfd_event.cc</text><text visibility="visible" transform="translate(600.2713425864904,302.60589054335645)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 600.271, 302.606);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">unistd.h</text><text visibility="visible" transform="translate(881.0403047736669,349.3135628024263)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 881.04, 349.314);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">pthread.cc</text><text visibility="visible" transform="translate(632.6737157002716,452.13758957233404)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 632.674, 452.138);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">traversal_progress.hpp</text><text visibility="visible" transform="translate(685.8409845337354,168.25130041875065)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 685.841, 168.251);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">blob.hpp</text><text visibility="visible" transform="translate(797.0359649604652,518.7640274105216)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 797.036, 518.764);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">cache_balancer.hpp</text><text visibility="visible" transform="translate(576.3323833347182,334.1240055074986)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 576.332, 334.124);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">cJSON.cc</text><text visibility="visible" transform="translate(767.0434723329114,281.62905361374095)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 767.043, 281.629);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">user_context.hpp</text><text visibility="visible" transform="translate(748.945973822077,414.6719520028453)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 748.946, 414.672);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">password.cc</text><text visibility="visible" transform="translate(634.1422009254876,221.6278706818793)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 634.142, 221.628);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">permissions.cc</text><text visibility="visible" transform="translate(878.2258029153858,389.594456733557)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 878.226, 389.594);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">permissions_artificial_table_backend.cc</text><text visibility="visible" transform="translate(663.5361805110967,428.3686369485256)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 663.536, 428.369);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">user.cc</text><text visibility="visible" transform="translate(812.1690844111868,175.1781350745738)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 812.169, 175.178);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">http.hpp</text><text visibility="visible" transform="translate(804.0249919585455,482.5431701774745)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 804.025, 482.543);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">http.cc</text><text visibility="visible" transform="translate(556.3911066663597,301.55177290348905)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 556.391, 301.552);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">http_parser.cc</text><text visibility="visible" transform="translate(805.7153800970239,365.4012184870461)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 805.715, 365.401);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">windows_service.hpp</text><text visibility="visible" transform="translate(609.2107711270542,422.5705794335421)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 609.211, 422.571);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">command_line.cc</text><text visibility="visible" transform="translate(653.938977692665,190.05818488652042)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 653.939, 190.058);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">options.cc</text><text visibility="visible" transform="translate(917.4948907731062,378.90293439119637)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 917.495, 378.903);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">path.cc</text><text visibility="visible" transform="translate(575.2570824869566,447.18807527513496)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 575.257, 447.188);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">raft_core.hpp</text><text visibility="visible" transform="translate(841.6342305194023,157.94574891777552)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 841.634, 157.946);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">metadata.hpp</text><text visibility="visible" transform="translate(648.7062635156881,544.6882465619002)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 648.706, 544.688);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">cond_var.hpp</text><text visibility="visible" transform="translate(601.1492038781848,246.08448574951709)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 601.149, 246.085);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">interruptor.hpp</text><text visibility="visible" transform="translate(915.3860234901634,239.71951299880143)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 915.386, 239.72);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">mutex.hpp</text><text visibility="visible" transform="translate(662.4505137025499,390.50391803894144)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 662.45, 390.504);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">signal.hpp</text><text visibility="visible" transform="translate(770.2925545310885,170.28013561465926)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 770.293, 170.28);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">passive_producer.hpp</text><text visibility="visible" transform="translate(755.7757881636716,524.9682096764137)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 755.776, 524.968);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">buffer_group.hpp</text><text visibility="visible" transform="translate(526.8767067131655,321.43395706731854)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 526.877, 321.434);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">counted.hpp</text><text visibility="visible" transform="translate(803.9478255158714,321.62502403612217)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 803.948, 321.625);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">half_intrusive_list.hpp</text><text visibility="visible" transform="translate(705.0503522568059,464.6838306626913)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 705.05, 464.684);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">intrusive_list.hpp</text><text visibility="visible" transform="translate(610.1701808947042,169.33824832765225)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 610.17, 169.338);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">intrusive_priority_queue.hpp</text><text visibility="visible" transform="translate(953.3740576240881,338.41932829107856)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 953.374, 338.419);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">lru_cache.hpp</text><text visibility="visible" transform="translate(565.3070560354237,480.3858558632255)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 565.307, 480.386);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">object_buffer.hpp</text><text visibility="visible" transform="translate(861.9506995694643,211.0489702537637)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 861.951, 211.049);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">optional.hpp</text><text visibility="visible" transform="translate(681.6406026467424,547.9035153867922)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 681.641, 547.904);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">printf_buffer.hpp</text><text visibility="visible" transform="translate(575.3758705431537,268.4790162901981)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 575.376, 268.479);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">scoped.hpp</text><text visibility="visible" transform="translate(896.8313425768749,276.1596321471386)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 896.831, 276.16);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">segmented_vector.hpp</text><text visibility="visible" transform="translate(705.9462566456384,421.52281315477813)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 705.946, 421.523);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">shared_buffer.hpp</text><text visibility="visible" transform="translate(687.2370062889704,133.63742505882257)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 687.237, 133.637);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">two_level_array.hpp</text><text visibility="visible" transform="translate(898.6300816185096,421.21125134992695)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 898.63, 421.211);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">uuid.hpp</text><text visibility="visible" transform="translate(552.5202972953502,365.0621198013492)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 552.52, 365.062);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">boost_types.hpp</text><text visibility="visible" transform="translate(791.077308714627,247.25635900917726)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 791.077, 247.256);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">socket_stream.hpp</text><text visibility="visible" transform="translate(627.6571475818321,517.7271716654354)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 627.657, 517.727);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">socket_stream.cc</text><text visibility="visible" transform="translate(604.4063552688295,204.3192416827734)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 604.406, 204.319);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">http_job.hpp</text><text visibility="visible" transform="translate(894.2716096741442,310.3492833787897)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 894.272, 310.349);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">http_runner.hpp</text><text visibility="visible" transform="translate(595.6577581625892,508.3266432515729)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 595.658, 508.327);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">js_runner.hpp</text><text visibility="visible" transform="translate(874.272170111291,178.17654012340302)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 874.272, 178.177);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">utf8.hpp</text><text visibility="visible" transform="translate(866.5653842885757,517.867095031279)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 866.565, 517.867);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">filter.hpp</text><text visibility="visible" transform="translate(529.5760608797884,276.28861134245403)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.075px 0px;transform:matrix(1, 0, 0, 1, 529.576, 276.289);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">filter.cc</text><text visibility="visible" transform="translate(814.0484330659541,287.9787160361901)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 814.048, 287.979);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">pprint.hpp</text><text visibility="visible" transform="translate(713.9211801836486,552.46269854151)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 713.921, 552.463);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">rapidjson.h</text><text visibility="visible" transform="translate(724.6673159417097,133.54545147911008)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 724.667, 133.545);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">changefeed.hpp</text><text visibility="visible" transform="translate(950.9515298824464,382.1547946562389)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 950.952, 382.155);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">datumspec.hpp</text><text visibility="visible" transform="translate(538.2006189679773,433.683621406548)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 538.201, 433.684);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">erase_range.hpp</text><text visibility="visible" transform="translate(829.7368133530563,252.7493527012087)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 829.737, 252.749);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">error.hpp</text><text visibility="visible" transform="translate(788.6883405076464,555.0280688580337)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 788.688, 555.028);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">func.hpp</text><text visibility="visible" transform="translate(571.3886208741777,207.4873158324279)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 571.389, 207.487);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">order_util.hpp</text><text visibility="visible" transform="translate(938.0968881919671,266.2366887930615)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 938.097, 266.237);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">profile.hpp</text><text visibility="visible" transform="translate(668.0465363750607,466.4931514213726)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.325px 0px;transform:matrix(1, 0, 0, 1, 668.046, 466.493);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">protocol.hpp</text><text visibility="visible" transform="translate(799.3027386358257,138.8944424152127)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 799.303, 138.894);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">term_storage.hpp</text><text visibility="visible" transform="translate(917.9823254740421,454.0143443593205)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 917.982, 454.014);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">datum.cc</text><text visibility="visible" transform="translate(518.9012515234691,357.3620021621653)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 518.901, 357.362);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">profile.cc</text><text visibility="visible" transform="translate(917.7142817579786,339.7345360931194)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 917.714, 339.735);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">pseudo_binary.cc</text><text visibility="visible" transform="translate(696.3772038740984,510.12122467974484)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 696.377, 510.121);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">pseudo_time.cc</text><text visibility="visible" transform="translate(645.8668412404518,150.25788444688243)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 645.867, 150.258);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">shards.cc</text><text visibility="visible" transform="translate(942.0103119346783,300.9449323892193)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 942.01, 300.945);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">logging.h</text><text visibility="visible" transform="translate(657.9163921602865,499.664924186561)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 657.916, 499.665);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">strutil.cc</text><text visibility="visible" transform="translate(901.7084501709768,208.54620843567892)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 901.708, 208.546);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">exactfloat.cc</text><text visibility="visible" transform="translate(828.7183649538492,539.1728039945518)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 828.718, 539.173);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">serialize_macros.hpp</text><text visibility="visible" transform="translate(550.2602140219263,239.3522793331269)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 550.26, 239.352);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">buf_ptr.hpp</text><text visibility="visible" transform="translate(871.4231753249123,247.29912438094226)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 871.423, 247.299);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">merger.cc</text><text visibility="visible" transform="translate(729.9385704874295,499.9500930298786)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 729.939, 499.95);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">data_block_manager.cc</text><text visibility="visible" transform="translate(760.9324595243454,132.93391777829038)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 760.932, 132.934);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">metablock_manager.cc</text><text visibility="visible" transform="translate(937.9671775188709,420.8363173255957)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 937.967, 420.836);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">mock_file.hpp</text><text visibility="visible" transform="translate(531.7413033813257,396.38861941145643)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.3375px 0px;transform:matrix(1, 0, 0, 1, 531.741, 396.389);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">rdb_env.hpp</text><text visibility="visible" transform="translate(855.0792189101941,286.65093974967607)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.075px 0px;transform:matrix(1, 0, 0, 1, 855.079, 286.651);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">fifo_enforcer.cc</text><text visibility="visible" transform="translate(747.7885094132854,560.8085516246451)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2375px 0px;transform:matrix(1, 0, 0, 1, 747.789, 560.809);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">options_test.cc</text></g></g></svg>
@@ -37,8 +37,11 @@ doc = <<DOCOPT
37
37
  Cpp Dependency Graph
38
38
 
39
39
  Usage:
40
- cpp_dependency_graph visualise --root_dir <argument> [--component <component>] [--output_file <file>] [--output_format <format>]
41
- cpp_dependency_graph visualise_includes --root_dir <argument> [--component <component>] [--output_file <file>] [--output_format <format>]
40
+ cpp_dependency_graph visualise_component --root_dir <argument> --component <component> [--output_file <file>] [--output_format <format>]
41
+ cpp_dependency_graph visualise_project --root_dir <argument> [--output_file <file>] [--output_format <format>]
42
+ cpp_dependency_graph visualise_component_includes --root_dir <argument> --component <component> [--output_file <file>] [--output_format <format>]
43
+ cpp_dependency_graph visualise_header_includes --root_dir <argument> --header <header> [--output_file <file>] [--output_format <format>]
44
+ cpp_dependency_graph visualise_project_includes --root_dir <argument> [--output_file <file>] [--output_format <format>]
42
45
  cpp_dependency_graph visualise_components --root_dir <argument> [--output_file <file>] [--output_format <format>]
43
46
  cpp_dependency_graph visualise_cyclic_deps --root_dir <argument> [--component <component>] [--output_file <file>] [--output_format <format>]
44
47
  cpp_dependency_graph -h | --help | -v | --version
@@ -47,9 +50,10 @@ doc = <<DOCOPT
47
50
  -h --help show this help message and exit
48
51
  -v --version show version and exit
49
52
  -r --root_dir dir top level root directory of C/C++ project
50
- -c --component component component generate visualisation for (case sensitive!)
51
53
  -o --output_file file name of output file to be generated [default: deps.html]
52
54
  -f --output_format format format of output file (dot, html, graphml, json) [default: html]
55
+ --component component component generate visualisation for (case sensitive!)
56
+ --header file header file to generate visualisation for (case sensitive!)
53
57
  DOCOPT
54
58
 
55
59
  begin
@@ -67,18 +71,16 @@ begin
67
71
  Kernel.exit(1)
68
72
  end
69
73
 
70
- if args['visualise']
71
- if args['--component']
72
- generate_component_graph(project_dir, args['--component'], args['--output_format'], args['--output_file'])
73
- else
74
- generate_project_graph(project_dir, args['--output_format'], args['--output_file'])
75
- end
76
- elsif args['visualise_includes']
77
- if args['--component']
78
- generate_component_include_graph(project_dir, args['--component'], args['--output_format'], args['--output_file'])
79
- else
80
- generate_project_include_graph(project_dir, args['--output_format'], args['--output_file'])
81
- end
74
+ if args['visualise_component']
75
+ generate_component_graph(project_dir, args['--component'], args['--output_format'], args['--output_file'])
76
+ elsif args['visualise_project']
77
+ generate_project_graph(project_dir, args['--output_format'], args['--output_file'])
78
+ elsif args['visualise_component_includes']
79
+ generate_component_include_graph(project_dir, args['--component'], args['--output_format'], args['--output_file'])
80
+ elsif args['visualise_header_includes']
81
+ generate_file_include_graph(project_dir, args['--header'], args['--output_format'], args['--output_file'])
82
+ elsif args['visualise_project_includes']
83
+ generate_project_include_graph(project_dir, args['--output_format'], args['--output_file'])
82
84
  elsif args['visualise_components']
83
85
  generate_enclosure_diagram(project_dir, args['--output_file'])
84
86
  elsif args['visualise_cyclic_deps']
@@ -5,7 +5,8 @@ require_relative 'cpp_dependency_graph/component_dependency_graph'
5
5
  require_relative 'cpp_dependency_graph/dir_tree'
6
6
  require_relative 'cpp_dependency_graph/graph_to_dot_visualiser'
7
7
  require_relative 'cpp_dependency_graph/graph_to_html_visualiser'
8
- require_relative 'cpp_dependency_graph/include_dependency_graph'
8
+ require_relative 'cpp_dependency_graph/include_component_dependency_graph'
9
+ require_relative 'cpp_dependency_graph/include_file_dependency_graph'
9
10
  require_relative 'cpp_dependency_graph/project'
10
11
  require_relative 'cpp_dependency_graph/version'
11
12
 
@@ -25,16 +26,23 @@ module CppDependencyGraph
25
26
  generate_visualisation(deps, format, output_file)
26
27
  end
27
28
 
29
+ def generate_file_include_graph(project_dir, file_name, format, output_file)
30
+ project = Project.new(project_dir)
31
+ graph = IncludeFileDependencyGraph.new(project)
32
+ deps = graph.links(file_name)
33
+ generate_visualisation(deps, format, output_file)
34
+ end
35
+
28
36
  def generate_component_include_graph(project_dir, component_name, format, output_file)
29
37
  project = Project.new(project_dir)
30
- graph = IncludeDependencyGraph.new(project)
38
+ graph = IncludeComponentDependencyGraph.new(project)
31
39
  deps = graph.links(component_name)
32
40
  generate_visualisation(deps, format, output_file)
33
41
  end
34
42
 
35
43
  def generate_project_include_graph(project_dir, format, output_file)
36
44
  project = Project.new(project_dir)
37
- graph = IncludeDependencyGraph.new(project)
45
+ graph = IncludeComponentDependencyGraph.new(project)
38
46
  deps = graph.all_links
39
47
  generate_visualisation(deps, format, output_file)
40
48
  end
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'graphviz'
3
+ require 'ruby-graphviz'
4
4
 
5
- # Outputs a `dot` langugage representation of a dependency graph
5
+ # Outputs a `dot` language representation of a dependency graph
6
6
  class GraphToDotVisualiser
7
7
  def generate(deps, file)
8
- @g = Graphviz::Graph.new('dependency_graph')
8
+ @g = GraphViz.new('dependency_graph')
9
9
  nodes = create_nodes(deps)
10
10
  connect_nodes(deps, nodes)
11
- File.write(file, @g.to_dot)
11
+ @g.output(:dot => file)
12
12
  end
13
13
 
14
14
  private
@@ -22,16 +22,18 @@ class GraphToDotVisualiser
22
22
  end
23
23
 
24
24
  def create_node(name)
25
- node = @g.add_node(name)
26
- node.attributes[:shape] = 'box3d'
25
+ node = @g.add_node(name, :shape => 'box3d')
27
26
  node
28
27
  end
29
28
 
30
29
  def connect_nodes(deps, nodes)
31
30
  deps.each do |source, links|
32
31
  links.each do |link|
33
- connection = nodes[source].connect(nodes[link.target])
34
- connection.attributes[:color] = 'red' if link.cyclic?
32
+ if link.cyclic?
33
+ @g.add_edges(source, link.target, :color => 'red')
34
+ else
35
+ @g.add_edges(source, link.target)
36
+ end
35
37
  end
36
38
  end
37
39
  end
@@ -5,7 +5,7 @@ require_relative 'link'
5
5
  require_relative 'cycle_detector'
6
6
 
7
7
  # Returns a hash of intra-component include links
8
- class IncludeDependencyGraph
8
+ class IncludeComponentDependencyGraph
9
9
  def initialize(project)
10
10
  @project = project
11
11
  end
@@ -14,9 +14,8 @@ class IncludeDependencyGraph
14
14
  components = @project.source_components
15
15
  all_source_files = components.values.flat_map(&:source_files)
16
16
  all_source_files.map do |file|
17
- source = file.basename
18
- links = file.includes.map { |inc| Link.new(source, inc, false) }
19
- [source, links]
17
+ links = file.includes.map { |inc| Link.new(file.basename, inc, false) }
18
+ [file.basename, links]
20
19
  end.to_h
21
20
  end
22
21
 
@@ -30,10 +29,9 @@ class IncludeDependencyGraph
30
29
  external_includes = @project.external_includes(component)
31
30
  source_files.map do |file|
32
31
  # TODO: Very inefficient
33
- source = file.basename
34
32
  internal_includes = file.includes.reject { |inc| external_includes.any?(inc) }
35
- links = internal_includes.map { |inc| Link.new(source, inc, false) }
36
- [source, links]
33
+ links = internal_includes.map { |inc| Link.new(file.basename, inc, false) }
34
+ [file.basename, links]
37
35
  end.to_h
38
36
  end
39
37
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'project'
4
+ require_relative 'link'
5
+ require_relative 'cycle_detector'
6
+
7
+ # Returns a hash of individual file include links
8
+ class IncludeFileDependencyGraph
9
+ def initialize(project)
10
+ @project = project
11
+ end
12
+
13
+ def all_links
14
+ # TODO: Implement
15
+ {}
16
+ end
17
+
18
+ def all_cyclic_links
19
+ # TODO: Implement
20
+ end
21
+
22
+ def links(file_name)
23
+ components = @project.source_components
24
+ all_source_files = components.values.flat_map(&:source_files)
25
+ files = all_source_files.select do |file|
26
+ file.includes.include?(file_name)
27
+ end
28
+ files.map do |file|
29
+ links = [Link.new(file.basename, file_name, false)]
30
+ [file.basename, links]
31
+ end.to_h
32
+ end
33
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CppDependencyGraph
4
- VERSION = '0.1.3'
4
+ VERSION = '0.4.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cpp_dependency_graph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shreyas Balakrishna
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-26 00:00:00.000000000 Z
11
+ date: 2020-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docopt
@@ -25,61 +25,47 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.6'
27
27
  - !ruby/object:Gem::Dependency
28
- name: graphviz
28
+ name: ruby-graphviz
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: '1.2'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.0'
40
+ version: '1.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: json
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '2.1'
47
+ version: 2.3.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '2.1'
55
- - !ruby/object:Gem::Dependency
56
- name: parallel
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '1.12'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '1.12'
54
+ version: 2.3.0
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: bundler
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - "~>"
74
60
  - !ruby/object:Gem::Version
75
- version: '1.16'
61
+ version: '2.1'
76
62
  type: :development
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
- version: '1.16'
68
+ version: '2.1'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: debase
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -100,84 +86,84 @@ dependencies:
100
86
  requirements:
101
87
  - - "~>"
102
88
  - !ruby/object:Gem::Version
103
- version: '12.3'
89
+ version: '13.0'
104
90
  type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
94
  - - "~>"
109
95
  - !ruby/object:Gem::Version
110
- version: '12.3'
96
+ version: '13.0'
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: rspec
113
99
  requirement: !ruby/object:Gem::Requirement
114
100
  requirements:
115
101
  - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: '3.7'
103
+ version: '3.9'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
108
  - - "~>"
123
109
  - !ruby/object:Gem::Version
124
- version: '3.7'
110
+ version: '3.9'
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: rubocop
127
113
  requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
115
  - - "~>"
130
116
  - !ruby/object:Gem::Version
131
- version: '0.55'
117
+ version: '0.81'
132
118
  type: :development
133
119
  prerelease: false
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
122
  - - "~>"
137
123
  - !ruby/object:Gem::Version
138
- version: '0.55'
124
+ version: '0.81'
139
125
  - !ruby/object:Gem::Dependency
140
126
  name: ruby-debug-ide
141
127
  requirement: !ruby/object:Gem::Requirement
142
128
  requirements:
143
129
  - - "~>"
144
130
  - !ruby/object:Gem::Version
145
- version: '0.6'
131
+ version: '0.7'
146
132
  type: :development
147
133
  prerelease: false
148
134
  version_requirements: !ruby/object:Gem::Requirement
149
135
  requirements:
150
136
  - - "~>"
151
137
  - !ruby/object:Gem::Version
152
- version: '0.6'
138
+ version: '0.7'
153
139
  - !ruby/object:Gem::Dependency
154
140
  name: ruby-prof
155
141
  requirement: !ruby/object:Gem::Requirement
156
142
  requirements:
157
143
  - - "~>"
158
144
  - !ruby/object:Gem::Version
159
- version: '0.17'
145
+ version: '0.18'
160
146
  type: :development
161
147
  prerelease: false
162
148
  version_requirements: !ruby/object:Gem::Requirement
163
149
  requirements:
164
150
  - - "~>"
165
151
  - !ruby/object:Gem::Version
166
- version: '0.17'
152
+ version: '0.18'
167
153
  - !ruby/object:Gem::Dependency
168
154
  name: simplecov
169
155
  requirement: !ruby/object:Gem::Requirement
170
156
  requirements:
171
157
  - - "~>"
172
158
  - !ruby/object:Gem::Version
173
- version: '0.16'
159
+ version: '0.18'
174
160
  type: :development
175
161
  prerelease: false
176
162
  version_requirements: !ruby/object:Gem::Requirement
177
163
  requirements:
178
164
  - - "~>"
179
165
  - !ruby/object:Gem::Version
180
- version: '0.16'
166
+ version: '0.18'
181
167
  - !ruby/object:Gem::Dependency
182
168
  name: simplecov-console
183
169
  requirement: !ruby/object:Gem::Requirement
@@ -224,6 +210,7 @@ files:
224
210
  - docs/examples/leveldb_overall_d3.png
225
211
  - docs/examples/leveldb_overall_d3.svg
226
212
  - docs/examples/rethinkdb_cyclic_deps.svg
213
+ - docs/examples/rethinkdb_errors_header_include.svg
227
214
  - docs/examples/rethinkdb_queue_component.png
228
215
  - docs/examples/rethinkdb_queue_component.svg
229
216
  - docs/examples/rethinkdb_queue_component_d3.png
@@ -248,7 +235,8 @@ files:
248
235
  - lib/cpp_dependency_graph/graph_to_dot_visualiser.rb
249
236
  - lib/cpp_dependency_graph/graph_to_graphml_visualiser.rb
250
237
  - lib/cpp_dependency_graph/graph_to_html_visualiser.rb
251
- - lib/cpp_dependency_graph/include_dependency_graph.rb
238
+ - lib/cpp_dependency_graph/include_component_dependency_graph.rb
239
+ - lib/cpp_dependency_graph/include_file_dependency_graph.rb
252
240
  - lib/cpp_dependency_graph/include_to_component_resolver.rb
253
241
  - lib/cpp_dependency_graph/link.rb
254
242
  - lib/cpp_dependency_graph/project.rb
@@ -270,15 +258,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
270
258
  requirements:
271
259
  - - ">="
272
260
  - !ruby/object:Gem::Version
273
- version: 2.4.0
261
+ version: 2.7.0
274
262
  required_rubygems_version: !ruby/object:Gem::Requirement
275
263
  requirements:
276
264
  - - ">="
277
265
  - !ruby/object:Gem::Version
278
266
  version: '0'
279
267
  requirements: []
280
- rubyforge_project:
281
- rubygems_version: 2.7.6
268
+ rubygems_version: 3.1.2
282
269
  signing_key:
283
270
  specification_version: 4
284
271
  summary: CppDependencyGraph is a program that generates dependency visualisations