Compare commits
1141 Commits
Author | SHA1 | Date | |
---|---|---|---|
8df4cf2895 | |||
dad62e132e | |||
0d4131ae68 | |||
a2539e1892 | |||
210659e6c3 | |||
15a0fb1fa9 | |||
4db31f5b48 | |||
b38a535c63 | |||
218b02aaf8 | |||
d6e7cbd4e8 | |||
f2fda14333 | |||
1c576d4a68 | |||
f6232e1b3c | |||
ad71fa3f12 | |||
9c326c7c71 | |||
ac545cadaf | |||
082d8fff36 | |||
2c3632a042 | |||
7b23e79922 | |||
9afd14a0c6 | |||
f42aa34ab6 | |||
43af91ff4b | |||
a920a0f946 | |||
4a8a6d0b3f | |||
a64b8a2705 | |||
0198f9e8af | |||
1582a3a927 | |||
e713f0e5fb | |||
77031000c4 | |||
635a962fba | |||
c59ec2dcff | |||
abc6c5e264 | |||
87cfac12dd | |||
60b43e34b6 | |||
9ab6222f03 | |||
2298dd5c07 | |||
822d166115 | |||
8f71580615 | |||
cc3352ff06 | |||
8f5928b7c7 | |||
888e9617ff | |||
4695c4cf7d | |||
bbfc56ff7f | |||
4103d99018 | |||
c375ce1fcd | |||
df813b31c5 | |||
7db92e2951 | |||
6585518f78 | |||
6398e256e4 | |||
b64ebb45e7 | |||
307ac66d9c | |||
dc02f2ea8b | |||
b7386f9d84 | |||
223f9707ca | |||
ea5b00364f | |||
fb98df76b7 | |||
4ddbf8d509 | |||
aa80f69171 | |||
0ace22d03f | |||
0e6aca5a7e | |||
3f04226864 | |||
d308eed136 | |||
ed1149c8e0 | |||
48f58a88bc | |||
d238371b0c | |||
0b7e8d0162 | |||
18fd52367e | |||
2d665da3e1 | |||
5ef06a9d36 | |||
f4622d67e9 | |||
b65c9ea544 | |||
cc7c6c960e | |||
01697a9f5c | |||
ab361a8073 | |||
ec5c02cb7f | |||
e8124324ff | |||
1720fe6a46 | |||
e50bc0d34b | |||
45774dc4aa | |||
ea8d9d1aea | |||
221866f74e | |||
3e96d59359 | |||
8c19b6268c | |||
8ae26867c5 | |||
19baaea0da | |||
e3cebcf82d | |||
ccad5d5aaf | |||
d0bcde001e | |||
83a8e82626 | |||
7305a1f407 | |||
3975c7f8c9 | |||
ac1d075d73 | |||
73a278dc64 | |||
a042ee609a | |||
0d5c1239c6 | |||
027ec71aa9 | |||
ef718c651e | |||
fc2a0d53d9 | |||
bb47844ae6 | |||
b997d3eb4e | |||
9bcca268a3 | |||
8a2d4e2f72 | |||
335675c51c | |||
1bf2285fa2 | |||
71f77a8e0a | |||
644a7f9a44 | |||
965361ff69 | |||
4593d333c7 | |||
940519ea5a | |||
a0bcbf70d5 | |||
17fb8258e5 | |||
c350543b46 | |||
5b4ecb01ca | |||
28b115497f | |||
0604029661 | |||
2374cf09e2 | |||
ab475e4849 | |||
1c97b31eaf | |||
bd257050e3 | |||
2d362ed337 | |||
cb7117beac | |||
b358ff66e1 | |||
6309c97697 | |||
58727463e1 | |||
741d148a0d | |||
127553ce4b | |||
ecb055a252 | |||
dfa6fbaa0c | |||
cf11d4c7dc | |||
d0a4686990 | |||
2542d5dd42 | |||
1e0f2b2446 | |||
a8028fbb93 | |||
ed87229cec | |||
c4fd81fc1c | |||
ad43babe3d | |||
36c0cb052b | |||
ed58bcda4c | |||
268bb1b59b | |||
059764586a | |||
72b11081a4 | |||
0bbee9456f | |||
fcac910989 | |||
2e9ba149f2 | |||
d3712dd26d | |||
60877f9ba4 | |||
4f2c76150f | |||
137577fb86 | |||
bf623219d2 | |||
25d1f841ee | |||
517fe73734 | |||
890919d140 | |||
33ea1e0edd | |||
7614af2a45 | |||
1528959327 | |||
46b6cedff4 | |||
8d8f28c1d0 | |||
df782b93ae | |||
124f77cdb1 | |||
fc15f74c3c | |||
1d06aa3b31 | |||
0b263f8714 | |||
84b3e12e1f | |||
669282ae69 | |||
485806c488 | |||
1412ee1ca6 | |||
ef5fb6fa46 | |||
99432833d2 | |||
fa00803fbf | |||
04ef977509 | |||
87c6508305 | |||
ed0c1d3b52 | |||
8b5598fabd | |||
5b070ad014 | |||
6246405afd | |||
27c8ba6afc | |||
b832a03315 | |||
09686290bc | |||
4aaa7b30ca | |||
fe590da3b6 | |||
a7fa92b372 | |||
a25e57c397 | |||
eed676113e | |||
b57f24f1bc | |||
0e084358b4 | |||
f016c9a669 | |||
59ba1df910 | |||
71a2c90f21 | |||
8436457e75 | |||
3ac0192d40 | |||
3db159f616 | |||
e21f5c784e | |||
65c24db83c | |||
ed5101b031 | |||
1420628b28 | |||
15ab966ed1 | |||
b5a735878a | |||
b6d09f1901 | |||
78f6ddc5b7 | |||
4e595e8e3c | |||
79249360f7 | |||
336d5136bf | |||
0c8cee8c4a | |||
4c0420b884 | |||
0d7e093415 | |||
c835749563 | |||
0172d2a065 | |||
927f272f0e | |||
5e2891ae5d | |||
4f85481a2b | |||
d314e0395a | |||
69a6d07371 | |||
fab8ef379f | |||
408ef8b2cb | |||
a2a2f1c2d2 | |||
dc2888c9a3 | |||
9739be9ecf | |||
e61257695f | |||
b9988b62e4 | |||
d6b3961530 | |||
6d0be323ad | |||
09256adbc3 | |||
8e3a7da596 | |||
7d96510d17 | |||
0fd795a676 | |||
eff876881b | |||
9adf0d4ee0 | |||
3bc9789e8d | |||
fd207b6907 | |||
2226c1b75c | |||
a0964bb2c2 | |||
b5383b8b54 | |||
39f86050a6 | |||
a03d441e6f | |||
3900d09f6f | |||
e218f4e56e | |||
81ba18eea6 | |||
1671ece9df | |||
775fa0c968 | |||
dd276138c2 | |||
0c55b37976 | |||
966d077431 | |||
400412d76c | |||
c7e77a2238 | |||
64c42e28dc | |||
c2baf7b07d | |||
a52a9afa3c | |||
669502ede7 | |||
b19f730527 | |||
d5ff5f4739 | |||
1c82f84595 | |||
bea9cd9684 | |||
1bc9a9c23b | |||
c4faccc77f | |||
e6803daf10 | |||
effe6e3ff3 | |||
0d6c233747 | |||
015e696077 | |||
7faab2072c | |||
83718a3b3e | |||
4a074133f7 | |||
12eff5a2f9 | |||
4197cce8c9 | |||
fed3817ed3 | |||
4ffd7693d6 | |||
1596c961d9 | |||
fd7d5cbe0d | |||
7058287273 | |||
912aafcefd | |||
2f34f433b3 | |||
1ff4dd9a9a | |||
fdcaad96c7 | |||
14a72b0fc0 | |||
c13ab9f14e | |||
cff1bc6e71 | |||
bb6c4efe9b | |||
c324e71768 | |||
e2570c98ee | |||
b5125479ec | |||
989355e885 | |||
a2f2c46f87 | |||
605623baf5 | |||
fdc452c536 | |||
1b391dd36b | |||
917067741a | |||
34ed93d57c | |||
d400a64b9a | |||
2c7447b73e | |||
c0f0fa24f8 | |||
bda5f949bb | |||
992e985972 | |||
afaa359b0d | |||
3c17db41dc | |||
d62ed4f6b3 | |||
79f3194d0c | |||
b045f9a50d | |||
ce231602dc | |||
6f5e0cd161 | |||
1269a79a4d | |||
1b3424ff61 | |||
8b8033c72b | |||
7ca0109732 | |||
6b5172d002 | |||
9e19a635bb | |||
15193d0e1f | |||
f1c5c72e62 | |||
25dfed207c | |||
006cbee88a | |||
c95e5346a4 | |||
e54bf563b5 | |||
8f79327190 | |||
a197ac092a | |||
1e2b55c0d7 | |||
964ff522be | |||
934c32cbc6 | |||
9bd6be779f | |||
ce70d6eedc | |||
3a0d13aa77 | |||
f9323c5273 | |||
7587656cf6 | |||
023074650f | |||
d854e90c23 | |||
3aabeb2b81 | |||
65f5885bce | |||
7a132eabb4 | |||
7e1b380f01 | |||
1a2d9b8eed | |||
6eefa0b72d | |||
44372db955 | |||
e24cce4aed | |||
a8595c0418 | |||
340424e03a | |||
93036bec01 | |||
663e98969d | |||
37d1daf58e | |||
1a18f0ca55 | |||
bb950ec93e | |||
39ab3557a3 | |||
dcdc46b97c | |||
da3ed0dfb3 | |||
e391b9fb90 | |||
e346cdad26 | |||
7e4c6ff218 | |||
356f246a74 | |||
80da552834 | |||
2dd8ab197d | |||
1fe11e9ae2 | |||
21d5fe6272 | |||
52bc4a3598 | |||
cccaacee36 | |||
ebf6e1c0e9 | |||
5cf090c896 | |||
cc299053cc | |||
82b75796f9 | |||
a560d94a9f | |||
0827d52c6f | |||
a8d33c9950 | |||
43c32ea280 | |||
30d40e9a32 | |||
e28508ad56 | |||
182e4cec86 | |||
a32de96ab1 | |||
0de35fdd1f | |||
470d9cd752 | |||
87598c7612 | |||
57bf618627 | |||
c576a707b0 | |||
b78b1bbfa9 | |||
e710964d05 | |||
2d00657756 | |||
0526d4ff21 | |||
76e20015a4 | |||
f5e797e3aa | |||
787e36a28f | |||
8572b57834 | |||
ed0129f881 | |||
78836a9e22 | |||
4c08184379 | |||
da165d6943 | |||
8ffccfbaff | |||
a6d083d69d | |||
91bae9d510 | |||
f0f185509f | |||
5947ef7706 | |||
4f663a2a86 | |||
1d01777a13 | |||
6d3b8b6d7d | |||
50c1c08235 | |||
b16c30b4c6 | |||
ff1ca1e0d3 | |||
721c4378c1 | |||
5f4e0c7e3e | |||
e6af4511a8 | |||
965ad778dd | |||
3b78be83cf | |||
564cd4e09d | |||
699ca5fec1 | |||
f91ffbbfdf | |||
156292e408 | |||
81ae44f858 | |||
c948814eae | |||
b5dba77056 | |||
ef06d165b4 | |||
5cb23c814d | |||
8f7ded33e0 | |||
a17d5795fb | |||
ad4d41e602 | |||
9754fc789e | |||
fd3c6eb320 | |||
b7b68ecdba | |||
08ba27627d | |||
27d2c0aaf3 | |||
b714a4be63 | |||
2356b25c58 | |||
05cad05505 | |||
1e3082fbc0 | |||
80d2573b10 | |||
6adcdc41f4 | |||
2d08dddfc8 | |||
6da8f49d8b | |||
bcd072c5e8 | |||
e90a31781c | |||
2e89ec9105 | |||
865c42465a | |||
73c93cc345 | |||
cf32fdf672 | |||
c33b54794c | |||
6775e83420 | |||
719785a8d3 | |||
287995ffdf | |||
0e506a53b5 | |||
70e1a15973 | |||
09cff5e4cc | |||
57858b8015 | |||
07855e3125 | |||
2f5f8e7afd | |||
43897de12e | |||
4b577aa77b | |||
85c3d64f29 | |||
47dd293904 | |||
c4220a4853 | |||
48ab88a2af | |||
d9cf9709d2 | |||
9720c894f1 | |||
8dad3af36d | |||
e5425d4a27 | |||
58e6d4aabb | |||
9ce142606c | |||
e75a64a8a2 | |||
bc71e1b612 | |||
580ca36a62 | |||
447fe48d2a | |||
e8a6c8cd6d | |||
a8fd42c1df | |||
e782c26908 | |||
cd65a1e172 | |||
6e51c5685e | |||
84a37a2c0c | |||
7e94cc2cc3 | |||
7002ccb866 | |||
4fe0b116ae | |||
a0fb9de515 | |||
5d42dcc9ec | |||
96e88c90e8 | |||
75d94240ed | |||
6c544708e1 | |||
078e7246ac | |||
06cff1fb9f | |||
2e8bbed75b | |||
a707c9410e | |||
a956bb08d8 | |||
db52cc6749 | |||
73c6224a95 | |||
a217920561 | |||
48a36f59a6 | |||
965b132664 | |||
63f185f9bf | |||
e97b0088f2 | |||
374c17a0d9 | |||
4b3bc587ab | |||
06c63f2026 | |||
6b7d9942a7 | |||
760a56964f | |||
6ca575b5a3 | |||
ce1d36cacb | |||
87b2525e03 | |||
faa77aca2e | |||
5d2158792c | |||
e1ebaa902b | |||
e0564f628e | |||
44e45aa090 | |||
89f5f336af | |||
727be309b2 | |||
ce2d7a2d5a | |||
fad6c7201e | |||
8f0e1f3349 | |||
6f7d0c6928 | |||
120c8f244c | |||
352a367570 | |||
9f65d22909 | |||
141131f3a6 | |||
488420fdf2 | |||
10e6b8f769 | |||
419da18405 | |||
7329d4bf3a | |||
c8fe4043b6 | |||
3d133d61ca | |||
d51e42c707 | |||
79e39d6f0b | |||
7dec934bb3 | |||
83f866df01 | |||
d88d8e2dbb | |||
3a40dff999 | |||
3f69d58498 | |||
ca10cf081f | |||
f120449aae | |||
636f51c93c | |||
9bb47c8c61 | |||
8886db2000 | |||
a7040896f0 | |||
2ebfab8e07 | |||
9bd5888f5e | |||
8b7bbbc6af | |||
0383ffa5ab | |||
3c361eb759 | |||
37eaa6e4f9 | |||
0ae7e86fcb | |||
3f405d8908 | |||
0245847ea8 | |||
54f16ca2bf | |||
a096ade345 | |||
848fe51f3d | |||
e82db6fc2f | |||
4b3176a9a1 | |||
5e6c58716e | |||
e98132fd76 | |||
ff171baa67 | |||
05664d150b | |||
fcda972cec | |||
01f44f531e | |||
c5b076ec7e | |||
05cf5a38af | |||
bd22b641b3 | |||
6a9005645a | |||
7392505bd8 | |||
6aaf742dfe | |||
dcaf69a5d5 | |||
323673c3c0 | |||
e16ccf8cf8 | |||
434cde179f | |||
629a4b5bf8 | |||
6a8f6fb3cc | |||
807e930786 | |||
554188e88e | |||
585fca06a1 | |||
282667c4b5 | |||
8176470b7f | |||
acb7ce16ca | |||
12bdef51f5 | |||
84b07c81fd | |||
107360a001 | |||
3f541df669 | |||
da17783242 | |||
0ea2843ec9 | |||
7c92bf15e2 | |||
97589f77f8 | |||
504adcc8c8 | |||
f03ed9f5bf | |||
b22dc38ba1 | |||
7a7992ab0b | |||
3513f4ee84 | |||
f33703aefc | |||
389089859d | |||
844dddfee0 | |||
862e7a410d | |||
7ad64c8d45 | |||
5b50990879 | |||
71b93468d5 | |||
6b88da2b82 | |||
d01ea20273 | |||
f05860672c | |||
2b5e919a47 | |||
27c8df6140 | |||
9ac112104c | |||
98b80288ed | |||
ecdea54203 | |||
9d5a07bac4 | |||
7adc721d96 | |||
f5137028fa | |||
48f9b2fdcc | |||
b7d6ff6770 | |||
f7a87d5e52 | |||
75d1aa5135 | |||
49396a69bf | |||
d94041e98d | |||
cc5408482e | |||
115bf2613d | |||
1d172b07a8 | |||
777ae3c215 | |||
1b2a9270e8 | |||
e082418e4a | |||
83218c479a | |||
dbb8267b09 | |||
ea0ba19089 | |||
2db28cae41 | |||
dd54fff978 | |||
c4f3bb9b67 | |||
45487a91f9 | |||
dad5c62df5 | |||
a1ab81a896 | |||
1d0ba0d1f2 | |||
46a4ea8f67 | |||
42f2b14a74 | |||
bec5835289 | |||
0aa4dc904e | |||
f526c424c5 | |||
601d7a52e9 | |||
7f6fc74c36 | |||
9e2ce1751b | |||
8920ac02f6 | |||
06415de8ee | |||
12d471e2da | |||
7d6777a96f | |||
96c08cd295 | |||
f3633a2e04 | |||
feeb1cb566 | |||
146bc95c16 | |||
5792f5bfb5 | |||
11521dca08 | |||
6f457292ff | |||
696cb298ab | |||
6d2861f358 | |||
7879fa5095 | |||
a03062af4f | |||
19ecce1e32 | |||
5e0a69f68b | |||
a33bcac52f | |||
39cd6dff7d | |||
ed9cf3566c | |||
d4d246bfd1 | |||
c02a14c798 | |||
781ce30e27 | |||
4b68c7c154 | |||
daddd90058 | |||
5d2b27d916 | |||
7a37363817 | |||
bee3829960 | |||
e0600e5a91 | |||
b55b646f12 | |||
43e608af47 | |||
32d6d811c5 | |||
0d6fca5abc | |||
48a085c28f | |||
059e631f41 | |||
deb7ac549c | |||
891767c6b7 | |||
62810d769a | |||
5253c27ca8 | |||
1ffd6b4b4d | |||
6469606baf | |||
77cd292828 | |||
22d6951de5 | |||
33f7103eae | |||
c00216e3be | |||
42247e0e1a | |||
8a908a6864 | |||
2d6ed7142f | |||
9ecb844de7 | |||
3ab8185777 | |||
b8008ae1e9 | |||
ab9ec45c9d | |||
6a0d683f79 | |||
711487267d | |||
503bf69ab3 | |||
a60521269d | |||
fe96f85410 | |||
275fab003f | |||
edfb386ef0 | |||
186709ed75 | |||
b7d4330dd4 | |||
7c3be2ec9a | |||
8fac9102eb | |||
178854ac97 | |||
f4a089cc26 | |||
422eab5846 | |||
95e1404a2b | |||
cfc21e1225 | |||
3799190fa0 | |||
d6c3396182 | |||
a95d37ea25 | |||
d8e1a196bc | |||
1e2970b7e1 | |||
0d1fed78af | |||
709bda5939 | |||
8a28734603 | |||
9485eba73d | |||
23c4a7dc49 | |||
39b578fde9 | |||
8e16079157 | |||
eabd23fc07 | |||
c7932b710c | |||
9d7a926a8b | |||
0a390cbc91 | |||
76829457df | |||
703a5348e8 | |||
1a135fa30e | |||
e4d75c77bf | |||
75d505c431 | |||
b72c99e46a | |||
fae9c08815 | |||
c3e7deb4b6 | |||
c9245751e9 | |||
9b172879a2 | |||
9077a94dfe | |||
e2f07a5220 | |||
ae93d574c2 | |||
369f37a0a4 | |||
e1b7f40c2b | |||
94dcd3fe12 | |||
2dc1ae9026 | |||
7cfff75c3e | |||
a66a49d384 | |||
5f58e0661b | |||
f0a40862d6 | |||
f75c51ff71 | |||
d357192025 | |||
c996c8ff49 | |||
1af4e256c9 | |||
bc09365c98 | |||
ba688cf629 | |||
d5c8b26a45 | |||
d38f3f664f | |||
5ac435325b | |||
b874441a47 | |||
a35087a5ed | |||
1aeaf052a6 | |||
a0eafa12e3 | |||
757425a360 | |||
64d1e776f7 | |||
c6695a3120 | |||
076e384bb5 | |||
41cff1b49d | |||
6796b08909 | |||
f9df17d8d0 | |||
7f71a0ba37 | |||
0e2e13f018 | |||
bd099e2f4d | |||
42f56b9f86 | |||
704c50ea17 | |||
887bff572a | |||
1eaf71b5b4 | |||
0f872af502 | |||
b13696ea1a | |||
5fbbf7c748 | |||
e7fe0db051 | |||
dcb7bd8c74 | |||
92d485dd4d | |||
f4229a5d3e | |||
f97626346b | |||
7f4feaee08 | |||
5a30ef180a | |||
0a0412e47e | |||
57d4b50467 | |||
8d75efdc58 | |||
c706f9b2cd | |||
c810913861 | |||
2b13158e29 | |||
4fe1716c7a | |||
d7a82783be | |||
0a0f15baca | |||
58c144ee55 | |||
280315a314 | |||
506ff5809e | |||
acd1505050 | |||
578b56fc10 | |||
88cb0c6ae3 | |||
294662a1ce | |||
eaa3e87eb0 | |||
9b3a1a99e5 | |||
76a68c26c9 | |||
ef64f00cbb | |||
acbe89a159 | |||
0f66e5e49b | |||
686aa3a150 | |||
d8bc828839 | |||
094c391cd7 | |||
c8491724b4 | |||
d5beb8a9e4 | |||
702f7cc51d | |||
b8cd0a1bc0 | |||
7f87ac4b65 | |||
306fbd8bd8 | |||
3e0b272a20 | |||
6c89226ccf | |||
f040987c9f | |||
2a42ddbcbf | |||
8bb68c4e6a | |||
4485b978c1 | |||
68bad56e7d | |||
ef55c15537 | |||
ce8d37984d | |||
c8166aed97 | |||
0bd41f98ed | |||
d8ead57fbb | |||
d9e7a5fcbe | |||
c965a110f2 | |||
8a879faac7 | |||
a2a9f1e331 | |||
15d7568038 | |||
8cbc450192 | |||
79199711b8 | |||
2c1b8fdd39 | |||
d9024db68d | |||
96dd044f8e | |||
e66b29943b | |||
100b9dd12a | |||
3415db9739 | |||
186bf7ae32 | |||
97ca6858b7 | |||
ee6b11d36d | |||
f58fef60fb | |||
a76eb64bbb | |||
8590326b50 | |||
b0271394cd | |||
c39633f968 | |||
1fef74b00c | |||
9f6a2e51b2 | |||
b150da837a | |||
ba9aaee7cd | |||
3aa67969f9 | |||
d4f336db40 | |||
d184d3a732 | |||
42da1ce4e2 | |||
d2ed921bc6 | |||
d32a072190 | |||
95c137158f | |||
7151b92239 | |||
716caeb17c | |||
f8e4bdd23d | |||
55dfd03007 | |||
854fc8d552 | |||
f2badf2c5d | |||
ea656b1a3f | |||
5b7bd24f0a | |||
2d7c7b0982 | |||
b958bf9086 | |||
43144cfe8b | |||
11d2d2eccd | |||
e22f89853f | |||
7ccc029f77 | |||
0eb78e461d | |||
3615209ce7 | |||
6bfe0fca1f | |||
bfa2535ea1 | |||
6ec918fabb | |||
cbf7c0080b | |||
a6196901de | |||
c09469fa3a | |||
3acd84d9c0 | |||
c902fd0303 | |||
955aaef2e6 | |||
e0a2bb9d86 | |||
3bc8d78801 | |||
b66c03667c | |||
6e04a646ba | |||
086e5da8d0 | |||
c1b06817a2 | |||
c3926e6af0 | |||
70322d1ff8 | |||
7c32640a9b | |||
5ad09afc15 | |||
5d8c1a303e | |||
24b254459b | |||
30089841f6 | |||
0bee05b849 | |||
afd9ae9999 | |||
5ab70c4e97 | |||
cab2232aba | |||
946e937549 | |||
0ca943f49b | |||
b2db0b97fc | |||
d565ec7968 | |||
36e3ccfc68 | |||
892ca196f1 | |||
59413b3124 | |||
e1643c91c4 | |||
3ce6248f8c | |||
006c39380a | |||
22f2247f46 | |||
852a2146ab | |||
99b42f210c | |||
ae3c9033c1 | |||
03f7f0d18c | |||
79d7090867 | |||
e7f63cd336 | |||
f108f483b7 | |||
d6cbb02c92 | |||
42af8b199f | |||
dbbd9663b2 | |||
f4846b6fe4 | |||
a28a34f61c | |||
96d47c51a1 | |||
f27c11ccd8 | |||
43e2301e2c | |||
7b05b3dbb3 | |||
c96b8c8d68 | |||
4fc767b3f6 | |||
cc96848b01 | |||
6009801c5f | |||
f116cdeed9 | |||
5f38fa379c | |||
e2fb9ac829 | |||
f83254d760 | |||
ee5cc733a1 | |||
18a17cfbbf | |||
a3a830e1ab | |||
4b1e9ada18 | |||
9026339d35 | |||
0be13a6295 | |||
fcc2874591 | |||
9246bee12b | |||
30a08f4282 | |||
e5c5f34f9a | |||
361eab1bf7 | |||
2fd2140f64 | |||
86faa3f995 | |||
81acd94153 | |||
48987bed67 | |||
4405e8a15b | |||
24cb4798bc | |||
986e9e268e | |||
71bf8c5f85 | |||
5a629ff387 | |||
148a58865e | |||
2523fa73cf | |||
6d76c34291 | |||
3faeb7fa79 | |||
bb00904fc8 | |||
73e3fc7c4f | |||
5903339c17 | |||
2688ae614c | |||
5670cafda4 | |||
4bc8fd3267 | |||
bb2fa9957a | |||
c6b108ef4f | |||
bb158a9b48 | |||
c2fdbde68f | |||
7e82450d7b | |||
188dbdb068 | |||
25866f3652 | |||
c7e2057d2d | |||
d84f367317 | |||
95d6586dd7 | |||
e8e13fdeeb | |||
816b2d7ff8 | |||
91cfa0aac9 | |||
4be646c695 | |||
a23c6177d5 | |||
cc6e1ea200 | |||
596d30661a | |||
b971eeca4b | |||
cfab36cb1d | |||
5835b3b8eb | |||
62eea636b0 | |||
b14e61ff79 | |||
59adc25c23 | |||
86ead6a65c | |||
fbfbafa3d4 | |||
1ddf90ed08 | |||
0fbd508c5f | |||
24a7b0ce74 | |||
68eafb3f30 | |||
2649f6bdd6 | |||
9807f47d4e | |||
63425bed10 | |||
02058ea699 | |||
91be35731c | |||
d1daeb44e6 | |||
efdfc5c327 | |||
9c00ad9ff2 | |||
151adab739 | |||
162b1bdef7 | |||
da425cc225 | |||
346213da4c | |||
8babecd890 | |||
2855c55ac1 | |||
bb9649e18d | |||
2f7d0e7884 | |||
dfc4d7cb50 | |||
b800642fa4 | |||
5b6c590057 | |||
66a0f54097 | |||
f8e64aad5b | |||
cd5ec8cd35 | |||
75fd13de5d | |||
807af8670e | |||
5bd05fba09 | |||
f7b6e777bf | |||
68353b7e57 | |||
8e81bc1b49 | |||
80a89b5e6d | |||
b64b54f48f | |||
20a52f153b | |||
d89271528e | |||
ccac35fc01 | |||
23e232b496 | |||
ddcf906a88 | |||
09e8124017 | |||
67d1e2903c | |||
a9c4cd6cbe | |||
180bc1784e | |||
f984feda42 | |||
56fc15f44d | |||
e0d9f7d1d4 | |||
87ba66b6d0 | |||
e420800aeb | |||
a684984f8b | |||
079682fbdc | |||
2491719f36 | |||
65de227520 | |||
29f3b198cf | |||
0ace79939b | |||
b3a75a60a4 | |||
5e8668799c | |||
8fa6935c9d | |||
a1fe6265fd | |||
67f636545a | |||
ec50c20400 | |||
18f146ace5 | |||
a91bf296d7 | |||
bb8985d76c | |||
7ff2a44a63 | |||
b5074d8577 | |||
5c1abaf43c | |||
dc3988eff8 | |||
24102a7435 | |||
9614d17024 | |||
8e3be6413e | |||
09e648f957 | |||
0c2bf022fa | |||
1c5d2a85cf | |||
8993b15248 | |||
8f91b5aab3 | |||
46391397b8 | |||
85c9a231c1 | |||
c312d4fba0 | |||
7203036e3e | |||
b9d8e3e55a | |||
08973f9f05 | |||
c6931dcb07 | |||
cea13e964c | |||
d207a34736 | |||
fba1af6ea9 | |||
b825d04597 | |||
3133ee2401 | |||
4d52f47f87 | |||
f54cfcdb8f | |||
57983980a7 | |||
33f4aaf3fd | |||
c138d692b1 | |||
fb12136975 | |||
efe260f12e | |||
b9b535c30f | |||
d085c8626f | |||
5e3697807c | |||
5416c114cf | |||
a0127e63c6 | |||
8b2327ed34 | |||
3938142535 | |||
66f76c8067 | |||
568475e2db | |||
9ea398416e | |||
50a17fc00b | |||
f9a9b7f610 | |||
a57f6b70da | |||
bae83ba2b6 | |||
385b4ce959 | |||
7b6e3a23be | |||
1cc8956f74 | |||
e6c8bfd008 | |||
2d67962c2f | |||
2e30926ac3 | |||
d2c66c40c6 | |||
a4d48df30a | |||
c52830980a | |||
e8e5ddc55d | |||
111942a47d | |||
bc88180058 | |||
3a616de47b | |||
9d65e6f183 | |||
328a6a866e | |||
5264fded00 | |||
83d5115a02 | |||
0559212df7 | |||
f131255066 | |||
59f3dc3b6b | |||
6454bfe754 | |||
7bb224f54a | |||
fa12a5f70b | |||
d2d78a073f | |||
6d403f2d85 | |||
8032141311 | |||
38491c8c4b | |||
627664b785 | |||
dfa1c7493c | |||
801337a422 | |||
4ec95043d7 | |||
b4dc1a7263 | |||
ef3aa2731c | |||
e738019c48 | |||
a5ef78f709 | |||
4156cea704 | |||
a587d05098 | |||
489dc657c6 | |||
029a2837e4 | |||
618ecfd1c6 | |||
83174b919c | |||
d952b38f93 | |||
1e2ab89b47 | |||
34a9619806 | |||
9ee65009cd | |||
85ccba366a | |||
579a02529d | |||
b04c8c1c1a | |||
243fa6cf63 | |||
30c0a7d069 | |||
71b4e765c8 | |||
73dd5aa2d1 | |||
96e209db49 | |||
0c14ca58c7 | |||
f3c0aa154a | |||
6efaaa9d7a | |||
08238e8307 | |||
e1b35f9847 | |||
e174af7838 | |||
be74801236 | |||
68acfd36d0 | |||
c9cea2152b | |||
e966c96644 | |||
73c31d873e | |||
a2a9d54985 |
@ -1,4 +1,4 @@
|
|||||||
root: ./book/src
|
root: ./docs/src
|
||||||
|
|
||||||
structure:
|
structure:
|
||||||
readme: introduction.md
|
readme: introduction.md
|
||||||
|
2
.github/stale.yml
vendored
@ -1,7 +1,7 @@
|
|||||||
only: pulls
|
only: pulls
|
||||||
|
|
||||||
# Number of days of inactivity before a pull request becomes stale
|
# Number of days of inactivity before a pull request becomes stale
|
||||||
daysUntilStale: 30
|
daysUntilStale: 7
|
||||||
|
|
||||||
# Number of days of inactivity before a stale pull request is closed
|
# Number of days of inactivity before a stale pull request is closed
|
||||||
daysUntilClose: 7
|
daysUntilClose: 7
|
||||||
|
6
.gitignore
vendored
@ -1,5 +1,6 @@
|
|||||||
/book/html/
|
/docs/html/
|
||||||
/book/src/tests.ok
|
/docs/src/tests.ok
|
||||||
|
/docs/src/.gitbook/assets/*.svg
|
||||||
/farf/
|
/farf/
|
||||||
/solana-release/
|
/solana-release/
|
||||||
/solana-release.tar.bz2
|
/solana-release.tar.bz2
|
||||||
@ -15,6 +16,7 @@
|
|||||||
# log files
|
# log files
|
||||||
*.log
|
*.log
|
||||||
log-*.txt
|
log-*.txt
|
||||||
|
log-*/
|
||||||
|
|
||||||
# intellij files
|
# intellij files
|
||||||
/.idea/
|
/.idea/
|
||||||
|
48
.mergify.yml
@ -19,59 +19,35 @@ pull_request_rules:
|
|||||||
label:
|
label:
|
||||||
add:
|
add:
|
||||||
- automerge
|
- automerge
|
||||||
- name: v0.16 backport
|
- name: v0.23 backport
|
||||||
conditions:
|
conditions:
|
||||||
- base=master
|
- base=master
|
||||||
- label=v0.16
|
- label=v0.23
|
||||||
actions:
|
actions:
|
||||||
backport:
|
backport:
|
||||||
branches:
|
branches:
|
||||||
- v0.16
|
- v0.23
|
||||||
- name: v0.17 backport
|
- name: v1.0 backport
|
||||||
conditions:
|
conditions:
|
||||||
- base=master
|
- base=master
|
||||||
- label=v0.17
|
- label=v1.0
|
||||||
actions:
|
actions:
|
||||||
backport:
|
backport:
|
||||||
branches:
|
branches:
|
||||||
- v0.17
|
- v1.0
|
||||||
- name: v0.18 backport
|
- name: v1.1 backport
|
||||||
conditions:
|
conditions:
|
||||||
- base=master
|
- base=master
|
||||||
- label=v0.18
|
- label=v1.1
|
||||||
actions:
|
actions:
|
||||||
backport:
|
backport:
|
||||||
branches:
|
branches:
|
||||||
- v0.18
|
- v1.1
|
||||||
- name: v0.19 backport
|
- name: v1.2 backport
|
||||||
conditions:
|
conditions:
|
||||||
- base=master
|
- base=master
|
||||||
- label=v0.19
|
- label=v1.2
|
||||||
actions:
|
actions:
|
||||||
backport:
|
backport:
|
||||||
branches:
|
branches:
|
||||||
- v0.19
|
- v1.2
|
||||||
- name: v0.20 backport
|
|
||||||
conditions:
|
|
||||||
- base=master
|
|
||||||
- label=v0.20
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- v0.20
|
|
||||||
- name: v0.21 backport
|
|
||||||
conditions:
|
|
||||||
- base=master
|
|
||||||
- label=v0.21
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- v0.21
|
|
||||||
- name: v0.22 backport
|
|
||||||
conditions:
|
|
||||||
- base=master
|
|
||||||
- label=v0.22
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- v0.22
|
|
||||||
|
270
CONTRIBUTING.md
@ -1,23 +1,41 @@
|
|||||||
Solana Coding Guidelines
|
# Solana Coding Guidelines
|
||||||
===
|
|
||||||
|
|
||||||
The goal of these guidelines is to improve developer productivity by allowing developers to
|
The goal of these guidelines is to improve developer productivity by allowing
|
||||||
jump any file in the codebase and not need to adapt to inconsistencies in how the code is
|
developers to jump into any file in the codebase and not need to adapt to
|
||||||
written. The codebase should appear as if it had been authored by a single developer. If you
|
inconsistencies in how the code is written. The codebase should appear as if it
|
||||||
don't agree with a convention, submit a PR patching this document and let's discuss! Once
|
had been authored by a single developer. If you don't agree with a convention,
|
||||||
the PR is accepted, *all* code should be updated as soon as possible to reflect the new
|
submit a PR patching this document and let's discuss! Once the PR is accepted,
|
||||||
|
*all* code should be updated as soon as possible to reflect the new
|
||||||
conventions.
|
conventions.
|
||||||
|
|
||||||
Pull Requests
|
## Pull Requests
|
||||||
---
|
|
||||||
|
|
||||||
Small, frequent PRs are much preferred to large, infrequent ones. A large PR is difficult
|
Small, frequent PRs are much preferred to large, infrequent ones. A large PR is
|
||||||
to review, can block others from making progress, and can quickly get its author into
|
difficult to review, can block others from making progress, and can quickly get
|
||||||
"rebase hell". A large PR oftentimes arises when one change requires another, which requires
|
its author into "rebase hell". A large PR oftentimes arises when one change
|
||||||
another, and then another. When you notice those dependencies, put the fix into a commit of
|
requires another, which requires another, and then another. When you notice
|
||||||
its own, then checkout a new branch, and cherrypick it. Open a PR to start the review
|
those dependencies, put the fix into a commit of its own, then checkout a new
|
||||||
process and then jump back to your original branch to keep making progress. Once the commit
|
branch, and cherry-pick it.
|
||||||
is merged, you can use git-rebase to purge it from your original branch.
|
|
||||||
|
```bash
|
||||||
|
$ git commit -am "Fix foo, needed by bar"
|
||||||
|
$ git checkout master
|
||||||
|
$ git checkout -b fix-foo
|
||||||
|
$ git cherry-pick fix-bar
|
||||||
|
$ git push --set-upstream origin fix-foo
|
||||||
|
```
|
||||||
|
|
||||||
|
Open a PR to start the review process and then jump back to your original
|
||||||
|
branch to keep making progress. Consider rebasing to make your fix the first
|
||||||
|
commit:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ git checkout fix-bar
|
||||||
|
$ git rebase -i master <Move fix-foo to top>
|
||||||
|
```
|
||||||
|
|
||||||
|
Once the commit is merged, rebase the original branch to purge the
|
||||||
|
cherry-picked commit:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ git pull --rebase upstream master
|
$ git pull --rebase upstream master
|
||||||
@ -25,26 +43,137 @@ $ git pull --rebase upstream master
|
|||||||
|
|
||||||
### How big is too big?
|
### How big is too big?
|
||||||
|
|
||||||
If there are no functional changes, PRs can be very large and that's no problem. If,
|
If there are no functional changes, PRs can be very large and that's no
|
||||||
however, your changes are making meaningful changes or additions, then about 1,000 lines of
|
problem. If, however, your changes are making meaningful changes or additions,
|
||||||
changes is about the most you should ask a Solana maintainer to review.
|
then about 1.0.2 lines of changes is about the most you should ask a Solana
|
||||||
|
maintainer to review.
|
||||||
|
|
||||||
### Should I send small PRs as I develop large, new components?
|
### Should I send small PRs as I develop large, new components?
|
||||||
|
|
||||||
Add only code to the codebase that is ready to be deployed. If you are building a large
|
Add only code to the codebase that is ready to be deployed. If you are building
|
||||||
library, consider developing it in a separate git repository. When it is ready to be
|
a large library, consider developing it in a separate git repository. When it
|
||||||
integrated, the Solana maintainers will work with you to decide on a path forward. Smaller
|
is ready to be integrated, the Solana maintainers will work with you to decide
|
||||||
libraries may be copied in whereas very large ones may be pulled in with a package manager.
|
on a path forward. Smaller libraries may be copied in whereas very large ones
|
||||||
|
may be pulled in with a package manager.
|
||||||
|
|
||||||
|
## Getting Pull Requests Merged
|
||||||
|
|
||||||
|
There is no single person assigned to watching GitHub PR queue and ushering you
|
||||||
|
through the process. Typically, you will ask the person that wrote a component
|
||||||
|
to review changes to it. You can find the author using `git blame` or asking on
|
||||||
|
Discord. When working to get your PR merged, it's most important to understand
|
||||||
|
that changing the code is your priority and not necessarily a priority of the
|
||||||
|
person you need an approval from. Also, while you may interact the most with
|
||||||
|
the component author, you should aim to be inclusive of others. Providing a
|
||||||
|
detailed problem description is the most effective means of engaging both the
|
||||||
|
component author and other potentially interested parties.
|
||||||
|
|
||||||
|
Consider opening all PRs as Draft Pull Requests first. Using a draft PR allows
|
||||||
|
you to kickstart the CI automation, which typically takes between 10 and 30
|
||||||
|
minutes to execute. Use that time to write a detailed problem description. Once
|
||||||
|
the description is written and CI succeeds, click the "Ready to Review" button
|
||||||
|
and add reviewers. Adding reviewers before CI succeeds is a fast path to losing
|
||||||
|
reviewer engagement. Not only will they be notified and see the PR is not yet
|
||||||
|
ready for them, they will also be bombarded them with additional notifications
|
||||||
|
each time you push a commit to get past CI or until they "mute" the PR. Once
|
||||||
|
muted, you'll need to reach out over some other medium, such as Discord, to
|
||||||
|
request they have another look. When you use draft PRs, no notifications are
|
||||||
|
sent when you push commits and edit the PR description. Use draft PRs
|
||||||
|
liberally. Don't bug the humans until you have gotten past the bots.
|
||||||
|
|
||||||
|
### What should be in my PR description?
|
||||||
|
|
||||||
|
Reviewing code is hard work and generally involves an attempt to guess the
|
||||||
|
author's intent at various levels. Please assume reviewer time is scarce and do
|
||||||
|
what you can to make your PR as consumable as possible. Inspired by techniques
|
||||||
|
for writing good whitepapers, the guidance here aims to maximize reviewer
|
||||||
|
engagement.
|
||||||
|
|
||||||
|
Assume the reviewer will spend no more than a few seconds reading the PR title.
|
||||||
|
If it doesn't describe a noteworthy change, don't expect the reviewer to click
|
||||||
|
to see more.
|
||||||
|
|
||||||
|
Next, like the abstract of a whitepaper, the reviewer will spend ~30 seconds
|
||||||
|
reading the PR problem description. If what is described there doesn't look
|
||||||
|
more important than competing issues, don't expect the reviewer to read on.
|
||||||
|
|
||||||
|
Next, the reviewer will read the proposed changes. At this point, the reviewer
|
||||||
|
needs to be convinced the proposed changes are a *good* solution to the problem
|
||||||
|
described above. If the proposed changes, not the code changes, generates
|
||||||
|
discussion, consider closing the PR and returning with a design proposal
|
||||||
|
instead.
|
||||||
|
|
||||||
|
Finally, once the reviewer understands the problem and agrees with the approach
|
||||||
|
to solving it, the reviewer will view the code changes. At this point, the
|
||||||
|
reviewer is simply looking to see if the implementation actually implements
|
||||||
|
what was proposed and if that implementation is maintainable. When a concise,
|
||||||
|
readable test for each new code path is present, the reviewer can safely ignore
|
||||||
|
the details of its implementation. When those tests are missing, expect to
|
||||||
|
either lose engagement or get a pile of review comments as the reviewer
|
||||||
|
attempts to consider every ambiguity in your implementation.
|
||||||
|
|
||||||
|
### The PR Title
|
||||||
|
|
||||||
|
The PR title should contain a brief summary of the change, from the perspective
|
||||||
|
of the user. Examples of good titles:
|
||||||
|
|
||||||
|
* Add rent to accounts
|
||||||
|
* Fix out-of-memory error in validator
|
||||||
|
* Clean up `process_message()` in runtime
|
||||||
|
|
||||||
|
The conventions here are all the same as a good git commit title:
|
||||||
|
|
||||||
|
* First word capitalized and in the imperative mood, not past tense ("add", not
|
||||||
|
"added")
|
||||||
|
* No trailing period
|
||||||
|
* What was done, whom it was done to, and in what context
|
||||||
|
|
||||||
|
### The PR Problem Statement
|
||||||
|
|
||||||
|
The git repo implements a product with various features. The problem statement
|
||||||
|
should describe how the product is missing a feature, how a feature is
|
||||||
|
incomplete, or how the implementation of a feature is somehow undesirable. If
|
||||||
|
an issue being fixed already describes the problem, go ahead and copy-paste it.
|
||||||
|
As mentioned above, reviewer time is scarce. Given a queue of PRs to review,
|
||||||
|
the reviewer may ignore PRs that expect them to click through links to see if
|
||||||
|
the PR warrants attention.
|
||||||
|
|
||||||
|
### The Proposed Changes
|
||||||
|
|
||||||
|
Typically the content under the "Proposed changes" section will be a bulleted
|
||||||
|
list of steps taken to solve the problem. Oftentimes, the list is identical to
|
||||||
|
the subject lines of the git commits contained in the PR. It's especially
|
||||||
|
generous (and not expected) to rebase or reword commits such that each change
|
||||||
|
matches the logical flow in your PR description.
|
||||||
|
|
||||||
### When will my PR be reviewed?
|
### When will my PR be reviewed?
|
||||||
|
|
||||||
PRs are typically reviewed and merged in under 7 days. If your PR has been open for longer,
|
PRs are typically reviewed and merged in under 7 days. If your PR has been open
|
||||||
it's a strong indicator that the reviewers aren't confident the change meets the quality
|
for longer, it's a strong indicator that the reviewers aren't confident the
|
||||||
standards of the codebase. You might consider closing it and coming back with smaller PRs
|
change meets the quality standards of the codebase. You might consider closing
|
||||||
and longer descriptions detailing what problem it solves and how it solves it.
|
it and coming back with smaller PRs and longer descriptions detailing what
|
||||||
|
problem it solves and how it solves it. Old PRs will be marked stale and then
|
||||||
|
closed automatically 7 days later.
|
||||||
|
|
||||||
Draft Pull Requests
|
### How to manage review feedback?
|
||||||
---
|
|
||||||
|
After a reviewer provides feedback, you can quickly say "acknowledged, will
|
||||||
|
fix" using a thumb's up emoji. If you're confident your fix is exactly as
|
||||||
|
prescribed, add a reply "Fixed in COMMIT\_HASH" and mark the comment as
|
||||||
|
resolved. If you're not sure, reply "Is this what you had in mind?
|
||||||
|
COMMIT\_HASH" and if so, the reviewer will reply and mark the conversation as
|
||||||
|
resolved. Marking conversations as resolved is an excellent way to engage more
|
||||||
|
reviewers. Leaving conversations open may imply the PR is not yet ready for
|
||||||
|
additional review.
|
||||||
|
|
||||||
|
### When will my PR be re-reviewed?
|
||||||
|
|
||||||
|
Recall that once your PR is opened, a notification is sent every time you push
|
||||||
|
a commit. After a reviewer adds feedback, they won't be checking on the status
|
||||||
|
of that feedback after every new commit. Instead, directly mention the reviewer
|
||||||
|
when you feel your PR is ready for another pass.
|
||||||
|
|
||||||
|
## Draft Pull Requests
|
||||||
|
|
||||||
If you want early feedback on your PR, use GitHub's "Draft Pull Request"
|
If you want early feedback on your PR, use GitHub's "Draft Pull Request"
|
||||||
mechanism. Draft PRs are a convenient way to collaborate with the Solana
|
mechanism. Draft PRs are a convenient way to collaborate with the Solana
|
||||||
@ -52,67 +181,68 @@ maintainers without triggering notifications as you make changes. When you feel
|
|||||||
your PR is ready for a broader audience, you can transition your draft PR to a
|
your PR is ready for a broader audience, you can transition your draft PR to a
|
||||||
standard PR with the click of a button.
|
standard PR with the click of a button.
|
||||||
|
|
||||||
Do not add reviewers to draft PRs. GitHub doesn't automatically clear approvals
|
Do not add reviewers to draft PRs. GitHub doesn't automatically clear
|
||||||
when you click "Ready for Review", so a review that meant "I approve of the
|
approvals when you click "Ready for Review", so a review that meant "I approve
|
||||||
direction" suddenly has the appearance of "I approve of these changes." Instead,
|
of the direction" suddenly has the appearance of "I approve of these changes."
|
||||||
add a comment that mentions the usernames that you would like a review from. Ask
|
Instead, add a comment that mentions the usernames that you would like a review
|
||||||
explicitly what you would like feedback on.
|
from. Ask explicitly what you would like feedback on.
|
||||||
|
|
||||||
Rust coding conventions
|
## Rust coding conventions
|
||||||
---
|
|
||||||
|
|
||||||
* All Rust code is formatted using the latest version of `rustfmt`. Once installed, it will be
|
* All Rust code is formatted using the latest version of `rustfmt`. Once
|
||||||
updated automatically when you update the compiler with `rustup`.
|
installed, it will be updated automatically when you update the compiler with
|
||||||
|
`rustup`.
|
||||||
|
|
||||||
* All Rust code is linted with Clippy. If you'd prefer to ignore its advice, do so explicitly:
|
* All Rust code is linted with Clippy. If you'd prefer to ignore its advice, do
|
||||||
|
so explicitly:
|
||||||
|
|
||||||
```rust
|
```rust #[allow(clippy::too_many_arguments)] ```
|
||||||
#[allow(clippy::too_many_arguments)]
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: Clippy defaults can be overridden in the top-level file `.clippy.toml`.
|
Note: Clippy defaults can be overridden in the top-level file `.clippy.toml`.
|
||||||
|
|
||||||
* For variable names, when in doubt, spell it out. The mapping from type names to variable names
|
* For variable names, when in doubt, spell it out. The mapping from type names
|
||||||
is to lowercase the type name, putting an underscore before each capital letter. Variable names
|
to variable names is to lowercase the type name, putting an underscore before
|
||||||
should *not* be abbreviated unless being used as closure arguments and the brevity improves
|
each capital letter. Variable names should *not* be abbreviated unless being
|
||||||
readability. When a function has multiple instances of the same type, qualify each with a
|
used as closure arguments and the brevity improves readability. When a function
|
||||||
prefix and underscore (i.e. alice_keypair) or a numeric suffix (i.e. tx0).
|
has multiple instances of the same type, qualify each with a prefix and
|
||||||
|
underscore (i.e. alice\_keypair) or a numeric suffix (i.e. tx0).
|
||||||
|
|
||||||
* For function and method names, use `<verb>_<subject>`. For unit tests, that verb should
|
* For function and method names, use `<verb>_<subject>`. For unit tests, that
|
||||||
always be `test` and for benchmarks the verb should always be `bench`. Avoid namespacing
|
verb should always be `test` and for benchmarks the verb should always be
|
||||||
function names with some arbitrary word. Avoid abbreviating words in function names.
|
`bench`. Avoid namespacing function names with some arbitrary word. Avoid
|
||||||
|
abbreviating words in function names.
|
||||||
|
|
||||||
* As they say, "When in Rome, do as the Romans do." A good patch should acknowledge the coding
|
* As they say, "When in Rome, do as the Romans do." A good patch should
|
||||||
conventions of the code that surrounds it, even in the case where that code has not yet been
|
acknowledge the coding conventions of the code that surrounds it, even in the
|
||||||
updated to meet the conventions described here.
|
case where that code has not yet been updated to meet the conventions described
|
||||||
|
here.
|
||||||
|
|
||||||
|
|
||||||
Terminology
|
## Terminology
|
||||||
---
|
|
||||||
|
|
||||||
Inventing new terms is allowed, but should only be done when the term is widely used and
|
Inventing new terms is allowed, but should only be done when the term is widely
|
||||||
understood. Avoid introducing new 3-letter terms, which can be confused with 3-letter acronyms.
|
used and understood. Avoid introducing new 3-letter terms, which can be
|
||||||
|
confused with 3-letter acronyms.
|
||||||
|
|
||||||
[Terms currently in use](book/src/terminology.md)
|
[Terms currently in use](docs/src/terminology.md)
|
||||||
|
|
||||||
|
|
||||||
Design Proposals
|
## Design Proposals
|
||||||
---
|
|
||||||
|
|
||||||
Solana's architecture is described by a book generated from markdown files in
|
Solana's architecture is described by docs generated from markdown files in
|
||||||
the `book/src/` directory, maintained by an *editor* (currently @garious). To
|
the `docs/src/` directory, maintained by an *editor* (currently @garious). To
|
||||||
add a design proposal, you'll need to at least propose a change the content
|
add a design proposal, you'll need to include it in the
|
||||||
under the [Accepted Design
|
[Accepted Design Proposals](https://docs.solana.com/proposals)
|
||||||
Proposals](https://docs.solana.com/book/v/master/proposals) chapter.
|
section of the Solana docs. Here's the full process:
|
||||||
Here's the full process:
|
|
||||||
|
|
||||||
1. Propose a design by creating a PR that adds a markdown document to the
|
1. Propose a design by creating a PR that adds a markdown document to the
|
||||||
directory `book/src/` and references it from the [table of
|
`docs/src/proposals` directory and references it from the [table of
|
||||||
contents](book/src/SUMMARY.md). Add any relevant *maintainers* to the PR review.
|
contents](docs/src/SUMMARY.md). Add any relevant *maintainers* to the PR
|
||||||
|
review.
|
||||||
2. The PR being merged indicates your proposed change was accepted and that the
|
2. The PR being merged indicates your proposed change was accepted and that the
|
||||||
maintainers support your plan of attack.
|
maintainers support your plan of attack.
|
||||||
3. Submit PRs that implement the proposal. When the implementation reveals the
|
3. Submit PRs that implement the proposal. When the implementation reveals the
|
||||||
need for tweaks to the proposal, be sure to update the proposal and have
|
need for tweaks to the proposal, be sure to update the proposal and have that
|
||||||
that change reviewed by the same people as in step 1.
|
change reviewed by the same people as in step 1.
|
||||||
4. Once the implementation is complete, submit a PR that moves the link from
|
4. Once the implementation is complete, submit a PR that moves the link from
|
||||||
the Accepted Proposals to the Implemented Proposals section.
|
the Accepted Proposals to the Implemented Proposals section.
|
||||||
|
3927
Cargo.lock
generated
62
Cargo.toml
@ -3,62 +3,62 @@ members = [
|
|||||||
"bench-exchange",
|
"bench-exchange",
|
||||||
"bench-streamer",
|
"bench-streamer",
|
||||||
"bench-tps",
|
"bench-tps",
|
||||||
"banking_bench",
|
"banking-bench",
|
||||||
|
"chacha",
|
||||||
|
"chacha-cuda",
|
||||||
"chacha-sys",
|
"chacha-sys",
|
||||||
|
"cli-config",
|
||||||
"client",
|
"client",
|
||||||
"core",
|
"core",
|
||||||
"drone",
|
"faucet",
|
||||||
|
"perf",
|
||||||
"validator",
|
"validator",
|
||||||
"genesis",
|
"genesis",
|
||||||
"genesis_programs",
|
"genesis-programs",
|
||||||
"gossip",
|
"gossip",
|
||||||
"install",
|
"install",
|
||||||
"keygen",
|
"keygen",
|
||||||
"ledger",
|
"ledger",
|
||||||
"ledger-tool",
|
"ledger-tool",
|
||||||
"local_cluster",
|
"local-cluster",
|
||||||
"logger",
|
"logger",
|
||||||
|
"log-analyzer",
|
||||||
"merkle-tree",
|
"merkle-tree",
|
||||||
"measure",
|
"measure",
|
||||||
"metrics",
|
"metrics",
|
||||||
"programs/bpf_loader_api",
|
"net-shaper",
|
||||||
"programs/bpf_loader_program",
|
"programs/bpf_loader",
|
||||||
"programs/budget_api",
|
"programs/budget",
|
||||||
"programs/budget_program",
|
"programs/btc_spv",
|
||||||
"programs/btc_spv_program",
|
|
||||||
"programs/btc_spv_api",
|
|
||||||
"programs/btc_spv_bin",
|
"programs/btc_spv_bin",
|
||||||
"programs/config_api",
|
"programs/config",
|
||||||
"programs/config_program",
|
"programs/exchange",
|
||||||
"programs/config_tests",
|
"programs/failure",
|
||||||
"programs/exchange_api",
|
"programs/noop",
|
||||||
"programs/exchange_program",
|
"programs/ownable",
|
||||||
"programs/failure_program",
|
"programs/stake",
|
||||||
"programs/move_loader_api",
|
"programs/storage",
|
||||||
"programs/move_loader_program",
|
"programs/vest",
|
||||||
"programs/librapay_api",
|
"programs/vote",
|
||||||
"programs/noop_program",
|
|
||||||
"programs/stake_api",
|
|
||||||
"programs/stake_program",
|
|
||||||
"programs/stake_tests",
|
|
||||||
"programs/storage_api",
|
|
||||||
"programs/storage_program",
|
|
||||||
"programs/vest_api",
|
|
||||||
"programs/vest_program",
|
|
||||||
"programs/vote_api",
|
|
||||||
"programs/vote_program",
|
|
||||||
"archiver",
|
"archiver",
|
||||||
|
"archiver-lib",
|
||||||
|
"archiver-utils",
|
||||||
|
"remote-wallet",
|
||||||
"runtime",
|
"runtime",
|
||||||
"sdk",
|
"sdk",
|
||||||
"sdk-c",
|
"sdk-c",
|
||||||
|
"scripts",
|
||||||
|
"sys-tuner",
|
||||||
"upload-perf",
|
"upload-perf",
|
||||||
"netutil",
|
"net-utils",
|
||||||
"fixed-buf",
|
|
||||||
"vote-signer",
|
"vote-signer",
|
||||||
"cli",
|
"cli",
|
||||||
"rayon-threadlimit",
|
"rayon-threadlimit",
|
||||||
|
"watchtower",
|
||||||
]
|
]
|
||||||
|
|
||||||
exclude = [
|
exclude = [
|
||||||
"programs/bpf",
|
"programs/bpf",
|
||||||
|
"programs/move_loader",
|
||||||
|
"programs/librapay",
|
||||||
]
|
]
|
||||||
|
18
README.md
@ -23,12 +23,12 @@ It's possible for a centralized database to process 710,000 transactions per sec
|
|||||||
|
|
||||||
Furthermore, and much to our surprise, it can be implemented using a mechanism that has existed in Bitcoin since day one. The Bitcoin feature is called nLocktime and it can be used to postdate transactions using block height instead of a timestamp. As a Bitcoin client, you'd use block height instead of a timestamp if you don't trust the network. Block height turns out to be an instance of what's being called a Verifiable Delay Function in cryptography circles. It's a cryptographically secure way to say time has passed. In Solana, we use a far more granular verifiable delay function, a SHA 256 hash chain, to checkpoint the ledger and coordinate consensus. With it, we implement Optimistic Concurrency Control and are now well en route towards that theoretical limit of 710,000 transactions per second.
|
Furthermore, and much to our surprise, it can be implemented using a mechanism that has existed in Bitcoin since day one. The Bitcoin feature is called nLocktime and it can be used to postdate transactions using block height instead of a timestamp. As a Bitcoin client, you'd use block height instead of a timestamp if you don't trust the network. Block height turns out to be an instance of what's being called a Verifiable Delay Function in cryptography circles. It's a cryptographically secure way to say time has passed. In Solana, we use a far more granular verifiable delay function, a SHA 256 hash chain, to checkpoint the ledger and coordinate consensus. With it, we implement Optimistic Concurrency Control and are now well en route towards that theoretical limit of 710,000 transactions per second.
|
||||||
|
|
||||||
Architecture
|
Documentation
|
||||||
===
|
===
|
||||||
|
|
||||||
Before you jump into the code, review the online book [Solana: Blockchain Rebuilt for Scale](https://docs.solana.com/book/).
|
Before you jump into the code, review the documentation [Solana: Blockchain Rebuilt for Scale](https://docs.solana.com).
|
||||||
|
|
||||||
(The _latest_ development version of the online book is also [available here](https://docs.solana.com/book/v/master/).)
|
(The _latest_ development version of the docs is [available here](https://docs.solana.com/v/master).)
|
||||||
|
|
||||||
Release Binaries
|
Release Binaries
|
||||||
===
|
===
|
||||||
@ -78,7 +78,7 @@ $ source $HOME/.cargo/env
|
|||||||
$ rustup component add rustfmt
|
$ rustup component add rustfmt
|
||||||
```
|
```
|
||||||
|
|
||||||
If your rustc version is lower than 1.38.0, please update it:
|
If your rustc version is lower than 1.39.0, please update it:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ rustup update
|
$ rustup update
|
||||||
@ -87,7 +87,8 @@ $ rustup update
|
|||||||
On Linux systems you may need to install libssl-dev, pkg-config, zlib1g-dev, etc. On Ubuntu:
|
On Linux systems you may need to install libssl-dev, pkg-config, zlib1g-dev, etc. On Ubuntu:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ sudo apt-get install libssl-dev pkg-config zlib1g-dev llvm clang
|
$ sudo apt-get update
|
||||||
|
$ sudo apt-get install libssl-dev libudev-dev pkg-config zlib1g-dev llvm clang
|
||||||
```
|
```
|
||||||
|
|
||||||
Download the source code:
|
Download the source code:
|
||||||
@ -120,16 +121,13 @@ $ cargo test
|
|||||||
Local Testnet
|
Local Testnet
|
||||||
---
|
---
|
||||||
|
|
||||||
Start your own testnet locally, instructions are in the book [Solana: Blockchain Rebuild for Scale: Getting Started](https://docs.solana.com/book/getting-started).
|
Start your own testnet locally, instructions are in the online docs [Solana: Blockchain Rebuild for Scale: Getting Started](https://docs.solana.com/building-from-source).
|
||||||
|
|
||||||
Remote Testnets
|
Remote Testnets
|
||||||
---
|
---
|
||||||
|
|
||||||
We maintain several testnets:
|
* `testnet` - public stable testnet accessible via devnet.solana.com. Runs 24/7
|
||||||
|
|
||||||
* `testnet` - public stable testnet accessible via testnet.solana.com. Runs 24/7
|
|
||||||
* `testnet-beta` - public beta channel testnet accessible via beta.testnet.solana.com. Runs 24/7
|
|
||||||
* `testnet-edge` - public edge channel testnet accessible via edge.testnet.solana.com. Runs 24/7
|
|
||||||
|
|
||||||
## Deploy process
|
## Deploy process
|
||||||
|
|
||||||
|
27
RELEASE.md
@ -138,30 +138,11 @@ There are three release channels that map to branches as follows:
|
|||||||
### Update documentation
|
### Update documentation
|
||||||
TODO: Documentation update procedure is WIP as we move to gitbook
|
TODO: Documentation update procedure is WIP as we move to gitbook
|
||||||
|
|
||||||
Document the new recommended version by updating `book/src/running-archiver.md` and `book/src/validator-testnet.md` on the release (beta) branch to point at the `solana-install` for the upcoming release version.
|
Document the new recommended version by updating `docs/src/running-archiver.md` and `docs/src/validator-testnet.md` on the release (beta) branch to point at the `solana-install` for the upcoming release version.
|
||||||
|
|
||||||
#### Publish updated Book
|
### Update software on devnet.solana.com
|
||||||
We maintain three copies of the "book" as official documentation:
|
|
||||||
|
|
||||||
1) "Book" is the documentation for the latest official release. This should get manually updated whenever a new release is made. It is published here:
|
The testnet running on devnet.solana.com is set to use a fixed release tag
|
||||||
https://solana-labs.github.io/book/
|
|
||||||
|
|
||||||
2) "Book-edge" tracks the tip of the master branch and updates automatically.
|
|
||||||
https://solana-labs.github.io/book-edge/
|
|
||||||
|
|
||||||
3) "Book-beta" tracks the tip of the beta branch and updates automatically.
|
|
||||||
https://solana-labs.github.io/book-beta/
|
|
||||||
|
|
||||||
To manually trigger an update of the "Book", create a new job of the manual-update-book pipeline.
|
|
||||||
Set the tag of the latest release as the PUBLISH_BOOK_TAG environment variable.
|
|
||||||
```bash
|
|
||||||
PUBLISH_BOOK_TAG=v0.16.6
|
|
||||||
```
|
|
||||||
https://buildkite.com/solana-labs/manual-update-book
|
|
||||||
|
|
||||||
### Update software on testnet.solana.com
|
|
||||||
|
|
||||||
The testnet running on testnet.solana.com is set to use a fixed release tag
|
|
||||||
which is set in the Buildkite testnet-management pipeline.
|
which is set in the Buildkite testnet-management pipeline.
|
||||||
This tag needs to be updated and the testnet restarted after a new release
|
This tag needs to be updated and the testnet restarted after a new release
|
||||||
tag is created.
|
tag is created.
|
||||||
@ -201,4 +182,4 @@ TESTNET_OP=create-and-start
|
|||||||
### Alert the community
|
### Alert the community
|
||||||
|
|
||||||
Notify Discord users on #validator-support that a new release for
|
Notify Discord users on #validator-support that a new release for
|
||||||
testnet.solana.com is available
|
devnet.solana.com is available
|
||||||
|
39
archiver-lib/Cargo.toml
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
[package]
|
||||||
|
name = "solana-archiver-lib"
|
||||||
|
version = "1.0.2"
|
||||||
|
description = "Solana Archiver Library"
|
||||||
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
homepage = "https://solana.com/"
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bincode = "1.2.1"
|
||||||
|
crossbeam-channel = "0.3"
|
||||||
|
ed25519-dalek = "=1.0.0-pre.1"
|
||||||
|
log = "0.4.8"
|
||||||
|
rand = "0.6.5"
|
||||||
|
rand_chacha = "0.1.1"
|
||||||
|
solana-client = { path = "../client", version = "1.0.2" }
|
||||||
|
solana-storage-program = { path = "../programs/storage", version = "1.0.2" }
|
||||||
|
thiserror = "1.0"
|
||||||
|
serde = "1.0.104"
|
||||||
|
serde_json = "1.0.46"
|
||||||
|
serde_derive = "1.0.103"
|
||||||
|
solana-net-utils = { path = "../net-utils", version = "1.0.2" }
|
||||||
|
solana-chacha = { path = "../chacha", version = "1.0.2" }
|
||||||
|
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.2" }
|
||||||
|
solana-ledger = { path = "../ledger", version = "1.0.2" }
|
||||||
|
solana-logger = { path = "../logger", version = "1.0.2" }
|
||||||
|
solana-perf = { path = "../perf", version = "1.0.2" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "1.0.2" }
|
||||||
|
solana-core = { path = "../core", version = "1.0.2" }
|
||||||
|
solana-archiver-utils = { path = "../archiver-utils", version = "1.0.2" }
|
||||||
|
solana-metrics = { path = "../metrics", version = "1.0.2" }
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
hex = "0.4.0"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "solana_archiver_lib"
|
@ -1,52 +1,63 @@
|
|||||||
use crate::chacha::{chacha_cbc_encrypt_ledger, CHACHA_BLOCK_SIZE};
|
use crate::result::ArchiverError;
|
||||||
use crate::cluster_info::{ClusterInfo, Node, VALIDATOR_PORT_RANGE};
|
use crossbeam_channel::unbounded;
|
||||||
use crate::contact_info::ContactInfo;
|
use rand::{thread_rng, Rng, SeedableRng};
|
||||||
use crate::gossip_service::GossipService;
|
|
||||||
use crate::packet::to_shared_blob;
|
|
||||||
use crate::recycler::Recycler;
|
|
||||||
use crate::repair_service;
|
|
||||||
use crate::repair_service::{RepairService, RepairSlotRange, RepairStrategy};
|
|
||||||
use crate::result::{Error, Result};
|
|
||||||
use crate::service::Service;
|
|
||||||
use crate::shred_fetch_stage::ShredFetchStage;
|
|
||||||
use crate::storage_stage::NUM_STORAGE_SAMPLES;
|
|
||||||
use crate::streamer::{receiver, responder, PacketReceiver};
|
|
||||||
use crate::window_service::WindowService;
|
|
||||||
use bincode::deserialize;
|
|
||||||
use rand::thread_rng;
|
|
||||||
use rand::Rng;
|
|
||||||
use rand::SeedableRng;
|
|
||||||
use rand_chacha::ChaChaRng;
|
use rand_chacha::ChaChaRng;
|
||||||
use solana_client::rpc_client::RpcClient;
|
use solana_archiver_utils::sample_file;
|
||||||
use solana_client::rpc_request::RpcRequest;
|
use solana_chacha::chacha::{chacha_cbc_encrypt_ledger, CHACHA_BLOCK_SIZE};
|
||||||
use solana_client::thin_client::ThinClient;
|
use solana_client::{
|
||||||
use solana_ed25519_dalek as ed25519_dalek;
|
rpc_client::RpcClient, rpc_request::RpcRequest, rpc_response::RpcStorageTurn,
|
||||||
use solana_ledger::blocktree::Blocktree;
|
thin_client::ThinClient,
|
||||||
use solana_ledger::leader_schedule_cache::LeaderScheduleCache;
|
};
|
||||||
use solana_ledger::shred::Shred;
|
use solana_core::{
|
||||||
use solana_netutil::bind_in_range;
|
cluster_info::{ClusterInfo, Node, VALIDATOR_PORT_RANGE},
|
||||||
use solana_sdk::account_utils::State;
|
contact_info::ContactInfo,
|
||||||
use solana_sdk::client::{AsyncClient, SyncClient};
|
gossip_service::GossipService,
|
||||||
use solana_sdk::clock::{get_complete_segment_from_slot, get_segment_from_slot};
|
packet::{limited_deserialize, PACKET_DATA_SIZE},
|
||||||
use solana_sdk::hash::{Hash, Hasher};
|
repair_service,
|
||||||
use solana_sdk::message::Message;
|
repair_service::{RepairService, RepairSlotRange, RepairStrategy},
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil, Signature};
|
serve_repair::ServeRepair,
|
||||||
use solana_sdk::timing::timestamp;
|
shred_fetch_stage::ShredFetchStage,
|
||||||
use solana_sdk::transaction::Transaction;
|
sigverify_stage::{DisabledSigVerifier, SigVerifyStage},
|
||||||
use solana_sdk::transport::TransportError;
|
storage_stage::NUM_STORAGE_SAMPLES,
|
||||||
use solana_storage_api::storage_contract::StorageContract;
|
streamer::{receiver, responder, PacketReceiver},
|
||||||
use solana_storage_api::storage_instruction::{self, StorageAccountType};
|
window_service::WindowService,
|
||||||
use std::fs::File;
|
};
|
||||||
use std::io::{self, BufReader, ErrorKind, Read, Seek, SeekFrom};
|
use solana_ledger::{
|
||||||
use std::mem::size_of;
|
blockstore::Blockstore, leader_schedule_cache::LeaderScheduleCache, shred::Shred,
|
||||||
use std::net::{SocketAddr, UdpSocket};
|
};
|
||||||
use std::path::{Path, PathBuf};
|
use solana_net_utils::bind_in_range;
|
||||||
use std::result;
|
use solana_perf::packet::Packets;
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use solana_perf::recycler::Recycler;
|
||||||
use std::sync::mpsc::{channel, Receiver, Sender};
|
use solana_sdk::packet::Packet;
|
||||||
use std::sync::{Arc, RwLock};
|
use solana_sdk::{
|
||||||
use std::thread::{sleep, spawn, JoinHandle};
|
account_utils::StateMut,
|
||||||
use std::time::Duration;
|
client::{AsyncClient, SyncClient},
|
||||||
|
clock::{get_complete_segment_from_slot, get_segment_from_slot, Slot},
|
||||||
|
commitment_config::CommitmentConfig,
|
||||||
|
hash::Hash,
|
||||||
|
message::Message,
|
||||||
|
signature::{Keypair, Signature, Signer},
|
||||||
|
timing::timestamp,
|
||||||
|
transaction::Transaction,
|
||||||
|
transport::TransportError,
|
||||||
|
};
|
||||||
|
use solana_storage_program::{
|
||||||
|
storage_contract::StorageContract,
|
||||||
|
storage_instruction::{self, StorageAccountType},
|
||||||
|
};
|
||||||
|
use std::{
|
||||||
|
io::{self, ErrorKind},
|
||||||
|
net::{SocketAddr, UdpSocket},
|
||||||
|
path::{Path, PathBuf},
|
||||||
|
result,
|
||||||
|
sync::atomic::{AtomicBool, Ordering},
|
||||||
|
sync::mpsc::{channel, Receiver, Sender},
|
||||||
|
sync::{Arc, RwLock},
|
||||||
|
thread::{sleep, spawn, JoinHandle},
|
||||||
|
time::Duration,
|
||||||
|
};
|
||||||
|
|
||||||
|
type Result<T> = std::result::Result<T, ArchiverError>;
|
||||||
|
|
||||||
static ENCRYPTED_FILENAME: &str = "ledger.enc";
|
static ENCRYPTED_FILENAME: &str = "ledger.enc";
|
||||||
|
|
||||||
@ -63,7 +74,7 @@ pub struct Archiver {
|
|||||||
// Shared Archiver Meta struct used internally
|
// Shared Archiver Meta struct used internally
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct ArchiverMeta {
|
struct ArchiverMeta {
|
||||||
slot: u64,
|
slot: Slot,
|
||||||
slots_per_segment: u64,
|
slots_per_segment: u64,
|
||||||
ledger_path: PathBuf,
|
ledger_path: PathBuf,
|
||||||
signature: Signature,
|
signature: Signature,
|
||||||
@ -72,49 +83,15 @@ struct ArchiverMeta {
|
|||||||
blockhash: Hash,
|
blockhash: Hash,
|
||||||
sha_state: Hash,
|
sha_state: Hash,
|
||||||
num_chacha_blocks: usize,
|
num_chacha_blocks: usize,
|
||||||
}
|
client_commitment: CommitmentConfig,
|
||||||
|
|
||||||
pub(crate) fn sample_file(in_path: &Path, sample_offsets: &[u64]) -> io::Result<Hash> {
|
|
||||||
let in_file = File::open(in_path)?;
|
|
||||||
let metadata = in_file.metadata()?;
|
|
||||||
let mut buffer_file = BufReader::new(in_file);
|
|
||||||
|
|
||||||
let mut hasher = Hasher::default();
|
|
||||||
let sample_size = size_of::<Hash>();
|
|
||||||
let sample_size64 = sample_size as u64;
|
|
||||||
let mut buf = vec![0; sample_size];
|
|
||||||
|
|
||||||
let file_len = metadata.len();
|
|
||||||
if file_len < sample_size64 {
|
|
||||||
return Err(io::Error::new(ErrorKind::Other, "file too short!"));
|
|
||||||
}
|
|
||||||
for offset in sample_offsets {
|
|
||||||
if *offset > (file_len - sample_size64) / sample_size64 {
|
|
||||||
return Err(io::Error::new(ErrorKind::Other, "offset too large"));
|
|
||||||
}
|
|
||||||
buffer_file.seek(SeekFrom::Start(*offset * sample_size64))?;
|
|
||||||
trace!("sampling @ {} ", *offset);
|
|
||||||
match buffer_file.read(&mut buf) {
|
|
||||||
Ok(size) => {
|
|
||||||
assert_eq!(size, buf.len());
|
|
||||||
hasher.hash(&buf);
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
warn!("Error sampling file");
|
|
||||||
return Err(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(hasher.result())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_slot_from_signature(
|
fn get_slot_from_signature(
|
||||||
signature: &ed25519_dalek::Signature,
|
signature: &Signature,
|
||||||
storage_turn: u64,
|
storage_turn: u64,
|
||||||
slots_per_segment: u64,
|
slots_per_segment: u64,
|
||||||
) -> u64 {
|
) -> u64 {
|
||||||
let signature_vec = signature.to_bytes();
|
let signature_vec = signature.as_ref();
|
||||||
let mut segment_index = u64::from(signature_vec[0])
|
let mut segment_index = u64::from(signature_vec[0])
|
||||||
| (u64::from(signature_vec[1]) << 8)
|
| (u64::from(signature_vec[1]) << 8)
|
||||||
| (u64::from(signature_vec[1]) << 16)
|
| (u64::from(signature_vec[1]) << 16)
|
||||||
@ -138,7 +115,7 @@ fn create_request_processor(
|
|||||||
let t_receiver = receiver(storage_socket.clone(), exit, s_reader, recycler, "archiver");
|
let t_receiver = receiver(storage_socket.clone(), exit, s_reader, recycler, "archiver");
|
||||||
thread_handles.push(t_receiver);
|
thread_handles.push(t_receiver);
|
||||||
|
|
||||||
let t_responder = responder("archiver-responder", storage_socket.clone(), r_responder);
|
let t_responder = responder("archiver-responder", storage_socket, r_responder);
|
||||||
thread_handles.push(t_responder);
|
thread_handles.push(t_responder);
|
||||||
|
|
||||||
let exit = exit.clone();
|
let exit = exit.clone();
|
||||||
@ -155,12 +132,11 @@ fn create_request_processor(
|
|||||||
if let Ok(packets) = packets {
|
if let Ok(packets) = packets {
|
||||||
for packet in &packets.packets {
|
for packet in &packets.packets {
|
||||||
let req: result::Result<ArchiverRequest, Box<bincode::ErrorKind>> =
|
let req: result::Result<ArchiverRequest, Box<bincode::ErrorKind>> =
|
||||||
deserialize(&packet.data[..packet.meta.size]);
|
limited_deserialize(&packet.data[..packet.meta.size]);
|
||||||
match req {
|
match req {
|
||||||
Ok(ArchiverRequest::GetSlotHeight(from)) => {
|
Ok(ArchiverRequest::GetSlotHeight(from)) => {
|
||||||
if let Ok(blob) = to_shared_blob(slot, from) {
|
let packet = Packet::from_data(&from, slot);
|
||||||
let _ = s_responder.send(vec![blob]);
|
let _ = s_responder.send(Packets::new(vec![packet]));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
info!("invalid request: {:?}", e);
|
info!("invalid request: {:?}", e);
|
||||||
@ -202,6 +178,7 @@ impl Archiver {
|
|||||||
cluster_entrypoint: ContactInfo,
|
cluster_entrypoint: ContactInfo,
|
||||||
keypair: Arc<Keypair>,
|
keypair: Arc<Keypair>,
|
||||||
storage_keypair: Arc<Keypair>,
|
storage_keypair: Arc<Keypair>,
|
||||||
|
client_commitment: CommitmentConfig,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
let exit = Arc::new(AtomicBool::new(false));
|
let exit = Arc::new(AtomicBool::new(false));
|
||||||
|
|
||||||
@ -214,33 +191,32 @@ impl Archiver {
|
|||||||
// Note for now, this ledger will not contain any of the existing entries
|
// Note for now, this ledger will not contain any of the existing entries
|
||||||
// in the ledger located at ledger_path, and will only append on newly received
|
// in the ledger located at ledger_path, and will only append on newly received
|
||||||
// entries after being passed to window_service
|
// entries after being passed to window_service
|
||||||
let blocktree = Arc::new(
|
let blockstore = Arc::new(
|
||||||
Blocktree::open(ledger_path).expect("Expected to be able to open database ledger"),
|
Blockstore::open(ledger_path).expect("Expected to be able to open database ledger"),
|
||||||
);
|
);
|
||||||
|
|
||||||
let gossip_service = GossipService::new(
|
let gossip_service = GossipService::new(&cluster_info, None, node.sockets.gossip, &exit);
|
||||||
&cluster_info,
|
|
||||||
Some(blocktree.clone()),
|
|
||||||
None,
|
|
||||||
node.sockets.gossip,
|
|
||||||
&exit,
|
|
||||||
);
|
|
||||||
|
|
||||||
info!("Connecting to the cluster via {:?}", cluster_entrypoint);
|
info!("Connecting to the cluster via {:?}", cluster_entrypoint);
|
||||||
let (nodes, _) =
|
let (nodes, _) =
|
||||||
match crate::gossip_service::discover_cluster(&cluster_entrypoint.gossip, 1) {
|
match solana_core::gossip_service::discover_cluster(&cluster_entrypoint.gossip, 1) {
|
||||||
Ok(nodes_and_archivers) => nodes_and_archivers,
|
Ok(nodes_and_archivers) => nodes_and_archivers,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
//shutdown services before exiting
|
//shutdown services before exiting
|
||||||
exit.store(true, Ordering::Relaxed);
|
exit.store(true, Ordering::Relaxed);
|
||||||
gossip_service.join()?;
|
gossip_service.join()?;
|
||||||
return Err(Error::from(e));
|
return Err(e.into());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let client = crate::gossip_service::get_client(&nodes);
|
let client = solana_core::gossip_service::get_client(&nodes);
|
||||||
|
|
||||||
info!("Setting up mining account...");
|
info!("Setting up mining account...");
|
||||||
if let Err(e) = Self::setup_mining_account(&client, &keypair, &storage_keypair) {
|
if let Err(e) = Self::setup_mining_account(
|
||||||
|
&client,
|
||||||
|
&keypair,
|
||||||
|
&storage_keypair,
|
||||||
|
client_commitment.clone(),
|
||||||
|
) {
|
||||||
//shutdown services before exiting
|
//shutdown services before exiting
|
||||||
exit.store(true, Ordering::Relaxed);
|
exit.store(true, Ordering::Relaxed);
|
||||||
gossip_service.join()?;
|
gossip_service.join()?;
|
||||||
@ -248,20 +224,20 @@ impl Archiver {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let repair_socket = Arc::new(node.sockets.repair);
|
let repair_socket = Arc::new(node.sockets.repair);
|
||||||
let blob_sockets: Vec<Arc<UdpSocket>> =
|
let shred_sockets: Vec<Arc<UdpSocket>> =
|
||||||
node.sockets.tvu.into_iter().map(Arc::new).collect();
|
node.sockets.tvu.into_iter().map(Arc::new).collect();
|
||||||
let blob_forward_sockets: Vec<Arc<UdpSocket>> = node
|
let shred_forward_sockets: Vec<Arc<UdpSocket>> = node
|
||||||
.sockets
|
.sockets
|
||||||
.tvu_forwards
|
.tvu_forwards
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(Arc::new)
|
.map(Arc::new)
|
||||||
.collect();
|
.collect();
|
||||||
let (blob_fetch_sender, blob_fetch_receiver) = channel();
|
let (shred_fetch_sender, shred_fetch_receiver) = channel();
|
||||||
let fetch_stage = ShredFetchStage::new(
|
let fetch_stage = ShredFetchStage::new(
|
||||||
blob_sockets,
|
shred_sockets,
|
||||||
blob_forward_sockets,
|
shred_forward_sockets,
|
||||||
repair_socket.clone(),
|
repair_socket.clone(),
|
||||||
&blob_fetch_sender,
|
&shred_fetch_sender,
|
||||||
&exit,
|
&exit,
|
||||||
);
|
);
|
||||||
let (slot_sender, slot_receiver) = channel();
|
let (slot_sender, slot_receiver) = channel();
|
||||||
@ -273,6 +249,7 @@ impl Archiver {
|
|||||||
let node_info = node.info.clone();
|
let node_info = node.info.clone();
|
||||||
let mut meta = ArchiverMeta {
|
let mut meta = ArchiverMeta {
|
||||||
ledger_path: ledger_path.to_path_buf(),
|
ledger_path: ledger_path.to_path_buf(),
|
||||||
|
client_commitment,
|
||||||
..ArchiverMeta::default()
|
..ArchiverMeta::default()
|
||||||
};
|
};
|
||||||
spawn(move || {
|
spawn(move || {
|
||||||
@ -280,12 +257,12 @@ impl Archiver {
|
|||||||
let window_service = match Self::setup(
|
let window_service = match Self::setup(
|
||||||
&mut meta,
|
&mut meta,
|
||||||
cluster_info.clone(),
|
cluster_info.clone(),
|
||||||
&blocktree,
|
&blockstore,
|
||||||
&exit,
|
&exit,
|
||||||
&node_info,
|
&node_info,
|
||||||
&storage_keypair,
|
&storage_keypair,
|
||||||
repair_socket,
|
repair_socket,
|
||||||
blob_fetch_receiver,
|
shred_fetch_receiver,
|
||||||
slot_sender,
|
slot_sender,
|
||||||
) {
|
) {
|
||||||
Ok(window_service) => window_service,
|
Ok(window_service) => window_service,
|
||||||
@ -306,7 +283,7 @@ impl Archiver {
|
|||||||
// run archiver
|
// run archiver
|
||||||
Self::run(
|
Self::run(
|
||||||
&mut meta,
|
&mut meta,
|
||||||
&blocktree,
|
&blockstore,
|
||||||
cluster_info,
|
cluster_info,
|
||||||
&keypair,
|
&keypair,
|
||||||
&storage_keypair,
|
&storage_keypair,
|
||||||
@ -330,14 +307,14 @@ impl Archiver {
|
|||||||
|
|
||||||
fn run(
|
fn run(
|
||||||
meta: &mut ArchiverMeta,
|
meta: &mut ArchiverMeta,
|
||||||
blocktree: &Arc<Blocktree>,
|
blockstore: &Arc<Blockstore>,
|
||||||
cluster_info: Arc<RwLock<ClusterInfo>>,
|
cluster_info: Arc<RwLock<ClusterInfo>>,
|
||||||
archiver_keypair: &Arc<Keypair>,
|
archiver_keypair: &Arc<Keypair>,
|
||||||
storage_keypair: &Arc<Keypair>,
|
storage_keypair: &Arc<Keypair>,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
) {
|
) {
|
||||||
// encrypt segment
|
// encrypt segment
|
||||||
Self::encrypt_ledger(meta, blocktree).expect("ledger encrypt not successful");
|
Self::encrypt_ledger(meta, blockstore).expect("ledger encrypt not successful");
|
||||||
let enc_file_path = meta.ledger_data_file_encrypted.clone();
|
let enc_file_path = meta.ledger_data_file_encrypted.clone();
|
||||||
// do replicate
|
// do replicate
|
||||||
loop {
|
loop {
|
||||||
@ -377,7 +354,12 @@ impl Archiver {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
meta.blockhash = storage_blockhash;
|
meta.blockhash = storage_blockhash;
|
||||||
Self::redeem_rewards(&cluster_info, archiver_keypair, storage_keypair);
|
Self::redeem_rewards(
|
||||||
|
&cluster_info,
|
||||||
|
archiver_keypair,
|
||||||
|
storage_keypair,
|
||||||
|
meta.client_commitment.clone(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
exit.store(true, Ordering::Relaxed);
|
exit.store(true, Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
@ -386,11 +368,14 @@ impl Archiver {
|
|||||||
cluster_info: &Arc<RwLock<ClusterInfo>>,
|
cluster_info: &Arc<RwLock<ClusterInfo>>,
|
||||||
archiver_keypair: &Arc<Keypair>,
|
archiver_keypair: &Arc<Keypair>,
|
||||||
storage_keypair: &Arc<Keypair>,
|
storage_keypair: &Arc<Keypair>,
|
||||||
|
client_commitment: CommitmentConfig,
|
||||||
) {
|
) {
|
||||||
let nodes = cluster_info.read().unwrap().tvu_peers();
|
let nodes = cluster_info.read().unwrap().tvu_peers();
|
||||||
let client = crate::gossip_service::get_client(&nodes);
|
let client = solana_core::gossip_service::get_client(&nodes);
|
||||||
|
|
||||||
if let Ok(Some(account)) = client.get_account(&storage_keypair.pubkey()) {
|
if let Ok(Some(account)) =
|
||||||
|
client.get_account_with_commitment(&storage_keypair.pubkey(), client_commitment.clone())
|
||||||
|
{
|
||||||
if let Ok(StorageContract::ArchiverStorage { validations, .. }) = account.state() {
|
if let Ok(StorageContract::ArchiverStorage { validations, .. }) = account.state() {
|
||||||
if !validations.is_empty() {
|
if !validations.is_empty() {
|
||||||
let ix = storage_instruction::claim_reward(
|
let ix = storage_instruction::claim_reward(
|
||||||
@ -399,12 +384,15 @@ impl Archiver {
|
|||||||
);
|
);
|
||||||
let message =
|
let message =
|
||||||
Message::new_with_payer(vec![ix], Some(&archiver_keypair.pubkey()));
|
Message::new_with_payer(vec![ix], Some(&archiver_keypair.pubkey()));
|
||||||
if let Err(e) = client.send_message(&[&archiver_keypair], message) {
|
if let Err(e) = client.send_message(&[archiver_keypair.as_ref()], message) {
|
||||||
error!("unable to redeem reward, tx failed: {:?}", e);
|
error!("unable to redeem reward, tx failed: {:?}", e);
|
||||||
} else {
|
} else {
|
||||||
info!(
|
info!(
|
||||||
"collected mining rewards: Account balance {:?}",
|
"collected mining rewards: Account balance {:?}",
|
||||||
client.get_balance(&archiver_keypair.pubkey())
|
client.get_balance_with_commitment(
|
||||||
|
&archiver_keypair.pubkey(),
|
||||||
|
client_commitment
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -418,23 +406,24 @@ impl Archiver {
|
|||||||
fn setup(
|
fn setup(
|
||||||
meta: &mut ArchiverMeta,
|
meta: &mut ArchiverMeta,
|
||||||
cluster_info: Arc<RwLock<ClusterInfo>>,
|
cluster_info: Arc<RwLock<ClusterInfo>>,
|
||||||
blocktree: &Arc<Blocktree>,
|
blockstore: &Arc<Blockstore>,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
node_info: &ContactInfo,
|
node_info: &ContactInfo,
|
||||||
storage_keypair: &Arc<Keypair>,
|
storage_keypair: &Arc<Keypair>,
|
||||||
repair_socket: Arc<UdpSocket>,
|
repair_socket: Arc<UdpSocket>,
|
||||||
blob_fetch_receiver: PacketReceiver,
|
shred_fetch_receiver: PacketReceiver,
|
||||||
slot_sender: Sender<u64>,
|
slot_sender: Sender<u64>,
|
||||||
) -> Result<(WindowService)> {
|
) -> Result<WindowService> {
|
||||||
let slots_per_segment = match Self::get_segment_config(&cluster_info) {
|
let slots_per_segment =
|
||||||
Ok(slots_per_segment) => slots_per_segment,
|
match Self::get_segment_config(&cluster_info, meta.client_commitment.clone()) {
|
||||||
Err(e) => {
|
Ok(slots_per_segment) => slots_per_segment,
|
||||||
error!("unable to get segment size configuration, exiting...");
|
Err(e) => {
|
||||||
//shutdown services before exiting
|
error!("unable to get segment size configuration, exiting...");
|
||||||
exit.store(true, Ordering::Relaxed);
|
//shutdown services before exiting
|
||||||
return Err(e);
|
exit.store(true, Ordering::Relaxed);
|
||||||
}
|
return Err(e);
|
||||||
};
|
}
|
||||||
|
};
|
||||||
let (segment_blockhash, segment_slot) = match Self::poll_for_segment(
|
let (segment_blockhash, segment_slot) = match Self::poll_for_segment(
|
||||||
&cluster_info,
|
&cluster_info,
|
||||||
slots_per_segment,
|
slots_per_segment,
|
||||||
@ -448,13 +437,13 @@ impl Archiver {
|
|||||||
return Err(e);
|
return Err(e);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let signature = storage_keypair.sign(segment_blockhash.as_ref());
|
let signature = storage_keypair.sign_message(segment_blockhash.as_ref());
|
||||||
let slot = get_slot_from_signature(&signature, segment_slot, slots_per_segment);
|
let slot = get_slot_from_signature(&signature, segment_slot, slots_per_segment);
|
||||||
info!("replicating slot: {}", slot);
|
info!("replicating slot: {}", slot);
|
||||||
slot_sender.send(slot)?;
|
slot_sender.send(slot)?;
|
||||||
meta.slot = slot;
|
meta.slot = slot;
|
||||||
meta.slots_per_segment = slots_per_segment;
|
meta.slots_per_segment = slots_per_segment;
|
||||||
meta.signature = Signature::new(&signature.to_bytes());
|
meta.signature = signature;
|
||||||
meta.blockhash = segment_blockhash;
|
meta.blockhash = segment_blockhash;
|
||||||
|
|
||||||
let mut repair_slot_range = RepairSlotRange::default();
|
let mut repair_slot_range = RepairSlotRange::default();
|
||||||
@ -463,10 +452,18 @@ impl Archiver {
|
|||||||
|
|
||||||
let (retransmit_sender, _) = channel();
|
let (retransmit_sender, _) = channel();
|
||||||
|
|
||||||
|
let (verified_sender, verified_receiver) = unbounded();
|
||||||
|
|
||||||
|
let _sigverify_stage = SigVerifyStage::new(
|
||||||
|
shred_fetch_receiver,
|
||||||
|
verified_sender,
|
||||||
|
DisabledSigVerifier::default(),
|
||||||
|
);
|
||||||
|
|
||||||
let window_service = WindowService::new(
|
let window_service = WindowService::new(
|
||||||
blocktree.clone(),
|
blockstore.clone(),
|
||||||
cluster_info.clone(),
|
cluster_info.clone(),
|
||||||
blob_fetch_receiver,
|
verified_receiver,
|
||||||
retransmit_sender,
|
retransmit_sender,
|
||||||
repair_socket,
|
repair_socket,
|
||||||
&exit,
|
&exit,
|
||||||
@ -478,7 +475,7 @@ impl Archiver {
|
|||||||
Self::wait_for_segment_download(
|
Self::wait_for_segment_download(
|
||||||
slot,
|
slot,
|
||||||
slots_per_segment,
|
slots_per_segment,
|
||||||
&blocktree,
|
&blockstore,
|
||||||
&exit,
|
&exit,
|
||||||
&node_info,
|
&node_info,
|
||||||
cluster_info,
|
cluster_info,
|
||||||
@ -487,9 +484,9 @@ impl Archiver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn wait_for_segment_download(
|
fn wait_for_segment_download(
|
||||||
start_slot: u64,
|
start_slot: Slot,
|
||||||
slots_per_segment: u64,
|
slots_per_segment: u64,
|
||||||
blocktree: &Arc<Blocktree>,
|
blockstore: &Arc<Blockstore>,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
node_info: &ContactInfo,
|
node_info: &ContactInfo,
|
||||||
cluster_info: Arc<RwLock<ClusterInfo>>,
|
cluster_info: Arc<RwLock<ClusterInfo>>,
|
||||||
@ -500,7 +497,7 @@ impl Archiver {
|
|||||||
);
|
);
|
||||||
let mut current_slot = start_slot;
|
let mut current_slot = start_slot;
|
||||||
'outer: loop {
|
'outer: loop {
|
||||||
while blocktree.is_full(current_slot) {
|
while blockstore.is_full(current_slot) {
|
||||||
current_slot += 1;
|
current_slot += 1;
|
||||||
info!("current slot: {}", current_slot);
|
info!("current slot: {}", current_slot);
|
||||||
if current_slot >= start_slot + slots_per_segment {
|
if current_slot >= start_slot + slots_per_segment {
|
||||||
@ -519,13 +516,15 @@ impl Archiver {
|
|||||||
let mut contact_info = node_info.clone();
|
let mut contact_info = node_info.clone();
|
||||||
contact_info.tvu = "0.0.0.0:0".parse().unwrap();
|
contact_info.tvu = "0.0.0.0:0".parse().unwrap();
|
||||||
contact_info.wallclock = timestamp();
|
contact_info.wallclock = timestamp();
|
||||||
|
// copy over the adopted shred_version from the entrypoint
|
||||||
|
contact_info.shred_version = cluster_info.read().unwrap().my_data().shred_version;
|
||||||
{
|
{
|
||||||
let mut cluster_info_w = cluster_info.write().unwrap();
|
let mut cluster_info_w = cluster_info.write().unwrap();
|
||||||
cluster_info_w.insert_self(contact_info);
|
cluster_info_w.insert_self(contact_info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encrypt_ledger(meta: &mut ArchiverMeta, blocktree: &Arc<Blocktree>) -> Result<()> {
|
fn encrypt_ledger(meta: &mut ArchiverMeta, blockstore: &Arc<Blockstore>) -> Result<()> {
|
||||||
meta.ledger_data_file_encrypted = meta.ledger_path.join(ENCRYPTED_FILENAME);
|
meta.ledger_data_file_encrypted = meta.ledger_path.join(ENCRYPTED_FILENAME);
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -533,7 +532,7 @@ impl Archiver {
|
|||||||
ivec.copy_from_slice(&meta.signature.as_ref());
|
ivec.copy_from_slice(&meta.signature.as_ref());
|
||||||
|
|
||||||
let num_encrypted_bytes = chacha_cbc_encrypt_ledger(
|
let num_encrypted_bytes = chacha_cbc_encrypt_ledger(
|
||||||
blocktree,
|
blockstore,
|
||||||
meta.slot,
|
meta.slot,
|
||||||
meta.slots_per_segment,
|
meta.slots_per_segment,
|
||||||
&meta.ledger_data_file_encrypted,
|
&meta.ledger_data_file_encrypted,
|
||||||
@ -564,7 +563,7 @@ impl Archiver {
|
|||||||
fn sample_file_to_create_mining_hash(
|
fn sample_file_to_create_mining_hash(
|
||||||
enc_file_path: &Path,
|
enc_file_path: &Path,
|
||||||
sampling_offsets: &[u64],
|
sampling_offsets: &[u64],
|
||||||
) -> Result<(Hash)> {
|
) -> Result<Hash> {
|
||||||
let sha_state = sample_file(enc_file_path, sampling_offsets)?;
|
let sha_state = sample_file(enc_file_path, sampling_offsets)?;
|
||||||
info!("sampled sha_state: {}", sha_state);
|
info!("sampled sha_state: {}", sha_state);
|
||||||
Ok(sha_state)
|
Ok(sha_state)
|
||||||
@ -574,33 +573,32 @@ impl Archiver {
|
|||||||
client: &ThinClient,
|
client: &ThinClient,
|
||||||
keypair: &Keypair,
|
keypair: &Keypair,
|
||||||
storage_keypair: &Keypair,
|
storage_keypair: &Keypair,
|
||||||
|
client_commitment: CommitmentConfig,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
// make sure archiver has some balance
|
// make sure archiver has some balance
|
||||||
info!("checking archiver keypair...");
|
info!("checking archiver keypair...");
|
||||||
if client.poll_balance_with_timeout(
|
if client.poll_balance_with_timeout_and_commitment(
|
||||||
&keypair.pubkey(),
|
&keypair.pubkey(),
|
||||||
&Duration::from_millis(100),
|
&Duration::from_millis(100),
|
||||||
&Duration::from_secs(5),
|
&Duration::from_secs(5),
|
||||||
|
client_commitment.clone(),
|
||||||
)? == 0
|
)? == 0
|
||||||
{
|
{
|
||||||
return Err(
|
return Err(ArchiverError::EmptyStorageAccountBalance);
|
||||||
io::Error::new(io::ErrorKind::Other, "keypair account has no balance").into(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
info!("checking storage account keypair...");
|
info!("checking storage account keypair...");
|
||||||
// check if the storage account exists
|
// check if the storage account exists
|
||||||
let balance = client.poll_get_balance(&storage_keypair.pubkey());
|
let balance = client
|
||||||
|
.poll_get_balance_with_commitment(&storage_keypair.pubkey(), client_commitment.clone());
|
||||||
if balance.is_err() || balance.unwrap() == 0 {
|
if balance.is_err() || balance.unwrap() == 0 {
|
||||||
let blockhash = match client.get_recent_blockhash() {
|
let blockhash =
|
||||||
Ok((blockhash, _)) => blockhash,
|
match client.get_recent_blockhash_with_commitment(client_commitment.clone()) {
|
||||||
Err(_) => {
|
Ok((blockhash, _)) => blockhash,
|
||||||
return Err(Error::IO(<io::Error>::new(
|
Err(e) => {
|
||||||
io::ErrorKind::Other,
|
return Err(ArchiverError::TransportError(e));
|
||||||
"unable to get recent blockhash, can't submit proof",
|
}
|
||||||
)));
|
};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let ix = storage_instruction::create_storage_account(
|
let ix = storage_instruction::create_storage_account(
|
||||||
&keypair.pubkey(),
|
&keypair.pubkey(),
|
||||||
@ -612,7 +610,7 @@ impl Archiver {
|
|||||||
let tx = Transaction::new_signed_instructions(&[keypair], ix, blockhash);
|
let tx = Transaction::new_signed_instructions(&[keypair], ix, blockhash);
|
||||||
let signature = client.async_send_transaction(tx)?;
|
let signature = client.async_send_transaction(tx)?;
|
||||||
client
|
client
|
||||||
.poll_for_signature(&signature)
|
.poll_for_signature_with_commitment(&signature, client_commitment)
|
||||||
.map_err(|err| match err {
|
.map_err(|err| match err {
|
||||||
TransportError::IoError(e) => e,
|
TransportError::IoError(e) => e,
|
||||||
TransportError::TransactionError(_) => io::Error::new(
|
TransportError::TransactionError(_) => io::Error::new(
|
||||||
@ -632,26 +630,33 @@ impl Archiver {
|
|||||||
) {
|
) {
|
||||||
// No point if we've got no storage account...
|
// No point if we've got no storage account...
|
||||||
let nodes = cluster_info.read().unwrap().tvu_peers();
|
let nodes = cluster_info.read().unwrap().tvu_peers();
|
||||||
let client = crate::gossip_service::get_client(&nodes);
|
let client = solana_core::gossip_service::get_client(&nodes);
|
||||||
let storage_balance = client.poll_get_balance(&storage_keypair.pubkey());
|
let storage_balance = client.poll_get_balance_with_commitment(
|
||||||
|
&storage_keypair.pubkey(),
|
||||||
|
meta.client_commitment.clone(),
|
||||||
|
);
|
||||||
if storage_balance.is_err() || storage_balance.unwrap() == 0 {
|
if storage_balance.is_err() || storage_balance.unwrap() == 0 {
|
||||||
error!("Unable to submit mining proof, no storage account");
|
error!("Unable to submit mining proof, no storage account");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// ...or no lamports for fees
|
// ...or no lamports for fees
|
||||||
let balance = client.poll_get_balance(&archiver_keypair.pubkey());
|
let balance = client.poll_get_balance_with_commitment(
|
||||||
|
&archiver_keypair.pubkey(),
|
||||||
|
meta.client_commitment.clone(),
|
||||||
|
);
|
||||||
if balance.is_err() || balance.unwrap() == 0 {
|
if balance.is_err() || balance.unwrap() == 0 {
|
||||||
error!("Unable to submit mining proof, insufficient Archiver Account balance");
|
error!("Unable to submit mining proof, insufficient Archiver Account balance");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let blockhash = match client.get_recent_blockhash() {
|
let blockhash =
|
||||||
Ok((blockhash, _)) => blockhash,
|
match client.get_recent_blockhash_with_commitment(meta.client_commitment.clone()) {
|
||||||
Err(_) => {
|
Ok((blockhash, _)) => blockhash,
|
||||||
error!("unable to get recent blockhash, can't submit proof");
|
Err(_) => {
|
||||||
return;
|
error!("unable to get recent blockhash, can't submit proof");
|
||||||
}
|
return;
|
||||||
};
|
}
|
||||||
|
};
|
||||||
let instruction = storage_instruction::mining_proof(
|
let instruction = storage_instruction::mining_proof(
|
||||||
&storage_keypair.pubkey(),
|
&storage_keypair.pubkey(),
|
||||||
meta.sha_state,
|
meta.sha_state,
|
||||||
@ -666,7 +671,7 @@ impl Archiver {
|
|||||||
blockhash,
|
blockhash,
|
||||||
);
|
);
|
||||||
if let Err(err) = client.send_and_confirm_transaction(
|
if let Err(err) = client.send_and_confirm_transaction(
|
||||||
&[&archiver_keypair, &storage_keypair],
|
&[archiver_keypair.as_ref(), storage_keypair.as_ref()],
|
||||||
&mut transaction,
|
&mut transaction,
|
||||||
10,
|
10,
|
||||||
0,
|
0,
|
||||||
@ -686,10 +691,13 @@ impl Archiver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_segment_config(cluster_info: &Arc<RwLock<ClusterInfo>>) -> result::Result<u64, Error> {
|
fn get_segment_config(
|
||||||
|
cluster_info: &Arc<RwLock<ClusterInfo>>,
|
||||||
|
client_commitment: CommitmentConfig,
|
||||||
|
) -> Result<u64> {
|
||||||
let rpc_peers = {
|
let rpc_peers = {
|
||||||
let cluster_info = cluster_info.read().unwrap();
|
let cluster_info = cluster_info.read().unwrap();
|
||||||
cluster_info.rpc_peers()
|
cluster_info.all_rpc_peers()
|
||||||
};
|
};
|
||||||
debug!("rpc peers: {:?}", rpc_peers);
|
debug!("rpc peers: {:?}", rpc_peers);
|
||||||
if !rpc_peers.is_empty() {
|
if !rpc_peers.is_empty() {
|
||||||
@ -698,15 +706,19 @@ impl Archiver {
|
|||||||
RpcClient::new_socket(rpc_peers[node_index].rpc)
|
RpcClient::new_socket(rpc_peers[node_index].rpc)
|
||||||
};
|
};
|
||||||
Ok(rpc_client
|
Ok(rpc_client
|
||||||
.retry_make_rpc_request(&RpcRequest::GetSlotsPerSegment, None, 0)
|
.send(
|
||||||
|
&RpcRequest::GetSlotsPerSegment,
|
||||||
|
serde_json::json!([client_commitment]),
|
||||||
|
0,
|
||||||
|
)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
warn!("Error while making rpc request {:?}", err);
|
warn!("Error while making rpc request {:?}", err);
|
||||||
Error::IO(io::Error::new(ErrorKind::Other, "rpc error"))
|
ArchiverError::ClientError(err)
|
||||||
})?
|
})?
|
||||||
.as_u64()
|
.as_u64()
|
||||||
.unwrap())
|
.unwrap())
|
||||||
} else {
|
} else {
|
||||||
Err(io::Error::new(io::ErrorKind::Other, "No RPC peers...".to_string()).into())
|
Err(ArchiverError::NoRpcPeers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -716,7 +728,7 @@ impl Archiver {
|
|||||||
slots_per_segment: u64,
|
slots_per_segment: u64,
|
||||||
previous_blockhash: &Hash,
|
previous_blockhash: &Hash,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
) -> result::Result<(Hash, u64), Error> {
|
) -> Result<(Hash, u64)> {
|
||||||
loop {
|
loop {
|
||||||
let (blockhash, turn_slot) = Self::poll_for_blockhash_and_slot(
|
let (blockhash, turn_slot) = Self::poll_for_blockhash_and_slot(
|
||||||
cluster_info,
|
cluster_info,
|
||||||
@ -736,12 +748,12 @@ impl Archiver {
|
|||||||
slots_per_segment: u64,
|
slots_per_segment: u64,
|
||||||
previous_blockhash: &Hash,
|
previous_blockhash: &Hash,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
) -> result::Result<(Hash, u64), Error> {
|
) -> Result<(Hash, u64)> {
|
||||||
info!("waiting for the next turn...");
|
info!("waiting for the next turn...");
|
||||||
loop {
|
loop {
|
||||||
let rpc_peers = {
|
let rpc_peers = {
|
||||||
let cluster_info = cluster_info.read().unwrap();
|
let cluster_info = cluster_info.read().unwrap();
|
||||||
cluster_info.rpc_peers()
|
cluster_info.all_rpc_peers()
|
||||||
};
|
};
|
||||||
debug!("rpc peers: {:?}", rpc_peers);
|
debug!("rpc peers: {:?}", rpc_peers);
|
||||||
if !rpc_peers.is_empty() {
|
if !rpc_peers.is_empty() {
|
||||||
@ -750,18 +762,20 @@ impl Archiver {
|
|||||||
RpcClient::new_socket(rpc_peers[node_index].rpc)
|
RpcClient::new_socket(rpc_peers[node_index].rpc)
|
||||||
};
|
};
|
||||||
let response = rpc_client
|
let response = rpc_client
|
||||||
.retry_make_rpc_request(&RpcRequest::GetStorageTurn, None, 0)
|
.send(
|
||||||
|
&RpcRequest::GetStorageTurn,
|
||||||
|
serde_json::value::Value::Null,
|
||||||
|
0,
|
||||||
|
)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
warn!("Error while making rpc request {:?}", err);
|
warn!("Error while making rpc request {:?}", err);
|
||||||
Error::IO(io::Error::new(ErrorKind::Other, "rpc error"))
|
ArchiverError::ClientError(err)
|
||||||
})?;
|
|
||||||
let (storage_blockhash, turn_slot) =
|
|
||||||
serde_json::from_value::<((String, u64))>(response).map_err(|err| {
|
|
||||||
io::Error::new(
|
|
||||||
io::ErrorKind::Other,
|
|
||||||
format!("Couldn't parse response: {:?}", err),
|
|
||||||
)
|
|
||||||
})?;
|
})?;
|
||||||
|
let RpcStorageTurn {
|
||||||
|
blockhash: storage_blockhash,
|
||||||
|
slot: turn_slot,
|
||||||
|
} = serde_json::from_value::<RpcStorageTurn>(response)
|
||||||
|
.map_err(ArchiverError::JsonError)?;
|
||||||
let turn_blockhash = storage_blockhash.parse().map_err(|err| {
|
let turn_blockhash = storage_blockhash.parse().map_err(|err| {
|
||||||
io::Error::new(
|
io::Error::new(
|
||||||
io::ErrorKind::Other,
|
io::ErrorKind::Other,
|
||||||
@ -779,7 +793,7 @@ impl Archiver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if exit.load(Ordering::Relaxed) {
|
if exit.load(Ordering::Relaxed) {
|
||||||
return Err(Error::IO(io::Error::new(
|
return Err(ArchiverError::IO(io::Error::new(
|
||||||
ErrorKind::Other,
|
ErrorKind::Other,
|
||||||
"exit signalled...",
|
"exit signalled...",
|
||||||
)));
|
)));
|
||||||
@ -788,19 +802,19 @@ impl Archiver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Ask an archiver to populate a given blocktree with its segment.
|
/// Ask an archiver to populate a given blockstore with its segment.
|
||||||
/// Return the slot at the start of the archiver's segment
|
/// Return the slot at the start of the archiver's segment
|
||||||
///
|
///
|
||||||
/// It is recommended to use a temporary blocktree for this since the download will not verify
|
/// It is recommended to use a temporary blockstore for this since the download will not verify
|
||||||
/// blobs received and might impact the chaining of blobs across slots
|
/// shreds received and might impact the chaining of shreds across slots
|
||||||
pub fn download_from_archiver(
|
pub fn download_from_archiver(
|
||||||
cluster_info: &Arc<RwLock<ClusterInfo>>,
|
serve_repair: &ServeRepair,
|
||||||
archiver_info: &ContactInfo,
|
archiver_info: &ContactInfo,
|
||||||
blocktree: &Arc<Blocktree>,
|
blockstore: &Arc<Blockstore>,
|
||||||
slots_per_segment: u64,
|
slots_per_segment: u64,
|
||||||
) -> Result<(u64)> {
|
) -> Result<u64> {
|
||||||
// Create a client which downloads from the archiver and see that it
|
// Create a client which downloads from the archiver and see that it
|
||||||
// can respond with blobs.
|
// can respond with shreds.
|
||||||
let start_slot = Self::get_archiver_segment_slot(archiver_info.storage_addr);
|
let start_slot = Self::get_archiver_segment_slot(archiver_info.storage_addr);
|
||||||
info!("Archiver download: start at {}", start_slot);
|
info!("Archiver download: start at {}", start_slot);
|
||||||
|
|
||||||
@ -810,14 +824,14 @@ impl Archiver {
|
|||||||
let t_receiver = receiver(
|
let t_receiver = receiver(
|
||||||
repair_socket.clone(),
|
repair_socket.clone(),
|
||||||
&exit,
|
&exit,
|
||||||
s_reader.clone(),
|
s_reader,
|
||||||
Recycler::default(),
|
Recycler::default(),
|
||||||
"archiver_reeciver",
|
"archiver_reeciver",
|
||||||
);
|
);
|
||||||
let id = cluster_info.read().unwrap().id();
|
let id = serve_repair.keypair().pubkey();
|
||||||
info!(
|
info!(
|
||||||
"Sending repair requests from: {} to: {}",
|
"Sending repair requests from: {} to: {}",
|
||||||
cluster_info.read().unwrap().my_data().id,
|
serve_repair.my_info().id,
|
||||||
archiver_info.gossip
|
archiver_info.gossip
|
||||||
);
|
);
|
||||||
let repair_slot_range = RepairSlotRange {
|
let repair_slot_range = RepairSlotRange {
|
||||||
@ -828,7 +842,7 @@ impl Archiver {
|
|||||||
for _ in 0..120 {
|
for _ in 0..120 {
|
||||||
// Strategy used by archivers
|
// Strategy used by archivers
|
||||||
let repairs = RepairService::generate_repairs_in_range(
|
let repairs = RepairService::generate_repairs_in_range(
|
||||||
blocktree,
|
blockstore,
|
||||||
repair_service::MAX_REPAIR_LENGTH,
|
repair_service::MAX_REPAIR_LENGTH,
|
||||||
&repair_slot_range,
|
&repair_slot_range,
|
||||||
);
|
);
|
||||||
@ -837,9 +851,7 @@ impl Archiver {
|
|||||||
let reqs: Vec<_> = repairs
|
let reqs: Vec<_> = repairs
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter_map(|repair_request| {
|
.filter_map(|repair_request| {
|
||||||
cluster_info
|
serve_repair
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.map_repair_request(&repair_request)
|
.map_repair_request(&repair_request)
|
||||||
.map(|result| ((archiver_info.gossip, result), repair_request))
|
.map(|result| ((archiver_info.gossip, result), repair_request))
|
||||||
.ok()
|
.ok()
|
||||||
@ -867,17 +879,17 @@ impl Archiver {
|
|||||||
let res = r_reader.recv_timeout(Duration::new(1, 0));
|
let res = r_reader.recv_timeout(Duration::new(1, 0));
|
||||||
if let Ok(mut packets) = res {
|
if let Ok(mut packets) = res {
|
||||||
while let Ok(mut more) = r_reader.try_recv() {
|
while let Ok(mut more) = r_reader.try_recv() {
|
||||||
packets.packets.append(&mut more.packets);
|
packets.packets.append_pinned(&mut more.packets);
|
||||||
}
|
}
|
||||||
let shreds: Vec<Shred> = packets
|
let shreds: Vec<Shred> = packets
|
||||||
.packets
|
.packets
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter_map(|p| Shred::new_from_serialized_shred(p.data.to_vec()).ok())
|
.filter_map(|p| Shred::new_from_serialized_shred(p.data.to_vec()).ok())
|
||||||
.collect();
|
.collect();
|
||||||
blocktree.insert_shreds(shreds, None)?;
|
blockstore.insert_shreds(shreds, None, false)?;
|
||||||
}
|
}
|
||||||
// check if all the slots in the segment are complete
|
// check if all the slots in the segment are complete
|
||||||
if Self::segment_complete(start_slot, slots_per_segment, blocktree) {
|
if Self::segment_complete(start_slot, slots_per_segment, blockstore) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sleep(Duration::from_millis(500));
|
sleep(Duration::from_millis(500));
|
||||||
@ -886,21 +898,19 @@ impl Archiver {
|
|||||||
t_receiver.join().unwrap();
|
t_receiver.join().unwrap();
|
||||||
|
|
||||||
// check if all the slots in the segment are complete
|
// check if all the slots in the segment are complete
|
||||||
if !Self::segment_complete(start_slot, slots_per_segment, blocktree) {
|
if !Self::segment_complete(start_slot, slots_per_segment, blockstore) {
|
||||||
return Err(
|
return Err(ArchiverError::SegmentDownloadError);
|
||||||
io::Error::new(ErrorKind::Other, "Unable to download the full segment").into(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
Ok(start_slot)
|
Ok(start_slot)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn segment_complete(
|
fn segment_complete(
|
||||||
start_slot: u64,
|
start_slot: Slot,
|
||||||
slots_per_segment: u64,
|
slots_per_segment: u64,
|
||||||
blocktree: &Arc<Blocktree>,
|
blockstore: &Arc<Blockstore>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
for slot in start_slot..(start_slot + slots_per_segment) {
|
for slot in start_slot..(start_slot + slots_per_segment) {
|
||||||
if !blocktree.is_full(slot) {
|
if !blockstore.is_full(slot) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -919,81 +929,16 @@ impl Archiver {
|
|||||||
socket.send_to(&serialized_req, to).unwrap();
|
socket.send_to(&serialized_req, to).unwrap();
|
||||||
let mut buf = [0; 1024];
|
let mut buf = [0; 1024];
|
||||||
if let Ok((size, _addr)) = socket.recv_from(&mut buf) {
|
if let Ok((size, _addr)) = socket.recv_from(&mut buf) {
|
||||||
return deserialize(&buf[..size]).unwrap();
|
// Ignore bad packet and try again
|
||||||
|
if let Ok(slot) = bincode::config()
|
||||||
|
.limit(PACKET_DATA_SIZE as u64)
|
||||||
|
.deserialize(&buf[..size])
|
||||||
|
{
|
||||||
|
return slot;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sleep(Duration::from_millis(500));
|
sleep(Duration::from_millis(500));
|
||||||
}
|
}
|
||||||
panic!("Couldn't get segment slot from archiver!");
|
panic!("Couldn't get segment slot from archiver!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
use std::fs::{create_dir_all, remove_file};
|
|
||||||
use std::io::Write;
|
|
||||||
|
|
||||||
fn tmp_file_path(name: &str) -> PathBuf {
|
|
||||||
use std::env;
|
|
||||||
let out_dir = env::var("FARF_DIR").unwrap_or_else(|_| "farf".to_string());
|
|
||||||
let keypair = Keypair::new();
|
|
||||||
|
|
||||||
let mut path = PathBuf::new();
|
|
||||||
path.push(out_dir);
|
|
||||||
path.push("tmp");
|
|
||||||
create_dir_all(&path).unwrap();
|
|
||||||
|
|
||||||
path.push(format!("{}-{}", name, keypair.pubkey()));
|
|
||||||
path
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_sample_file() {
|
|
||||||
solana_logger::setup();
|
|
||||||
let in_path = tmp_file_path("test_sample_file_input.txt");
|
|
||||||
let num_strings = 4096;
|
|
||||||
let string = "12foobar";
|
|
||||||
{
|
|
||||||
let mut in_file = File::create(&in_path).unwrap();
|
|
||||||
for _ in 0..num_strings {
|
|
||||||
in_file.write(string.as_bytes()).unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let num_samples = (string.len() * num_strings / size_of::<Hash>()) as u64;
|
|
||||||
let samples: Vec<_> = (0..num_samples).collect();
|
|
||||||
let res = sample_file(&in_path, samples.as_slice());
|
|
||||||
let ref_hash: Hash = Hash::new(&[
|
|
||||||
173, 251, 182, 165, 10, 54, 33, 150, 133, 226, 106, 150, 99, 192, 179, 1, 230, 144,
|
|
||||||
151, 126, 18, 191, 54, 67, 249, 140, 230, 160, 56, 30, 170, 52,
|
|
||||||
]);
|
|
||||||
let res = res.unwrap();
|
|
||||||
assert_eq!(res, ref_hash);
|
|
||||||
|
|
||||||
// Sample just past the end
|
|
||||||
assert!(sample_file(&in_path, &[num_samples]).is_err());
|
|
||||||
remove_file(&in_path).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_sample_file_invalid_offset() {
|
|
||||||
let in_path = tmp_file_path("test_sample_file_invalid_offset_input.txt");
|
|
||||||
{
|
|
||||||
let mut in_file = File::create(&in_path).unwrap();
|
|
||||||
for _ in 0..4096 {
|
|
||||||
in_file.write("123456foobar".as_bytes()).unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let samples = [0, 200000];
|
|
||||||
let res = sample_file(&in_path, &samples);
|
|
||||||
assert!(res.is_err());
|
|
||||||
remove_file(in_path).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_sample_file_missing_file() {
|
|
||||||
let in_path = tmp_file_path("test_sample_file_that_doesnt_exist.txt");
|
|
||||||
let samples = [0, 5];
|
|
||||||
let res = sample_file(&in_path, &samples);
|
|
||||||
assert!(res.is_err());
|
|
||||||
}
|
|
||||||
}
|
|
11
archiver-lib/src/lib.rs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#[macro_use]
|
||||||
|
extern crate log;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate serde_derive;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate solana_metrics;
|
||||||
|
|
||||||
|
pub mod archiver;
|
||||||
|
mod result;
|
48
archiver-lib/src/result.rs
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
use serde_json;
|
||||||
|
use solana_client::client_error;
|
||||||
|
use solana_ledger::blockstore;
|
||||||
|
use solana_sdk::transport;
|
||||||
|
use std::any::Any;
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
#[derive(Error, Debug)]
|
||||||
|
pub enum ArchiverError {
|
||||||
|
#[error("IO error")]
|
||||||
|
IO(#[from] std::io::Error),
|
||||||
|
|
||||||
|
#[error("blockstore error")]
|
||||||
|
BlockstoreError(#[from] blockstore::BlockstoreError),
|
||||||
|
|
||||||
|
#[error("crossbeam error")]
|
||||||
|
CrossbeamSendError(#[from] crossbeam_channel::SendError<u64>),
|
||||||
|
|
||||||
|
#[error("send error")]
|
||||||
|
SendError(#[from] std::sync::mpsc::SendError<u64>),
|
||||||
|
|
||||||
|
#[error("join error")]
|
||||||
|
JoinError(Box<dyn Any + Send + 'static>),
|
||||||
|
|
||||||
|
#[error("transport error")]
|
||||||
|
TransportError(#[from] transport::TransportError),
|
||||||
|
|
||||||
|
#[error("client error")]
|
||||||
|
ClientError(#[from] client_error::ClientError),
|
||||||
|
|
||||||
|
#[error("Json parsing error")]
|
||||||
|
JsonError(#[from] serde_json::error::Error),
|
||||||
|
|
||||||
|
#[error("Storage account has no balance")]
|
||||||
|
EmptyStorageAccountBalance,
|
||||||
|
|
||||||
|
#[error("No RPC peers..")]
|
||||||
|
NoRpcPeers,
|
||||||
|
|
||||||
|
#[error("Couldn't download full segment")]
|
||||||
|
SegmentDownloadError,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::convert::From<Box<dyn Any + Send + 'static>> for ArchiverError {
|
||||||
|
fn from(e: Box<dyn Any + Send + 'static>) -> ArchiverError {
|
||||||
|
ArchiverError::JoinError(e)
|
||||||
|
}
|
||||||
|
}
|
25
archiver-utils/Cargo.toml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
[package]
|
||||||
|
name = "solana-archiver-utils"
|
||||||
|
version = "1.0.2"
|
||||||
|
description = "Solana Archiver Utils"
|
||||||
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
homepage = "https://solana.com/"
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
log = "0.4.8"
|
||||||
|
rand = "0.6.5"
|
||||||
|
solana-chacha = { path = "../chacha", version = "1.0.2" }
|
||||||
|
solana-chacha-sys = { path = "../chacha-sys", version = "1.0.2" }
|
||||||
|
solana-ledger = { path = "../ledger", version = "1.0.2" }
|
||||||
|
solana-logger = { path = "../logger", version = "1.0.2" }
|
||||||
|
solana-perf = { path = "../perf", version = "1.0.2" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "1.0.2" }
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
hex = "0.4.0"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "solana_archiver_utils"
|
120
archiver-utils/src/lib.rs
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
#[macro_use]
|
||||||
|
extern crate log;
|
||||||
|
|
||||||
|
use solana_sdk::hash::{Hash, Hasher};
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::{self, BufReader, ErrorKind, Read, Seek, SeekFrom};
|
||||||
|
use std::mem::size_of;
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
pub fn sample_file(in_path: &Path, sample_offsets: &[u64]) -> io::Result<Hash> {
|
||||||
|
let in_file = File::open(in_path)?;
|
||||||
|
let metadata = in_file.metadata()?;
|
||||||
|
let mut buffer_file = BufReader::new(in_file);
|
||||||
|
|
||||||
|
let mut hasher = Hasher::default();
|
||||||
|
let sample_size = size_of::<Hash>();
|
||||||
|
let sample_size64 = sample_size as u64;
|
||||||
|
let mut buf = vec![0; sample_size];
|
||||||
|
|
||||||
|
let file_len = metadata.len();
|
||||||
|
if file_len < sample_size64 {
|
||||||
|
return Err(io::Error::new(ErrorKind::Other, "file too short!"));
|
||||||
|
}
|
||||||
|
for offset in sample_offsets {
|
||||||
|
if *offset > (file_len - sample_size64) / sample_size64 {
|
||||||
|
return Err(io::Error::new(ErrorKind::Other, "offset too large"));
|
||||||
|
}
|
||||||
|
buffer_file.seek(SeekFrom::Start(*offset * sample_size64))?;
|
||||||
|
trace!("sampling @ {} ", *offset);
|
||||||
|
match buffer_file.read(&mut buf) {
|
||||||
|
Ok(size) => {
|
||||||
|
assert_eq!(size, buf.len());
|
||||||
|
hasher.hash(&buf);
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
warn!("Error sampling file");
|
||||||
|
return Err(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(hasher.result())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use rand::{thread_rng, Rng};
|
||||||
|
use std::fs::{create_dir_all, remove_file};
|
||||||
|
use std::io::Write;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
extern crate hex;
|
||||||
|
|
||||||
|
fn tmp_file_path(name: &str) -> PathBuf {
|
||||||
|
use std::env;
|
||||||
|
let out_dir = env::var("FARF_DIR").unwrap_or_else(|_| "farf".to_string());
|
||||||
|
let mut rand_bits = [0u8; 32];
|
||||||
|
thread_rng().fill(&mut rand_bits[..]);
|
||||||
|
|
||||||
|
let mut path = PathBuf::new();
|
||||||
|
path.push(out_dir);
|
||||||
|
path.push("tmp");
|
||||||
|
create_dir_all(&path).unwrap();
|
||||||
|
|
||||||
|
path.push(format!("{}-{:?}", name, hex::encode(rand_bits)));
|
||||||
|
println!("path: {:?}", path);
|
||||||
|
path
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sample_file() {
|
||||||
|
solana_logger::setup();
|
||||||
|
let in_path = tmp_file_path("test_sample_file_input.txt");
|
||||||
|
let num_strings = 4096;
|
||||||
|
let string = "12foobar";
|
||||||
|
{
|
||||||
|
let mut in_file = File::create(&in_path).unwrap();
|
||||||
|
for _ in 0..num_strings {
|
||||||
|
in_file.write(string.as_bytes()).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let num_samples = (string.len() * num_strings / size_of::<Hash>()) as u64;
|
||||||
|
let samples: Vec<_> = (0..num_samples).collect();
|
||||||
|
let res = sample_file(&in_path, samples.as_slice());
|
||||||
|
let ref_hash: Hash = Hash::new(&[
|
||||||
|
173, 251, 182, 165, 10, 54, 33, 150, 133, 226, 106, 150, 99, 192, 179, 1, 230, 144,
|
||||||
|
151, 126, 18, 191, 54, 67, 249, 140, 230, 160, 56, 30, 170, 52,
|
||||||
|
]);
|
||||||
|
let res = res.unwrap();
|
||||||
|
assert_eq!(res, ref_hash);
|
||||||
|
|
||||||
|
// Sample just past the end
|
||||||
|
assert!(sample_file(&in_path, &[num_samples]).is_err());
|
||||||
|
remove_file(&in_path).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sample_file_invalid_offset() {
|
||||||
|
let in_path = tmp_file_path("test_sample_file_invalid_offset_input.txt");
|
||||||
|
{
|
||||||
|
let mut in_file = File::create(&in_path).unwrap();
|
||||||
|
for _ in 0..4096 {
|
||||||
|
in_file.write("123456foobar".as_bytes()).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let samples = [0, 200000];
|
||||||
|
let res = sample_file(&in_path, &samples);
|
||||||
|
assert!(res.is_err());
|
||||||
|
remove_file(in_path).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sample_file_missing_file() {
|
||||||
|
let in_path = tmp_file_path("test_sample_file_that_doesnt_exist.txt");
|
||||||
|
let samples = [0, 5];
|
||||||
|
let res = sample_file(&in_path, &samples);
|
||||||
|
assert!(res.is_err());
|
||||||
|
}
|
||||||
|
}
|
@ -2,17 +2,19 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-archiver"
|
name = "solana-archiver"
|
||||||
version = "0.20.0"
|
version = "1.0.2"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
console = "0.9.0"
|
console = "0.9.2"
|
||||||
solana-core = { path = "../core", version = "0.20.0" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.2" }
|
||||||
solana-logger = { path = "../logger", version = "0.20.0" }
|
solana-core = { path = "../core", version = "1.0.2" }
|
||||||
solana-metrics = { path = "../metrics", version = "0.20.0" }
|
solana-logger = { path = "../logger", version = "1.0.2" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.20.0" }
|
solana-metrics = { path = "../metrics", version = "1.0.2" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.20.0" }
|
solana-archiver-lib = { path = "../archiver-lib", version = "1.0.2" }
|
||||||
|
solana-net-utils = { path = "../net-utils", version = "1.0.2" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "1.0.2" }
|
||||||
|
|
||||||
|
@ -1,31 +1,30 @@
|
|||||||
use clap::{crate_description, crate_name, crate_version, App, Arg};
|
use clap::{crate_description, crate_name, App, Arg};
|
||||||
use console::style;
|
use console::style;
|
||||||
use solana_core::archiver::Archiver;
|
use solana_archiver_lib::archiver::Archiver;
|
||||||
use solana_core::cluster_info::{Node, VALIDATOR_PORT_RANGE};
|
use solana_clap_utils::{
|
||||||
use solana_core::contact_info::ContactInfo;
|
input_validators::is_keypair,
|
||||||
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
keypair::{
|
||||||
use std::net::SocketAddr;
|
self, keypair_input, KeypairWithSource, ASK_SEED_PHRASE_ARG,
|
||||||
use std::path::PathBuf;
|
SKIP_SEED_PHRASE_VALIDATION_ARG,
|
||||||
use std::process::exit;
|
},
|
||||||
use std::sync::Arc;
|
};
|
||||||
|
use solana_core::{
|
||||||
// Return an error if a keypair file cannot be parsed.
|
cluster_info::{Node, VALIDATOR_PORT_RANGE},
|
||||||
fn is_keypair(string: String) -> Result<(), String> {
|
contact_info::ContactInfo,
|
||||||
read_keypair_file(&string)
|
};
|
||||||
.map(|_| ())
|
use solana_sdk::{commitment_config::CommitmentConfig, signature::Signer};
|
||||||
.map_err(|err| format!("{:?}", err))
|
use std::{net::SocketAddr, path::PathBuf, process::exit, sync::Arc};
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
|
|
||||||
let matches = App::new(crate_name!())
|
let matches = App::new(crate_name!())
|
||||||
.about(crate_description!())
|
.about(crate_description!())
|
||||||
.version(crate_version!())
|
.version(solana_clap_utils::version!())
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("identity")
|
Arg::with_name("identity_keypair")
|
||||||
.short("i")
|
.short("i")
|
||||||
.long("identity")
|
.long("identity-keypair")
|
||||||
.value_name("PATH")
|
.value_name("PATH")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.validator(is_keypair)
|
.validator(is_keypair)
|
||||||
@ -38,7 +37,7 @@ fn main() {
|
|||||||
.value_name("HOST:PORT")
|
.value_name("HOST:PORT")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.required(true)
|
.required(true)
|
||||||
.validator(solana_netutil::is_host_port)
|
.validator(solana_net_utils::is_host_port)
|
||||||
.help("Rendezvous with the cluster at this entry point"),
|
.help("Rendezvous with the cluster at this entry point"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
@ -56,58 +55,80 @@ fn main() {
|
|||||||
.long("storage-keypair")
|
.long("storage-keypair")
|
||||||
.value_name("PATH")
|
.value_name("PATH")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.required(true)
|
|
||||||
.validator(is_keypair)
|
.validator(is_keypair)
|
||||||
.help("File containing the storage account keypair"),
|
.help("File containing the storage account keypair"),
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name(ASK_SEED_PHRASE_ARG.name)
|
||||||
|
.long(ASK_SEED_PHRASE_ARG.long)
|
||||||
|
.value_name("KEYPAIR NAME")
|
||||||
|
.multiple(true)
|
||||||
|
.takes_value(true)
|
||||||
|
.possible_values(&["identity-keypair", "storage-keypair"])
|
||||||
|
.help(ASK_SEED_PHRASE_ARG.help),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name(SKIP_SEED_PHRASE_VALIDATION_ARG.name)
|
||||||
|
.long(SKIP_SEED_PHRASE_VALIDATION_ARG.long)
|
||||||
|
.requires(ASK_SEED_PHRASE_ARG.name)
|
||||||
|
.help(SKIP_SEED_PHRASE_VALIDATION_ARG.help),
|
||||||
|
)
|
||||||
.get_matches();
|
.get_matches();
|
||||||
|
|
||||||
let ledger_path = PathBuf::from(matches.value_of("ledger").unwrap());
|
let ledger_path = PathBuf::from(matches.value_of("ledger").unwrap());
|
||||||
|
|
||||||
let keypair = if let Some(identity) = matches.value_of("identity") {
|
let identity_keypair = keypair_input(&matches, "identity_keypair")
|
||||||
read_keypair_file(identity).unwrap_or_else(|err| {
|
.unwrap_or_else(|err| {
|
||||||
eprintln!("{}: Unable to open keypair file: {}", err, identity);
|
eprintln!("Identity keypair input failed: {}", err);
|
||||||
exit(1);
|
exit(1);
|
||||||
})
|
})
|
||||||
} else {
|
.keypair;
|
||||||
Keypair::new()
|
let KeypairWithSource {
|
||||||
};
|
keypair: storage_keypair,
|
||||||
let storage_keypair = if let Some(storage_keypair) = matches.value_of("storage_keypair") {
|
source: storage_keypair_source,
|
||||||
read_keypair_file(storage_keypair).unwrap_or_else(|err| {
|
} = keypair_input(&matches, "storage_keypair").unwrap_or_else(|err| {
|
||||||
eprintln!("{}: Unable to open keypair file: {}", err, storage_keypair);
|
eprintln!("Storage keypair input failed: {}", err);
|
||||||
exit(1);
|
exit(1);
|
||||||
})
|
});
|
||||||
} else {
|
if storage_keypair_source == keypair::Source::Generated {
|
||||||
Keypair::new()
|
clap::Error::with_description(
|
||||||
};
|
"The `storage-keypair` argument was not found",
|
||||||
|
clap::ErrorKind::ArgumentNotFound,
|
||||||
|
)
|
||||||
|
.exit();
|
||||||
|
}
|
||||||
|
|
||||||
let entrypoint_addr = matches
|
let entrypoint_addr = matches
|
||||||
.value_of("entrypoint")
|
.value_of("entrypoint")
|
||||||
.map(|entrypoint| {
|
.map(|entrypoint| {
|
||||||
solana_netutil::parse_host_port(entrypoint).expect("failed to parse entrypoint address")
|
solana_net_utils::parse_host_port(entrypoint)
|
||||||
|
.expect("failed to parse entrypoint address")
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let gossip_addr = {
|
let gossip_addr = {
|
||||||
let ip = solana_netutil::get_public_ip_addr(&entrypoint_addr).unwrap();
|
let ip = solana_net_utils::get_public_ip_addr(&entrypoint_addr).unwrap();
|
||||||
let mut addr = SocketAddr::new(ip, 0);
|
let mut addr = SocketAddr::new(ip, 0);
|
||||||
addr.set_ip(solana_netutil::get_public_ip_addr(&entrypoint_addr).unwrap());
|
addr.set_ip(solana_net_utils::get_public_ip_addr(&entrypoint_addr).unwrap());
|
||||||
addr
|
addr
|
||||||
};
|
};
|
||||||
let node =
|
let node = Node::new_archiver_with_external_ip(
|
||||||
Node::new_archiver_with_external_ip(&keypair.pubkey(), &gossip_addr, VALIDATOR_PORT_RANGE);
|
&identity_keypair.pubkey(),
|
||||||
|
&gossip_addr,
|
||||||
|
VALIDATOR_PORT_RANGE,
|
||||||
|
);
|
||||||
|
|
||||||
println!(
|
println!(
|
||||||
"{} version {} (branch={}, commit={})",
|
"{} version {} (branch={}, commit={})",
|
||||||
style(crate_name!()).bold(),
|
style(crate_name!()).bold(),
|
||||||
crate_version!(),
|
solana_clap_utils::version!(),
|
||||||
option_env!("CI_BRANCH").unwrap_or("unknown"),
|
option_env!("CI_BRANCH").unwrap_or("unknown"),
|
||||||
option_env!("CI_COMMIT").unwrap_or("unknown")
|
option_env!("CI_COMMIT").unwrap_or("unknown")
|
||||||
);
|
);
|
||||||
solana_metrics::set_host_id(keypair.pubkey().to_string());
|
solana_metrics::set_host_id(identity_keypair.pubkey().to_string());
|
||||||
println!(
|
println!(
|
||||||
"replicating the data with keypair={:?} gossip_addr={:?}",
|
"replicating the data with identity_keypair={:?} gossip_addr={:?}",
|
||||||
keypair.pubkey(),
|
identity_keypair.pubkey(),
|
||||||
gossip_addr
|
gossip_addr
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -116,8 +137,9 @@ fn main() {
|
|||||||
&ledger_path,
|
&ledger_path,
|
||||||
node,
|
node,
|
||||||
entrypoint_info,
|
entrypoint_info,
|
||||||
Arc::new(keypair),
|
Arc::new(identity_keypair),
|
||||||
Arc::new(storage_keypair),
|
Arc::new(storage_keypair),
|
||||||
|
CommitmentConfig::recent(),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
20
banking-bench/Cargo.toml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
[package]
|
||||||
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
name = "solana-banking-bench"
|
||||||
|
version = "1.0.2"
|
||||||
|
repository = "https://github.com/solana-labs/solana"
|
||||||
|
license = "Apache-2.0"
|
||||||
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
log = "0.4.6"
|
||||||
|
rayon = "1.2.0"
|
||||||
|
solana-core = { path = "../core", version = "1.0.2" }
|
||||||
|
solana-ledger = { path = "../ledger", version = "1.0.2" }
|
||||||
|
solana-logger = { path = "../logger", version = "1.0.2" }
|
||||||
|
solana-runtime = { path = "../runtime", version = "1.0.2" }
|
||||||
|
solana-measure = { path = "../measure", version = "1.0.2" }
|
||||||
|
solana-sdk = { path = "../sdk", version = "1.0.2" }
|
||||||
|
rand = "0.6.5"
|
||||||
|
crossbeam-channel = "0.3"
|
@ -1,7 +1,3 @@
|
|||||||
#[macro_use]
|
|
||||||
extern crate solana_ledger;
|
|
||||||
extern crate crossbeam_channel;
|
|
||||||
|
|
||||||
use crossbeam_channel::unbounded;
|
use crossbeam_channel::unbounded;
|
||||||
use log::*;
|
use log::*;
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
@ -9,13 +5,12 @@ use rayon::prelude::*;
|
|||||||
use solana_core::banking_stage::{create_test_recorder, BankingStage};
|
use solana_core::banking_stage::{create_test_recorder, BankingStage};
|
||||||
use solana_core::cluster_info::ClusterInfo;
|
use solana_core::cluster_info::ClusterInfo;
|
||||||
use solana_core::cluster_info::Node;
|
use solana_core::cluster_info::Node;
|
||||||
use solana_core::genesis_utils::{create_genesis_block, GenesisBlockInfo};
|
use solana_core::genesis_utils::{create_genesis_config, GenesisConfigInfo};
|
||||||
use solana_core::packet::to_packets_chunked;
|
use solana_core::packet::to_packets_chunked;
|
||||||
use solana_core::poh_recorder::PohRecorder;
|
use solana_core::poh_recorder::PohRecorder;
|
||||||
use solana_core::poh_recorder::WorkingBankEntry;
|
use solana_core::poh_recorder::WorkingBankEntry;
|
||||||
use solana_core::service::Service;
|
|
||||||
use solana_ledger::bank_forks::BankForks;
|
use solana_ledger::bank_forks::BankForks;
|
||||||
use solana_ledger::blocktree::{get_tmp_ledger_path, Blocktree};
|
use solana_ledger::{blockstore::Blockstore, get_tmp_ledger_path};
|
||||||
use solana_measure::measure::Measure;
|
use solana_measure::measure::Measure;
|
||||||
use solana_runtime::bank::Bank;
|
use solana_runtime::bank::Bank;
|
||||||
use solana_sdk::hash::Hash;
|
use solana_sdk::hash::Hash;
|
||||||
@ -25,7 +20,6 @@ use solana_sdk::signature::Signature;
|
|||||||
use solana_sdk::system_transaction;
|
use solana_sdk::system_transaction;
|
||||||
use solana_sdk::timing::{duration_as_us, timestamp};
|
use solana_sdk::timing::{duration_as_us, timestamp};
|
||||||
use solana_sdk::transaction::Transaction;
|
use solana_sdk::transaction::Transaction;
|
||||||
use std::iter;
|
|
||||||
use std::sync::atomic::Ordering;
|
use std::sync::atomic::Ordering;
|
||||||
use std::sync::mpsc::Receiver;
|
use std::sync::mpsc::Receiver;
|
||||||
use std::sync::{Arc, Mutex, RwLock};
|
use std::sync::{Arc, Mutex, RwLock};
|
||||||
@ -103,21 +97,21 @@ fn main() {
|
|||||||
const PACKETS_PER_BATCH: usize = 192;
|
const PACKETS_PER_BATCH: usize = 192;
|
||||||
let txes = PACKETS_PER_BATCH * num_threads * CHUNKS;
|
let txes = PACKETS_PER_BATCH * num_threads * CHUNKS;
|
||||||
let mint_total = 1_000_000_000_000;
|
let mint_total = 1_000_000_000_000;
|
||||||
let GenesisBlockInfo {
|
let GenesisConfigInfo {
|
||||||
genesis_block,
|
genesis_config,
|
||||||
mint_keypair,
|
mint_keypair,
|
||||||
..
|
..
|
||||||
} = create_genesis_block(mint_total);
|
} = create_genesis_config(mint_total);
|
||||||
|
|
||||||
let (verified_sender, verified_receiver) = unbounded();
|
let (verified_sender, verified_receiver) = unbounded();
|
||||||
let (vote_sender, vote_receiver) = unbounded();
|
let (vote_sender, vote_receiver) = unbounded();
|
||||||
let bank0 = Bank::new(&genesis_block);
|
let bank0 = Bank::new(&genesis_config);
|
||||||
let mut bank_forks = BankForks::new(0, bank0);
|
let mut bank_forks = BankForks::new(0, bank0);
|
||||||
let mut bank = bank_forks.working_bank();
|
let mut bank = bank_forks.working_bank();
|
||||||
|
|
||||||
info!("threads: {} txs: {}", num_threads, txes);
|
info!("threads: {} txs: {}", num_threads, txes);
|
||||||
|
|
||||||
let mut transactions = make_accounts_txs(txes, &mint_keypair, genesis_block.hash());
|
let mut transactions = make_accounts_txs(txes, &mint_keypair, genesis_config.hash());
|
||||||
|
|
||||||
// fund all the accounts
|
// fund all the accounts
|
||||||
transactions.iter().for_each(|tx| {
|
transactions.iter().for_each(|tx| {
|
||||||
@ -125,7 +119,7 @@ fn main() {
|
|||||||
&mint_keypair,
|
&mint_keypair,
|
||||||
&tx.message.account_keys[0],
|
&tx.message.account_keys[0],
|
||||||
mint_total / txes as u64,
|
mint_total / txes as u64,
|
||||||
genesis_block.hash(),
|
genesis_config.hash(),
|
||||||
);
|
);
|
||||||
let x = bank.process_transaction(&fund);
|
let x = bank.process_transaction(&fund);
|
||||||
x.unwrap();
|
x.unwrap();
|
||||||
@ -142,20 +136,14 @@ fn main() {
|
|||||||
assert!(r.is_ok(), "sanity parallel execution");
|
assert!(r.is_ok(), "sanity parallel execution");
|
||||||
}
|
}
|
||||||
bank.clear_signatures();
|
bank.clear_signatures();
|
||||||
let mut verified: Vec<_> = to_packets_chunked(&transactions.clone(), PACKETS_PER_BATCH)
|
let mut verified: Vec<_> = to_packets_chunked(&transactions.clone(), PACKETS_PER_BATCH);
|
||||||
.into_iter()
|
|
||||||
.map(|x| {
|
|
||||||
let len = x.packets.len();
|
|
||||||
(x, iter::repeat(1).take(len).collect())
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
let ledger_path = get_tmp_ledger_path!();
|
let ledger_path = get_tmp_ledger_path!();
|
||||||
{
|
{
|
||||||
let blocktree = Arc::new(
|
let blockstore = Arc::new(
|
||||||
Blocktree::open(&ledger_path).expect("Expected to be able to open database ledger"),
|
Blockstore::open(&ledger_path).expect("Expected to be able to open database ledger"),
|
||||||
);
|
);
|
||||||
let (exit, poh_recorder, poh_service, signal_receiver) =
|
let (exit, poh_recorder, poh_service, signal_receiver) =
|
||||||
create_test_recorder(&bank, &blocktree, None);
|
create_test_recorder(&bank, &blockstore, None);
|
||||||
let cluster_info = ClusterInfo::new_with_invalid_keypair(Node::new_localhost().info);
|
let cluster_info = ClusterInfo::new_with_invalid_keypair(Node::new_localhost().info);
|
||||||
let cluster_info = Arc::new(RwLock::new(cluster_info));
|
let cluster_info = Arc::new(RwLock::new(cluster_info));
|
||||||
let banking_stage = BankingStage::new(
|
let banking_stage = BankingStage::new(
|
||||||
@ -163,6 +151,7 @@ fn main() {
|
|||||||
&poh_recorder,
|
&poh_recorder,
|
||||||
verified_receiver,
|
verified_receiver,
|
||||||
vote_receiver,
|
vote_receiver,
|
||||||
|
None,
|
||||||
);
|
);
|
||||||
poh_recorder.lock().unwrap().set_bank(&bank);
|
poh_recorder.lock().unwrap().set_bank(&bank);
|
||||||
|
|
||||||
@ -173,9 +162,8 @@ fn main() {
|
|||||||
// If it is dropped before poh_service, then poh_service will error when
|
// If it is dropped before poh_service, then poh_service will error when
|
||||||
// calling send() on the channel.
|
// calling send() on the channel.
|
||||||
let signal_receiver = Arc::new(signal_receiver);
|
let signal_receiver = Arc::new(signal_receiver);
|
||||||
let signal_receiver2 = signal_receiver.clone();
|
let mut total_us = 0;
|
||||||
let mut total = 0;
|
let mut tx_total_us = 0;
|
||||||
let mut tx_total = 0;
|
|
||||||
let mut txs_processed = 0;
|
let mut txs_processed = 0;
|
||||||
let mut root = 1;
|
let mut root = 1;
|
||||||
let collector = Pubkey::new_rand();
|
let collector = Pubkey::new_rand();
|
||||||
@ -185,6 +173,7 @@ fn main() {
|
|||||||
chunk_len,
|
chunk_len,
|
||||||
num_threads,
|
num_threads,
|
||||||
};
|
};
|
||||||
|
let mut total_sent = 0;
|
||||||
for _ in 0..ITERS {
|
for _ in 0..ITERS {
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
let mut sent = 0;
|
let mut sent = 0;
|
||||||
@ -209,7 +198,7 @@ fn main() {
|
|||||||
index,
|
index,
|
||||||
);
|
);
|
||||||
for xv in v {
|
for xv in v {
|
||||||
sent += xv.0.packets.len();
|
sent += xv.packets.len();
|
||||||
}
|
}
|
||||||
verified_sender.send(v.to_vec()).unwrap();
|
verified_sender.send(v.to_vec()).unwrap();
|
||||||
}
|
}
|
||||||
@ -226,7 +215,7 @@ fn main() {
|
|||||||
sleep(Duration::from_millis(5));
|
sleep(Duration::from_millis(5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if check_txs(&signal_receiver2, txes / CHUNKS, &poh_recorder) {
|
if check_txs(&signal_receiver, txes / CHUNKS, &poh_recorder) {
|
||||||
debug!(
|
debug!(
|
||||||
"resetting bank {} tx count: {} txs_proc: {}",
|
"resetting bank {} tx count: {} txs_proc: {}",
|
||||||
bank.slot(),
|
bank.slot(),
|
||||||
@ -235,7 +224,7 @@ fn main() {
|
|||||||
);
|
);
|
||||||
assert!(txs_processed < bank.transaction_count());
|
assert!(txs_processed < bank.transaction_count());
|
||||||
txs_processed = bank.transaction_count();
|
txs_processed = bank.transaction_count();
|
||||||
tx_total += duration_as_us(&now.elapsed());
|
tx_total_us += duration_as_us(&now.elapsed());
|
||||||
|
|
||||||
let mut poh_time = Measure::start("poh_time");
|
let mut poh_time = Measure::start("poh_time");
|
||||||
poh_recorder.lock().unwrap().reset(
|
poh_recorder.lock().unwrap().reset(
|
||||||
@ -267,20 +256,21 @@ fn main() {
|
|||||||
poh_time.as_us(),
|
poh_time.as_us(),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
tx_total += duration_as_us(&now.elapsed());
|
tx_total_us += duration_as_us(&now.elapsed());
|
||||||
}
|
}
|
||||||
|
|
||||||
// This signature clear may not actually clear the signatures
|
// This signature clear may not actually clear the signatures
|
||||||
// in this chunk, but since we rotate between CHUNKS then
|
// in this chunk, but since we rotate between CHUNKS then
|
||||||
// we should clear them by the time we come around again to re-use that chunk.
|
// we should clear them by the time we come around again to re-use that chunk.
|
||||||
bank.clear_signatures();
|
bank.clear_signatures();
|
||||||
total += duration_as_us(&now.elapsed());
|
total_us += duration_as_us(&now.elapsed());
|
||||||
debug!(
|
debug!(
|
||||||
"time: {} us checked: {} sent: {}",
|
"time: {} us checked: {} sent: {}",
|
||||||
duration_as_us(&now.elapsed()),
|
duration_as_us(&now.elapsed()),
|
||||||
txes / CHUNKS,
|
txes / CHUNKS,
|
||||||
sent,
|
sent,
|
||||||
);
|
);
|
||||||
|
total_sent += sent;
|
||||||
|
|
||||||
if bank.slot() > 0 && bank.slot() % 16 == 0 {
|
if bank.slot() > 0 && bank.slot() % 16 == 0 {
|
||||||
for tx in transactions.iter_mut() {
|
for tx in transactions.iter_mut() {
|
||||||
@ -288,13 +278,7 @@ fn main() {
|
|||||||
let sig: Vec<u8> = (0..64).map(|_| thread_rng().gen()).collect();
|
let sig: Vec<u8> = (0..64).map(|_| thread_rng().gen()).collect();
|
||||||
tx.signatures[0] = Signature::new(&sig[0..64]);
|
tx.signatures[0] = Signature::new(&sig[0..64]);
|
||||||
}
|
}
|
||||||
verified = to_packets_chunked(&transactions.clone(), PACKETS_PER_BATCH)
|
verified = to_packets_chunked(&transactions.clone(), PACKETS_PER_BATCH);
|
||||||
.into_iter()
|
|
||||||
.map(|x| {
|
|
||||||
let len = x.packets.len();
|
|
||||||
(x, iter::repeat(1).take(len).collect())
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
start += chunk_len;
|
start += chunk_len;
|
||||||
@ -302,11 +286,11 @@ fn main() {
|
|||||||
}
|
}
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"{{'name': 'banking_bench_total', 'median': '{}'}}",
|
"{{'name': 'banking_bench_total', 'median': '{}'}}",
|
||||||
total / ITERS as u64,
|
(1000.0 * 1000.0 * total_sent as f64) / (total_us as f64),
|
||||||
);
|
);
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"{{'name': 'banking_bench_tx_total', 'median': '{}'}}",
|
"{{'name': 'banking_bench_tx_total', 'median': '{}'}}",
|
||||||
tx_total / ITERS as u64,
|
(1000.0 * 1000.0 * total_sent as f64) / (tx_total_us as f64),
|
||||||
);
|
);
|
||||||
|
|
||||||
drop(verified_sender);
|
drop(verified_sender);
|
||||||
@ -318,5 +302,5 @@ fn main() {
|
|||||||
sleep(Duration::from_secs(1));
|
sleep(Duration::from_secs(1));
|
||||||
debug!("waited for poh_service");
|
debug!("waited for poh_service");
|
||||||
}
|
}
|
||||||
let _unused = Blocktree::destroy(&ledger_path);
|
let _unused = Blockstore::destroy(&ledger_path);
|
||||||
}
|
}
|
@ -1,20 +0,0 @@
|
|||||||
[package]
|
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|
||||||
edition = "2018"
|
|
||||||
name = "solana-banking-bench"
|
|
||||||
version = "0.20.0"
|
|
||||||
repository = "https://github.com/solana-labs/solana"
|
|
||||||
license = "Apache-2.0"
|
|
||||||
homepage = "https://solana.com/"
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
log = "0.4.6"
|
|
||||||
rayon = "1.2.0"
|
|
||||||
solana-core = { path = "../core", version = "0.20.0" }
|
|
||||||
solana-ledger = { path = "../ledger", version = "0.20.0" }
|
|
||||||
solana-logger = { path = "../logger", version = "0.20.0" }
|
|
||||||
solana-runtime = { path = "../runtime", version = "0.20.0" }
|
|
||||||
solana-measure = { path = "../measure", version = "0.20.0" }
|
|
||||||
solana-sdk = { path = "../sdk", version = "0.20.0" }
|
|
||||||
rand = "0.6.5"
|
|
||||||
crossbeam-channel = "0.3"
|
|
@ -2,38 +2,33 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-bench-exchange"
|
name = "solana-bench-exchange"
|
||||||
version = "0.20.0"
|
version = "1.0.2"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
publish = false
|
publish = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bincode = "1.2.0"
|
|
||||||
bs58 = "0.3.0"
|
|
||||||
clap = "2.32.0"
|
clap = "2.32.0"
|
||||||
env_logger = "0.7.1"
|
itertools = "0.8.2"
|
||||||
itertools = "0.8.0"
|
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
num-derive = "0.3"
|
num-derive = "0.3"
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
rand = "0.6.5"
|
rand = "0.6.5"
|
||||||
rayon = "1.2.0"
|
rayon = "1.2.0"
|
||||||
serde = "1.0.101"
|
serde_json = "1.0.46"
|
||||||
serde_derive = "1.0.101"
|
|
||||||
serde_json = "1.0.41"
|
|
||||||
serde_yaml = "0.8.11"
|
serde_yaml = "0.8.11"
|
||||||
# solana-runtime = { path = "../solana/runtime"}
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.2" }
|
||||||
solana-core = { path = "../core", version = "0.20.0" }
|
solana-core = { path = "../core", version = "1.0.2" }
|
||||||
solana-genesis = { path = "../genesis", version = "0.20.0" }
|
solana-genesis = { path = "../genesis", version = "1.0.2" }
|
||||||
solana-client = { path = "../client", version = "0.20.0" }
|
solana-client = { path = "../client", version = "1.0.2" }
|
||||||
solana-drone = { path = "../drone", version = "0.20.0" }
|
solana-faucet = { path = "../faucet", version = "1.0.2" }
|
||||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.0" }
|
solana-exchange-program = { path = "../programs/exchange", version = "1.0.2" }
|
||||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.0" }
|
solana-logger = { path = "../logger", version = "1.0.2" }
|
||||||
solana-logger = { path = "../logger", version = "0.20.0" }
|
solana-metrics = { path = "../metrics", version = "1.0.2" }
|
||||||
solana-metrics = { path = "../metrics", version = "0.20.0" }
|
solana-net-utils = { path = "../net-utils", version = "1.0.2" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.20.0" }
|
solana-runtime = { path = "../runtime", version = "1.0.2" }
|
||||||
solana-runtime = { path = "../runtime", version = "0.20.0" }
|
solana-sdk = { path = "../sdk", version = "1.0.2" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.20.0" }
|
|
||||||
untrusted = "0.7.0"
|
[dev-dependencies]
|
||||||
ws = "0.9.1"
|
solana-local-cluster = { path = "../local-cluster", version = "1.0.2" }
|
||||||
|
@ -360,7 +360,7 @@ The Matcher would initiate the following last swap:
|
|||||||
|
|
||||||
- Row 1, To: Investor 1 trades 2 A token to 12 B tokens
|
- Row 1, To: Investor 1 trades 2 A token to 12 B tokens
|
||||||
- Row 1, From: Investor 2 trades 2 A token from 12 B tokens
|
- Row 1, From: Investor 2 trades 2 A token from 12 B tokens
|
||||||
- Matcher takes 4 B tokens as profit
|
- Matcher takes 2 B tokens as profit
|
||||||
|
|
||||||
Table becomes:
|
Table becomes:
|
||||||
|
|
||||||
|
@ -7,32 +7,36 @@ use rand::{thread_rng, Rng};
|
|||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use solana_client::perf_utils::{sample_txs, SampleStats};
|
use solana_client::perf_utils::{sample_txs, SampleStats};
|
||||||
use solana_core::gen_keys::GenKeys;
|
use solana_core::gen_keys::GenKeys;
|
||||||
use solana_drone::drone::request_airdrop_transaction;
|
use solana_exchange_program::{exchange_instruction, exchange_state::*, id};
|
||||||
use solana_exchange_api::exchange_instruction;
|
use solana_faucet::faucet::request_airdrop_transaction;
|
||||||
use solana_exchange_api::exchange_state::*;
|
|
||||||
use solana_exchange_api::id;
|
|
||||||
use solana_genesis::Base64Account;
|
use solana_genesis::Base64Account;
|
||||||
use solana_metrics::datapoint_info;
|
use solana_metrics::datapoint_info;
|
||||||
use solana_sdk::client::Client;
|
use solana_sdk::{
|
||||||
use solana_sdk::client::SyncClient;
|
client::{Client, SyncClient},
|
||||||
use solana_sdk::pubkey::Pubkey;
|
commitment_config::CommitmentConfig,
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
pubkey::Pubkey,
|
||||||
use solana_sdk::timing::{duration_as_ms, duration_as_s};
|
signature::{Keypair, Signer},
|
||||||
use solana_sdk::transaction::Transaction;
|
timing::{duration_as_ms, duration_as_s},
|
||||||
use solana_sdk::{system_instruction, system_program};
|
transaction::Transaction,
|
||||||
use std::cmp;
|
{system_instruction, system_program},
|
||||||
use std::collections::{HashMap, VecDeque};
|
};
|
||||||
use std::fs::File;
|
use std::{
|
||||||
use std::io::prelude::*;
|
cmp,
|
||||||
use std::mem;
|
collections::{HashMap, VecDeque},
|
||||||
use std::net::SocketAddr;
|
fs::File,
|
||||||
use std::path::Path;
|
io::prelude::*,
|
||||||
use std::process::exit;
|
mem,
|
||||||
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
net::SocketAddr,
|
||||||
use std::sync::mpsc::{channel, Receiver, Sender};
|
path::Path,
|
||||||
use std::sync::{Arc, RwLock};
|
process::exit,
|
||||||
use std::thread::{sleep, Builder};
|
sync::{
|
||||||
use std::time::{Duration, Instant};
|
atomic::{AtomicBool, AtomicUsize, Ordering},
|
||||||
|
mpsc::{channel, Receiver, Sender},
|
||||||
|
Arc, RwLock,
|
||||||
|
},
|
||||||
|
thread::{sleep, Builder},
|
||||||
|
time::{Duration, Instant},
|
||||||
|
};
|
||||||
|
|
||||||
// TODO Chunk length as specified results in a bunch of failures, divide by 10 helps...
|
// TODO Chunk length as specified results in a bunch of failures, divide by 10 helps...
|
||||||
// Assume 4MB network buffers, and 512 byte packets
|
// Assume 4MB network buffers, and 512 byte packets
|
||||||
@ -174,19 +178,28 @@ where
|
|||||||
|
|
||||||
info!("Generating {:?} account keys", total_keys);
|
info!("Generating {:?} account keys", total_keys);
|
||||||
let mut account_keypairs = generate_keypairs(total_keys);
|
let mut account_keypairs = generate_keypairs(total_keys);
|
||||||
let src_pubkeys: Vec<_> = account_keypairs
|
let src_keypairs: Vec<_> = account_keypairs
|
||||||
.drain(0..accounts_in_groups)
|
.drain(0..accounts_in_groups)
|
||||||
|
.map(|keypair| keypair)
|
||||||
|
.collect();
|
||||||
|
let src_pubkeys: Vec<Pubkey> = src_keypairs
|
||||||
|
.iter()
|
||||||
.map(|keypair| keypair.pubkey())
|
.map(|keypair| keypair.pubkey())
|
||||||
.collect();
|
.collect();
|
||||||
let profit_pubkeys: Vec<_> = account_keypairs
|
|
||||||
|
let profit_keypairs: Vec<_> = account_keypairs
|
||||||
.drain(0..accounts_in_groups)
|
.drain(0..accounts_in_groups)
|
||||||
|
.map(|keypair| keypair)
|
||||||
|
.collect();
|
||||||
|
let profit_pubkeys: Vec<Pubkey> = profit_keypairs
|
||||||
|
.iter()
|
||||||
.map(|keypair| keypair.pubkey())
|
.map(|keypair| keypair.pubkey())
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
info!("Create {:?} source token accounts", src_pubkeys.len());
|
info!("Create {:?} source token accounts", src_pubkeys.len());
|
||||||
create_token_accounts(client, &trader_signers, &src_pubkeys);
|
create_token_accounts(client, &trader_signers, &src_keypairs);
|
||||||
info!("Create {:?} profit token accounts", profit_pubkeys.len());
|
info!("Create {:?} profit token accounts", profit_pubkeys.len());
|
||||||
create_token_accounts(client, &swapper_signers, &profit_pubkeys);
|
create_token_accounts(client, &swapper_signers, &profit_keypairs);
|
||||||
|
|
||||||
// Collect the max transaction rate and total tx count seen (single node only)
|
// Collect the max transaction rate and total tx count seen (single node only)
|
||||||
let sample_stats = Arc::new(RwLock::new(Vec::new()));
|
let sample_stats = Arc::new(RwLock::new(Vec::new()));
|
||||||
@ -243,7 +256,7 @@ where
|
|||||||
trace!("Start trader thread");
|
trace!("Start trader thread");
|
||||||
let trader_thread = {
|
let trader_thread = {
|
||||||
let exit_signal = exit_signal.clone();
|
let exit_signal = exit_signal.clone();
|
||||||
let shared_txs = shared_txs.clone();
|
|
||||||
let client = clients[0].clone();
|
let client = clients[0].clone();
|
||||||
Builder::new()
|
Builder::new()
|
||||||
.name("solana-exchange-trader".to_string())
|
.name("solana-exchange-trader".to_string())
|
||||||
@ -380,7 +393,10 @@ fn swapper<T>(
|
|||||||
let mut tries = 0;
|
let mut tries = 0;
|
||||||
let mut trade_index = 0;
|
let mut trade_index = 0;
|
||||||
while client
|
while client
|
||||||
.get_balance(&trade_infos[trade_index].trade_account)
|
.get_balance_with_commitment(
|
||||||
|
&trade_infos[trade_index].trade_account,
|
||||||
|
CommitmentConfig::recent(),
|
||||||
|
)
|
||||||
.unwrap_or(0)
|
.unwrap_or(0)
|
||||||
== 0
|
== 0
|
||||||
{
|
{
|
||||||
@ -434,7 +450,7 @@ fn swapper<T>(
|
|||||||
account_group = (account_group + 1) % account_groups as usize;
|
account_group = (account_group + 1) % account_groups as usize;
|
||||||
|
|
||||||
let (blockhash, _fee_calculator) = client
|
let (blockhash, _fee_calculator) = client
|
||||||
.get_recent_blockhash()
|
.get_recent_blockhash_with_commitment(CommitmentConfig::recent())
|
||||||
.expect("Failed to get blockhash");
|
.expect("Failed to get blockhash");
|
||||||
let to_swap_txs: Vec<_> = to_swap
|
let to_swap_txs: Vec<_> = to_swap
|
||||||
.par_iter()
|
.par_iter()
|
||||||
@ -557,27 +573,39 @@ fn trader<T>(
|
|||||||
trade_account: trade.pubkey(),
|
trade_account: trade.pubkey(),
|
||||||
order_info,
|
order_info,
|
||||||
});
|
});
|
||||||
trades.push((signer, trade.pubkey(), side, src));
|
trades.push((signer, trade, side, src));
|
||||||
}
|
}
|
||||||
account_group = (account_group + 1) % account_groups as usize;
|
account_group = (account_group + 1) % account_groups as usize;
|
||||||
|
|
||||||
let (blockhash, _fee_calculator) = client
|
let (blockhash, _fee_calculator) = client
|
||||||
.get_recent_blockhash()
|
.get_recent_blockhash_with_commitment(CommitmentConfig::recent())
|
||||||
.expect("Failed to get blockhash");
|
.expect("Failed to get blockhash");
|
||||||
|
|
||||||
trades.chunks(chunk_size).for_each(|chunk| {
|
trades.chunks(chunk_size).for_each(|chunk| {
|
||||||
let trades_txs: Vec<_> = chunk
|
let trades_txs: Vec<_> = chunk
|
||||||
.par_iter()
|
.par_iter()
|
||||||
.map(|(signer, trade, side, src)| {
|
.map(|(owner, trade, side, src)| {
|
||||||
let s: &Keypair = &signer;
|
let owner_pubkey = &owner.pubkey();
|
||||||
let owner = &signer.pubkey();
|
let trade_pubkey = &trade.pubkey();
|
||||||
let space = mem::size_of::<ExchangeState>() as u64;
|
let space = mem::size_of::<ExchangeState>() as u64;
|
||||||
Transaction::new_signed_instructions(
|
Transaction::new_signed_instructions(
|
||||||
&[s],
|
&[owner.as_ref(), trade],
|
||||||
vec![
|
vec![
|
||||||
system_instruction::create_account(owner, trade, 1, space, &id()),
|
system_instruction::create_account(
|
||||||
|
owner_pubkey,
|
||||||
|
trade_pubkey,
|
||||||
|
1,
|
||||||
|
space,
|
||||||
|
&id(),
|
||||||
|
),
|
||||||
exchange_instruction::trade_request(
|
exchange_instruction::trade_request(
|
||||||
owner, trade, *side, pair, tokens, price, src,
|
owner_pubkey,
|
||||||
|
trade_pubkey,
|
||||||
|
*side,
|
||||||
|
pair,
|
||||||
|
tokens,
|
||||||
|
price,
|
||||||
|
src,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
blockhash,
|
blockhash,
|
||||||
@ -638,7 +666,9 @@ where
|
|||||||
T: SyncClient + ?Sized,
|
T: SyncClient + ?Sized,
|
||||||
{
|
{
|
||||||
for s in &tx.signatures {
|
for s in &tx.signatures {
|
||||||
if let Ok(Some(r)) = sync_client.get_signature_status(s) {
|
if let Ok(Some(r)) =
|
||||||
|
sync_client.get_signature_status_with_commitment(s, CommitmentConfig::recent())
|
||||||
|
{
|
||||||
match r {
|
match r {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
return true;
|
return true;
|
||||||
@ -659,16 +689,19 @@ fn verify_funding_transfer<T: SyncClient + ?Sized>(
|
|||||||
) -> bool {
|
) -> bool {
|
||||||
if verify_transaction(client, tx) {
|
if verify_transaction(client, tx) {
|
||||||
for a in &tx.message().account_keys[1..] {
|
for a in &tx.message().account_keys[1..] {
|
||||||
if client.get_balance(a).unwrap_or(0) >= amount {
|
if client
|
||||||
|
.get_balance_with_commitment(a, CommitmentConfig::recent())
|
||||||
|
.unwrap_or(0)
|
||||||
|
>= amount
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fund_keys(client: &dyn Client, source: &Keypair, dests: &[Arc<Keypair>], lamports: u64) {
|
pub fn fund_keys<T: Client>(client: &T, source: &Keypair, dests: &[Arc<Keypair>], lamports: u64) {
|
||||||
let total = lamports * (dests.len() as u64 + 1);
|
let total = lamports * (dests.len() as u64 + 1);
|
||||||
let mut funded: Vec<(&Keypair, u64)> = vec![(source, total)];
|
let mut funded: Vec<(&Keypair, u64)> = vec![(source, total)];
|
||||||
let mut notfunded: Vec<&Arc<Keypair>> = dests.iter().collect();
|
let mut notfunded: Vec<&Arc<Keypair>> = dests.iter().collect();
|
||||||
@ -742,8 +775,9 @@ pub fn fund_keys(client: &dyn Client, source: &Keypair, dests: &[Arc<Keypair>],
|
|||||||
to_fund_txs.len(),
|
to_fund_txs.len(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let (blockhash, _fee_calculator) =
|
let (blockhash, _fee_calculator) = client
|
||||||
client.get_recent_blockhash().expect("blockhash");
|
.get_recent_blockhash_with_commitment(CommitmentConfig::recent())
|
||||||
|
.expect("blockhash");
|
||||||
to_fund_txs.par_iter_mut().for_each(|(k, tx)| {
|
to_fund_txs.par_iter_mut().for_each(|(k, tx)| {
|
||||||
tx.sign(&[*k], blockhash);
|
tx.sign(&[*k], blockhash);
|
||||||
});
|
});
|
||||||
@ -780,27 +814,41 @@ pub fn fund_keys(client: &dyn Client, source: &Keypair, dests: &[Arc<Keypair>],
|
|||||||
});
|
});
|
||||||
funded.append(&mut new_funded);
|
funded.append(&mut new_funded);
|
||||||
funded.retain(|(k, b)| {
|
funded.retain(|(k, b)| {
|
||||||
client.get_balance(&k.pubkey()).unwrap_or(0) > lamports && *b > lamports
|
client
|
||||||
|
.get_balance_with_commitment(&k.pubkey(), CommitmentConfig::recent())
|
||||||
|
.unwrap_or(0)
|
||||||
|
> lamports
|
||||||
|
&& *b > lamports
|
||||||
});
|
});
|
||||||
debug!(" Funded: {} left: {}", funded.len(), notfunded.len());
|
debug!(" Funded: {} left: {}", funded.len(), notfunded.len());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_token_accounts(client: &dyn Client, signers: &[Arc<Keypair>], accounts: &[Pubkey]) {
|
pub fn create_token_accounts<T: Client>(
|
||||||
let mut notfunded: Vec<(&Arc<Keypair>, &Pubkey)> = signers.iter().zip(accounts).collect();
|
client: &T,
|
||||||
|
signers: &[Arc<Keypair>],
|
||||||
|
accounts: &[Keypair],
|
||||||
|
) {
|
||||||
|
let mut notfunded: Vec<(&Arc<Keypair>, &Keypair)> = signers.iter().zip(accounts).collect();
|
||||||
|
|
||||||
while !notfunded.is_empty() {
|
while !notfunded.is_empty() {
|
||||||
notfunded.chunks(FUND_CHUNK_LEN).for_each(|chunk| {
|
notfunded.chunks(FUND_CHUNK_LEN).for_each(|chunk| {
|
||||||
let mut to_create_txs: Vec<_> = chunk
|
let mut to_create_txs: Vec<_> = chunk
|
||||||
.par_iter()
|
.par_iter()
|
||||||
.map(|(signer, new)| {
|
.map(|(from_keypair, new_keypair)| {
|
||||||
let owner_pubkey = &signer.pubkey();
|
let owner_pubkey = &from_keypair.pubkey();
|
||||||
let space = mem::size_of::<ExchangeState>() as u64;
|
let space = mem::size_of::<ExchangeState>() as u64;
|
||||||
let create_ix =
|
let create_ix = system_instruction::create_account(
|
||||||
system_instruction::create_account(owner_pubkey, new, 1, space, &id());
|
owner_pubkey,
|
||||||
let request_ix = exchange_instruction::account_request(owner_pubkey, new);
|
&new_keypair.pubkey(),
|
||||||
|
1,
|
||||||
|
space,
|
||||||
|
&id(),
|
||||||
|
);
|
||||||
|
let request_ix =
|
||||||
|
exchange_instruction::account_request(owner_pubkey, &new_keypair.pubkey());
|
||||||
(
|
(
|
||||||
signer,
|
(from_keypair, new_keypair),
|
||||||
Transaction::new_unsigned_instructions(vec![create_ix, request_ix]),
|
Transaction::new_unsigned_instructions(vec![create_ix, request_ix]),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -819,12 +867,13 @@ pub fn create_token_accounts(client: &dyn Client, signers: &[Arc<Keypair>], acco
|
|||||||
let mut retries = 0;
|
let mut retries = 0;
|
||||||
while !to_create_txs.is_empty() {
|
while !to_create_txs.is_empty() {
|
||||||
let (blockhash, _fee_calculator) = client
|
let (blockhash, _fee_calculator) = client
|
||||||
.get_recent_blockhash()
|
.get_recent_blockhash_with_commitment(CommitmentConfig::recent())
|
||||||
.expect("Failed to get blockhash");
|
.expect("Failed to get blockhash");
|
||||||
to_create_txs.par_iter_mut().for_each(|(k, tx)| {
|
to_create_txs
|
||||||
let kp: &Keypair = k;
|
.par_iter_mut()
|
||||||
tx.sign(&[kp], blockhash);
|
.for_each(|((from_keypair, to_keypair), tx)| {
|
||||||
});
|
tx.sign(&[from_keypair.as_ref(), to_keypair], blockhash);
|
||||||
|
});
|
||||||
to_create_txs.iter().for_each(|(_, tx)| {
|
to_create_txs.iter().for_each(|(_, tx)| {
|
||||||
client.async_send_transaction(tx.clone()).expect("transfer");
|
client.async_send_transaction(tx.clone()).expect("transfer");
|
||||||
});
|
});
|
||||||
@ -861,9 +910,13 @@ pub fn create_token_accounts(client: &dyn Client, signers: &[Arc<Keypair>], acco
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut new_notfunded: Vec<(&Arc<Keypair>, &Pubkey)> = vec![];
|
let mut new_notfunded: Vec<(&Arc<Keypair>, &Keypair)> = vec![];
|
||||||
for f in ¬funded {
|
for f in ¬funded {
|
||||||
if client.get_balance(&f.1).unwrap_or(0) == 0 {
|
if client
|
||||||
|
.get_balance_with_commitment(&f.1.pubkey(), CommitmentConfig::recent())
|
||||||
|
.unwrap_or(0)
|
||||||
|
== 0
|
||||||
|
{
|
||||||
new_notfunded.push(*f)
|
new_notfunded.push(*f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -919,8 +972,13 @@ fn generate_keypairs(num: u64) -> Vec<Keypair> {
|
|||||||
rnd.gen_n_keypairs(num)
|
rnd.gen_n_keypairs(num)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn airdrop_lamports(client: &dyn Client, drone_addr: &SocketAddr, id: &Keypair, amount: u64) {
|
pub fn airdrop_lamports<T: Client>(
|
||||||
let balance = client.get_balance(&id.pubkey());
|
client: &T,
|
||||||
|
faucet_addr: &SocketAddr,
|
||||||
|
id: &Keypair,
|
||||||
|
amount: u64,
|
||||||
|
) {
|
||||||
|
let balance = client.get_balance_with_commitment(&id.pubkey(), CommitmentConfig::recent());
|
||||||
let balance = balance.unwrap_or(0);
|
let balance = balance.unwrap_or(0);
|
||||||
if balance >= amount {
|
if balance >= amount {
|
||||||
return;
|
return;
|
||||||
@ -931,33 +989,40 @@ pub fn airdrop_lamports(client: &dyn Client, drone_addr: &SocketAddr, id: &Keypa
|
|||||||
info!(
|
info!(
|
||||||
"Airdropping {:?} lamports from {} for {}",
|
"Airdropping {:?} lamports from {} for {}",
|
||||||
amount_to_drop,
|
amount_to_drop,
|
||||||
drone_addr,
|
faucet_addr,
|
||||||
id.pubkey(),
|
id.pubkey(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut tries = 0;
|
let mut tries = 0;
|
||||||
loop {
|
loop {
|
||||||
let (blockhash, _fee_calculator) = client
|
let (blockhash, _fee_calculator) = client
|
||||||
.get_recent_blockhash()
|
.get_recent_blockhash_with_commitment(CommitmentConfig::recent())
|
||||||
.expect("Failed to get blockhash");
|
.expect("Failed to get blockhash");
|
||||||
match request_airdrop_transaction(&drone_addr, &id.pubkey(), amount_to_drop, blockhash) {
|
match request_airdrop_transaction(&faucet_addr, &id.pubkey(), amount_to_drop, blockhash) {
|
||||||
Ok(transaction) => {
|
Ok(transaction) => {
|
||||||
let signature = client.async_send_transaction(transaction).unwrap();
|
let signature = client.async_send_transaction(transaction).unwrap();
|
||||||
|
|
||||||
for _ in 0..30 {
|
for _ in 0..30 {
|
||||||
if let Ok(Some(_)) = client.get_signature_status(&signature) {
|
if let Ok(Some(_)) = client.get_signature_status_with_commitment(
|
||||||
|
&signature,
|
||||||
|
CommitmentConfig::recent(),
|
||||||
|
) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sleep(Duration::from_millis(100));
|
sleep(Duration::from_millis(100));
|
||||||
}
|
}
|
||||||
if client.get_balance(&id.pubkey()).unwrap_or(0) >= amount {
|
if client
|
||||||
|
.get_balance_with_commitment(&id.pubkey(), CommitmentConfig::recent())
|
||||||
|
.unwrap_or(0)
|
||||||
|
>= amount
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
panic!(
|
panic!(
|
||||||
"Error requesting airdrop: {:?} to addr: {:?} amount: {}",
|
"Error requesting airdrop: {:?} to addr: {:?} amount: {}",
|
||||||
err, drone_addr, amount
|
err, faucet_addr, amount
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
use clap::{crate_description, crate_name, crate_version, value_t, App, Arg, ArgMatches};
|
use clap::{crate_description, crate_name, value_t, App, Arg, ArgMatches};
|
||||||
use solana_core::gen_keys::GenKeys;
|
use solana_core::gen_keys::GenKeys;
|
||||||
use solana_drone::drone::DRONE_PORT;
|
use solana_faucet::faucet::FAUCET_PORT;
|
||||||
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
use solana_sdk::signature::{read_keypair_file, Keypair};
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub entrypoint_addr: SocketAddr,
|
pub entrypoint_addr: SocketAddr,
|
||||||
pub drone_addr: SocketAddr,
|
pub faucet_addr: SocketAddr,
|
||||||
pub identity: Keypair,
|
pub identity: Keypair,
|
||||||
pub threads: usize,
|
pub threads: usize,
|
||||||
pub num_nodes: usize,
|
pub num_nodes: usize,
|
||||||
@ -27,7 +27,7 @@ impl Default for Config {
|
|||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
entrypoint_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
entrypoint_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
||||||
drone_addr: SocketAddr::from(([127, 0, 0, 1], DRONE_PORT)),
|
faucet_addr: SocketAddr::from(([127, 0, 0, 1], FAUCET_PORT)),
|
||||||
identity: Keypair::new(),
|
identity: Keypair::new(),
|
||||||
num_nodes: 1,
|
num_nodes: 1,
|
||||||
threads: 4,
|
threads: 4,
|
||||||
@ -44,10 +44,10 @@ impl Default for Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
pub fn build_args<'a, 'b>(version: &'b str) -> App<'a, 'b> {
|
||||||
App::new(crate_name!())
|
App::new(crate_name!())
|
||||||
.about(crate_description!())
|
.about(crate_description!())
|
||||||
.version(crate_version!())
|
.version(version)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("entrypoint")
|
Arg::with_name("entrypoint")
|
||||||
.short("n")
|
.short("n")
|
||||||
@ -59,14 +59,14 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
.help("Cluster entry point; defaults to 127.0.0.1:8001"),
|
.help("Cluster entry point; defaults to 127.0.0.1:8001"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("drone")
|
Arg::with_name("faucet")
|
||||||
.short("d")
|
.short("d")
|
||||||
.long("drone")
|
.long("faucet")
|
||||||
.value_name("HOST:PORT")
|
.value_name("HOST:PORT")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.required(false)
|
.required(false)
|
||||||
.default_value("127.0.0.1:9900")
|
.default_value("127.0.0.1:9900")
|
||||||
.help("Location of the drone; defaults to 127.0.0.1:9900"),
|
.help("Location of the faucet; defaults to 127.0.0.1:9900"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("identity")
|
Arg::with_name("identity")
|
||||||
@ -166,15 +166,17 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
||||||
let mut args = Config::default();
|
let mut args = Config::default();
|
||||||
|
|
||||||
args.entrypoint_addr = solana_netutil::parse_host_port(matches.value_of("entrypoint").unwrap())
|
args.entrypoint_addr = solana_net_utils::parse_host_port(
|
||||||
.unwrap_or_else(|e| {
|
matches.value_of("entrypoint").unwrap(),
|
||||||
eprintln!("failed to parse entrypoint address: {}", e);
|
)
|
||||||
exit(1)
|
.unwrap_or_else(|e| {
|
||||||
});
|
eprintln!("failed to parse entrypoint address: {}", e);
|
||||||
|
exit(1)
|
||||||
|
});
|
||||||
|
|
||||||
args.drone_addr = solana_netutil::parse_host_port(matches.value_of("drone").unwrap())
|
args.faucet_addr = solana_net_utils::parse_host_port(matches.value_of("faucet").unwrap())
|
||||||
.unwrap_or_else(|e| {
|
.unwrap_or_else(|e| {
|
||||||
eprintln!("failed to parse drone address: {}", e);
|
eprintln!("failed to parse faucet address: {}", e);
|
||||||
exit(1)
|
exit(1)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -5,18 +5,18 @@ pub mod order_book;
|
|||||||
use crate::bench::{airdrop_lamports, create_client_accounts_file, do_bench_exchange, Config};
|
use crate::bench::{airdrop_lamports, create_client_accounts_file, do_bench_exchange, Config};
|
||||||
use log::*;
|
use log::*;
|
||||||
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
||||||
use solana_sdk::signature::KeypairUtil;
|
use solana_sdk::signature::Signer;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
solana_metrics::set_panic_hook("bench-exchange");
|
solana_metrics::set_panic_hook("bench-exchange");
|
||||||
|
|
||||||
let matches = cli::build_args().get_matches();
|
let matches = cli::build_args(solana_clap_utils::version!()).get_matches();
|
||||||
let cli_config = cli::extract_args(&matches);
|
let cli_config = cli::extract_args(&matches);
|
||||||
|
|
||||||
let cli::Config {
|
let cli::Config {
|
||||||
entrypoint_addr,
|
entrypoint_addr,
|
||||||
drone_addr,
|
faucet_addr,
|
||||||
identity,
|
identity,
|
||||||
threads,
|
threads,
|
||||||
num_nodes,
|
num_nodes,
|
||||||
@ -73,7 +73,7 @@ fn main() {
|
|||||||
const NUM_SIGNERS: u64 = 2;
|
const NUM_SIGNERS: u64 = 2;
|
||||||
airdrop_lamports(
|
airdrop_lamports(
|
||||||
&client,
|
&client,
|
||||||
&drone_addr,
|
&faucet_addr,
|
||||||
&config.identity,
|
&config.identity,
|
||||||
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
||||||
);
|
);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use itertools::EitherOrBoth::{Both, Left, Right};
|
use itertools::EitherOrBoth::{Both, Left, Right};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use log::*;
|
use log::*;
|
||||||
use solana_exchange_api::exchange_state::*;
|
use solana_exchange_program::exchange_state::*;
|
||||||
use solana_sdk::pubkey::Pubkey;
|
use solana_sdk::pubkey::Pubkey;
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::collections::BinaryHeap;
|
use std::collections::BinaryHeap;
|
||||||
|
@ -1,19 +1,22 @@
|
|||||||
use crate::local_cluster::{ClusterConfig, LocalCluster};
|
use log::*;
|
||||||
use solana_bench_exchange::bench::{airdrop_lamports, do_bench_exchange, Config};
|
use solana_bench_exchange::bench::{airdrop_lamports, do_bench_exchange, Config};
|
||||||
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
||||||
use solana_core::validator::ValidatorConfig;
|
use solana_core::validator::ValidatorConfig;
|
||||||
use solana_drone::drone::run_local_drone;
|
use solana_exchange_program::exchange_processor::process_instruction;
|
||||||
use solana_exchange_api::exchange_processor::process_instruction;
|
use solana_exchange_program::id;
|
||||||
use solana_exchange_api::id;
|
use solana_exchange_program::solana_exchange_program;
|
||||||
|
use solana_faucet::faucet::run_local_faucet;
|
||||||
|
use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster};
|
||||||
use solana_runtime::bank::Bank;
|
use solana_runtime::bank::Bank;
|
||||||
use solana_runtime::bank_client::BankClient;
|
use solana_runtime::bank_client::BankClient;
|
||||||
use solana_sdk::genesis_block::create_genesis_block;
|
use solana_sdk::genesis_config::create_genesis_config;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, Signer};
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
use std::sync::mpsc::channel;
|
use std::sync::mpsc::channel;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
#[ignore]
|
||||||
fn test_exchange_local_cluster() {
|
fn test_exchange_local_cluster() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
|
|
||||||
@ -44,16 +47,16 @@ fn test_exchange_local_cluster() {
|
|||||||
..ClusterConfig::default()
|
..ClusterConfig::default()
|
||||||
});
|
});
|
||||||
|
|
||||||
let drone_keypair = Keypair::new();
|
let faucet_keypair = Keypair::new();
|
||||||
cluster.transfer(
|
cluster.transfer(
|
||||||
&cluster.funding_keypair,
|
&cluster.funding_keypair,
|
||||||
&drone_keypair.pubkey(),
|
&faucet_keypair.pubkey(),
|
||||||
2_000_000_000_000,
|
2_000_000_000_000,
|
||||||
);
|
);
|
||||||
|
|
||||||
let (addr_sender, addr_receiver) = channel();
|
let (addr_sender, addr_receiver) = channel();
|
||||||
run_local_drone(drone_keypair, addr_sender, Some(1_000_000_000_000));
|
run_local_faucet(faucet_keypair, addr_sender, Some(1_000_000_000_000));
|
||||||
let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
let faucet_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
||||||
|
|
||||||
info!("Connecting to the cluster");
|
info!("Connecting to the cluster");
|
||||||
let (nodes, _) =
|
let (nodes, _) =
|
||||||
@ -70,7 +73,7 @@ fn test_exchange_local_cluster() {
|
|||||||
const NUM_SIGNERS: u64 = 2;
|
const NUM_SIGNERS: u64 = 2;
|
||||||
airdrop_lamports(
|
airdrop_lamports(
|
||||||
&client,
|
&client,
|
||||||
&drone_addr,
|
&faucet_addr,
|
||||||
&config.identity,
|
&config.identity,
|
||||||
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
||||||
);
|
);
|
||||||
@ -81,8 +84,8 @@ fn test_exchange_local_cluster() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_exchange_bank_client() {
|
fn test_exchange_bank_client() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
let (genesis_block, identity) = create_genesis_block(100_000_000_000_000);
|
let (genesis_config, identity) = create_genesis_config(100_000_000_000_000);
|
||||||
let mut bank = Bank::new(&genesis_block);
|
let mut bank = Bank::new(&genesis_config);
|
||||||
bank.add_instruction_processor(id(), process_instruction);
|
bank.add_instruction_processor(id(), process_instruction);
|
||||||
let clients = vec![BankClient::new(bank)];
|
let clients = vec![BankClient::new(bank)];
|
||||||
|
|
@ -2,13 +2,14 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-bench-streamer"
|
name = "solana-bench-streamer"
|
||||||
version = "0.20.0"
|
version = "1.0.2"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
solana-core = { path = "../core", version = "0.20.0" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.2" }
|
||||||
solana-logger = { path = "../logger", version = "0.20.0" }
|
solana-core = { path = "../core", version = "1.0.2" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.20.0" }
|
solana-logger = { path = "../logger", version = "1.0.2" }
|
||||||
|
solana-net-utils = { path = "../net-utils", version = "1.0.2" }
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
use clap::{crate_description, crate_name, crate_version, App, Arg};
|
use clap::{crate_description, crate_name, App, Arg};
|
||||||
use solana_core::packet::PacketsRecycler;
|
use solana_core::packet::{Packet, Packets, PacketsRecycler, PACKET_DATA_SIZE};
|
||||||
use solana_core::packet::{Packet, Packets, BLOB_SIZE, PACKET_DATA_SIZE};
|
|
||||||
use solana_core::result::Result;
|
|
||||||
use solana_core::streamer::{receiver, PacketReceiver};
|
use solana_core::streamer::{receiver, PacketReceiver};
|
||||||
use std::cmp::max;
|
use std::cmp::max;
|
||||||
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
|
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
|
||||||
@ -9,7 +7,7 @@ use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
|||||||
use std::sync::mpsc::channel;
|
use std::sync::mpsc::channel;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
use std::thread::{spawn, JoinHandle};
|
use std::thread::{spawn, JoinHandle, Result};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
|
|
||||||
@ -29,7 +27,7 @@ fn producer(addr: &SocketAddr, exit: Arc<AtomicBool>) -> JoinHandle<()> {
|
|||||||
let mut num = 0;
|
let mut num = 0;
|
||||||
for p in &msgs.packets {
|
for p in &msgs.packets {
|
||||||
let a = p.meta.addr();
|
let a = p.meta.addr();
|
||||||
assert!(p.meta.size < BLOB_SIZE);
|
assert!(p.meta.size < PACKET_DATA_SIZE);
|
||||||
send.send_to(&p.data[..p.meta.size], &a).unwrap();
|
send.send_to(&p.data[..p.meta.size], &a).unwrap();
|
||||||
num += 1;
|
num += 1;
|
||||||
}
|
}
|
||||||
@ -54,7 +52,7 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
let matches = App::new(crate_name!())
|
let matches = App::new(crate_name!())
|
||||||
.about(crate_description!())
|
.about(crate_description!())
|
||||||
.version(crate_version!())
|
.version(solana_clap_utils::version!())
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("num-recv-sockets")
|
Arg::with_name("num-recv-sockets")
|
||||||
.long("num-recv-sockets")
|
.long("num-recv-sockets")
|
||||||
@ -77,7 +75,7 @@ fn main() -> Result<()> {
|
|||||||
let mut read_threads = Vec::new();
|
let mut read_threads = Vec::new();
|
||||||
let recycler = PacketsRecycler::default();
|
let recycler = PacketsRecycler::default();
|
||||||
for _ in 0..num_sockets {
|
for _ in 0..num_sockets {
|
||||||
let read = solana_netutil::bind_to(port, false).unwrap();
|
let read = solana_net_utils::bind_to(port, false).unwrap();
|
||||||
read.set_read_timeout(Some(Duration::new(1, 0))).unwrap();
|
read.set_read_timeout(Some(Duration::new(1, 0))).unwrap();
|
||||||
|
|
||||||
addr = read.local_addr().unwrap();
|
addr = read.local_addr().unwrap();
|
||||||
|
@ -2,37 +2,36 @@
|
|||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "solana-bench-tps"
|
name = "solana-bench-tps"
|
||||||
version = "0.20.0"
|
version = "1.0.2"
|
||||||
repository = "https://github.com/solana-labs/solana"
|
repository = "https://github.com/solana-labs/solana"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
homepage = "https://solana.com/"
|
homepage = "https://solana.com/"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bincode = "1.2.0"
|
bincode = "1.2.1"
|
||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
rayon = "1.2.0"
|
rayon = "1.2.0"
|
||||||
serde = "1.0.101"
|
serde_json = "1.0.46"
|
||||||
serde_derive = "1.0.101"
|
|
||||||
serde_json = "1.0.41"
|
|
||||||
serde_yaml = "0.8.11"
|
serde_yaml = "0.8.11"
|
||||||
solana-core = { path = "../core", version = "0.20.0" }
|
solana-clap-utils = { path = "../clap-utils", version = "1.0.2" }
|
||||||
solana-genesis = { path = "../genesis", version = "0.20.0" }
|
solana-core = { path = "../core", version = "1.0.2" }
|
||||||
solana-client = { path = "../client", version = "0.20.0" }
|
solana-genesis = { path = "../genesis", version = "1.0.2" }
|
||||||
solana-drone = { path = "../drone", version = "0.20.0" }
|
solana-client = { path = "../client", version = "1.0.2" }
|
||||||
solana-librapay-api = { path = "../programs/librapay_api", version = "0.20.0", optional = true }
|
solana-faucet = { path = "../faucet", version = "1.0.2" }
|
||||||
solana-logger = { path = "../logger", version = "0.20.0" }
|
solana-librapay = { path = "../programs/librapay", version = "1.0.2", optional = true }
|
||||||
solana-metrics = { path = "../metrics", version = "0.20.0" }
|
solana-logger = { path = "../logger", version = "1.0.2" }
|
||||||
solana-measure = { path = "../measure", version = "0.20.0" }
|
solana-metrics = { path = "../metrics", version = "1.0.2" }
|
||||||
solana-netutil = { path = "../netutil", version = "0.20.0" }
|
solana-measure = { path = "../measure", version = "1.0.2" }
|
||||||
solana-runtime = { path = "../runtime", version = "0.20.0" }
|
solana-net-utils = { path = "../net-utils", version = "1.0.2" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.20.0" }
|
solana-runtime = { path = "../runtime", version = "1.0.2" }
|
||||||
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.0", optional = true }
|
solana-sdk = { path = "../sdk", version = "1.0.2" }
|
||||||
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.0", optional = true }
|
solana-move-loader-program = { path = "../programs/move_loader", version = "1.0.2", optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
serial_test = "0.2.0"
|
serial_test = "0.3.2"
|
||||||
serial_test_derive = "0.2.0"
|
serial_test_derive = "0.4.0"
|
||||||
|
solana-local-cluster = { path = "../local-cluster", version = "1.0.2" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
move = ["solana-core/move", "solana-librapay-api", "solana-move-loader-program", "solana-move-loader-api"]
|
move = ["solana-librapay", "solana-move-loader-program"]
|
||||||
|
@ -1,26 +1,28 @@
|
|||||||
use clap::{crate_description, crate_name, crate_version, App, Arg, ArgMatches};
|
use clap::{crate_description, crate_name, App, Arg, ArgMatches};
|
||||||
use solana_drone::drone::DRONE_PORT;
|
use solana_faucet::faucet::FAUCET_PORT;
|
||||||
use solana_sdk::fee_calculator::FeeCalculator;
|
use solana_sdk::fee_calculator::FeeCalculator;
|
||||||
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
use solana_sdk::signature::{read_keypair_file, Keypair};
|
||||||
use std::{net::SocketAddr, process::exit, time::Duration};
|
use std::{net::SocketAddr, process::exit, time::Duration};
|
||||||
|
|
||||||
const NUM_LAMPORTS_PER_ACCOUNT_DEFAULT: u64 = solana_sdk::native_token::SOL_LAMPORTS;
|
const NUM_LAMPORTS_PER_ACCOUNT_DEFAULT: u64 = solana_sdk::native_token::LAMPORTS_PER_SOL;
|
||||||
|
|
||||||
/// Holds the configuration for a single run of the benchmark
|
/// Holds the configuration for a single run of the benchmark
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub entrypoint_addr: SocketAddr,
|
pub entrypoint_addr: SocketAddr,
|
||||||
pub drone_addr: SocketAddr,
|
pub faucet_addr: SocketAddr,
|
||||||
pub id: Keypair,
|
pub id: Keypair,
|
||||||
pub threads: usize,
|
pub threads: usize,
|
||||||
pub num_nodes: usize,
|
pub num_nodes: usize,
|
||||||
pub duration: Duration,
|
pub duration: Duration,
|
||||||
pub tx_count: usize,
|
pub tx_count: usize,
|
||||||
|
pub keypair_multiplier: usize,
|
||||||
pub thread_batch_sleep_ms: usize,
|
pub thread_batch_sleep_ms: usize,
|
||||||
pub sustained: bool,
|
pub sustained: bool,
|
||||||
pub client_ids_and_stake_file: String,
|
pub client_ids_and_stake_file: String,
|
||||||
pub write_to_client_file: bool,
|
pub write_to_client_file: bool,
|
||||||
pub read_from_client_file: bool,
|
pub read_from_client_file: bool,
|
||||||
pub target_lamports_per_signature: u64,
|
pub target_lamports_per_signature: u64,
|
||||||
|
pub multi_client: bool,
|
||||||
pub use_move: bool,
|
pub use_move: bool,
|
||||||
pub num_lamports_per_account: u64,
|
pub num_lamports_per_account: u64,
|
||||||
}
|
}
|
||||||
@ -29,18 +31,20 @@ impl Default for Config {
|
|||||||
fn default() -> Config {
|
fn default() -> Config {
|
||||||
Config {
|
Config {
|
||||||
entrypoint_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
entrypoint_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
||||||
drone_addr: SocketAddr::from(([127, 0, 0, 1], DRONE_PORT)),
|
faucet_addr: SocketAddr::from(([127, 0, 0, 1], FAUCET_PORT)),
|
||||||
id: Keypair::new(),
|
id: Keypair::new(),
|
||||||
threads: 4,
|
threads: 4,
|
||||||
num_nodes: 1,
|
num_nodes: 1,
|
||||||
duration: Duration::new(std::u64::MAX, 0),
|
duration: Duration::new(std::u64::MAX, 0),
|
||||||
tx_count: 50_000,
|
tx_count: 50_000,
|
||||||
|
keypair_multiplier: 8,
|
||||||
thread_batch_sleep_ms: 1000,
|
thread_batch_sleep_ms: 1000,
|
||||||
sustained: false,
|
sustained: false,
|
||||||
client_ids_and_stake_file: String::new(),
|
client_ids_and_stake_file: String::new(),
|
||||||
write_to_client_file: false,
|
write_to_client_file: false,
|
||||||
read_from_client_file: false,
|
read_from_client_file: false,
|
||||||
target_lamports_per_signature: FeeCalculator::default().target_lamports_per_signature,
|
target_lamports_per_signature: FeeCalculator::default().target_lamports_per_signature,
|
||||||
|
multi_client: true,
|
||||||
use_move: false,
|
use_move: false,
|
||||||
num_lamports_per_account: NUM_LAMPORTS_PER_ACCOUNT_DEFAULT,
|
num_lamports_per_account: NUM_LAMPORTS_PER_ACCOUNT_DEFAULT,
|
||||||
}
|
}
|
||||||
@ -48,9 +52,9 @@ impl Default for Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Defines and builds the CLI args for a run of the benchmark
|
/// Defines and builds the CLI args for a run of the benchmark
|
||||||
pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
pub fn build_args<'a, 'b>(version: &'b str) -> App<'a, 'b> {
|
||||||
App::new(crate_name!()).about(crate_description!())
|
App::new(crate_name!()).about(crate_description!())
|
||||||
.version(crate_version!())
|
.version(version)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("entrypoint")
|
Arg::with_name("entrypoint")
|
||||||
.short("n")
|
.short("n")
|
||||||
@ -60,12 +64,12 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
.help("Rendezvous with the cluster at this entry point; defaults to 127.0.0.1:8001"),
|
.help("Rendezvous with the cluster at this entry point; defaults to 127.0.0.1:8001"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("drone")
|
Arg::with_name("faucet")
|
||||||
.short("d")
|
.short("d")
|
||||||
.long("drone")
|
.long("faucet")
|
||||||
.value_name("HOST:PORT")
|
.value_name("HOST:PORT")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.help("Location of the drone; defaults to entrypoint:DRONE_PORT"),
|
.help("Location of the faucet; defaults to entrypoint:FAUCET_PORT"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("identity")
|
Arg::with_name("identity")
|
||||||
@ -108,6 +112,11 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
.long("use-move")
|
.long("use-move")
|
||||||
.help("Use Move language transactions to perform transfers."),
|
.help("Use Move language transactions to perform transfers."),
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("no-multi-client")
|
||||||
|
.long("no-multi-client")
|
||||||
|
.help("Disable multi-client support, only transact with the entrypoint."),
|
||||||
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("tx_count")
|
Arg::with_name("tx_count")
|
||||||
.long("tx_count")
|
.long("tx_count")
|
||||||
@ -115,6 +124,13 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
|||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.help("Number of transactions to send per batch")
|
.help("Number of transactions to send per batch")
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("keypair_multiplier")
|
||||||
|
.long("keypair-multiplier")
|
||||||
|
.value_name("NUM")
|
||||||
|
.takes_value(true)
|
||||||
|
.help("Multiply by transaction count to determine number of keypairs to create")
|
||||||
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("thread-batch-sleep-ms")
|
Arg::with_name("thread-batch-sleep-ms")
|
||||||
.short("z")
|
.short("z")
|
||||||
@ -167,15 +183,15 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
|||||||
let mut args = Config::default();
|
let mut args = Config::default();
|
||||||
|
|
||||||
if let Some(addr) = matches.value_of("entrypoint") {
|
if let Some(addr) = matches.value_of("entrypoint") {
|
||||||
args.entrypoint_addr = solana_netutil::parse_host_port(addr).unwrap_or_else(|e| {
|
args.entrypoint_addr = solana_net_utils::parse_host_port(addr).unwrap_or_else(|e| {
|
||||||
eprintln!("failed to parse entrypoint address: {}", e);
|
eprintln!("failed to parse entrypoint address: {}", e);
|
||||||
exit(1)
|
exit(1)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(addr) = matches.value_of("drone") {
|
if let Some(addr) = matches.value_of("faucet") {
|
||||||
args.drone_addr = solana_netutil::parse_host_port(addr).unwrap_or_else(|e| {
|
args.faucet_addr = solana_net_utils::parse_host_port(addr).unwrap_or_else(|e| {
|
||||||
eprintln!("failed to parse drone address: {}", e);
|
eprintln!("failed to parse faucet address: {}", e);
|
||||||
exit(1)
|
exit(1)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -201,7 +217,15 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(s) = matches.value_of("tx_count") {
|
if let Some(s) = matches.value_of("tx_count") {
|
||||||
args.tx_count = s.to_string().parse().expect("can't parse tx_account");
|
args.tx_count = s.to_string().parse().expect("can't parse tx_count");
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(s) = matches.value_of("keypair_multiplier") {
|
||||||
|
args.keypair_multiplier = s
|
||||||
|
.to_string()
|
||||||
|
.parse()
|
||||||
|
.expect("can't parse keypair-multiplier");
|
||||||
|
assert!(args.keypair_multiplier >= 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(t) = matches.value_of("thread-batch-sleep-ms") {
|
if let Some(t) = matches.value_of("thread-batch-sleep-ms") {
|
||||||
@ -229,6 +253,7 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
args.use_move = matches.is_present("use-move");
|
args.use_move = matches.is_present("use-move");
|
||||||
|
args.multi_client = !matches.is_present("no-multi-client");
|
||||||
|
|
||||||
if let Some(v) = matches.value_of("num_lamports_per_account") {
|
if let Some(v) = matches.value_of("num_lamports_per_account") {
|
||||||
args.num_lamports_per_account = v.to_string().parse().expect("can't parse lamports");
|
args.num_lamports_per_account = v.to_string().parse().expect("can't parse lamports");
|
||||||
|
@ -1,41 +1,44 @@
|
|||||||
use log::*;
|
use log::*;
|
||||||
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs, generate_keypairs};
|
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs, generate_keypairs};
|
||||||
use solana_bench_tps::cli;
|
use solana_bench_tps::cli;
|
||||||
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
use solana_core::gossip_service::{discover_cluster, get_client, get_multi_client};
|
||||||
use solana_genesis::Base64Account;
|
use solana_genesis::Base64Account;
|
||||||
use solana_sdk::fee_calculator::FeeCalculator;
|
use solana_sdk::fee_calculator::FeeCalculator;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, Signer};
|
||||||
use solana_sdk::system_program;
|
use solana_sdk::system_program;
|
||||||
use std::{collections::HashMap, fs::File, io::prelude::*, path::Path, process::exit};
|
use std::{collections::HashMap, fs::File, io::prelude::*, path::Path, process::exit, sync::Arc};
|
||||||
|
|
||||||
/// Number of signatures for all transactions in ~1 week at ~100K TPS
|
/// Number of signatures for all transactions in ~1 week at ~100K TPS
|
||||||
pub const NUM_SIGNATURES_FOR_TXS: u64 = 100_000 * 60 * 60 * 24 * 7;
|
pub const NUM_SIGNATURES_FOR_TXS: u64 = 100_000 * 60 * 60 * 24 * 7;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
solana_logger::setup_with_filter("solana=info");
|
solana_logger::setup_with_default("solana=info");
|
||||||
solana_metrics::set_panic_hook("bench-tps");
|
solana_metrics::set_panic_hook("bench-tps");
|
||||||
|
|
||||||
let matches = cli::build_args().get_matches();
|
let matches = cli::build_args(solana_clap_utils::version!()).get_matches();
|
||||||
let cli_config = cli::extract_args(&matches);
|
let cli_config = cli::extract_args(&matches);
|
||||||
|
|
||||||
let cli::Config {
|
let cli::Config {
|
||||||
entrypoint_addr,
|
entrypoint_addr,
|
||||||
drone_addr,
|
faucet_addr,
|
||||||
id,
|
id,
|
||||||
num_nodes,
|
num_nodes,
|
||||||
tx_count,
|
tx_count,
|
||||||
|
keypair_multiplier,
|
||||||
client_ids_and_stake_file,
|
client_ids_and_stake_file,
|
||||||
write_to_client_file,
|
write_to_client_file,
|
||||||
read_from_client_file,
|
read_from_client_file,
|
||||||
target_lamports_per_signature,
|
target_lamports_per_signature,
|
||||||
use_move,
|
use_move,
|
||||||
|
multi_client,
|
||||||
num_lamports_per_account,
|
num_lamports_per_account,
|
||||||
..
|
..
|
||||||
} = &cli_config;
|
} = &cli_config;
|
||||||
|
|
||||||
|
let keypair_count = *tx_count * keypair_multiplier;
|
||||||
if *write_to_client_file {
|
if *write_to_client_file {
|
||||||
info!("Generating {} keypairs", *tx_count * 2);
|
info!("Generating {} keypairs", keypair_count);
|
||||||
let (keypairs, _) = generate_keypairs(&id, *tx_count as u64 * 2);
|
let (keypairs, _) = generate_keypairs(&id, keypair_count as u64);
|
||||||
let num_accounts = keypairs.len() as u64;
|
let num_accounts = keypairs.len() as u64;
|
||||||
let max_fee =
|
let max_fee =
|
||||||
FeeCalculator::new(*target_lamports_per_signature, 0).max_lamports_per_signature;
|
FeeCalculator::new(*target_lamports_per_signature, 0).max_lamports_per_signature;
|
||||||
@ -70,17 +73,21 @@ fn main() {
|
|||||||
exit(1);
|
exit(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
let (client, num_clients) = get_multi_client(&nodes);
|
let client = if *multi_client {
|
||||||
|
let (client, num_clients) = get_multi_client(&nodes);
|
||||||
|
if nodes.len() < num_clients {
|
||||||
|
eprintln!(
|
||||||
|
"Error: Insufficient nodes discovered. Expecting {} or more",
|
||||||
|
num_nodes
|
||||||
|
);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
Arc::new(client)
|
||||||
|
} else {
|
||||||
|
Arc::new(get_client(&nodes))
|
||||||
|
};
|
||||||
|
|
||||||
if nodes.len() < num_clients {
|
let (keypairs, move_keypairs) = if *read_from_client_file && !use_move {
|
||||||
eprintln!(
|
|
||||||
"Error: Insufficient nodes discovered. Expecting {} or more",
|
|
||||||
num_nodes
|
|
||||||
);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
let (keypairs, move_keypairs, keypair_balance) = if *read_from_client_file && !use_move {
|
|
||||||
let path = Path::new(&client_ids_and_stake_file);
|
let path = Path::new(&client_ids_and_stake_file);
|
||||||
let file = File::open(path).unwrap();
|
let file = File::open(path).unwrap();
|
||||||
|
|
||||||
@ -97,10 +104,10 @@ fn main() {
|
|||||||
last_balance = primordial_account.balance;
|
last_balance = primordial_account.balance;
|
||||||
});
|
});
|
||||||
|
|
||||||
if keypairs.len() < tx_count * 2 {
|
if keypairs.len() < keypair_count {
|
||||||
eprintln!(
|
eprintln!(
|
||||||
"Expected {} accounts in {}, only received {} (--tx_count mismatch?)",
|
"Expected {} accounts in {}, only received {} (--tx_count mismatch?)",
|
||||||
tx_count * 2,
|
keypair_count,
|
||||||
client_ids_and_stake_file,
|
client_ids_and_stake_file,
|
||||||
keypairs.len(),
|
keypairs.len(),
|
||||||
);
|
);
|
||||||
@ -110,13 +117,13 @@ fn main() {
|
|||||||
// This prevents the amount of storage needed for bench-tps accounts from creeping up
|
// This prevents the amount of storage needed for bench-tps accounts from creeping up
|
||||||
// across multiple runs.
|
// across multiple runs.
|
||||||
keypairs.sort_by(|x, y| x.pubkey().to_string().cmp(&y.pubkey().to_string()));
|
keypairs.sort_by(|x, y| x.pubkey().to_string().cmp(&y.pubkey().to_string()));
|
||||||
(keypairs, None, last_balance)
|
(keypairs, None)
|
||||||
} else {
|
} else {
|
||||||
generate_and_fund_keypairs(
|
generate_and_fund_keypairs(
|
||||||
&client,
|
client.clone(),
|
||||||
Some(*drone_addr),
|
Some(*faucet_addr),
|
||||||
&id,
|
&id,
|
||||||
*tx_count,
|
keypair_count,
|
||||||
*num_lamports_per_account,
|
*num_lamports_per_account,
|
||||||
*use_move,
|
*use_move,
|
||||||
)
|
)
|
||||||
@ -126,11 +133,5 @@ fn main() {
|
|||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
do_bench_tps(
|
do_bench_tps(client, cli_config, keypairs, move_keypairs);
|
||||||
vec![client],
|
|
||||||
cli_config,
|
|
||||||
keypairs,
|
|
||||||
keypair_balance,
|
|
||||||
move_keypairs,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,20 @@
|
|||||||
use crate::local_cluster::{ClusterConfig, LocalCluster};
|
|
||||||
use serial_test_derive::serial;
|
use serial_test_derive::serial;
|
||||||
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs};
|
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs};
|
||||||
use solana_bench_tps::cli::Config;
|
use solana_bench_tps::cli::Config;
|
||||||
use solana_client::thin_client::create_client;
|
use solana_client::thin_client::create_client;
|
||||||
use solana_core::cluster_info::VALIDATOR_PORT_RANGE;
|
use solana_core::cluster_info::VALIDATOR_PORT_RANGE;
|
||||||
use solana_core::validator::ValidatorConfig;
|
use solana_core::validator::ValidatorConfig;
|
||||||
use solana_drone::drone::run_local_drone;
|
use solana_faucet::faucet::run_local_faucet;
|
||||||
|
use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster};
|
||||||
#[cfg(feature = "move")]
|
#[cfg(feature = "move")]
|
||||||
use solana_move_loader_program;
|
use solana_sdk::move_loader::solana_move_loader_program;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, Signer};
|
||||||
use std::sync::mpsc::channel;
|
use std::sync::{mpsc::channel, Arc};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
fn test_bench_tps_local_cluster(config: Config) {
|
fn test_bench_tps_local_cluster(config: Config) {
|
||||||
#[cfg(feature = "move")]
|
#[cfg(feature = "move")]
|
||||||
let native_instruction_processors = vec![solana_move_loader_program!()];
|
let native_instruction_processors = vec![solana_move_loader_program()];
|
||||||
|
|
||||||
#[cfg(not(feature = "move"))]
|
#[cfg(not(feature = "move"))]
|
||||||
let native_instruction_processors = vec![];
|
let native_instruction_processors = vec![];
|
||||||
@ -29,36 +29,39 @@ fn test_bench_tps_local_cluster(config: Config) {
|
|||||||
..ClusterConfig::default()
|
..ClusterConfig::default()
|
||||||
});
|
});
|
||||||
|
|
||||||
let drone_keypair = Keypair::new();
|
let faucet_keypair = Keypair::new();
|
||||||
cluster.transfer(
|
cluster.transfer(
|
||||||
&cluster.funding_keypair,
|
&cluster.funding_keypair,
|
||||||
&drone_keypair.pubkey(),
|
&faucet_keypair.pubkey(),
|
||||||
100_000_000,
|
100_000_000,
|
||||||
);
|
);
|
||||||
|
|
||||||
let client = create_client(
|
let client = Arc::new(create_client(
|
||||||
(cluster.entry_point_info.rpc, cluster.entry_point_info.tpu),
|
(cluster.entry_point_info.rpc, cluster.entry_point_info.tpu),
|
||||||
VALIDATOR_PORT_RANGE,
|
VALIDATOR_PORT_RANGE,
|
||||||
);
|
));
|
||||||
|
|
||||||
let (addr_sender, addr_receiver) = channel();
|
let (addr_sender, addr_receiver) = channel();
|
||||||
run_local_drone(drone_keypair, addr_sender, None);
|
run_local_faucet(faucet_keypair, addr_sender, None);
|
||||||
let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
let faucet_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
||||||
|
|
||||||
let lamports_per_account = 100;
|
let lamports_per_account = 100;
|
||||||
|
|
||||||
let (keypairs, move_keypairs, _keypair_balance) = generate_and_fund_keypairs(
|
let keypair_count = config.tx_count * config.keypair_multiplier;
|
||||||
&client,
|
let (keypairs, move_keypairs) = generate_and_fund_keypairs(
|
||||||
Some(drone_addr),
|
client.clone(),
|
||||||
|
Some(faucet_addr),
|
||||||
&config.id,
|
&config.id,
|
||||||
config.tx_count,
|
keypair_count,
|
||||||
lamports_per_account,
|
lamports_per_account,
|
||||||
config.use_move,
|
config.use_move,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let total = do_bench_tps(vec![client], config, keypairs, 0, move_keypairs);
|
let _total = do_bench_tps(client, config, keypairs, move_keypairs);
|
||||||
assert!(total > 100);
|
|
||||||
|
#[cfg(not(debug_assertions))]
|
||||||
|
assert!(_total > 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -76,7 +79,7 @@ fn test_bench_tps_local_cluster_solana() {
|
|||||||
fn test_bench_tps_local_cluster_move() {
|
fn test_bench_tps_local_cluster_move() {
|
||||||
let mut config = Config::default();
|
let mut config = Config::default();
|
||||||
config.tx_count = 100;
|
config.tx_count = 100;
|
||||||
config.duration = Duration::from_secs(20);
|
config.duration = Duration::from_secs(10);
|
||||||
config.use_move = true;
|
config.use_move = true;
|
||||||
|
|
||||||
test_bench_tps_local_cluster(config);
|
test_bench_tps_local_cluster(config);
|
@ -1,18 +0,0 @@
|
|||||||
+------------+
|
|
||||||
| Bank-Merkle|
|
|
||||||
+------------+
|
|
||||||
^ ^
|
|
||||||
/ \
|
|
||||||
+-----------------+ +-------------+
|
|
||||||
| Bank-Diff-Merkle| | Block-Merkle|
|
|
||||||
+-----------------+ +-------------+
|
|
||||||
^ ^
|
|
||||||
/ \
|
|
||||||
+------+ +--------------------------+
|
|
||||||
| Hash | | Previous Bank-Diff-Merkle|
|
|
||||||
+------+ +--------------------------+
|
|
||||||
^ ^
|
|
||||||
/ \
|
|
||||||
+---------------+ +---------------+
|
|
||||||
| Hash(Account1)| | Hash(Account2)|
|
|
||||||
+---------------+ +---------------+
|
|
@ -1,30 +0,0 @@
|
|||||||
.--------------------------------------.
|
|
||||||
| Validator |
|
|
||||||
| |
|
|
||||||
.--------. | .-------------------. |
|
|
||||||
| |---->| | |
|
|
||||||
| Client | | | JSON RPC Service | |
|
|
||||||
| |<----| | |
|
|
||||||
`----+---` | `-------------------` |
|
|
||||||
| | ^ |
|
|
||||||
| | | .----------------. | .------------------.
|
|
||||||
| | | | Gossip Service |<----------| Validators |
|
|
||||||
| | | `----------------` | | |
|
|
||||||
| | | ^ | | |
|
|
||||||
| | | | | | .------------. |
|
|
||||||
| | .---+---. .----+---. .-----------. | | | | |
|
|
||||||
| | | Bank |<-+ Replay | | BlobFetch |<------+ Upstream | |
|
|
||||||
| | | Forks | | Stage | | Stage | | | | Validators | |
|
|
||||||
| | `-------` `--------` `--+--------` | | | | |
|
|
||||||
| | ^ ^ | | | `------------` |
|
|
||||||
| | | | v | | |
|
|
||||||
| | | .--+--------. | | |
|
|
||||||
| | | | Blocktree | | | |
|
|
||||||
| | | `-----------` | | .------------. |
|
|
||||||
| | | ^ | | | | |
|
|
||||||
| | | | | | | Downstream | |
|
|
||||||
| | .--+--. .-------+---. | | | Validators | |
|
|
||||||
`-------->| TPU +---->| Broadcast +--------------->| | |
|
|
||||||
| `-----` | Stage | | | `------------` |
|
|
||||||
| `-----------` | `------------------`
|
|
||||||
`--------------------------------------`
|
|
@ -1,13 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
cd "$(dirname "$0")"
|
|
||||||
|
|
||||||
make -j"$(nproc)" -B svg
|
|
||||||
|
|
||||||
#TODO figure out why book wants to change, but local and CI differ
|
|
||||||
exit 0
|
|
||||||
if [[ -n $CI ]]; then
|
|
||||||
# In CI confirm that no svgs need to be built
|
|
||||||
git diff --exit-code
|
|
||||||
fi
|
|
@ -1,6 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
cd "$(dirname "$0")"
|
|
||||||
|
|
||||||
make -j"$(nproc)" test
|
|
@ -1,192 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.9 KiB |
@ -1,192 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.9 KiB |
@ -1,192 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.9 KiB |
@ -1,192 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.9 KiB |
@ -1,210 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,192 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.9 KiB |
@ -1,183 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,201 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.7 KiB |
@ -1,183 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,183 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,183 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,183 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,183 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="304" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="304" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="184"/>
|
|
||||||
<line x1="4" x2="540" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="540" y1="184" y2="184"/>
|
|
||||||
<line x1="540" x2="540" y1="8" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="28" x2="28" y1="232" y2="296"/>
|
|
||||||
<line x1="28" x2="108" y1="232" y2="232"/>
|
|
||||||
<line x1="28" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="108" x2="164" y1="232" y2="232"/>
|
|
||||||
<line x1="164" x2="196" y1="232" y2="232"/>
|
|
||||||
<line x1="196" x2="196" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="40" y2="104"/>
|
|
||||||
<line x1="36" x2="180" y1="40" y2="40"/>
|
|
||||||
<line x1="36" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="108" x2="108" y1="104" y2="176"/>
|
|
||||||
<line x1="108" x2="124" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="136"/>
|
|
||||||
<line x1="124" x2="180" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="364" y1="136" y2="136"/>
|
|
||||||
<line x1="180" x2="180" y1="40" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="56" y2="88"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="56" y2="56"/>
|
|
||||||
<line x1="180" x2="180" y1="88" y2="104"/>
|
|
||||||
<line x1="180" x2="184" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="176"/>
|
|
||||||
<line x1="364" x2="420" y1="152" y2="152"/>
|
|
||||||
<line x1="420" x2="420" y1="104" y2="152"/>
|
|
||||||
<line x1="420" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="436" y1="104" y2="176"/>
|
|
||||||
<line x1="436" x2="508" y1="104" y2="104"/>
|
|
||||||
<line x1="508" x2="508" y1="40" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="176"/>
|
|
||||||
<line x1="164" x2="364" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="164" x2="164" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="88" y2="88"/>
|
|
||||||
<line x1="192" x2="364" y1="88" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="56" y2="88"/>
|
|
||||||
<line x1="364" x2="364" y1="88" y2="104"/>
|
|
||||||
<line x1="364" x2="420" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="232" y2="296"/>
|
|
||||||
<line x1="348" x2="364" y1="232" y2="232"/>
|
|
||||||
<line x1="348" x2="516" y1="296" y2="296"/>
|
|
||||||
<line x1="364" x2="436" y1="232" y2="232"/>
|
|
||||||
<line x1="436" x2="516" y1="232" y2="232"/>
|
|
||||||
<line x1="516" x2="516" y1="232" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="40" y2="56"/>
|
|
||||||
<line x1="364" x2="508" y1="40" y2="40"/>
|
|
||||||
<line x1="364" x2="360" y1="56" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="364" x2="364" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="192" y2="220"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="57" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="76">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="268">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="76">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="481" y="268">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.8 KiB |
@ -1,340 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.2 KiB |
@ -1,322 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.3 KiB |
@ -1,322 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.3 KiB |
@ -1,322 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.3 KiB |
@ -1,322 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.3 KiB |
@ -1,322 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.3 KiB |
@ -1,322 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="400" width="856" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="400" width="856" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="8" y2="152"/>
|
|
||||||
<line x1="4" x2="852" y1="8" y2="8"/>
|
|
||||||
<line x1="4" x2="852" y1="152" y2="152"/>
|
|
||||||
<line x1="852" x2="852" y1="8" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="248" y2="392"/>
|
|
||||||
<line x1="4" x2="852" y1="248" y2="248"/>
|
|
||||||
<line x1="4" x2="852" y1="392" y2="392"/>
|
|
||||||
<line x1="852" x2="852" y1="248" y2="392"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="56" y2="120"/>
|
|
||||||
<line x1="60" x2="196" y1="56" y2="56"/>
|
|
||||||
<line x1="60" x2="84" y1="120" y2="120"/>
|
|
||||||
<line x1="84" x2="84" y1="120" y2="144"/>
|
|
||||||
<line x1="84" x2="196" y1="120" y2="120"/>
|
|
||||||
<line x1="196" x2="196" y1="56" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="72" y2="72"/>
|
|
||||||
<line x1="196" x2="196" y1="104" y2="120"/>
|
|
||||||
<line x1="196" x2="200" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="60" x2="60" y1="296" y2="360"/>
|
|
||||||
<line x1="60" x2="84" y1="296" y2="296"/>
|
|
||||||
<line x1="60" x2="196" y1="360" y2="360"/>
|
|
||||||
<line x1="84" x2="196" y1="296" y2="296"/>
|
|
||||||
<line x1="196" x2="196" y1="296" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="196" x2="252" y1="312" y2="312"/>
|
|
||||||
<line x1="196" x2="196" y1="344" y2="360"/>
|
|
||||||
<line x1="196" x2="200" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="84" x2="84" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="84" x2="84" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="208" x2="260" y1="104" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="72" y2="104"/>
|
|
||||||
<line x1="260" x2="260" y1="104" y2="120"/>
|
|
||||||
<line x1="260" x2="284" y1="120" y2="120"/>
|
|
||||||
<line x1="284" x2="284" y1="120" y2="144"/>
|
|
||||||
<line x1="284" x2="396" y1="120" y2="120"/>
|
|
||||||
<line x1="396" x2="396" y1="104" y2="120"/>
|
|
||||||
<line x1="396" x2="400" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="208" x2="204" y1="344" y2="344"/>
|
|
||||||
<line x1="208" x2="260" y1="344" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="312" y2="344"/>
|
|
||||||
<line x1="260" x2="260" y1="344" y2="360"/>
|
|
||||||
<line x1="260" x2="396" y1="360" y2="360"/>
|
|
||||||
<line x1="396" x2="396" y1="344" y2="360"/>
|
|
||||||
<line x1="396" x2="400" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="56" y2="72"/>
|
|
||||||
<line x1="260" x2="396" y1="56" y2="56"/>
|
|
||||||
<line x1="260" x2="256" y1="72" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="56" y2="72"/>
|
|
||||||
<line x1="396" x2="396" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="296" y2="312"/>
|
|
||||||
<line x1="260" x2="284" y1="296" y2="296"/>
|
|
||||||
<line x1="260" x2="256" y1="312" y2="312"/>
|
|
||||||
<line x1="284" x2="396" y1="296" y2="296"/>
|
|
||||||
<line x1="396" x2="396" y1="296" y2="312"/>
|
|
||||||
<line x1="396" x2="396" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="396" x2="452" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="284" x2="284" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="284" x2="284" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="104" y2="104"/>
|
|
||||||
<line x1="408" x2="460" y1="104" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="72" y2="104"/>
|
|
||||||
<line x1="460" x2="460" y1="104" y2="120"/>
|
|
||||||
<line x1="460" x2="508" y1="120" y2="120"/>
|
|
||||||
<line x1="508" x2="508" y1="120" y2="144"/>
|
|
||||||
<line x1="508" x2="596" y1="120" y2="120"/>
|
|
||||||
<line x1="596" x2="596" y1="104" y2="120"/>
|
|
||||||
<line x1="596" x2="600" y1="104" y2="104"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="408" x2="404" y1="344" y2="344"/>
|
|
||||||
<line x1="408" x2="460" y1="344" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="312" y2="344"/>
|
|
||||||
<line x1="460" x2="460" y1="344" y2="360"/>
|
|
||||||
<line x1="460" x2="596" y1="360" y2="360"/>
|
|
||||||
<line x1="596" x2="596" y1="344" y2="360"/>
|
|
||||||
<line x1="596" x2="600" y1="344" y2="344"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="56" y2="72"/>
|
|
||||||
<line x1="460" x2="596" y1="56" y2="56"/>
|
|
||||||
<line x1="460" x2="456" y1="72" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="56" y2="72"/>
|
|
||||||
<line x1="596" x2="596" y1="72" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="296" y2="312"/>
|
|
||||||
<line x1="460" x2="508" y1="296" y2="296"/>
|
|
||||||
<line x1="460" x2="456" y1="312" y2="312"/>
|
|
||||||
<line x1="508" x2="596" y1="296" y2="296"/>
|
|
||||||
<line x1="596" x2="596" y1="296" y2="312"/>
|
|
||||||
<line x1="596" x2="596" y1="312" y2="344"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="596" x2="652" y1="312" y2="312"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="508" x2="508" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="508" x2="508" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="104" y2="104"/>
|
|
||||||
<line x1="608" x2="660" y1="104" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="72" y2="104"/>
|
|
||||||
<line x1="660" x2="660" y1="104" y2="120"/>
|
|
||||||
<line x1="660" x2="684" y1="120" y2="120"/>
|
|
||||||
<line x1="684" x2="684" y1="120" y2="144"/>
|
|
||||||
<line x1="684" x2="796" y1="120" y2="120"/>
|
|
||||||
<line x1="796" x2="796" y1="56" y2="120"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="608" x2="604" y1="344" y2="344"/>
|
|
||||||
<line x1="608" x2="660" y1="344" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="312" y2="344"/>
|
|
||||||
<line x1="660" x2="660" y1="344" y2="360"/>
|
|
||||||
<line x1="660" x2="796" y1="360" y2="360"/>
|
|
||||||
<line x1="796" x2="796" y1="296" y2="360"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="56" y2="72"/>
|
|
||||||
<line x1="660" x2="796" y1="56" y2="56"/>
|
|
||||||
<line x1="660" x2="656" y1="72" y2="72"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="660" x2="660" y1="296" y2="312"/>
|
|
||||||
<line x1="660" x2="684" y1="296" y2="296"/>
|
|
||||||
<line x1="660" x2="656" y1="312" y2="312"/>
|
|
||||||
<line x1="684" x2="796" y1="296" y2="296"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="684" x2="684" y1="160" y2="240"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="684" x2="684" y1="256" y2="284"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="92">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="161" y="332">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="28">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="353" y="268">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="92">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="332">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="28">
|
|
||||||
Above
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="457" y="268">
|
|
||||||
Below
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="489" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="92">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="561" y="332">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="92">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="689" y="332">
|
|
||||||
Neighbor
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="92">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="761" y="332">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8.3 KiB |
@ -1,138 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="104" y2="232"/>
|
|
||||||
<line x1="4" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="4" x2="540" y1="232" y2="232"/>
|
|
||||||
<line x1="108" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="540" y1="104" y2="104"/>
|
|
||||||
<line x1="540" x2="540" y1="104" y2="232"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="136" y2="200"/>
|
|
||||||
<line x1="36" x2="180" y1="136" y2="136"/>
|
|
||||||
<line x1="36" x2="180" y1="200" y2="200"/>
|
|
||||||
<line x1="180" x2="180" y1="136" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="152" y2="184"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="184" y2="200"/>
|
|
||||||
<line x1="180" x2="184" y1="184" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
|
||||||
<line x1="108" x2="212" y1="40" y2="40"/>
|
|
||||||
<line x1="212" x2="212" y1="8" y2="40"/>
|
|
||||||
<line x1="212" x2="332" y1="8" y2="8"/>
|
|
||||||
<line x1="212" x2="212" y1="40" y2="72"/>
|
|
||||||
<line x1="212" x2="332" y1="72" y2="72"/>
|
|
||||||
<line x1="332" x2="332" y1="8" y2="40"/>
|
|
||||||
<line x1="332" x2="332" y1="40" y2="72"/>
|
|
||||||
<line x1="332" x2="436" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
|
||||||
<line x1="192" x2="364" y1="184" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="184" y2="200"/>
|
|
||||||
<line x1="364" x2="508" y1="200" y2="200"/>
|
|
||||||
<line x1="508" x2="508" y1="136" y2="200"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="508" y1="136" y2="136"/>
|
|
||||||
<line x1="364" x2="360" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="172">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="44">
|
|
||||||
Leader
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="140">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="172">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.8 KiB |
@ -1,138 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="104" y2="232"/>
|
|
||||||
<line x1="4" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="4" x2="540" y1="232" y2="232"/>
|
|
||||||
<line x1="108" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="540" y1="104" y2="104"/>
|
|
||||||
<line x1="540" x2="540" y1="104" y2="232"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="136" y2="200"/>
|
|
||||||
<line x1="36" x2="180" y1="136" y2="136"/>
|
|
||||||
<line x1="36" x2="180" y1="200" y2="200"/>
|
|
||||||
<line x1="180" x2="180" y1="136" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="152" y2="184"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="184" y2="200"/>
|
|
||||||
<line x1="180" x2="184" y1="184" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
|
||||||
<line x1="108" x2="212" y1="40" y2="40"/>
|
|
||||||
<line x1="212" x2="212" y1="8" y2="40"/>
|
|
||||||
<line x1="212" x2="332" y1="8" y2="8"/>
|
|
||||||
<line x1="212" x2="212" y1="40" y2="72"/>
|
|
||||||
<line x1="212" x2="332" y1="72" y2="72"/>
|
|
||||||
<line x1="332" x2="332" y1="8" y2="40"/>
|
|
||||||
<line x1="332" x2="332" y1="40" y2="72"/>
|
|
||||||
<line x1="332" x2="436" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
|
||||||
<line x1="192" x2="364" y1="184" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="184" y2="200"/>
|
|
||||||
<line x1="364" x2="508" y1="200" y2="200"/>
|
|
||||||
<line x1="508" x2="508" y1="136" y2="200"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="508" y1="136" y2="136"/>
|
|
||||||
<line x1="364" x2="360" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="172">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="44">
|
|
||||||
Leader
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="140">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="172">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.8 KiB |
@ -1,156 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="240" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="104" y2="232"/>
|
|
||||||
<line x1="4" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="4" x2="540" y1="232" y2="232"/>
|
|
||||||
<line x1="108" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="540" y1="104" y2="104"/>
|
|
||||||
<line x1="540" x2="540" y1="104" y2="232"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="136" y2="200"/>
|
|
||||||
<line x1="36" x2="180" y1="136" y2="136"/>
|
|
||||||
<line x1="36" x2="180" y1="200" y2="200"/>
|
|
||||||
<line x1="180" x2="180" y1="136" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="152" y2="184"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="184" y2="200"/>
|
|
||||||
<line x1="180" x2="184" y1="184" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
|
||||||
<line x1="108" x2="212" y1="40" y2="40"/>
|
|
||||||
<line x1="212" x2="212" y1="8" y2="40"/>
|
|
||||||
<line x1="212" x2="332" y1="8" y2="8"/>
|
|
||||||
<line x1="212" x2="212" y1="40" y2="72"/>
|
|
||||||
<line x1="212" x2="332" y1="72" y2="72"/>
|
|
||||||
<line x1="332" x2="332" y1="8" y2="40"/>
|
|
||||||
<line x1="332" x2="332" y1="40" y2="72"/>
|
|
||||||
<line x1="332" x2="436" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
|
||||||
<line x1="192" x2="364" y1="184" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="184" y2="200"/>
|
|
||||||
<line x1="364" x2="508" y1="200" y2="200"/>
|
|
||||||
<line x1="508" x2="508" y1="136" y2="200"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="508" y1="136" y2="136"/>
|
|
||||||
<line x1="364" x2="360" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="172">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="44">
|
|
||||||
Leader
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="140">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="172">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.7 KiB |
@ -1,138 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="104" y2="232"/>
|
|
||||||
<line x1="4" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="4" x2="540" y1="232" y2="232"/>
|
|
||||||
<line x1="108" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="540" y1="104" y2="104"/>
|
|
||||||
<line x1="540" x2="540" y1="104" y2="232"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="136" y2="200"/>
|
|
||||||
<line x1="36" x2="180" y1="136" y2="136"/>
|
|
||||||
<line x1="36" x2="180" y1="200" y2="200"/>
|
|
||||||
<line x1="180" x2="180" y1="136" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="152" y2="184"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="184" y2="200"/>
|
|
||||||
<line x1="180" x2="184" y1="184" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
|
||||||
<line x1="108" x2="212" y1="40" y2="40"/>
|
|
||||||
<line x1="212" x2="212" y1="8" y2="40"/>
|
|
||||||
<line x1="212" x2="332" y1="8" y2="8"/>
|
|
||||||
<line x1="212" x2="212" y1="40" y2="72"/>
|
|
||||||
<line x1="212" x2="332" y1="72" y2="72"/>
|
|
||||||
<line x1="332" x2="332" y1="8" y2="40"/>
|
|
||||||
<line x1="332" x2="332" y1="40" y2="72"/>
|
|
||||||
<line x1="332" x2="436" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
|
||||||
<line x1="192" x2="364" y1="184" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="184" y2="200"/>
|
|
||||||
<line x1="364" x2="508" y1="200" y2="200"/>
|
|
||||||
<line x1="508" x2="508" y1="136" y2="200"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="508" y1="136" y2="136"/>
|
|
||||||
<line x1="364" x2="360" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="172">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="44">
|
|
||||||
Leader
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="140">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="172">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.8 KiB |
@ -1,138 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="104" y2="232"/>
|
|
||||||
<line x1="4" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="4" x2="540" y1="232" y2="232"/>
|
|
||||||
<line x1="108" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="540" y1="104" y2="104"/>
|
|
||||||
<line x1="540" x2="540" y1="104" y2="232"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="136" y2="200"/>
|
|
||||||
<line x1="36" x2="180" y1="136" y2="136"/>
|
|
||||||
<line x1="36" x2="180" y1="200" y2="200"/>
|
|
||||||
<line x1="180" x2="180" y1="136" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="152" y2="184"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="184" y2="200"/>
|
|
||||||
<line x1="180" x2="184" y1="184" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
|
||||||
<line x1="108" x2="212" y1="40" y2="40"/>
|
|
||||||
<line x1="212" x2="212" y1="8" y2="40"/>
|
|
||||||
<line x1="212" x2="332" y1="8" y2="8"/>
|
|
||||||
<line x1="212" x2="212" y1="40" y2="72"/>
|
|
||||||
<line x1="212" x2="332" y1="72" y2="72"/>
|
|
||||||
<line x1="332" x2="332" y1="8" y2="40"/>
|
|
||||||
<line x1="332" x2="332" y1="40" y2="72"/>
|
|
||||||
<line x1="332" x2="436" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
|
||||||
<line x1="192" x2="364" y1="184" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="184" y2="200"/>
|
|
||||||
<line x1="364" x2="508" y1="200" y2="200"/>
|
|
||||||
<line x1="508" x2="508" y1="136" y2="200"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="508" y1="136" y2="136"/>
|
|
||||||
<line x1="364" x2="360" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="172">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="44">
|
|
||||||
Leader
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="140">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="172">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.8 KiB |
@ -1,138 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="240" width="544" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="240" width="544" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="104" y2="232"/>
|
|
||||||
<line x1="4" x2="108" y1="104" y2="104"/>
|
|
||||||
<line x1="4" x2="540" y1="232" y2="232"/>
|
|
||||||
<line x1="108" x2="436" y1="104" y2="104"/>
|
|
||||||
<line x1="436" x2="540" y1="104" y2="104"/>
|
|
||||||
<line x1="540" x2="540" y1="104" y2="232"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="36" x2="36" y1="136" y2="200"/>
|
|
||||||
<line x1="36" x2="180" y1="136" y2="136"/>
|
|
||||||
<line x1="36" x2="180" y1="200" y2="200"/>
|
|
||||||
<line x1="180" x2="180" y1="136" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="152" y2="184"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="180" x2="356" y1="152" y2="152"/>
|
|
||||||
<line x1="180" x2="180" y1="184" y2="200"/>
|
|
||||||
<line x1="180" x2="184" y1="184" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="108" x2="108" y1="40" y2="92"/>
|
|
||||||
<line x1="108" x2="212" y1="40" y2="40"/>
|
|
||||||
<line x1="212" x2="212" y1="8" y2="40"/>
|
|
||||||
<line x1="212" x2="332" y1="8" y2="8"/>
|
|
||||||
<line x1="212" x2="212" y1="40" y2="72"/>
|
|
||||||
<line x1="212" x2="332" y1="72" y2="72"/>
|
|
||||||
<line x1="332" x2="332" y1="8" y2="40"/>
|
|
||||||
<line x1="332" x2="332" y1="40" y2="72"/>
|
|
||||||
<line x1="332" x2="436" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="436" x2="436" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="192" x2="188" y1="184" y2="184"/>
|
|
||||||
<line x1="192" x2="364" y1="184" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="152" y2="184"/>
|
|
||||||
<line x1="364" x2="364" y1="184" y2="200"/>
|
|
||||||
<line x1="364" x2="508" y1="200" y2="200"/>
|
|
||||||
<line x1="508" x2="508" y1="136" y2="200"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="364" x2="364" y1="136" y2="152"/>
|
|
||||||
<line x1="364" x2="508" y1="136" y2="136"/>
|
|
||||||
<line x1="364" x2="360" y1="152" y2="152"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="145" y="172">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="44">
|
|
||||||
Leader
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="140">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="172">
|
|
||||||
Validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="172">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 3.8 KiB |
@ -1,192 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="288" width="736" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="288" width="736" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="4" x2="4" y1="216" y2="280"/>
|
|
||||||
<line x1="4" x2="156" y1="216" y2="216"/>
|
|
||||||
<line x1="4" x2="172" y1="280" y2="280"/>
|
|
||||||
<line x1="156" x2="172" y1="216" y2="216"/>
|
|
||||||
<line x1="172" x2="172" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="104" y2="168"/>
|
|
||||||
<line x1="124" x2="204" y1="104" y2="104"/>
|
|
||||||
<line x1="124" x2="156" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="156" x2="156" y1="168" y2="204"/>
|
|
||||||
<line x1="156" x2="204" y1="168" y2="168"/>
|
|
||||||
<line x1="204" x2="292" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="168" y2="204"/>
|
|
||||||
<line x1="204" x2="292" y1="168" y2="168"/>
|
|
||||||
<line x1="292" x2="292" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="216" y2="280"/>
|
|
||||||
<line x1="188" x2="204" y1="216" y2="216"/>
|
|
||||||
<line x1="188" x2="356" y1="280" y2="280"/>
|
|
||||||
<line x1="204" x2="356" y1="216" y2="216"/>
|
|
||||||
<line x1="356" x2="356" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="204" x2="204" y1="40" y2="92"/>
|
|
||||||
<line x1="204" x2="276" y1="40" y2="40"/>
|
|
||||||
<line x1="276" x2="276" y1="8" y2="40"/>
|
|
||||||
<line x1="276" x2="444" y1="8" y2="8"/>
|
|
||||||
<line x1="276" x2="276" y1="40" y2="72"/>
|
|
||||||
<line x1="276" x2="444" y1="72" y2="72"/>
|
|
||||||
<line x1="444" x2="444" y1="8" y2="40"/>
|
|
||||||
<line x1="444" x2="444" y1="40" y2="72"/>
|
|
||||||
<line x1="444" x2="532" y1="40" y2="40"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="40" y2="92"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="380" x2="380" y1="216" y2="280"/>
|
|
||||||
<line x1="380" x2="532" y1="216" y2="216"/>
|
|
||||||
<line x1="380" x2="548" y1="280" y2="280"/>
|
|
||||||
<line x1="532" x2="548" y1="216" y2="216"/>
|
|
||||||
<line x1="548" x2="548" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="444" x2="444" y1="104" y2="168"/>
|
|
||||||
<line x1="444" x2="532" y1="104" y2="104"/>
|
|
||||||
<line x1="444" x2="532" y1="168" y2="168"/>
|
|
||||||
<line x1="532" x2="612" y1="104" y2="104"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="532" x2="532" y1="168" y2="204"/>
|
|
||||||
<line x1="532" x2="580" y1="168" y2="168"/>
|
|
||||||
<line marker-end="url(#triangle)" x1="580" x2="580" y1="168" y2="204"/>
|
|
||||||
<line x1="580" x2="612" y1="168" y2="168"/>
|
|
||||||
<line x1="612" x2="612" y1="104" y2="168"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="564" x2="564" y1="216" y2="280"/>
|
|
||||||
<line x1="564" x2="580" y1="216" y2="216"/>
|
|
||||||
<line x1="564" x2="732" y1="280" y2="280"/>
|
|
||||||
<line x1="580" x2="732" y1="216" y2="216"/>
|
|
||||||
<line x1="732" x2="732" y1="216" y2="280"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="252">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="153" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="217" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="44">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="321" y="252">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="44">
|
|
||||||
0
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="473" y="140">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="252">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="140">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="252">
|
|
||||||
Neighborhood
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="697" y="252">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.9 KiB |
@ -1,330 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.5 KiB |
@ -1,330 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.5 KiB |
@ -1,330 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.5 KiB |
@ -1,348 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.4 KiB |
@ -1,330 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.5 KiB |
@ -1,330 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.5 KiB |
@ -1,330 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="768" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="768" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line marker-end="url(#triangle)" x1="76" x2="76" y1="32" y2="172"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="124" x2="124" y1="24" y2="56"/>
|
|
||||||
<line x1="124" x2="164" y1="24" y2="24"/>
|
|
||||||
<line x1="124" x2="124" y1="56" y2="88"/>
|
|
||||||
<line x1="124" x2="164" y1="56" y2="56"/>
|
|
||||||
<line x1="124" x2="124" y1="88" y2="120"/>
|
|
||||||
<line x1="124" x2="164" y1="88" y2="88"/>
|
|
||||||
<line x1="124" x2="124" y1="120" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="120" y2="120"/>
|
|
||||||
<line x1="124" x2="124" y1="152" y2="184"/>
|
|
||||||
<line x1="124" x2="164" y1="152" y2="152"/>
|
|
||||||
<line x1="124" x2="164" y1="184" y2="184"/>
|
|
||||||
<line x1="164" x2="164" y1="24" y2="56"/>
|
|
||||||
<line x1="164" x2="164" y1="56" y2="88"/>
|
|
||||||
<line x1="164" x2="164" y1="88" y2="120"/>
|
|
||||||
<line x1="164" x2="164" y1="120" y2="152"/>
|
|
||||||
<line x1="164" x2="164" y1="152" y2="184"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="188" x2="188" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="200" x2="208" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="224" x2="236" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="232" x2="240" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="236" x2="236" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="260" x2="260" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="264" x2="272" y1="64" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="272" x2="280" y1="128" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="304" x2="316" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="316" x2="316" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="360" y1="136" y2="112"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="348" x2="348" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="368" x2="376" y1="96" y2="80"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="384" y1="48" y2="64"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="376" x2="388" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="388" x2="388" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="416" x2="424" y1="80" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="420" x2="420" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="436" x2="420" y1="104" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="448" x2="460" y1="112" y2="136"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="460" x2="460" y1="144" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="512" x2="640" y1="24" y2="24"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="108">
|
|
||||||
time
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="44">
|
|
||||||
L1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="76">
|
|
||||||
L2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="108">
|
|
||||||
L3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="140">
|
|
||||||
L4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="137" y="172">
|
|
||||||
L5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="140">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="185" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="209" y="108">
|
|
||||||
E3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="225" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="249" y="76">
|
|
||||||
E2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="140">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="257" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="289" y="108">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="305" y="172">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="313" y="44">
|
|
||||||
E1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="337" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="361" y="108">
|
|
||||||
E3'
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="377" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="393" y="76">
|
|
||||||
x
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="409" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="449" y="172">
|
|
||||||
xx
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="12">
|
|
||||||
validator
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="60">
|
|
||||||
vote(E1)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="92">
|
|
||||||
vote(E2)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="124">
|
|
||||||
slash(E3)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="156">
|
|
||||||
vote(E4)
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="513" y="188">
|
|
||||||
hang
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="553" y="188">
|
|
||||||
on
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="577" y="188">
|
|
||||||
to
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="593" y="12">
|
|
||||||
action
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="601" y="188">
|
|
||||||
E4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="625" y="188">
|
|
||||||
and
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="657" y="188">
|
|
||||||
E5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="681" y="188">
|
|
||||||
for
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="713" y="188">
|
|
||||||
more...
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.5 KiB |
@ -1,122 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="48" x2="64" y1="16" y2="48"/>
|
|
||||||
<line x1="68" x2="64" y1="56" y2="48"/>
|
|
||||||
<line x1="68" x2="68" y1="64" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="68" x2="68" y1="80" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="72" x2="80" y1="80" y2="96"/>
|
|
||||||
<line x1="80" x2="88" y1="96" y2="112"/>
|
|
||||||
<line x1="92" x2="88" y1="120" y2="112"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="120"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="192"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="204">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.9 KiB |
@ -1,140 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="208" width="96" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="48" x2="64" y1="16" y2="48"/>
|
|
||||||
<line x1="68" x2="64" y1="56" y2="48"/>
|
|
||||||
<line x1="68" x2="68" y1="64" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="68" x2="68" y1="80" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="72" x2="80" y1="80" y2="96"/>
|
|
||||||
<line x1="80" x2="88" y1="96" y2="112"/>
|
|
||||||
<line x1="92" x2="88" y1="120" y2="112"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="120"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="192"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="204">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.8 KiB |
@ -1,122 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="48" x2="64" y1="16" y2="48"/>
|
|
||||||
<line x1="68" x2="64" y1="56" y2="48"/>
|
|
||||||
<line x1="68" x2="68" y1="64" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="68" x2="68" y1="80" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="72" x2="80" y1="80" y2="96"/>
|
|
||||||
<line x1="80" x2="88" y1="96" y2="112"/>
|
|
||||||
<line x1="92" x2="88" y1="120" y2="112"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="120"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="192"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="204">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.9 KiB |
@ -1,122 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="48" x2="64" y1="16" y2="48"/>
|
|
||||||
<line x1="68" x2="64" y1="56" y2="48"/>
|
|
||||||
<line x1="68" x2="68" y1="64" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="68" x2="68" y1="80" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="72" x2="80" y1="80" y2="96"/>
|
|
||||||
<line x1="80" x2="88" y1="96" y2="112"/>
|
|
||||||
<line x1="92" x2="88" y1="120" y2="112"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="120"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="192"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="204">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.9 KiB |
@ -1,122 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="48" x2="64" y1="16" y2="48"/>
|
|
||||||
<line x1="68" x2="64" y1="56" y2="48"/>
|
|
||||||
<line x1="68" x2="68" y1="64" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="68" x2="68" y1="80" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="72" x2="80" y1="80" y2="96"/>
|
|
||||||
<line x1="80" x2="88" y1="96" y2="112"/>
|
|
||||||
<line x1="92" x2="88" y1="120" y2="112"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="120"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="192"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="204">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.9 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="144" width="48" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="144" width="48" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,110 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon class="fg_fill" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon class="bg_fill" points="2,2 2,12 18,7 2,2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="fg_fill" cx="10" cy="10" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect class="fg_fill" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle class="bg_fill" cx="10" cy="10" r="4"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle class="bg_fill" cx="20" cy="20" r="6"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
rect.backdrop {
|
|
||||||
fill: white;
|
|
||||||
}
|
|
||||||
text{
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
circle {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
line {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
path {
|
|
||||||
fill: none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg_fill {
|
|
||||||
fill: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.bg_fill {
|
|
||||||
fill: white;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect class="backdrop" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.3 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,92 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="176" width="40" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="176" width="40" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="12" x2="12" y1="48" y2="128"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="16" x2="32" y1="48" y2="80"/>
|
|
||||||
<line x1="36" x2="32" y1="88" y2="80"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="88"/>
|
|
||||||
<line x1="36" x2="36" y1="96" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="44">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="9" y="140">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="33" y="172">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,122 +0,0 @@
|
|||||||
<svg class="bob" font-family="arial" font-size="14" height="208" width="96" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<defs>
|
|
||||||
<marker id="triangle" markerHeight="8" markerWidth="8" orient="auto" refX="4" refY="2" viewBox="0 0 8 4">
|
|
||||||
<polygon fill="black" points="0,0 0,4 8,2 0,0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="clear_triangle" markerHeight="10" markerWidth="10" orient="auto" refX="1" refY="7" viewBox="0 0 20 14">
|
|
||||||
<polygon fill="none" points="2,2 2,12 18,7 2,2" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="circle" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="black" r="8"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="square" markerHeight="5" markerWidth="5" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<rect fill="black" height="20" width="20" x="0" y="0"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="open_circle" markerHeight="10" markerWidth="10" orient="auto" refX="10" refY="10" viewBox="0 0 20 20">
|
|
||||||
<circle cx="10" cy="10" fill="white" r="4" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
<marker id="big_open_circle" markerHeight="20" markerWidth="20" orient="auto" refX="20" refY="20" viewBox="0 0 40 40">
|
|
||||||
<circle cx="20" cy="20" fill="white" r="6" stroke="black" stroke-width="2"/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
line,path {
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
line.dashed {
|
|
||||||
stroke-dasharray: 5;
|
|
||||||
}
|
|
||||||
circle.solid {
|
|
||||||
fill:black;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
circle.open {
|
|
||||||
fill:none;
|
|
||||||
stroke: black;
|
|
||||||
stroke-width: 2;
|
|
||||||
stroke-opacity: 1;
|
|
||||||
fill-opacity: 1;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: miter;
|
|
||||||
}
|
|
||||||
tspan.head{
|
|
||||||
fill: none;
|
|
||||||
stroke: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<rect fill="white" height="208" width="96" x="0" y="0"/>
|
|
||||||
<g>
|
|
||||||
<line x1="20" x2="24" y1="88" y2="80"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="88"/>
|
|
||||||
<line x1="20" x2="20" y1="96" y2="128"/>
|
|
||||||
<line x1="24" x2="40" y1="80" y2="48"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="16" y2="32"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="44" x2="44" y1="48" y2="96"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="48" x2="64" y1="16" y2="48"/>
|
|
||||||
<line x1="68" x2="64" y1="56" y2="48"/>
|
|
||||||
<line x1="68" x2="68" y1="64" y2="56"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="68" x2="68" y1="80" y2="160"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<line x1="72" x2="80" y1="80" y2="96"/>
|
|
||||||
<line x1="80" x2="88" y1="96" y2="112"/>
|
|
||||||
<line x1="92" x2="88" y1="120" y2="112"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="120"/>
|
|
||||||
<line x1="92" x2="92" y1="128" y2="192"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="17" y="140">
|
|
||||||
5
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="12">
|
|
||||||
1
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="44">
|
|
||||||
2
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="41" y="108">
|
|
||||||
4
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="76">
|
|
||||||
3
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="65" y="172">
|
|
||||||
6
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<text x="89" y="204">
|
|
||||||
7
|
|
||||||
</text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 256 KiB |
Before Width: | Height: | Size: 256 KiB |
Before Width: | Height: | Size: 256 KiB |
Before Width: | Height: | Size: 256 KiB |
Before Width: | Height: | Size: 256 KiB |
Before Width: | Height: | Size: 256 KiB |
Before Width: | Height: | Size: 256 KiB |