Compare commits
33 Commits
Author | SHA1 | Date | |
---|---|---|---|
94e06342ac | |||
ecfe655ba3 | |||
f8ea80850e | |||
657d9ad215 | |||
963ce0bbc3 | |||
1e0cd6549b | |||
395a7ec96e | |||
42ee738646 | |||
515ab21f07 | |||
7c5e5a06f3 | |||
7c0c7da72d | |||
b328e5f6ec | |||
0a4b6cedc7 | |||
d9a53eb9d4 | |||
a5b8ee645f | |||
1cbd1c42df | |||
b380bdd54f | |||
cb194eaee7 | |||
ff3f810284 | |||
7e7e9603c9 | |||
4c0e29cd2a | |||
065cf51a3f | |||
d4ec81fe61 | |||
e2508e5d12 | |||
c7fea37964 | |||
b197edea84 | |||
11f99faf0a | |||
728314c96f | |||
2530448474 | |||
49ad5e0b69 | |||
3c49d48666 | |||
2fe93101cc | |||
e90d97e244 |
@ -1,42 +0,0 @@
|
|||||||
version: '{build}'
|
|
||||||
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
- /^v[0-9.]+\.[0-9.]+/
|
|
||||||
|
|
||||||
cache:
|
|
||||||
- '%USERPROFILE%\.cargo'
|
|
||||||
- '%APPVEYOR_BUILD_FOLDER%\target'
|
|
||||||
|
|
||||||
clone_folder: d:\projects\solana
|
|
||||||
|
|
||||||
build_script:
|
|
||||||
- bash ci/publish-tarball.sh
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
- provider: Slack
|
|
||||||
incoming_webhook:
|
|
||||||
secure: GJsBey+F5apAtUm86MHVJ68Uqa6WN1SImcuIc4TsTZrDhA8K1QWUNw9FFQPybUWDyOcS5dly3kubnUqlGt9ux6Ad2efsfRIQYWv0tOVXKeY=
|
|
||||||
channel: ci-status
|
|
||||||
on_build_success: false
|
|
||||||
on_build_failure: true
|
|
||||||
on_build_status_changed: true
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
- provider: S3
|
|
||||||
access_key_id:
|
|
||||||
secure: fTbJl6JpFebR40J7cOWZ2mXBa3kIvEiXgzxAj6L3N7A=
|
|
||||||
secret_access_key:
|
|
||||||
secure: vItsBXb2rEFLvkWtVn/Rcxu5a5+2EwC+b7GsA0waJy9hXh6XuBAD0lnHd9re3g/4
|
|
||||||
bucket: release.solana.com
|
|
||||||
region: us-west-1
|
|
||||||
set_public: true
|
|
||||||
|
|
||||||
- provider: GitHub
|
|
||||||
auth_token:
|
|
||||||
secure: 81fEmPZ0cV1wLtNuUrcmtgxKF6ROQF1+/ft5m+fHX21z6PoeCbaNo8cTyLioWBj7
|
|
||||||
draft: false
|
|
||||||
prerelease: false
|
|
||||||
on:
|
|
||||||
appveyor_repo_tag: true
|
|
1
.buildkite/env/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
/secrets_unencrypted.ejson
|
|
17
.buildkite/env/secrets.ejson
vendored
@ -1,15 +1,12 @@
|
|||||||
{
|
{
|
||||||
"_public_key": "ae29f4f7ad2fc92de70d470e411c8426d5d48db8817c9e3dae574b122192335f",
|
"_public_key": "ae29f4f7ad2fc92de70d470e411c8426d5d48db8817c9e3dae574b122192335f",
|
||||||
"environment": {
|
"environment": {
|
||||||
"CODECOV_TOKEN": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:JnxhrIxh09AvqdJgrVSYmb7PxSrh19aE:07WzVExCHEd1lJ1m8QizRRthGri+WBNeZRKjjEvsy5eo4gv3HD7zVEm42tVTGkqITKkBNQ==]",
|
"CODECOV_TOKEN": "EJ[1:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:rHBSqXK7uSnveA4qwUxARZjTNZcA0hXU:ko8lLGwPECpVm19znWBRxKEpMF7xpTHBCEzVOxRar2wDThw4lNDAKqTS61vtkJLtdkHtug==]",
|
||||||
"CRATES_IO_TOKEN": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:d0jJqC32/axwzq/N7kMRmpxKhnRrhtpt:zvcPHwkOzGnjhNkAQSejwdy1Jkr9wR1qXFFCnfIjyt/XQYubzB1tLkoly/qdmeb5]",
|
"CRATES_IO_TOKEN": "EJ[1:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:NzN6y0ooXJBYvxB589khepthSxhKFkLB:ZTTFZh2A/kB2SAgjJJAMbwAfanRlzxOCNMVcA2MXBCpQHJeeZGULg+0MLACYswfS]",
|
||||||
"GEOLOCATION_API_KEY": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:R4gfB6Ey4i50HyfLt4UZDLBqg3qHEUye:UfZCOgt8XI6Y2g+ivCRVoS1fjFycFs7/GSevvCqh1B50mG0+hzpEyzXQLuKG5OeI]",
|
"GITHUB_TOKEN": "EJ[1:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:iy0Fnxeo0aslTCvgXc5Ddj2ly6ZsQ8gK:GNOOj/kZUJ2rYKxTbLyVKtajWNoGQ3PcChwfEB4HdN18qDHlB96Z7gx01Pcf0qeIHODOWRtxlH4=]",
|
||||||
"GITHUB_TOKEN": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:Vq2dkGTOzfEpRht0BAGHFp/hDogMvXJe:tFXHg1epVt2mq9hkuc5sRHe+KAnVREi/p8S+IZu67XRyzdiA/nGak1k860FXYuuzuaE0QWekaEc=]",
|
"INFLUX_DATABASE": "EJ[1:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:Ly/TpIRF0oCxmiBWv225S3mX8s6pfQR+:+tXGB2c9rRCVDcgNO1IDOo89]",
|
||||||
"INFLUX_DATABASE": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:5KI9WBkXx3R/W4m256mU5MJOE7N8aAT9:Cb8QFELZ9I60t5zhJ9h55Kcs]",
|
"INFLUX_PASSWORD": "EJ[1:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:ycrq1uQLoSfI932czD+krUOaJeLWpeq6:2iS7ukp/C7wVD3IT0GvQVcwccWGyLr4UocStF/XiDi0OB/N3YKIKN8SQU4ob1b6StAPZ/XOHmag=]",
|
||||||
"INFLUX_PASSWORD": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:hQRMpLCrav+OYkNphkeM4hagdVoZv5Iw:AUO76rr6+gF1OLJA8ZLSG8wHKXgYCPNk6gRCV8rBhZBJ4KwDaxpvOhMl7bxxXG6jol7v4aRa/Lk=]",
|
"INFLUX_USERNAME": "EJ[1:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:35hBKofakZ4Db/u0TOW53RXoNWzJTIcl:HWREcMTrgZ8DGB0ZupgSzNWr/tVyE06P]",
|
||||||
"INFLUX_USERNAME": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:R7BNmQjfeqoGDAFTJu9bYTGHol2NgnYN:Q2tOT/EBcFvhFk+DKLKmVU7tLCpVC3Ui]",
|
"SOLANA_INSTALL_UPDATE_MANIFEST_KEYPAIR_x86_64_unknown_linux_gnu": "EJ[1:+7nLVR8NlnN48zgaJPPXF9JOZDXVNHDZLeARlCFHyRk=:kRz8CyJYKAg/AiwgLrcRNDJAmlRX2zvX:uV1XV6y2Fb+dN4Z9BIMPBRiNS3n+NL8GlJXyu1i7meIsph1DzfLg4Thcp5Mj9nUsFNLgqQgjnsa5C4XNY/h5AgMSzRrJxVj7RhVTRmDJ5/Vjq6v7wCMRfBOvF3rITsV4zTwWSV8yafFmS+ZQ+QJTRgtYsuoYAUNZ06IEebfDHcuNwws72hEGoD9w43hOLSpyEOmXbtZ9h1lIRxrgsrhYDpBlU5LkhDeTXAX5M5dwYxyquJFRwd5quGDV5DYsCh9bAkbjAyjWYymVJ78U9YJIQHT9izzQqTDlMQN49EbLo7MDIaC7O7HVtb7unDJs+DRejbHacoyWVulqVVwu3GRiZezu8zdjwzGHphMMxOtKQaidnqYgflNp/O01I8wZRgR1alsGcmIhEhI8YV/IvQ==]"
|
||||||
"SOLANA_INSTALL_UPDATE_MANIFEST_KEYPAIR_x86_64_unknown_linux_gnu": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:Egc2dMrHDU0NcZ71LwGv/V66shUhwYUE:04VoIb8CKy7KYhQ5W4cEW9SDKZltxWBL5Hob106lMBbUOD/yUvKYcG3Ep8JfTMwO3K8zowW5HpU/IdGoilX0XWLiJJ6t+p05WWK0TA16nOEtwrEG+UK8wm3sN+xCO20i4jDhpNpgg3FYFHT5rKTHW8+zaBTNUX/SFxkN67Lm+92IM28CXYE43SU1WV6H99hGFFVpTK5JVM3JuYU1ex/dHRE+xCzTr4MYUB/F+nGoNFW8HUDV/y0e1jxT9to3x0SmnytEEuk+5RUzFuEt9cKNFeNml3fOCi4qL+sfj/Y5pjH9xDiUxsvH/8NL35jbLP244aFHgWcp]",
|
|
||||||
"SOLANA_INSTALL_UPDATE_MANIFEST_KEYPAIR_x86_64_apple_darwin": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:NeOxSoWCvXB9AL4H6OK26l/7bmsKd/oz:Ijfoxtvk2CHlN1ZXHup3Gg/914kbbAkEGWJfvozA8UIe+aUzUObMyTrKkVOeNAH8Q8YH9tNzk7RRnrTcpnzeCCBLlWcVEeruMxHox3mPRzmSeDLxtbzCl9VePlRO3T7jg90K5hW+ZAkd5J/WJNzpAcmr93ts/of3MbvGHSujId/efCTzJEcP6JInnBb8Vrj7TlgKbzUlnqpq1+NjYPSXN3maKa9pKeo2JWxZlGBMoy6QWUUY5GbYEylw9smwh1LJcHZjlaZNMuOl4gNKtaSr38IXQkAXaRUJDPAmPras00YObKzXU8RkTrP4EoP/jx5LPR7f]",
|
|
||||||
"SOLANA_INSTALL_UPDATE_MANIFEST_KEYPAIR_x86_64_pc_windows_msvc": "EJ[1:yGpTmjdbyjW2kjgIHkFoJv7Ue7EbUvUbqHyw6anGgWg=:7t+56twjW+jR7fpFNNeRFLPd7E4lbmyN:JuviDpkQrfVcNUGRGsa2e/UhvH6tTYyk1s4cHHE5xZH1NByL7Kpqx36VG/+o1AUGEeSQdsBnKgzYdMoFYbO8o50DoRPc86QIEVXCupD6J9avxLFtQgOWgJp+/mCdUVXlqXiFs/vQgS/L4psrcKdF6WHd77BeUr6ll8DjH+9m5FC9Rcai2pXno6VbPpunHQ0oUdYzhFR64+LiRacBaefQ9igZ+nSEWDLqbaZSyfm9viWkijoVFTq8gAgdXXEh7g0QdxVE5T6bPristJhT6jWBhWunPUCDNFFErWIsbRGctepl4pbCWqh2hNTw9btSgVfeY6uGCOsdy9E=]"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
CI_BUILD_START=$(date +%s)
|
CI_BUILD_START=$(date +%s)
|
||||||
export CI_BUILD_START
|
export CI_BUILD_START
|
||||||
|
|
||||||
source ci/env.sh
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Kill any running docker containers, which are potentially left over from the
|
# Kill any running docker containers, which are potentially left over from the
|
||||||
# previous CI job
|
# previous CI job
|
||||||
@ -33,10 +31,3 @@ source ci/env.sh
|
|||||||
kill -9 "$victim" || true
|
kill -9 "$victim" || true
|
||||||
done
|
done
|
||||||
)
|
)
|
||||||
|
|
||||||
# HACK: These are in our docker images, need to be removed from CARGO_HOME
|
|
||||||
# because we try to cache downloads across builds with CARGO_HOME
|
|
||||||
# cargo lacks a facility for "system" tooling, always tries CARGO_HOME first
|
|
||||||
cargo uninstall cargo-audit || true
|
|
||||||
cargo uninstall svgbob_cli || true
|
|
||||||
cargo uninstall mdbook || true
|
|
||||||
|
@ -10,8 +10,6 @@
|
|||||||
set -x
|
set -x
|
||||||
rsync -a --delete --link-dest="$PWD" target "$d"
|
rsync -a --delete --link-dest="$PWD" target "$d"
|
||||||
du -hs "$d"
|
du -hs "$d"
|
||||||
read -r cacheSizeInGB _ < <(du -s --block-size=1800000000 "$d")
|
|
||||||
echo "--- ${cacheSizeInGB}GB: $d"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -14,18 +14,14 @@ export PS4="++"
|
|||||||
(
|
(
|
||||||
set -x
|
set -x
|
||||||
d=$HOME/cargo-target-cache/"$BUILDKITE_LABEL"
|
d=$HOME/cargo-target-cache/"$BUILDKITE_LABEL"
|
||||||
MAX_CACHE_SIZE=18 # gigabytes
|
|
||||||
|
|
||||||
if [[ -d $d ]]; then
|
if [[ -d $d ]]; then
|
||||||
du -hs "$d"
|
du -hs "$d"
|
||||||
read -r cacheSizeInGB _ < <(du -s --block-size=1800000000 "$d")
|
read -r cacheSizeInGB _ < <(du -s --block-size=1000000000 "$d")
|
||||||
echo "--- ${cacheSizeInGB}GB: $d"
|
if [[ $cacheSizeInGB -gt 10 ]]; then
|
||||||
if [[ $cacheSizeInGB -gt $MAX_CACHE_SIZE ]]; then
|
echo "$d has gotten too large, removing it"
|
||||||
echo "--- $d is too large, removing it"
|
|
||||||
rm -rf "$d"
|
rm -rf "$d"
|
||||||
fi
|
fi
|
||||||
else
|
|
||||||
echo "--- $d not present"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
mkdir -p "$d"/target
|
mkdir -p "$d"/target
|
||||||
|
@ -10,22 +10,11 @@
|
|||||||
set -e
|
set -e
|
||||||
cd "$(dirname "$0")"/..
|
cd "$(dirname "$0")"/..
|
||||||
|
|
||||||
if [[ -n $BUILDKITE_TAG ]]; then
|
buildkite-agent pipeline upload ci/buildkite.yml
|
||||||
buildkite-agent annotate --style info --context release-tag \
|
|
||||||
"https://github.com/solana-labs/solana/releases/$BUILDKITE_TAG"
|
|
||||||
buildkite-agent pipeline upload ci/buildkite-release.yml
|
|
||||||
else
|
|
||||||
if [[ $BUILDKITE_BRANCH =~ ^pull ]]; then
|
|
||||||
# Add helpful link back to the corresponding Github Pull Request
|
|
||||||
buildkite-agent annotate --style info --context pr-backlink \
|
|
||||||
"Github Pull Request: https://github.com/solana-labs/solana/$BUILDKITE_BRANCH"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $BUILDKITE_MESSAGE =~ GitBook: ]]; then
|
if [[ $BUILDKITE_BRANCH =~ ^pull ]]; then
|
||||||
buildkite-agent annotate --style info --context gitbook-ci-skip \
|
# Add helpful link back to the corresponding Github Pull Request
|
||||||
"GitBook commit detected, CI skipped"
|
buildkite-agent annotate --style info --context pr-backlink \
|
||||||
exit
|
"Github Pull Request: https://github.com/solana-labs/solana/$BUILDKITE_BRANCH"
|
||||||
fi
|
|
||||||
|
|
||||||
buildkite-agent pipeline upload ci/buildkite.yml
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
root: ./book/src
|
|
||||||
|
|
||||||
structure:
|
|
||||||
readme: introduction.md
|
|
||||||
summary: SUMMARY.md
|
|
24
.github/stale.yml
vendored
@ -1,24 +0,0 @@
|
|||||||
only: pulls
|
|
||||||
|
|
||||||
# Number of days of inactivity before a pull request becomes stale
|
|
||||||
daysUntilStale: 30
|
|
||||||
|
|
||||||
# Number of days of inactivity before a stale pull request is closed
|
|
||||||
daysUntilClose: 7
|
|
||||||
|
|
||||||
# Issues with these labels will never be considered stale
|
|
||||||
exemptLabels:
|
|
||||||
- security
|
|
||||||
|
|
||||||
# Label to use when marking a pull request as stale
|
|
||||||
staleLabel: stale
|
|
||||||
|
|
||||||
# Comment to post when marking a pull request as stale. Set to `false` to disable
|
|
||||||
markComment: >
|
|
||||||
This pull request has been automatically marked as stale because it has not had
|
|
||||||
recent activity. It will be closed if no further activity occurs.
|
|
||||||
|
|
||||||
# Comment to post when closing a stale pull request. Set to `false` to disable
|
|
||||||
closeComment: >
|
|
||||||
This stale pull request has been automatically closed.
|
|
||||||
Thank you for your contributions.
|
|
18
.gitignore
vendored
@ -1,23 +1,23 @@
|
|||||||
/book/html/
|
|
||||||
/book/src/tests.ok
|
|
||||||
/farf/
|
|
||||||
/solana-release/
|
|
||||||
/solana-release.tar.bz2
|
|
||||||
/solana-metrics/
|
|
||||||
/solana-metrics.tar.bz2
|
|
||||||
/target/
|
/target/
|
||||||
|
/ledger-tool/target/
|
||||||
|
/wallet/target/
|
||||||
|
/core/target/
|
||||||
|
/book/html/
|
||||||
|
/book/src/img/
|
||||||
|
/book/src/tests.ok
|
||||||
|
|
||||||
**/*.rs.bk
|
**/*.rs.bk
|
||||||
.cargo
|
.cargo
|
||||||
|
|
||||||
|
# node config that is rsynced
|
||||||
/config/
|
/config/
|
||||||
|
# node config that remains local
|
||||||
|
/config-local/
|
||||||
|
|
||||||
# log files
|
# log files
|
||||||
*.log
|
*.log
|
||||||
log-*.txt
|
log-*.txt
|
||||||
log-*/
|
|
||||||
|
|
||||||
# intellij files
|
# intellij files
|
||||||
/.idea/
|
/.idea/
|
||||||
/solana.iml
|
/solana.iml
|
||||||
/.vscode/
|
|
||||||
|
45
.mergify.yml
@ -1,45 +0,0 @@
|
|||||||
# Validate your changes with:
|
|
||||||
#
|
|
||||||
# $ curl -F 'data=@.mergify.yml' https://gh.mergify.io/validate
|
|
||||||
#
|
|
||||||
# https://doc.mergify.io/
|
|
||||||
pull_request_rules:
|
|
||||||
- name: remove outdated reviews
|
|
||||||
conditions:
|
|
||||||
- base=master
|
|
||||||
actions:
|
|
||||||
dismiss_reviews:
|
|
||||||
changes_requested: true
|
|
||||||
- name: set automerge label on mergify backport PRs
|
|
||||||
conditions:
|
|
||||||
- author=mergify[bot]
|
|
||||||
- head~=^mergify/bp/
|
|
||||||
- "#status-failure=0"
|
|
||||||
actions:
|
|
||||||
label:
|
|
||||||
add:
|
|
||||||
- automerge
|
|
||||||
- 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
|
|
||||||
- name: v0.23 backport
|
|
||||||
conditions:
|
|
||||||
- base=master
|
|
||||||
- label=v0.23
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- v0.23
|
|
42
.travis.yml
@ -1,42 +0,0 @@
|
|||||||
os:
|
|
||||||
- osx
|
|
||||||
|
|
||||||
language: rust
|
|
||||||
rust:
|
|
||||||
- stable
|
|
||||||
|
|
||||||
install:
|
|
||||||
- source ci/rust-version.sh
|
|
||||||
|
|
||||||
script:
|
|
||||||
- source ci/env.sh
|
|
||||||
- ci/publish-tarball.sh
|
|
||||||
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
- /^v\d+\.\d+/
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
slack:
|
|
||||||
on_success: change
|
|
||||||
secure: F4IjOE05MyaMOdPRL+r8qhs7jBvv4yDM3RmFKE1zNXnfUOqV4X38oQM1EI+YVsgpMQLj/pxnEB7wcTE4Bf86N6moLssEULCpvAuMVoXj4QbWdomLX+01WbFa6fLVeNQIg45NHrz2XzVBhoKOrMNnl+QI5mbR2AlS5oqsudHsXDnyLzZtd4Y5SDMdYG1zVWM01+oNNjgNfjcCGmOE/K0CnOMl6GPi3X9C34tJ19P2XT7MTDsz1/IfEF7fro2Q8DHEYL9dchJMoisXSkem5z7IDQkGzXsWdWT4NnndUvmd1MlTCE9qgoXDqRf95Qh8sB1Dz08HtvgfaosP2XjtNTfDI9BBYS15Ibw9y7PchAJE1luteNjF35EOy6OgmCLw/YpnweqfuNViBZz+yOPWXVC0kxnPIXKZ1wyH9ibeH6E4hr7a8o9SV/6SiWIlbYF+IR9jPXyTCLP/cc3sYljPWxDnhWFwFdRVIi3PbVAhVu7uWtVUO17Oc9gtGPgs/GrhOMkJfwQPXaudRJDpVZowxTX4x9kefNotlMAMRgq+Drbmgt4eEBiCNp0ITWgh17BiE1U09WS3myuduhoct85+FoVeaUkp1sxzHVtGsNQH0hcz7WcpZyOM+AwistJA/qzeEDQao5zi1eKWPbO2xAhi2rV1bDH6bPf/4lDBwLRqSiwvlWU=
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
- provider: s3
|
|
||||||
access_key_id: $AWS_ACCESS_KEY_ID
|
|
||||||
secret_access_key: $AWS_SECRET_ACCESS_KEY
|
|
||||||
bucket: release.solana.com
|
|
||||||
region: us-west-1
|
|
||||||
skip_cleanup: true
|
|
||||||
acl: public_read
|
|
||||||
local_dir: travis-s3-upload
|
|
||||||
on:
|
|
||||||
all_branches: true
|
|
||||||
- provider: releases
|
|
||||||
api_key: $GITHUB_TOKEN
|
|
||||||
skip_cleanup: true
|
|
||||||
file_glob: true
|
|
||||||
file: travis-release-upload/*
|
|
||||||
on:
|
|
||||||
tags: true
|
|
@ -103,7 +103,7 @@ Solana's architecture is described by a book generated from markdown files in
|
|||||||
the `book/src/` directory, maintained by an *editor* (currently @garious). To
|
the `book/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 at least propose a change the content
|
||||||
under the [Accepted Design
|
under the [Accepted Design
|
||||||
Proposals](https://docs.solana.com/book/v/master/proposals) chapter.
|
Proposals](https://solana-labs.github.io/book-edge/proposals.html) chapter.
|
||||||
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
|
||||||
|
5118
Cargo.lock
generated
72
Cargo.toml
@ -1,60 +1,40 @@
|
|||||||
[workspace]
|
[workspace]
|
||||||
members = [
|
members = [
|
||||||
"bench-exchange",
|
".",
|
||||||
"bench-streamer",
|
"bench-streamer",
|
||||||
"bench-tps",
|
"bench-tps",
|
||||||
"banking-bench",
|
|
||||||
"chacha-sys",
|
|
||||||
"client",
|
|
||||||
"core",
|
|
||||||
"drone",
|
"drone",
|
||||||
"perf",
|
"fullnode",
|
||||||
"validator",
|
|
||||||
"genesis",
|
"genesis",
|
||||||
"genesis-programs",
|
|
||||||
"gossip",
|
"gossip",
|
||||||
"install",
|
"install",
|
||||||
"keygen",
|
"keygen",
|
||||||
"ledger",
|
"kvstore",
|
||||||
"ledger-tool",
|
"ledger-tool",
|
||||||
"local-cluster",
|
|
||||||
"logger",
|
"logger",
|
||||||
"log-analyzer",
|
|
||||||
"merkle-tree",
|
|
||||||
"measure",
|
|
||||||
"metrics",
|
"metrics",
|
||||||
"net-shaper",
|
|
||||||
"programs/bpf_loader",
|
|
||||||
"programs/budget",
|
|
||||||
"programs/btc_spv",
|
|
||||||
"programs/btc_spv_bin",
|
|
||||||
"programs/config",
|
|
||||||
"programs/config_tests",
|
|
||||||
"programs/exchange",
|
|
||||||
"programs/failure",
|
|
||||||
"programs/noop",
|
|
||||||
"programs/ownable_api",
|
|
||||||
"programs/stake",
|
|
||||||
"programs/stake_tests",
|
|
||||||
"programs/storage",
|
|
||||||
"programs/storage_tests",
|
|
||||||
"programs/vest",
|
|
||||||
"programs/vote",
|
|
||||||
"archiver",
|
|
||||||
"runtime",
|
|
||||||
"sdk",
|
|
||||||
"sdk-c",
|
|
||||||
"scripts",
|
|
||||||
"upload-perf",
|
|
||||||
"net-utils",
|
|
||||||
"fixed-buf",
|
|
||||||
"vote-signer",
|
|
||||||
"cli",
|
|
||||||
"rayon-threadlimit",
|
|
||||||
]
|
|
||||||
|
|
||||||
exclude = [
|
|
||||||
"programs/bpf",
|
"programs/bpf",
|
||||||
"programs/move_loader",
|
"programs/bpf_loader",
|
||||||
"programs/librapay_api",
|
"programs/budget_api",
|
||||||
|
"programs/budget_program",
|
||||||
|
"programs/config_api",
|
||||||
|
"programs/config_program",
|
||||||
|
"programs/exchange_api",
|
||||||
|
"programs/exchange_program",
|
||||||
|
"programs/token_api",
|
||||||
|
"programs/token_program",
|
||||||
|
"programs/failure_program",
|
||||||
|
"programs/noop_program",
|
||||||
|
"programs/stake_api",
|
||||||
|
"programs/stake_program",
|
||||||
|
"programs/storage_api",
|
||||||
|
"programs/storage_program",
|
||||||
|
"programs/vote_api",
|
||||||
|
"programs/vote_program",
|
||||||
|
"replicator",
|
||||||
|
"sdk",
|
||||||
|
"upload-perf",
|
||||||
|
"vote-signer",
|
||||||
|
"wallet",
|
||||||
]
|
]
|
||||||
|
exclude = ["programs/bpf/rust/noop"]
|
||||||
|
59
README.md
@ -1,5 +1,5 @@
|
|||||||
[](https://crates.io/crates/solana-core)
|
[](https://crates.io/crates/solana)
|
||||||
[](https://docs.rs/solana-core)
|
[](https://docs.rs/solana)
|
||||||
[](https://buildkite.com/solana-labs/solana/builds?branch=master)
|
[](https://buildkite.com/solana-labs/solana/builds?branch=master)
|
||||||
[](https://codecov.io/gh/solana-labs/solana)
|
[](https://codecov.io/gh/solana-labs/solana)
|
||||||
|
|
||||||
@ -26,43 +26,9 @@ Furthermore, and much to our surprise, it can be implemented using a mechanism t
|
|||||||
Architecture
|
Architecture
|
||||||
===
|
===
|
||||||
|
|
||||||
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 online book [Solana: Blockchain Rebuilt for Scale](https://solana-labs.github.io/book/).
|
||||||
|
|
||||||
(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 online book is also [available here](https://solana-labs.github.io/book-edge/).)
|
||||||
|
|
||||||
Release Binaries
|
|
||||||
===
|
|
||||||
Official release binaries are available at [Github Releases](https://github.com/solana-labs/solana/releases).
|
|
||||||
|
|
||||||
Additionally we provide pre-release binaries for the latest code on the edge and
|
|
||||||
beta channels. Note that these pre-release binaries may be less stable than an
|
|
||||||
official release.
|
|
||||||
|
|
||||||
### Edge channel
|
|
||||||
#### Linux (x86_64-unknown-linux-gnu)
|
|
||||||
* [solana.tar.bz2](http://release.solana.com/edge/solana-release-x86_64-unknown-linux-gnu.tar.bz2)
|
|
||||||
* [solana-install-init](http://release.solana.com/edge/solana-install-init-x86_64-unknown-linux-gnu) as a stand-alone executable
|
|
||||||
#### mac OS (x86_64-apple-darwin)
|
|
||||||
* [solana.tar.bz2](http://release.solana.com/edge/solana-release-x86_64-apple-darwin.tar.bz2)
|
|
||||||
* [solana-install-init](http://release.solana.com/edge/solana-install-init-x86_64-apple-darwin) as a stand-alone executable
|
|
||||||
#### Windows (x86_64-pc-windows-msvc)
|
|
||||||
* [solana.tar.bz2](http://release.solana.com/edge/solana-release-x86_64-pc-windows-msvc.tar.bz2)
|
|
||||||
* [solana-install-init.exe](http://release.solana.com/edge/solana-install-init-x86_64-pc-windows-msvc.exe) as a stand-alone executable
|
|
||||||
#### All platforms
|
|
||||||
* [solana-metrics.tar.bz2](http://release.solana.com.s3.amazonaws.com/edge/solana-metrics.tar.bz2)
|
|
||||||
|
|
||||||
### Beta channel
|
|
||||||
#### Linux (x86_64-unknown-linux-gnu)
|
|
||||||
* [solana.tar.bz2](http://release.solana.com/beta/solana-release-x86_64-unknown-linux-gnu.tar.bz2)
|
|
||||||
* [solana-install-init](http://release.solana.com/beta/solana-install-init-x86_64-unknown-linux-gnu) as a stand-alone executable
|
|
||||||
#### mac OS (x86_64-apple-darwin)
|
|
||||||
* [solana.tar.bz2](http://release.solana.com/beta/solana-release-x86_64-apple-darwin.tar.bz2)
|
|
||||||
* [solana-install-init](http://release.solana.com/beta/solana-install-init-x86_64-apple-darwin) as a stand-alone executable
|
|
||||||
#### Windows (x86_64-pc-windows-msvc)
|
|
||||||
* [solana.tar.bz2](http://release.solana.com/beta/solana-release-x86_64-pc-windows-msvc.tar.bz2)
|
|
||||||
* [solana-install-init.exe](http://release.solana.com/beta/solana-install-init-x86_64-pc-windows-msvc.exe) as a stand-alone executable
|
|
||||||
#### All platforms
|
|
||||||
* [solana-metrics.tar.bz2](http://release.solana.com.s3.amazonaws.com/beta/solana-metrics.tar.bz2)
|
|
||||||
|
|
||||||
Developing
|
Developing
|
||||||
===
|
===
|
||||||
@ -75,10 +41,10 @@ Install rustc, cargo and rustfmt:
|
|||||||
```bash
|
```bash
|
||||||
$ curl https://sh.rustup.rs -sSf | sh
|
$ curl https://sh.rustup.rs -sSf | sh
|
||||||
$ source $HOME/.cargo/env
|
$ source $HOME/.cargo/env
|
||||||
$ rustup component add rustfmt
|
$ rustup component add rustfmt-preview
|
||||||
```
|
```
|
||||||
|
|
||||||
If your rustc version is lower than 1.39.0, please update it:
|
If your rustc version is lower than 1.34.0, please update it:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ rustup update
|
$ rustup update
|
||||||
@ -100,7 +66,7 @@ $ cd solana
|
|||||||
Build
|
Build
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ cargo build
|
$ cargo build --all
|
||||||
```
|
```
|
||||||
|
|
||||||
Then to run a minimal local cluster
|
Then to run a minimal local cluster
|
||||||
@ -114,22 +80,25 @@ Testing
|
|||||||
Run the test suite:
|
Run the test suite:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ cargo test
|
$ cargo test --all
|
||||||
```
|
```
|
||||||
|
|
||||||
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 book [Solana: Blockchain Rebuild for Scale: Getting Started](https://solana-labs.github.io/book/getting-started.html).
|
||||||
|
|
||||||
Remote Testnets
|
Remote Testnets
|
||||||
---
|
---
|
||||||
|
|
||||||
We maintain several testnets:
|
We maintain several testnets:
|
||||||
|
|
||||||
* `testnet` - public stable testnet accessible via testnet.solana.com. Runs 24/7
|
* `testnet` - public stable testnet accessible via testnet.solana.com, with an https proxy for web apps at api.testnet.solana.com. Runs 24/7
|
||||||
* `testnet-beta` - public beta channel testnet accessible via beta.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
|
* `testnet-edge` - public edge channel testnet accessible via edge.testnet.solana.com. Runs 24/7
|
||||||
|
* `testnet-perf` - permissioned stable testnet running a 24/7 soak test
|
||||||
|
* `testnet-beta-perf` - permissioned beta channel testnet running a multi-hour soak test weekday mornings
|
||||||
|
* `testnet-edge-perf` - permissioned edge channel testnet running a multi-hour soak test weekday mornings
|
||||||
|
|
||||||
## Deploy process
|
## Deploy process
|
||||||
|
|
||||||
@ -240,3 +209,5 @@ problem is solved by this code?" On the other hand, if a test does fail and you
|
|||||||
better way to solve the same problem, a Pull Request with your solution would most certainly be
|
better way to solve the same problem, a Pull Request with your solution would most certainly be
|
||||||
welcome! Likewise, if rewriting a test can better communicate what code it's protecting, please
|
welcome! Likewise, if rewriting a test can better communicate what code it's protecting, please
|
||||||
send us that patch!
|
send us that patch!
|
||||||
|
|
||||||
|
|
||||||
|
171
RELEASE.md
@ -59,146 +59,53 @@ There are three release channels that map to branches as follows:
|
|||||||
* beta - tracks the largest (and latest) `vX.Y` stabilization branch, more stable.
|
* beta - tracks the largest (and latest) `vX.Y` stabilization branch, more stable.
|
||||||
* stable - tracks the second largest `vX.Y` stabilization branch, most stable.
|
* stable - tracks the second largest `vX.Y` stabilization branch, most stable.
|
||||||
|
|
||||||
## Steps to Create a Branch
|
## Release Steps
|
||||||
|
|
||||||
### Create the new branch
|
### Changing channels
|
||||||
1. Check out the latest commit on `master` branch:
|
|
||||||
```
|
#### Create the new branch
|
||||||
git fetch --all
|
1. Pick your branch point for release on master.
|
||||||
git checkout upstream/master
|
1. Create the branch. The name should be "v" + the first 2 "version" fields
|
||||||
```
|
|
||||||
1. Determine the new branch name. The name should be "v" + the first 2 version fields
|
|
||||||
from Cargo.toml. For example, a Cargo.toml with version = "0.9.0" implies
|
from Cargo.toml. For example, a Cargo.toml with version = "0.9.0" implies
|
||||||
the next branch name is "v0.9".
|
the next branch name is "v0.9".
|
||||||
1. Create the new branch and push this branch to the `solana` repository:
|
1. Note the Cargo.toml in the repo root directory does not contain a version. Look at any other Cargo.toml file.
|
||||||
```
|
1. Create a new branch and push this branch to the solana repository.
|
||||||
git checkout -b <branchname>
|
1. `git checkout -b <branchname>`
|
||||||
git push -u origin <branchname>
|
1. `git push -u origin <branchname>`
|
||||||
```
|
|
||||||
|
|
||||||
### Update master branch with the next version
|
#### Update master with the next version
|
||||||
|
|
||||||
1. After the new branch has been created and pushed, update the Cargo.toml files on **master** to the next semantic version (e.g. 0.9.0 -> 0.10.0) with:
|
1. After the new branch has been created and pushed, update Cargo.toml on **master** to the next semantic version (e.g. 0.9.0 -> 0.10.0)
|
||||||
```
|
by running `./scripts/increment-cargo-version.sh`, then rebuild with
|
||||||
scripts/increment-cargo-version.sh minor
|
`cargo build` to cause a refresh of `Cargo.lock`.
|
||||||
```
|
1. Push your Cargo.toml change and the autogenerated Cargo.lock changes to the
|
||||||
1. Rebuild to get an updated version of `Cargo.lock`:
|
master branch
|
||||||
```
|
|
||||||
cargo build
|
|
||||||
```
|
|
||||||
1. Push all the changed Cargo.toml and Cargo.lock files to the `master` branch with something like:
|
|
||||||
```
|
|
||||||
git co -b version_update
|
|
||||||
git ls-files -m | xargs git add
|
|
||||||
git commit -m 'Update Cargo.toml versions from X.Y to X.Y+1'
|
|
||||||
git push -u origin version_update
|
|
||||||
```
|
|
||||||
1. Confirm that your freshly cut release branch is shown as `BETA_CHANNEL` and the previous release branch as `STABLE_CHANNEL`:
|
|
||||||
```
|
|
||||||
ci/channel_info.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
## Steps to Create a Release
|
At this point, `ci/channel-info.sh` should show your freshly cut release branch as
|
||||||
|
"BETA_CHANNEL" and the previous release branch as "STABLE_CHANNEL".
|
||||||
|
|
||||||
### Create the Release Tag on GitHub
|
### Updating channels (i.e. "making a release")
|
||||||
|
|
||||||
1. Go to [GitHub's Releases UI](https://github.com/solana-labs/solana/releases) for tagging a release.
|
We use [github's Releases UI](https://github.com/solana-labs/solana/releases) for tagging a release.
|
||||||
|
|
||||||
|
1. Go [there ;)](https://github.com/solana-labs/solana/releases).
|
||||||
1. Click "Draft new release". The release tag must exactly match the `version`
|
1. Click "Draft new release". The release tag must exactly match the `version`
|
||||||
field in `/Cargo.toml` prefixed by `v`.
|
field in `/Cargo.toml` prefixed by `v` (ie, `<branchname>.X`).
|
||||||
1. If the Cargo.toml verion field is **0.12.3**, then the release tag must be **v0.12.3**
|
1. If the Cargo.toml verion field is **0.12.3**, then the release tag must be **v0.12.3**
|
||||||
1. Make sure the Target Branch field matches the branch you want to make a release on.
|
|
||||||
1. If you want to release v0.12.0, the target branch must be v0.12
|
|
||||||
1. If this is the first release on the branch (e.g. v0.13.**0**), paste in [this
|
1. If this is the first release on the branch (e.g. v0.13.**0**), paste in [this
|
||||||
template](https://raw.githubusercontent.com/solana-labs/solana/master/.github/RELEASE_TEMPLATE.md). Engineering Lead can provide summary contents for release notes if needed.
|
template](https://raw.githubusercontent.com/solana-labs/solana/master/.github/RELEASE_TEMPLATE.md)
|
||||||
1. Click "Save Draft", then confirm the release notes look good and the tag name and branch are correct. Go back into edit the release and click "Publish release" when ready.
|
and fill it in.
|
||||||
|
1. Test the release by generating a tag using semver's rules. First try at a
|
||||||
### Update release branch with the next patch version
|
release should be `<branchname>.X-rc.0`.
|
||||||
|
1. Verify release automation:
|
||||||
1. After the new release has been tagged, update the Cargo.toml files on **release branch** to the next semantic version (e.g. 0.9.0 -> 0.9.1) with:
|
1. [Crates.io](https://crates.io/crates/solana) should have an updated Solana version.
|
||||||
```
|
1. ...
|
||||||
scripts/increment-cargo-version.sh patch
|
1. After testnet deployment, verify that testnets are running correct software.
|
||||||
```
|
http://metrics.solana.com should show testnet running on a hash from your
|
||||||
1. Rebuild to get an updated version of `Cargo.lock`:
|
newly created branch.
|
||||||
```
|
1. Once the release has been made, update Cargo.toml on the release branch to the next
|
||||||
cargo build
|
semantic version (e.g. 0.9.0 -> 0.9.1) by running
|
||||||
```
|
`./scripts/increment-cargo-version.sh patch`, then rebuild with `cargo
|
||||||
1. Push all the changed Cargo.toml and Cargo.lock files to the **release branch** with something like:
|
build` to cause a refresh of `Cargo.lock`.
|
||||||
```
|
1. Push your Cargo.toml change and the autogenerated Cargo.lock changes to the
|
||||||
git co -b version_update
|
release branch.
|
||||||
git ls-files -m | xargs git add
|
|
||||||
git commit -m 'Update Cargo.toml versions from X.Y.Z to X.Y.Z+1'
|
|
||||||
git push -u origin version_update
|
|
||||||
```
|
|
||||||
|
|
||||||
### Verify release automation success
|
|
||||||
1. Go to [Solana Releases](https://github.com/solana-labs/solana/releases) and click on the latest release that you just published. Verify that all of the build artifacts are present. This can take up to 90 minutes after creating the tag.
|
|
||||||
1. The `solana-secondary` Buildkite pipeline handles creating the binary tarballs and updated crates. Look for a job under the tag name of the release: https://buildkite.com/solana-labs/solana-secondary
|
|
||||||
1. [Crates.io](https://crates.io/crates/solana) should have an updated Solana version.
|
|
||||||
|
|
||||||
### Update documentation
|
|
||||||
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.
|
|
||||||
|
|
||||||
#### Publish updated Book
|
|
||||||
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:
|
|
||||||
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.
|
|
||||||
This tag needs to be updated and the testnet restarted after a new release
|
|
||||||
tag is created.
|
|
||||||
|
|
||||||
#### Update testnet schedules
|
|
||||||
|
|
||||||
Go to https://buildkite.com/solana-labs and click through: Pipelines ->
|
|
||||||
testnet-management -> Pipeline Settings -> Schedules
|
|
||||||
Or just click here:
|
|
||||||
https://buildkite.com/solana-labs/testnet-management/settings/schedules
|
|
||||||
|
|
||||||
There are two scheduled jobs for testnet: a daily restart and an hourly sanity-or-restart. \
|
|
||||||
https://buildkite.com/solana-labs/testnet-management/settings/schedules/0efd7856-7143-4713-8817-47e6bdb05387
|
|
||||||
https://buildkite.com/solana-labs/testnet-management/settings/schedules/2a926646-d972-42b5-aeb9-bb6759592a53
|
|
||||||
|
|
||||||
On each schedule:
|
|
||||||
1. Set TESTNET_TAG environment variable to the desired release tag.
|
|
||||||
1. Example, TESTNET_TAG=v0.13.2
|
|
||||||
1. Set the Build Branch to the branch that TESTNET_TAG is from.
|
|
||||||
1. Example: v0.13
|
|
||||||
|
|
||||||
#### Restart the testnet
|
|
||||||
|
|
||||||
Trigger a TESTNET_OP=create-and-start to refresh the cluster with the new version
|
|
||||||
|
|
||||||
1. Go to https://buildkite.com/solana-labs/testnet-management
|
|
||||||
2. Click "New Build" and use the following settings, then click "Create Build"
|
|
||||||
1. Commit: HEAD
|
|
||||||
1. Branch: [channel branch as set in the schedules]
|
|
||||||
1. Environment Variables:
|
|
||||||
```
|
|
||||||
TESTNET=testnet
|
|
||||||
TESTNET_TAG=[same value as used in TESTNET_TAG in the schedules]
|
|
||||||
TESTNET_OP=create-and-start
|
|
||||||
```
|
|
||||||
|
|
||||||
### Alert the community
|
|
||||||
|
|
||||||
Notify Discord users on #validator-support that a new release for
|
|
||||||
testnet.solana.com is available
|
|
||||||
|
2
archiver/.gitignore
vendored
@ -1,2 +0,0 @@
|
|||||||
/target/
|
|
||||||
/farf/
|
|
@ -1,19 +0,0 @@
|
|||||||
[package]
|
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|
||||||
edition = "2018"
|
|
||||||
name = "solana-archiver"
|
|
||||||
version = "0.21.2"
|
|
||||||
repository = "https://github.com/solana-labs/solana"
|
|
||||||
license = "Apache-2.0"
|
|
||||||
homepage = "https://solana.com/"
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
clap = "2.33.0"
|
|
||||||
console = "0.9.1"
|
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "0.21.2" }
|
|
||||||
solana-core = { path = "../core", version = "0.21.2" }
|
|
||||||
solana-logger = { path = "../logger", version = "0.21.2" }
|
|
||||||
solana-metrics = { path = "../metrics", version = "0.21.2" }
|
|
||||||
solana-net-utils = { path = "../net-utils", version = "0.21.2" }
|
|
||||||
solana-sdk = { path = "../sdk", version = "0.21.2" }
|
|
||||||
|
|
@ -1,147 +0,0 @@
|
|||||||
use clap::{crate_description, crate_name, App, Arg};
|
|
||||||
use console::style;
|
|
||||||
use solana_clap_utils::{
|
|
||||||
input_validators::is_keypair,
|
|
||||||
keypair::{
|
|
||||||
self, keypair_input, KeypairWithSource, ASK_SEED_PHRASE_ARG,
|
|
||||||
SKIP_SEED_PHRASE_VALIDATION_ARG,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
use solana_core::{
|
|
||||||
archiver::Archiver,
|
|
||||||
cluster_info::{Node, VALIDATOR_PORT_RANGE},
|
|
||||||
contact_info::ContactInfo,
|
|
||||||
};
|
|
||||||
use solana_sdk::{commitment_config::CommitmentConfig, signature::KeypairUtil};
|
|
||||||
use std::{net::SocketAddr, path::PathBuf, process::exit, sync::Arc};
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
solana_logger::setup();
|
|
||||||
|
|
||||||
let matches = App::new(crate_name!())
|
|
||||||
.about(crate_description!())
|
|
||||||
.version(solana_clap_utils::version!())
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("identity_keypair")
|
|
||||||
.short("i")
|
|
||||||
.long("identity-keypair")
|
|
||||||
.value_name("PATH")
|
|
||||||
.takes_value(true)
|
|
||||||
.validator(is_keypair)
|
|
||||||
.help("File containing an identity (keypair)"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("entrypoint")
|
|
||||||
.short("n")
|
|
||||||
.long("entrypoint")
|
|
||||||
.value_name("HOST:PORT")
|
|
||||||
.takes_value(true)
|
|
||||||
.required(true)
|
|
||||||
.validator(solana_net_utils::is_host_port)
|
|
||||||
.help("Rendezvous with the cluster at this entry point"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("ledger")
|
|
||||||
.short("l")
|
|
||||||
.long("ledger")
|
|
||||||
.value_name("DIR")
|
|
||||||
.takes_value(true)
|
|
||||||
.required(true)
|
|
||||||
.help("use DIR as persistent ledger location"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("storage_keypair")
|
|
||||||
.short("s")
|
|
||||||
.long("storage-keypair")
|
|
||||||
.value_name("PATH")
|
|
||||||
.takes_value(true)
|
|
||||||
.validator(is_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();
|
|
||||||
|
|
||||||
let ledger_path = PathBuf::from(matches.value_of("ledger").unwrap());
|
|
||||||
|
|
||||||
let identity_keypair = keypair_input(&matches, "identity_keypair")
|
|
||||||
.unwrap_or_else(|err| {
|
|
||||||
eprintln!("Identity keypair input failed: {}", err);
|
|
||||||
exit(1);
|
|
||||||
})
|
|
||||||
.keypair;
|
|
||||||
let KeypairWithSource {
|
|
||||||
keypair: storage_keypair,
|
|
||||||
source: storage_keypair_source,
|
|
||||||
} = keypair_input(&matches, "storage_keypair").unwrap_or_else(|err| {
|
|
||||||
eprintln!("Storage keypair input failed: {}", err);
|
|
||||||
exit(1);
|
|
||||||
});
|
|
||||||
if storage_keypair_source == keypair::Source::Generated {
|
|
||||||
clap::Error::with_description(
|
|
||||||
"The `storage-keypair` argument was not found",
|
|
||||||
clap::ErrorKind::ArgumentNotFound,
|
|
||||||
)
|
|
||||||
.exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
let entrypoint_addr = matches
|
|
||||||
.value_of("entrypoint")
|
|
||||||
.map(|entrypoint| {
|
|
||||||
solana_net_utils::parse_host_port(entrypoint)
|
|
||||||
.expect("failed to parse entrypoint address")
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let gossip_addr = {
|
|
||||||
let ip = solana_net_utils::get_public_ip_addr(&entrypoint_addr).unwrap();
|
|
||||||
let mut addr = SocketAddr::new(ip, 0);
|
|
||||||
addr.set_ip(solana_net_utils::get_public_ip_addr(&entrypoint_addr).unwrap());
|
|
||||||
addr
|
|
||||||
};
|
|
||||||
let node = Node::new_archiver_with_external_ip(
|
|
||||||
&identity_keypair.pubkey(),
|
|
||||||
&gossip_addr,
|
|
||||||
VALIDATOR_PORT_RANGE,
|
|
||||||
);
|
|
||||||
|
|
||||||
println!(
|
|
||||||
"{} version {} (branch={}, commit={})",
|
|
||||||
style(crate_name!()).bold(),
|
|
||||||
solana_clap_utils::version!(),
|
|
||||||
option_env!("CI_BRANCH").unwrap_or("unknown"),
|
|
||||||
option_env!("CI_COMMIT").unwrap_or("unknown")
|
|
||||||
);
|
|
||||||
solana_metrics::set_host_id(identity_keypair.pubkey().to_string());
|
|
||||||
println!(
|
|
||||||
"replicating the data with identity_keypair={:?} gossip_addr={:?}",
|
|
||||||
identity_keypair.pubkey(),
|
|
||||||
gossip_addr
|
|
||||||
);
|
|
||||||
|
|
||||||
let entrypoint_info = ContactInfo::new_gossip_entry_point(&entrypoint_addr);
|
|
||||||
let archiver = Archiver::new(
|
|
||||||
&ledger_path,
|
|
||||||
node,
|
|
||||||
entrypoint_info,
|
|
||||||
Arc::new(identity_keypair),
|
|
||||||
Arc::new(storage_keypair),
|
|
||||||
CommitmentConfig::recent(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
archiver.join();
|
|
||||||
}
|
|
2
banking-bench/.gitignore
vendored
@ -1,2 +0,0 @@
|
|||||||
/target/
|
|
||||||
/farf/
|
|
@ -1,20 +0,0 @@
|
|||||||
[package]
|
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|
||||||
edition = "2018"
|
|
||||||
name = "solana-banking-bench"
|
|
||||||
version = "0.21.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 = "0.21.2" }
|
|
||||||
solana-ledger = { path = "../ledger", version = "0.21.2" }
|
|
||||||
solana-logger = { path = "../logger", version = "0.21.2" }
|
|
||||||
solana-runtime = { path = "../runtime", version = "0.21.2" }
|
|
||||||
solana-measure = { path = "../measure", version = "0.21.2" }
|
|
||||||
solana-sdk = { path = "../sdk", version = "0.21.2" }
|
|
||||||
rand = "0.6.5"
|
|
||||||
crossbeam-channel = "0.3"
|
|
@ -1,305 +0,0 @@
|
|||||||
use crossbeam_channel::unbounded;
|
|
||||||
use log::*;
|
|
||||||
use rand::{thread_rng, Rng};
|
|
||||||
use rayon::prelude::*;
|
|
||||||
use solana_core::banking_stage::{create_test_recorder, BankingStage};
|
|
||||||
use solana_core::cluster_info::ClusterInfo;
|
|
||||||
use solana_core::cluster_info::Node;
|
|
||||||
use solana_core::genesis_utils::{create_genesis_config, GenesisConfigInfo};
|
|
||||||
use solana_core::packet::to_packets_chunked;
|
|
||||||
use solana_core::poh_recorder::PohRecorder;
|
|
||||||
use solana_core::poh_recorder::WorkingBankEntry;
|
|
||||||
use solana_ledger::bank_forks::BankForks;
|
|
||||||
use solana_ledger::{blocktree::Blocktree, get_tmp_ledger_path};
|
|
||||||
use solana_measure::measure::Measure;
|
|
||||||
use solana_runtime::bank::Bank;
|
|
||||||
use solana_sdk::hash::Hash;
|
|
||||||
use solana_sdk::pubkey::Pubkey;
|
|
||||||
use solana_sdk::signature::Keypair;
|
|
||||||
use solana_sdk::signature::Signature;
|
|
||||||
use solana_sdk::system_transaction;
|
|
||||||
use solana_sdk::timing::{duration_as_us, timestamp};
|
|
||||||
use solana_sdk::transaction::Transaction;
|
|
||||||
use std::sync::atomic::Ordering;
|
|
||||||
use std::sync::mpsc::Receiver;
|
|
||||||
use std::sync::{Arc, Mutex, RwLock};
|
|
||||||
use std::thread::sleep;
|
|
||||||
use std::time::{Duration, Instant};
|
|
||||||
|
|
||||||
fn check_txs(
|
|
||||||
receiver: &Arc<Receiver<WorkingBankEntry>>,
|
|
||||||
ref_tx_count: usize,
|
|
||||||
poh_recorder: &Arc<Mutex<PohRecorder>>,
|
|
||||||
) -> bool {
|
|
||||||
let mut total = 0;
|
|
||||||
let now = Instant::now();
|
|
||||||
let mut no_bank = false;
|
|
||||||
loop {
|
|
||||||
if let Ok((_bank, (entry, _tick_height))) = receiver.recv_timeout(Duration::from_millis(10))
|
|
||||||
{
|
|
||||||
total += entry.transactions.len();
|
|
||||||
}
|
|
||||||
if total >= ref_tx_count {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if now.elapsed().as_secs() > 60 {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if poh_recorder.lock().unwrap().bank().is_none() {
|
|
||||||
trace!("no bank");
|
|
||||||
no_bank = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !no_bank {
|
|
||||||
assert!(total >= ref_tx_count);
|
|
||||||
}
|
|
||||||
no_bank
|
|
||||||
}
|
|
||||||
|
|
||||||
fn make_accounts_txs(txes: usize, mint_keypair: &Keypair, hash: Hash) -> Vec<Transaction> {
|
|
||||||
let to_pubkey = Pubkey::new_rand();
|
|
||||||
let dummy = system_transaction::transfer(mint_keypair, &to_pubkey, 1, hash);
|
|
||||||
(0..txes)
|
|
||||||
.into_par_iter()
|
|
||||||
.map(|_| {
|
|
||||||
let mut new = dummy.clone();
|
|
||||||
let sig: Vec<u8> = (0..64).map(|_| thread_rng().gen()).collect();
|
|
||||||
new.message.account_keys[0] = Pubkey::new_rand();
|
|
||||||
new.message.account_keys[1] = Pubkey::new_rand();
|
|
||||||
new.signatures = vec![Signature::new(&sig[0..64])];
|
|
||||||
new
|
|
||||||
})
|
|
||||||
.collect()
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Config {
|
|
||||||
packets_per_batch: usize,
|
|
||||||
chunk_len: usize,
|
|
||||||
num_threads: usize,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Config {
|
|
||||||
fn get_transactions_index(&self, chunk_index: usize) -> usize {
|
|
||||||
chunk_index * (self.chunk_len / self.num_threads) * self.packets_per_batch
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bytes_as_usize(bytes: &[u8]) -> usize {
|
|
||||||
bytes[0] as usize | (bytes[1] as usize) << 8
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
solana_logger::setup();
|
|
||||||
let num_threads = BankingStage::num_threads() as usize;
|
|
||||||
// a multiple of packet chunk duplicates to avoid races
|
|
||||||
const CHUNKS: usize = 8 * 2;
|
|
||||||
const PACKETS_PER_BATCH: usize = 192;
|
|
||||||
let txes = PACKETS_PER_BATCH * num_threads * CHUNKS;
|
|
||||||
let mint_total = 1_000_000_000_000;
|
|
||||||
let GenesisConfigInfo {
|
|
||||||
genesis_config,
|
|
||||||
mint_keypair,
|
|
||||||
..
|
|
||||||
} = create_genesis_config(mint_total);
|
|
||||||
|
|
||||||
let (verified_sender, verified_receiver) = unbounded();
|
|
||||||
let (vote_sender, vote_receiver) = unbounded();
|
|
||||||
let bank0 = Bank::new(&genesis_config);
|
|
||||||
let mut bank_forks = BankForks::new(0, bank0);
|
|
||||||
let mut bank = bank_forks.working_bank();
|
|
||||||
|
|
||||||
info!("threads: {} txs: {}", num_threads, txes);
|
|
||||||
|
|
||||||
let mut transactions = make_accounts_txs(txes, &mint_keypair, genesis_config.hash());
|
|
||||||
|
|
||||||
// fund all the accounts
|
|
||||||
transactions.iter().for_each(|tx| {
|
|
||||||
let fund = system_transaction::transfer(
|
|
||||||
&mint_keypair,
|
|
||||||
&tx.message.account_keys[0],
|
|
||||||
mint_total / txes as u64,
|
|
||||||
genesis_config.hash(),
|
|
||||||
);
|
|
||||||
let x = bank.process_transaction(&fund);
|
|
||||||
x.unwrap();
|
|
||||||
});
|
|
||||||
//sanity check, make sure all the transactions can execute sequentially
|
|
||||||
transactions.iter().for_each(|tx| {
|
|
||||||
let res = bank.process_transaction(&tx);
|
|
||||||
assert!(res.is_ok(), "sanity test transactions");
|
|
||||||
});
|
|
||||||
bank.clear_signatures();
|
|
||||||
//sanity check, make sure all the transactions can execute in parallel
|
|
||||||
let res = bank.process_transactions(&transactions);
|
|
||||||
for r in res {
|
|
||||||
assert!(r.is_ok(), "sanity parallel execution");
|
|
||||||
}
|
|
||||||
bank.clear_signatures();
|
|
||||||
let mut verified: Vec<_> = to_packets_chunked(&transactions.clone(), PACKETS_PER_BATCH);
|
|
||||||
let ledger_path = get_tmp_ledger_path!();
|
|
||||||
{
|
|
||||||
let blocktree = Arc::new(
|
|
||||||
Blocktree::open(&ledger_path).expect("Expected to be able to open database ledger"),
|
|
||||||
);
|
|
||||||
let (exit, poh_recorder, poh_service, signal_receiver) =
|
|
||||||
create_test_recorder(&bank, &blocktree, None);
|
|
||||||
let cluster_info = ClusterInfo::new_with_invalid_keypair(Node::new_localhost().info);
|
|
||||||
let cluster_info = Arc::new(RwLock::new(cluster_info));
|
|
||||||
let banking_stage = BankingStage::new(
|
|
||||||
&cluster_info,
|
|
||||||
&poh_recorder,
|
|
||||||
verified_receiver,
|
|
||||||
vote_receiver,
|
|
||||||
None,
|
|
||||||
);
|
|
||||||
poh_recorder.lock().unwrap().set_bank(&bank);
|
|
||||||
|
|
||||||
let chunk_len = verified.len() / CHUNKS;
|
|
||||||
let mut start = 0;
|
|
||||||
|
|
||||||
// This is so that the signal_receiver does not go out of scope after the closure.
|
|
||||||
// If it is dropped before poh_service, then poh_service will error when
|
|
||||||
// calling send() on the channel.
|
|
||||||
let signal_receiver = Arc::new(signal_receiver);
|
|
||||||
let signal_receiver2 = signal_receiver.clone();
|
|
||||||
let mut total = 0;
|
|
||||||
let mut tx_total = 0;
|
|
||||||
let mut txs_processed = 0;
|
|
||||||
let mut root = 1;
|
|
||||||
let collector = Pubkey::new_rand();
|
|
||||||
const ITERS: usize = 1_000;
|
|
||||||
let config = Config {
|
|
||||||
packets_per_batch: PACKETS_PER_BATCH,
|
|
||||||
chunk_len,
|
|
||||||
num_threads,
|
|
||||||
};
|
|
||||||
for _ in 0..ITERS {
|
|
||||||
let now = Instant::now();
|
|
||||||
let mut sent = 0;
|
|
||||||
|
|
||||||
for (i, v) in verified[start..start + chunk_len]
|
|
||||||
.chunks(chunk_len / num_threads)
|
|
||||||
.enumerate()
|
|
||||||
{
|
|
||||||
let mut byte = 0;
|
|
||||||
let index = config.get_transactions_index(start + i);
|
|
||||||
if index < transactions.len() {
|
|
||||||
byte = bytes_as_usize(transactions[index].signatures[0].as_ref());
|
|
||||||
}
|
|
||||||
trace!(
|
|
||||||
"sending... {}..{} {} v.len: {} sig: {} transactions.len: {} index: {}",
|
|
||||||
start + i,
|
|
||||||
start + chunk_len,
|
|
||||||
timestamp(),
|
|
||||||
v.len(),
|
|
||||||
byte,
|
|
||||||
transactions.len(),
|
|
||||||
index,
|
|
||||||
);
|
|
||||||
for xv in v {
|
|
||||||
sent += xv.packets.len();
|
|
||||||
}
|
|
||||||
verified_sender.send(v.to_vec()).unwrap();
|
|
||||||
}
|
|
||||||
let start_tx_index = config.get_transactions_index(start);
|
|
||||||
let end_tx_index = config.get_transactions_index(start + chunk_len);
|
|
||||||
for tx in &transactions[start_tx_index..end_tx_index] {
|
|
||||||
loop {
|
|
||||||
if bank.get_signature_status(&tx.signatures[0]).is_some() {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if poh_recorder.lock().unwrap().bank().is_none() {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sleep(Duration::from_millis(5));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if check_txs(&signal_receiver2, txes / CHUNKS, &poh_recorder) {
|
|
||||||
debug!(
|
|
||||||
"resetting bank {} tx count: {} txs_proc: {}",
|
|
||||||
bank.slot(),
|
|
||||||
bank.transaction_count(),
|
|
||||||
txs_processed
|
|
||||||
);
|
|
||||||
assert!(txs_processed < bank.transaction_count());
|
|
||||||
txs_processed = bank.transaction_count();
|
|
||||||
tx_total += duration_as_us(&now.elapsed());
|
|
||||||
|
|
||||||
let mut poh_time = Measure::start("poh_time");
|
|
||||||
poh_recorder.lock().unwrap().reset(
|
|
||||||
bank.last_blockhash(),
|
|
||||||
bank.slot(),
|
|
||||||
Some((bank.slot(), bank.slot() + 1)),
|
|
||||||
);
|
|
||||||
poh_time.stop();
|
|
||||||
|
|
||||||
let mut new_bank_time = Measure::start("new_bank");
|
|
||||||
let new_bank = Bank::new_from_parent(&bank, &collector, bank.slot() + 1);
|
|
||||||
new_bank_time.stop();
|
|
||||||
|
|
||||||
let mut insert_time = Measure::start("insert_time");
|
|
||||||
bank_forks.insert(new_bank);
|
|
||||||
bank = bank_forks.working_bank();
|
|
||||||
insert_time.stop();
|
|
||||||
|
|
||||||
poh_recorder.lock().unwrap().set_bank(&bank);
|
|
||||||
assert!(poh_recorder.lock().unwrap().bank().is_some());
|
|
||||||
if bank.slot() > 32 {
|
|
||||||
bank_forks.set_root(root, &None);
|
|
||||||
root += 1;
|
|
||||||
}
|
|
||||||
debug!(
|
|
||||||
"new_bank_time: {}us insert_time: {}us poh_time: {}us",
|
|
||||||
new_bank_time.as_us(),
|
|
||||||
insert_time.as_us(),
|
|
||||||
poh_time.as_us(),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
tx_total += duration_as_us(&now.elapsed());
|
|
||||||
}
|
|
||||||
|
|
||||||
// This signature clear may not actually clear the signatures
|
|
||||||
// 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.
|
|
||||||
bank.clear_signatures();
|
|
||||||
total += duration_as_us(&now.elapsed());
|
|
||||||
debug!(
|
|
||||||
"time: {} us checked: {} sent: {}",
|
|
||||||
duration_as_us(&now.elapsed()),
|
|
||||||
txes / CHUNKS,
|
|
||||||
sent,
|
|
||||||
);
|
|
||||||
|
|
||||||
if bank.slot() > 0 && bank.slot() % 16 == 0 {
|
|
||||||
for tx in transactions.iter_mut() {
|
|
||||||
tx.message.recent_blockhash = bank.last_blockhash();
|
|
||||||
let sig: Vec<u8> = (0..64).map(|_| thread_rng().gen()).collect();
|
|
||||||
tx.signatures[0] = Signature::new(&sig[0..64]);
|
|
||||||
}
|
|
||||||
verified = to_packets_chunked(&transactions.clone(), PACKETS_PER_BATCH);
|
|
||||||
}
|
|
||||||
|
|
||||||
start += chunk_len;
|
|
||||||
start %= verified.len();
|
|
||||||
}
|
|
||||||
eprintln!(
|
|
||||||
"{{'name': 'banking_bench_total', 'median': '{}'}}",
|
|
||||||
total / ITERS as u64,
|
|
||||||
);
|
|
||||||
eprintln!(
|
|
||||||
"{{'name': 'banking_bench_tx_total', 'median': '{}'}}",
|
|
||||||
tx_total / ITERS as u64,
|
|
||||||
);
|
|
||||||
|
|
||||||
drop(verified_sender);
|
|
||||||
drop(vote_sender);
|
|
||||||
exit.store(true, Ordering::Relaxed);
|
|
||||||
banking_stage.join().unwrap();
|
|
||||||
debug!("waited for banking_stage");
|
|
||||||
poh_service.join().unwrap();
|
|
||||||
sleep(Duration::from_secs(1));
|
|
||||||
debug!("waited for poh_service");
|
|
||||||
}
|
|
||||||
let _unused = Blocktree::destroy(&ledger_path);
|
|
||||||
}
|
|
4
bench-exchange/.gitignore
vendored
@ -1,4 +0,0 @@
|
|||||||
/target/
|
|
||||||
/config/
|
|
||||||
/config-local/
|
|
||||||
/farf/
|
|
@ -1,41 +0,0 @@
|
|||||||
[package]
|
|
||||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
|
||||||
edition = "2018"
|
|
||||||
name = "solana-bench-exchange"
|
|
||||||
version = "0.21.2"
|
|
||||||
repository = "https://github.com/solana-labs/solana"
|
|
||||||
license = "Apache-2.0"
|
|
||||||
homepage = "https://solana.com/"
|
|
||||||
publish = false
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
bincode = "1.2.0"
|
|
||||||
bs58 = "0.3.0"
|
|
||||||
clap = "2.32.0"
|
|
||||||
env_logger = "0.7.1"
|
|
||||||
itertools = "0.8.2"
|
|
||||||
log = "0.4.8"
|
|
||||||
num-derive = "0.3"
|
|
||||||
num-traits = "0.2"
|
|
||||||
rand = "0.6.5"
|
|
||||||
rayon = "1.2.0"
|
|
||||||
serde = "1.0.102"
|
|
||||||
serde_derive = "1.0.102"
|
|
||||||
serde_json = "1.0.41"
|
|
||||||
serde_yaml = "0.8.11"
|
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "0.21.2" }
|
|
||||||
solana-core = { path = "../core", version = "0.21.2" }
|
|
||||||
solana-genesis = { path = "../genesis", version = "0.21.2" }
|
|
||||||
solana-client = { path = "../client", version = "0.21.2" }
|
|
||||||
solana-drone = { path = "../drone", version = "0.21.2" }
|
|
||||||
solana-exchange-program = { path = "../programs/exchange", version = "0.21.2" }
|
|
||||||
solana-logger = { path = "../logger", version = "0.21.2" }
|
|
||||||
solana-metrics = { path = "../metrics", version = "0.21.2" }
|
|
||||||
solana-net-utils = { path = "../net-utils", version = "0.21.2" }
|
|
||||||
solana-runtime = { path = "../runtime", version = "0.21.2" }
|
|
||||||
solana-sdk = { path = "../sdk", version = "0.21.2" }
|
|
||||||
untrusted = "0.7.0"
|
|
||||||
ws = "0.9.1"
|
|
||||||
|
|
||||||
[dev-dependencies]
|
|
||||||
solana-local-cluster = { path = "../local-cluster", version = "0.21.2" }
|
|
@ -1,479 +0,0 @@
|
|||||||
# token-exchange
|
|
||||||
Solana Token Exchange Bench
|
|
||||||
|
|
||||||
If you can't wait; jump to [Running the exchange](#Running-the-exchange) to
|
|
||||||
learn how to start and interact with the exchange.
|
|
||||||
|
|
||||||
### Table of Contents
|
|
||||||
[Overview](#Overview)<br>
|
|
||||||
[Premise](#Premise)<br>
|
|
||||||
[Exchange startup](#Exchange-startup)<br>
|
|
||||||
[Order Requests](#Trade-requests)<br>
|
|
||||||
[Order Cancellations](#Trade-cancellations)<br>
|
|
||||||
[Trade swap](#Trade-swap)<br>
|
|
||||||
[Exchange program operations](#Exchange-program-operations)<br>
|
|
||||||
[Quotes and OHLCV](#Quotes-and-OHLCV)<br>
|
|
||||||
[Investor strategies](#Investor-strategies)<br>
|
|
||||||
[Running the exchange](#Running-the-exchange)<br>
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
An exchange is a marketplace where one asset can be traded for another. This
|
|
||||||
demo demonstrates one way to host an exchange on the Solana blockchain by
|
|
||||||
emulating a currency exchange.
|
|
||||||
|
|
||||||
The assets are virtual tokens held by investors who may post order requests to
|
|
||||||
the exchange. A Matcher monitors the exchange and posts swap requests for
|
|
||||||
matching orders. All the transactions can execute concurrently.
|
|
||||||
|
|
||||||
## Premise
|
|
||||||
|
|
||||||
- Exchange
|
|
||||||
- An exchange is a marketplace where one asset can be traded for another.
|
|
||||||
The exchange in this demo is the on-chain program that implements the
|
|
||||||
tokens and the policies for trading those tokens.
|
|
||||||
- Token
|
|
||||||
- A virtual asset that can be owned, traded, and holds virtual intrinsic value
|
|
||||||
compared to other assets. There are four types of tokens in this demo, A,
|
|
||||||
B, C, D. Each one may be traded for another.
|
|
||||||
- Token account
|
|
||||||
- An account owned by the exchange that holds a quantity of one type of token.
|
|
||||||
- Account request
|
|
||||||
- A request to create a token account
|
|
||||||
- Token request
|
|
||||||
- A request to deposit tokens of a particular type into a token account.
|
|
||||||
- Asset pair
|
|
||||||
- A struct with fields Base and Quote, representing the two assets which make up a
|
|
||||||
trading pair, which themselves are Tokens. The Base or 'primary' asset is the
|
|
||||||
numerator and the Quote is the denominator for pricing purposes.
|
|
||||||
- Order side
|
|
||||||
- Describes which side of the market an investor wants to place a trade on. Options
|
|
||||||
are "Bid" or "Ask", where a bid represents an offer to purchase the Base asset of
|
|
||||||
the AssetPair for a sum of the Quote Asset and an Ask is an offer to sell Base asset
|
|
||||||
for the Quote asset.
|
|
||||||
- Price ratio
|
|
||||||
- An expression of the relative prices of two tokens. Calculated with the Base
|
|
||||||
Asset as the numerator and the Quote Asset as the denominator. Ratios are
|
|
||||||
represented as fixed point numbers. The fixed point scaler is defined in
|
|
||||||
[exchange_state.rs](https://github.com/solana-labs/solana/blob/c2fdd1362a029dcf89c8907c562d2079d977df11/programs/exchange_api/src/exchange_state.rs#L7)
|
|
||||||
- Order request
|
|
||||||
- A Solana transaction sent by a trader to the exchange to submit an order.
|
|
||||||
Order requests are made up of the token pair, the order side (bid or ask),
|
|
||||||
quantity of the primary token, the price ratio, and the two token accounts
|
|
||||||
to be credited/deducted. An example trade request looks like "T AB 5 2"
|
|
||||||
which reads "Exchange 5 A tokens to B tokens at a price ratio of 1:2" A fulfilled trade would result in 5 A tokens
|
|
||||||
deducted and 10 B tokens credited to the trade initiator's token accounts.
|
|
||||||
Successful order requests result in an order.
|
|
||||||
- Order
|
|
||||||
- The result of a successful order request. orders are stored in
|
|
||||||
accounts owned by the submitter of the order request. They can only be
|
|
||||||
canceled by their owner but can be used by anyone in a trade swap. They
|
|
||||||
contain the same information as the order request.
|
|
||||||
- Price spread
|
|
||||||
- The difference between the two matching orders. The spread is the
|
|
||||||
profit of the Matcher initiating the swap request.
|
|
||||||
- Match requirements
|
|
||||||
- Policies that result in a successful trade swap.
|
|
||||||
- Match request
|
|
||||||
- A request to fill two complementary orders (bid/ask), resulting if successful,
|
|
||||||
in a trade being created.
|
|
||||||
- Trade
|
|
||||||
- A successful trade is created from two matching orders that meet
|
|
||||||
swap requirements which are submitted in a Match Request by a Matcher and
|
|
||||||
executed by the exchange. A trade may not wholly satisfy one or both of the
|
|
||||||
orders in which case the orders are adjusted appropriately. Upon execution,
|
|
||||||
tokens are distributed to the traders' accounts and any overlap or
|
|
||||||
"negative spread" between orders is deposited into the Matcher's profit
|
|
||||||
account. All successful trades are recorded in the data of a new solana
|
|
||||||
account for posterity.
|
|
||||||
- Investor
|
|
||||||
- Individual investors who hold a number of tokens and wish to trade them on
|
|
||||||
the exchange. Investors operate as Solana thin clients who own a set of
|
|
||||||
accounts containing tokens and/or order requests. Investors post
|
|
||||||
transactions to the exchange in order to request tokens and post or cancel
|
|
||||||
order requests.
|
|
||||||
- Matcher
|
|
||||||
- An agent who facilitates trading between investors. Matchers operate as
|
|
||||||
Solana thin clients who monitor all the orders looking for a trade
|
|
||||||
match. Once found, the Matcher issues a swap request to the exchange.
|
|
||||||
Matchers are the engine of the exchange and are rewarded for their efforts by
|
|
||||||
accumulating the price spreads of the swaps they initiate. Matchers also
|
|
||||||
provide current bid/ask price and OHLCV (Open, High, Low, Close, Volume)
|
|
||||||
information on demand via a public network port.
|
|
||||||
- Transaction fees
|
|
||||||
- Solana transaction fees are paid for by the transaction submitters who are
|
|
||||||
the Investors and Matchers.
|
|
||||||
|
|
||||||
## Exchange startup
|
|
||||||
|
|
||||||
The exchange is up and running when it reaches a state where it can take
|
|
||||||
investors' trades and Matchers' match requests. To achieve this state the
|
|
||||||
following must occur in order:
|
|
||||||
|
|
||||||
- Start the Solana blockchain
|
|
||||||
- Start the thin-client
|
|
||||||
- The Matcher subscribes to change notifications for all the accounts owned by
|
|
||||||
the exchange program id. The subscription is managed via Solana's JSON RPC
|
|
||||||
interface.
|
|
||||||
- The Matcher starts responding to queries for bid/ask price and OHLCV
|
|
||||||
|
|
||||||
The Matcher responding successfully to price and OHLCV requests is the signal to
|
|
||||||
the investors that trades submitted after that point will be analyzed. <!--This
|
|
||||||
is not ideal, and instead investors should be able to submit trades at any time,
|
|
||||||
and the Matcher could come and go without missing a trade. One way to achieve
|
|
||||||
this is for the Matcher to read the current state of all accounts looking for all
|
|
||||||
open orders.-->
|
|
||||||
|
|
||||||
Investors will initially query the exchange to discover their current balance
|
|
||||||
for each type of token. If the investor does not already have an account for
|
|
||||||
each type of token, they will submit account requests. Matcher as well will
|
|
||||||
request accounts to hold the tokens they earn by initiating trade swaps.
|
|
||||||
|
|
||||||
```rust
|
|
||||||
/// Supported token types
|
|
||||||
pub enum Token {
|
|
||||||
A,
|
|
||||||
B,
|
|
||||||
C,
|
|
||||||
D,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Supported token pairs
|
|
||||||
pub enum TokenPair {
|
|
||||||
AB,
|
|
||||||
AC,
|
|
||||||
AD,
|
|
||||||
BC,
|
|
||||||
BD,
|
|
||||||
CD,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub enum ExchangeInstruction {
|
|
||||||
/// New token account
|
|
||||||
/// key 0 - Signer
|
|
||||||
/// key 1 - New token account
|
|
||||||
AccountRequest,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Token accounts are populated with this structure
|
|
||||||
pub struct TokenAccountInfo {
|
|
||||||
/// Investor who owns this account
|
|
||||||
pub owner: Pubkey,
|
|
||||||
/// Current number of tokens this account holds
|
|
||||||
pub tokens: Tokens,
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
For this demo investors or Matcher can request more tokens from the exchange at
|
|
||||||
any time by submitting token requests. In non-demos, an exchange of this type
|
|
||||||
would provide another way to exchange a 3rd party asset into tokens.
|
|
||||||
|
|
||||||
To request tokens, investors submit transfer requests:
|
|
||||||
|
|
||||||
```rust
|
|
||||||
pub enum ExchangeInstruction {
|
|
||||||
/// Transfer tokens between two accounts
|
|
||||||
/// key 0 - Account to transfer tokens to
|
|
||||||
/// key 1 - Account to transfer tokens from. This can be the exchange program itself,
|
|
||||||
/// the exchange has a limitless number of tokens it can transfer.
|
|
||||||
TransferRequest(Token, u64),
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Order Requests
|
|
||||||
|
|
||||||
When an investor decides to exchange a token of one type for another, they
|
|
||||||
submit a transaction to the Solana Blockchain containing an order request, which,
|
|
||||||
if successful, is turned into an order. orders do not expire but are
|
|
||||||
cancellable. <!-- orders should have a timestamp to enable trade
|
|
||||||
expiration --> When an order is created, tokens are deducted from a token
|
|
||||||
account and the order acts as an escrow. The tokens are held until the
|
|
||||||
order is fulfilled or canceled. If the direction is `To`, then the number
|
|
||||||
of `tokens` are deducted from the primary account, if `From` then `tokens`
|
|
||||||
multiplied by `price` are deducted from the secondary account. orders are
|
|
||||||
no longer valid when the number of `tokens` goes to zero, at which point they
|
|
||||||
can no longer be used. <!-- Could support refilling orders, so order
|
|
||||||
accounts are refilled rather than accumulating -->
|
|
||||||
|
|
||||||
```rust
|
|
||||||
/// Direction of the exchange between two tokens in a pair
|
|
||||||
pub enum Direction {
|
|
||||||
/// Trade first token type (primary) in the pair 'To' the second
|
|
||||||
To,
|
|
||||||
/// Trade first token type in the pair 'From' the second (secondary)
|
|
||||||
From,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct OrderRequestInfo {
|
|
||||||
/// Direction of trade
|
|
||||||
pub direction: Direction,
|
|
||||||
|
|
||||||
/// Token pair to trade
|
|
||||||
pub pair: TokenPair,
|
|
||||||
|
|
||||||
/// Number of tokens to exchange; refers to the primary or the secondary depending on the direction
|
|
||||||
pub tokens: u64,
|
|
||||||
|
|
||||||
/// The price ratio the primary price over the secondary price. The primary price is fixed
|
|
||||||
/// and equal to the variable `SCALER`.
|
|
||||||
pub price: u64,
|
|
||||||
|
|
||||||
/// Token account to deposit tokens on successful swap
|
|
||||||
pub dst_account: Pubkey,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub enum ExchangeInstruction {
|
|
||||||
/// order request
|
|
||||||
/// key 0 - Signer
|
|
||||||
/// key 1 - Account in which to record the swap
|
|
||||||
/// key 2 - Token account associated with this trade
|
|
||||||
TradeRequest(TradeRequestInfo),
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Trade accounts are populated with this structure
|
|
||||||
pub struct TradeOrderInfo {
|
|
||||||
/// Owner of the order
|
|
||||||
pub owner: Pubkey,
|
|
||||||
/// Direction of the exchange
|
|
||||||
pub direction: Direction,
|
|
||||||
/// Token pair indicating two tokens to exchange, first is primary
|
|
||||||
pub pair: TokenPair,
|
|
||||||
/// Number of tokens to exchange; primary or secondary depending on direction
|
|
||||||
pub tokens: u64,
|
|
||||||
/// Scaled price of the secondary token given the primary is equal to the scale value
|
|
||||||
/// If scale is 1 and price is 2 then ratio is 1:2 or 1 primary token for 2 secondary tokens
|
|
||||||
pub price: u64,
|
|
||||||
/// account which the tokens were source from. The trade account holds the tokens in escrow
|
|
||||||
/// until either one or more part of a swap or the trade is canceled.
|
|
||||||
pub src_account: Pubkey,
|
|
||||||
/// account which the tokens the tokens will be deposited into on a successful trade
|
|
||||||
pub dst_account: Pubkey,
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Order cancellations
|
|
||||||
|
|
||||||
An investor may cancel a trade at anytime, but only trades they own. If the
|
|
||||||
cancellation is successful, any tokens held in escrow are returned to the
|
|
||||||
account from which they came.
|
|
||||||
|
|
||||||
```rust
|
|
||||||
pub enum ExchangeInstruction {
|
|
||||||
/// order cancellation
|
|
||||||
/// key 0 - Signer
|
|
||||||
/// key 1 -order to cancel
|
|
||||||
TradeCancellation,
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Trade swaps
|
|
||||||
|
|
||||||
The Matcher is monitoring the accounts assigned to the exchange program and
|
|
||||||
building a trade-order table. The order table is used to identify
|
|
||||||
matching orders which could be fulfilled. When a match is found the
|
|
||||||
Matcher should issue a swap request. Swap requests may not satisfy the entirety
|
|
||||||
of either order, but the exchange will greedily fulfill it. Any leftover tokens
|
|
||||||
in either account will keep the order valid for further swap requests in
|
|
||||||
the future.
|
|
||||||
|
|
||||||
Matching orders are defined by the following swap requirements:
|
|
||||||
|
|
||||||
- Opposite polarity (one `To` and one `From`)
|
|
||||||
- Operate on the same token pair
|
|
||||||
- The price ratio of the `From` order is greater than or equal to the `To` order
|
|
||||||
- There are sufficient tokens to perform the trade
|
|
||||||
|
|
||||||
Orders can be written in the following format:
|
|
||||||
|
|
||||||
`investor direction pair quantity price-ratio`
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
- `1 T AB 2 1`
|
|
||||||
- Investor 1 wishes to exchange 2 A tokens to B tokens at a ratio of 1 A to 1
|
|
||||||
B
|
|
||||||
- `2 F AC 6 1.2`
|
|
||||||
- Investor 2 wishes to exchange A tokens from 6 B tokens at a ratio of 1 A
|
|
||||||
from 1.2 B
|
|
||||||
|
|
||||||
An order table could look something like the following. Notice how the columns
|
|
||||||
are sorted low to high and high to low, respectively. Prices are dramatic and
|
|
||||||
whole for clarity.
|
|
||||||
|
|
||||||
|Row| To | From |
|
|
||||||
|---|-------------|------------|
|
|
||||||
| 1 | 1 T AB 2 4 | 2 F AB 2 8 |
|
|
||||||
| 2 | 1 T AB 1 4 | 2 F AB 2 8 |
|
|
||||||
| 3 | 1 T AB 6 6 | 2 F AB 2 7 |
|
|
||||||
| 4 | 1 T AB 2 8 | 2 F AB 3 6 |
|
|
||||||
| 5 | 1 T AB 2 10 | 2 F AB 1 5 |
|
|
||||||
|
|
||||||
As part of a successful swap request, the exchange will credit tokens to the
|
|
||||||
Matcher's account equal to the difference in the price ratios or the two orders.
|
|
||||||
These tokens are considered the Matcher's profit for initiating the trade.
|
|
||||||
|
|
||||||
The Matcher would initiate the following swap on the order table above:
|
|
||||||
|
|
||||||
- Row 1, To: Investor 1 trades 2 A tokens to 8 B tokens
|
|
||||||
- Row 1, From: Investor 2 trades 2 A tokens from 8 B tokens
|
|
||||||
- Matcher takes 8 B tokens as profit
|
|
||||||
|
|
||||||
Both row 1 trades are fully realized, table becomes:
|
|
||||||
|
|
||||||
|Row| To | From |
|
|
||||||
|---|-------------|------------|
|
|
||||||
| 1 | 1 T AB 1 4 | 2 F AB 2 8 |
|
|
||||||
| 2 | 1 T AB 6 6 | 2 F AB 2 7 |
|
|
||||||
| 3 | 1 T AB 2 8 | 2 F AB 3 6 |
|
|
||||||
| 4 | 1 T AB 2 10 | 2 F AB 1 5 |
|
|
||||||
|
|
||||||
The Matcher would initiate the following swap:
|
|
||||||
|
|
||||||
- Row 1, To: Investor 1 trades 1 A token to 4 B tokens
|
|
||||||
- Row 1, From: Investor 2 trades 1 A token from 4 B tokens
|
|
||||||
- Matcher takes 4 B tokens as profit
|
|
||||||
|
|
||||||
Row 1 From is not fully realized, table becomes:
|
|
||||||
|
|
||||||
|Row| To | From |
|
|
||||||
|---|-------------|------------|
|
|
||||||
| 1 | 1 T AB 6 6 | 2 F AB 1 8 |
|
|
||||||
| 2 | 1 T AB 2 8 | 2 F AB 2 7 |
|
|
||||||
| 3 | 1 T AB 2 10 | 2 F AB 3 6 |
|
|
||||||
| 4 | | 2 F AB 1 5 |
|
|
||||||
|
|
||||||
The Matcher would initiate the following swap:
|
|
||||||
|
|
||||||
- Row 1, To: Investor 1 trades 1 A token to 6 B tokens
|
|
||||||
- Row 1, From: Investor 2 trades 1 A token from 6 B tokens
|
|
||||||
- Matcher takes 2 B tokens as profit
|
|
||||||
|
|
||||||
Row 1 To is now fully realized, table becomes:
|
|
||||||
|
|
||||||
|Row| To | From |
|
|
||||||
|---|-------------|------------|
|
|
||||||
| 1 | 1 T AB 5 6 | 2 F AB 2 7 |
|
|
||||||
| 2 | 1 T AB 2 8 | 2 F AB 3 5 |
|
|
||||||
| 3 | 1 T AB 2 10 | 2 F AB 1 5 |
|
|
||||||
|
|
||||||
The Matcher would initiate the following last swap:
|
|
||||||
|
|
||||||
- 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
|
|
||||||
- Matcher takes 2 B tokens as profit
|
|
||||||
|
|
||||||
Table becomes:
|
|
||||||
|
|
||||||
|Row| To | From |
|
|
||||||
|---|-------------|------------|
|
|
||||||
| 1 | 1 T AB 3 6 | 2 F AB 3 5 |
|
|
||||||
| 2 | 1 T AB 2 8 | 2 F AB 1 5 |
|
|
||||||
| 3 | 1 T AB 2 10 | |
|
|
||||||
|
|
||||||
At this point the lowest To's price is larger than the largest From's price so
|
|
||||||
no more swaps would be initiated until new orders came in.
|
|
||||||
|
|
||||||
```rust
|
|
||||||
pub enum ExchangeInstruction {
|
|
||||||
/// Trade swap request
|
|
||||||
/// key 0 - Signer
|
|
||||||
/// key 1 - Account in which to record the swap
|
|
||||||
/// key 2 - 'To' order
|
|
||||||
/// key 3 - `From` order
|
|
||||||
/// key 4 - Token account associated with the To Trade
|
|
||||||
/// key 5 - Token account associated with From trade
|
|
||||||
/// key 6 - Token account in which to deposit the Matcher profit from the swap.
|
|
||||||
SwapRequest,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Swap accounts are populated with this structure
|
|
||||||
pub struct TradeSwapInfo {
|
|
||||||
/// Pair swapped
|
|
||||||
pub pair: TokenPair,
|
|
||||||
/// `To` order
|
|
||||||
pub to_trade_order: Pubkey,
|
|
||||||
/// `From` order
|
|
||||||
pub from_trade_order: Pubkey,
|
|
||||||
/// Number of primary tokens exchanged
|
|
||||||
pub primary_tokens: u64,
|
|
||||||
/// Price the primary tokens were exchanged for
|
|
||||||
pub primary_price: u64,
|
|
||||||
/// Number of secondary tokens exchanged
|
|
||||||
pub secondary_tokens: u64,
|
|
||||||
/// Price the secondary tokens were exchanged for
|
|
||||||
pub secondary_price: u64,
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Exchange program operations
|
|
||||||
|
|
||||||
Putting all the commands together from above, the following operations will be
|
|
||||||
supported by the on-chain exchange program:
|
|
||||||
|
|
||||||
```rust
|
|
||||||
pub enum ExchangeInstruction {
|
|
||||||
/// New token account
|
|
||||||
/// key 0 - Signer
|
|
||||||
/// key 1 - New token account
|
|
||||||
AccountRequest,
|
|
||||||
|
|
||||||
/// Transfer tokens between two accounts
|
|
||||||
/// key 0 - Account to transfer tokens to
|
|
||||||
/// key 1 - Account to transfer tokens from. This can be the exchange program itself,
|
|
||||||
/// the exchange has a limitless number of tokens it can transfer.
|
|
||||||
TransferRequest(Token, u64),
|
|
||||||
|
|
||||||
/// order request
|
|
||||||
/// key 0 - Signer
|
|
||||||
/// key 1 - Account in which to record the swap
|
|
||||||
/// key 2 - Token account associated with this trade
|
|
||||||
TradeRequest(TradeRequestInfo),
|
|
||||||
|
|
||||||
/// order cancellation
|
|
||||||
/// key 0 - Signer
|
|
||||||
/// key 1 -order to cancel
|
|
||||||
TradeCancellation,
|
|
||||||
|
|
||||||
/// Trade swap request
|
|
||||||
/// key 0 - Signer
|
|
||||||
/// key 1 - Account in which to record the swap
|
|
||||||
/// key 2 - 'To' order
|
|
||||||
/// key 3 - `From` order
|
|
||||||
/// key 4 - Token account associated with the To Trade
|
|
||||||
/// key 5 - Token account associated with From trade
|
|
||||||
/// key 6 - Token account in which to deposit the Matcher profit from the swap.
|
|
||||||
SwapRequest,
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Quotes and OHLCV
|
|
||||||
|
|
||||||
The Matcher will provide current bid/ask price quotes based on trade actively and
|
|
||||||
also provide OHLCV based on some time window. The details of how the bid/ask
|
|
||||||
price quotes are calculated are yet to be decided.
|
|
||||||
|
|
||||||
## Investor strategies
|
|
||||||
|
|
||||||
To make a compelling demo, the investors needs to provide interesting trade
|
|
||||||
behavior. Something as simple as a randomly twiddled baseline would be a
|
|
||||||
minimum starting point.
|
|
||||||
|
|
||||||
## Running the exchange
|
|
||||||
|
|
||||||
The exchange bench posts trades and swaps matches as fast as it can.
|
|
||||||
|
|
||||||
You might want to bump the duration up
|
|
||||||
to 60 seconds and the batch size to 1000 for better numbers. You can modify those
|
|
||||||
in client_demo/src/demo.rs::test_exchange_local_cluster.
|
|
||||||
|
|
||||||
The following command runs the bench:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ RUST_LOG=solana_bench_exchange=info cargo test --release -- --nocapture test_exchange_local_cluster
|
|
||||||
```
|
|
||||||
|
|
||||||
To also see the cluster messages:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ RUST_LOG=solana_bench_exchange=info,solana=info cargo test --release -- --nocapture test_exchange_local_cluster
|
|
||||||
```
|
|
@ -1,220 +0,0 @@
|
|||||||
use clap::{crate_description, crate_name, value_t, App, Arg, ArgMatches};
|
|
||||||
use solana_core::gen_keys::GenKeys;
|
|
||||||
use solana_drone::drone::DRONE_PORT;
|
|
||||||
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
|
||||||
use std::net::SocketAddr;
|
|
||||||
use std::process::exit;
|
|
||||||
use std::time::Duration;
|
|
||||||
|
|
||||||
pub struct Config {
|
|
||||||
pub entrypoint_addr: SocketAddr,
|
|
||||||
pub drone_addr: SocketAddr,
|
|
||||||
pub identity: Keypair,
|
|
||||||
pub threads: usize,
|
|
||||||
pub num_nodes: usize,
|
|
||||||
pub duration: Duration,
|
|
||||||
pub transfer_delay: u64,
|
|
||||||
pub fund_amount: u64,
|
|
||||||
pub batch_size: usize,
|
|
||||||
pub chunk_size: usize,
|
|
||||||
pub account_groups: usize,
|
|
||||||
pub client_ids_and_stake_file: String,
|
|
||||||
pub write_to_client_file: bool,
|
|
||||||
pub read_from_client_file: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Config {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
entrypoint_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
|
||||||
drone_addr: SocketAddr::from(([127, 0, 0, 1], DRONE_PORT)),
|
|
||||||
identity: Keypair::new(),
|
|
||||||
num_nodes: 1,
|
|
||||||
threads: 4,
|
|
||||||
duration: Duration::new(u64::max_value(), 0),
|
|
||||||
transfer_delay: 0,
|
|
||||||
fund_amount: 100_000,
|
|
||||||
batch_size: 100,
|
|
||||||
chunk_size: 100,
|
|
||||||
account_groups: 100,
|
|
||||||
client_ids_and_stake_file: String::new(),
|
|
||||||
write_to_client_file: false,
|
|
||||||
read_from_client_file: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn build_args<'a, 'b>(version: &'b str) -> App<'a, 'b> {
|
|
||||||
App::new(crate_name!())
|
|
||||||
.about(crate_description!())
|
|
||||||
.version(version)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("entrypoint")
|
|
||||||
.short("n")
|
|
||||||
.long("entrypoint")
|
|
||||||
.value_name("HOST:PORT")
|
|
||||||
.takes_value(true)
|
|
||||||
.required(false)
|
|
||||||
.default_value("127.0.0.1:8001")
|
|
||||||
.help("Cluster entry point; defaults to 127.0.0.1:8001"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("drone")
|
|
||||||
.short("d")
|
|
||||||
.long("drone")
|
|
||||||
.value_name("HOST:PORT")
|
|
||||||
.takes_value(true)
|
|
||||||
.required(false)
|
|
||||||
.default_value("127.0.0.1:9900")
|
|
||||||
.help("Location of the drone; defaults to 127.0.0.1:9900"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("identity")
|
|
||||||
.short("i")
|
|
||||||
.long("identity")
|
|
||||||
.value_name("PATH")
|
|
||||||
.takes_value(true)
|
|
||||||
.help("File containing a client identity (keypair)"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("threads")
|
|
||||||
.long("threads")
|
|
||||||
.value_name("<threads>")
|
|
||||||
.takes_value(true)
|
|
||||||
.required(false)
|
|
||||||
.default_value("1")
|
|
||||||
.help("Number of threads submitting transactions"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("num-nodes")
|
|
||||||
.long("num-nodes")
|
|
||||||
.value_name("NUM")
|
|
||||||
.takes_value(true)
|
|
||||||
.required(false)
|
|
||||||
.default_value("1")
|
|
||||||
.help("Wait for NUM nodes to converge"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("duration")
|
|
||||||
.long("duration")
|
|
||||||
.value_name("SECS")
|
|
||||||
.takes_value(true)
|
|
||||||
.default_value("60")
|
|
||||||
.help("Seconds to run benchmark, then exit; default is forever"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("transfer-delay")
|
|
||||||
.long("transfer-delay")
|
|
||||||
.value_name("<delay>")
|
|
||||||
.takes_value(true)
|
|
||||||
.required(false)
|
|
||||||
.default_value("0")
|
|
||||||
.help("Delay between each chunk"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("fund-amount")
|
|
||||||
.long("fund-amount")
|
|
||||||
.value_name("<fund>")
|
|
||||||
.takes_value(true)
|
|
||||||
.required(false)
|
|
||||||
.default_value("100000")
|
|
||||||
.help("Number of lamports to fund to each signer"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("batch-size")
|
|
||||||
.long("batch-size")
|
|
||||||
.value_name("<batch>")
|
|
||||||
.takes_value(true)
|
|
||||||
.required(false)
|
|
||||||
.default_value("1000")
|
|
||||||
.help("Number of transactions before the signer rolls over"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("chunk-size")
|
|
||||||
.long("chunk-size")
|
|
||||||
.value_name("<cunk>")
|
|
||||||
.takes_value(true)
|
|
||||||
.required(false)
|
|
||||||
.default_value("500")
|
|
||||||
.help("Number of transactions to generate and send at a time"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("account-groups")
|
|
||||||
.long("account-groups")
|
|
||||||
.value_name("<groups>")
|
|
||||||
.takes_value(true)
|
|
||||||
.required(false)
|
|
||||||
.default_value("10")
|
|
||||||
.help("Number of account groups to cycle for each batch"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("write-client-keys")
|
|
||||||
.long("write-client-keys")
|
|
||||||
.value_name("FILENAME")
|
|
||||||
.takes_value(true)
|
|
||||||
.help("Generate client keys and stakes and write the list to YAML file"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("read-client-keys")
|
|
||||||
.long("read-client-keys")
|
|
||||||
.value_name("FILENAME")
|
|
||||||
.takes_value(true)
|
|
||||||
.help("Read client keys and stakes from the YAML file"),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
|
||||||
let mut args = Config::default();
|
|
||||||
|
|
||||||
args.entrypoint_addr = solana_net_utils::parse_host_port(
|
|
||||||
matches.value_of("entrypoint").unwrap(),
|
|
||||||
)
|
|
||||||
.unwrap_or_else(|e| {
|
|
||||||
eprintln!("failed to parse entrypoint address: {}", e);
|
|
||||||
exit(1)
|
|
||||||
});
|
|
||||||
|
|
||||||
args.drone_addr = solana_net_utils::parse_host_port(matches.value_of("drone").unwrap())
|
|
||||||
.unwrap_or_else(|e| {
|
|
||||||
eprintln!("failed to parse drone address: {}", e);
|
|
||||||
exit(1)
|
|
||||||
});
|
|
||||||
|
|
||||||
if matches.is_present("identity") {
|
|
||||||
args.identity = read_keypair_file(matches.value_of("identity").unwrap())
|
|
||||||
.expect("can't read client identity");
|
|
||||||
} else {
|
|
||||||
args.identity = {
|
|
||||||
let seed = [42_u8; 32];
|
|
||||||
let mut rnd = GenKeys::new(seed);
|
|
||||||
rnd.gen_keypair()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
args.threads = value_t!(matches.value_of("threads"), usize).expect("Failed to parse threads");
|
|
||||||
args.num_nodes =
|
|
||||||
value_t!(matches.value_of("num-nodes"), usize).expect("Failed to parse num-nodes");
|
|
||||||
let duration = value_t!(matches.value_of("duration"), u64).expect("Failed to parse duration");
|
|
||||||
args.duration = Duration::from_secs(duration);
|
|
||||||
args.transfer_delay =
|
|
||||||
value_t!(matches.value_of("transfer-delay"), u64).expect("Failed to parse transfer-delay");
|
|
||||||
args.fund_amount =
|
|
||||||
value_t!(matches.value_of("fund-amount"), u64).expect("Failed to parse fund-amount");
|
|
||||||
args.batch_size =
|
|
||||||
value_t!(matches.value_of("batch-size"), usize).expect("Failed to parse batch-size");
|
|
||||||
args.chunk_size =
|
|
||||||
value_t!(matches.value_of("chunk-size"), usize).expect("Failed to parse chunk-size");
|
|
||||||
args.account_groups = value_t!(matches.value_of("account-groups"), usize)
|
|
||||||
.expect("Failed to parse account-groups");
|
|
||||||
|
|
||||||
if let Some(s) = matches.value_of("write-client-keys") {
|
|
||||||
args.write_to_client_file = true;
|
|
||||||
args.client_ids_and_stake_file = s.to_string();
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(s) = matches.value_of("read-client-keys") {
|
|
||||||
assert!(!args.write_to_client_file);
|
|
||||||
args.read_from_client_file = true;
|
|
||||||
args.client_ids_and_stake_file = s.to_string();
|
|
||||||
}
|
|
||||||
args
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
pub mod bench;
|
|
||||||
pub mod cli;
|
|
||||||
mod order_book;
|
|
@ -1,83 +0,0 @@
|
|||||||
pub mod bench;
|
|
||||||
mod cli;
|
|
||||||
pub mod order_book;
|
|
||||||
|
|
||||||
use crate::bench::{airdrop_lamports, create_client_accounts_file, do_bench_exchange, Config};
|
|
||||||
use log::*;
|
|
||||||
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
|
||||||
use solana_sdk::signature::KeypairUtil;
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
solana_logger::setup();
|
|
||||||
solana_metrics::set_panic_hook("bench-exchange");
|
|
||||||
|
|
||||||
let matches = cli::build_args(solana_clap_utils::version!()).get_matches();
|
|
||||||
let cli_config = cli::extract_args(&matches);
|
|
||||||
|
|
||||||
let cli::Config {
|
|
||||||
entrypoint_addr,
|
|
||||||
drone_addr,
|
|
||||||
identity,
|
|
||||||
threads,
|
|
||||||
num_nodes,
|
|
||||||
duration,
|
|
||||||
transfer_delay,
|
|
||||||
fund_amount,
|
|
||||||
batch_size,
|
|
||||||
chunk_size,
|
|
||||||
account_groups,
|
|
||||||
client_ids_and_stake_file,
|
|
||||||
write_to_client_file,
|
|
||||||
read_from_client_file,
|
|
||||||
..
|
|
||||||
} = cli_config;
|
|
||||||
|
|
||||||
let config = Config {
|
|
||||||
identity,
|
|
||||||
threads,
|
|
||||||
duration,
|
|
||||||
transfer_delay,
|
|
||||||
fund_amount,
|
|
||||||
batch_size,
|
|
||||||
chunk_size,
|
|
||||||
account_groups,
|
|
||||||
client_ids_and_stake_file,
|
|
||||||
read_from_client_file,
|
|
||||||
};
|
|
||||||
|
|
||||||
if write_to_client_file {
|
|
||||||
create_client_accounts_file(
|
|
||||||
&config.client_ids_and_stake_file,
|
|
||||||
config.batch_size,
|
|
||||||
config.account_groups,
|
|
||||||
config.fund_amount,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
info!("Connecting to the cluster");
|
|
||||||
let (nodes, _archivers) =
|
|
||||||
discover_cluster(&entrypoint_addr, num_nodes).unwrap_or_else(|_| {
|
|
||||||
panic!("Failed to discover nodes");
|
|
||||||
});
|
|
||||||
|
|
||||||
let (client, num_clients) = get_multi_client(&nodes);
|
|
||||||
|
|
||||||
info!("{} nodes found", num_clients);
|
|
||||||
if num_clients < num_nodes {
|
|
||||||
panic!("Error: Insufficient nodes discovered");
|
|
||||||
}
|
|
||||||
|
|
||||||
if !read_from_client_file {
|
|
||||||
info!("Funding keypair: {}", config.identity.pubkey());
|
|
||||||
|
|
||||||
let accounts_in_groups = batch_size * account_groups;
|
|
||||||
const NUM_SIGNERS: u64 = 2;
|
|
||||||
airdrop_lamports(
|
|
||||||
&client,
|
|
||||||
&drone_addr,
|
|
||||||
&config.identity,
|
|
||||||
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
do_bench_exchange(vec![client], config);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,134 +0,0 @@
|
|||||||
use itertools::EitherOrBoth::{Both, Left, Right};
|
|
||||||
use itertools::Itertools;
|
|
||||||
use log::*;
|
|
||||||
use solana_exchange_program::exchange_state::*;
|
|
||||||
use solana_sdk::pubkey::Pubkey;
|
|
||||||
use std::cmp::Ordering;
|
|
||||||
use std::collections::BinaryHeap;
|
|
||||||
use std::{error, fmt};
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
||||||
pub struct ToOrder {
|
|
||||||
pub pubkey: Pubkey,
|
|
||||||
pub info: OrderInfo,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Ord for ToOrder {
|
|
||||||
fn cmp(&self, other: &Self) -> Ordering {
|
|
||||||
other.info.price.cmp(&self.info.price)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl PartialOrd for ToOrder {
|
|
||||||
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
|
||||||
Some(self.cmp(other))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
||||||
pub struct FromOrder {
|
|
||||||
pub pubkey: Pubkey,
|
|
||||||
pub info: OrderInfo,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Ord for FromOrder {
|
|
||||||
fn cmp(&self, other: &Self) -> Ordering {
|
|
||||||
self.info.price.cmp(&other.info.price)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl PartialOrd for FromOrder {
|
|
||||||
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
|
||||||
Some(self.cmp(other))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Default)]
|
|
||||||
pub struct OrderBook {
|
|
||||||
// TODO scale to x token types
|
|
||||||
to_ab: BinaryHeap<ToOrder>,
|
|
||||||
from_ab: BinaryHeap<FromOrder>,
|
|
||||||
}
|
|
||||||
impl fmt::Display for OrderBook {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
writeln!(
|
|
||||||
f,
|
|
||||||
"+-Order Book--------------------------+-------------------------------------+"
|
|
||||||
)?;
|
|
||||||
for (i, it) in self
|
|
||||||
.to_ab
|
|
||||||
.iter()
|
|
||||||
.zip_longest(self.from_ab.iter())
|
|
||||||
.enumerate()
|
|
||||||
{
|
|
||||||
match it {
|
|
||||||
Both(to, from) => writeln!(
|
|
||||||
f,
|
|
||||||
"| T AB {:8} for {:8}/{:8} | F AB {:8} for {:8}/{:8} |{}",
|
|
||||||
to.info.tokens,
|
|
||||||
SCALER,
|
|
||||||
to.info.price,
|
|
||||||
from.info.tokens,
|
|
||||||
SCALER,
|
|
||||||
from.info.price,
|
|
||||||
i
|
|
||||||
)?,
|
|
||||||
Left(to) => writeln!(
|
|
||||||
f,
|
|
||||||
"| T AB {:8} for {:8}/{:8} | |{}",
|
|
||||||
to.info.tokens, SCALER, to.info.price, i
|
|
||||||
)?,
|
|
||||||
Right(from) => writeln!(
|
|
||||||
f,
|
|
||||||
"| | F AB {:8} for {:8}/{:8} |{}",
|
|
||||||
from.info.tokens, SCALER, from.info.price, i
|
|
||||||
)?,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
write!(
|
|
||||||
f,
|
|
||||||
"+-------------------------------------+-------------------------------------+"
|
|
||||||
)?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl OrderBook {
|
|
||||||
// TODO
|
|
||||||
// pub fn cancel(&mut self, pubkey: Pubkey) -> Result<(), Box<dyn error::Error>> {
|
|
||||||
// Ok(())
|
|
||||||
// }
|
|
||||||
pub fn push(&mut self, pubkey: Pubkey, info: OrderInfo) -> Result<(), Box<dyn error::Error>> {
|
|
||||||
check_trade(info.side, info.tokens, info.price)?;
|
|
||||||
match info.side {
|
|
||||||
OrderSide::Ask => {
|
|
||||||
self.to_ab.push(ToOrder { pubkey, info });
|
|
||||||
}
|
|
||||||
OrderSide::Bid => {
|
|
||||||
self.from_ab.push(FromOrder { pubkey, info });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
pub fn pop(&mut self) -> Option<(ToOrder, FromOrder)> {
|
|
||||||
if let Some(pair) = Self::pop_pair(&mut self.to_ab, &mut self.from_ab) {
|
|
||||||
return Some(pair);
|
|
||||||
}
|
|
||||||
None
|
|
||||||
}
|
|
||||||
pub fn get_num_outstanding(&self) -> (usize, usize) {
|
|
||||||
(self.to_ab.len(), self.from_ab.len())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn pop_pair(
|
|
||||||
to_ab: &mut BinaryHeap<ToOrder>,
|
|
||||||
from_ab: &mut BinaryHeap<FromOrder>,
|
|
||||||
) -> Option<(ToOrder, FromOrder)> {
|
|
||||||
let to = to_ab.peek()?;
|
|
||||||
let from = from_ab.peek()?;
|
|
||||||
if from.info.price < to.info.price {
|
|
||||||
debug!("Trade not viable");
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
let to = to_ab.pop()?;
|
|
||||||
let from = from_ab.pop()?;
|
|
||||||
Some((to, from))
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,102 +0,0 @@
|
|||||||
use log::*;
|
|
||||||
use solana_bench_exchange::bench::{airdrop_lamports, do_bench_exchange, Config};
|
|
||||||
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
|
||||||
use solana_core::validator::ValidatorConfig;
|
|
||||||
use solana_drone::drone::run_local_drone;
|
|
||||||
use solana_exchange_program::exchange_processor::process_instruction;
|
|
||||||
use solana_exchange_program::id;
|
|
||||||
use solana_exchange_program::solana_exchange_program;
|
|
||||||
use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster};
|
|
||||||
use solana_runtime::bank::Bank;
|
|
||||||
use solana_runtime::bank_client::BankClient;
|
|
||||||
use solana_sdk::genesis_config::create_genesis_config;
|
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
|
||||||
use std::process::exit;
|
|
||||||
use std::sync::mpsc::channel;
|
|
||||||
use std::time::Duration;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_exchange_local_cluster() {
|
|
||||||
solana_logger::setup();
|
|
||||||
|
|
||||||
const NUM_NODES: usize = 1;
|
|
||||||
|
|
||||||
let mut config = Config::default();
|
|
||||||
config.identity = Keypair::new();
|
|
||||||
config.duration = Duration::from_secs(1);
|
|
||||||
config.fund_amount = 100_000;
|
|
||||||
config.threads = 1;
|
|
||||||
config.transfer_delay = 20; // 15
|
|
||||||
config.batch_size = 100; // 1000;
|
|
||||||
config.chunk_size = 10; // 200;
|
|
||||||
config.account_groups = 1; // 10;
|
|
||||||
let Config {
|
|
||||||
fund_amount,
|
|
||||||
batch_size,
|
|
||||||
account_groups,
|
|
||||||
..
|
|
||||||
} = config;
|
|
||||||
let accounts_in_groups = batch_size * account_groups;
|
|
||||||
|
|
||||||
let cluster = LocalCluster::new(&ClusterConfig {
|
|
||||||
node_stakes: vec![100_000; NUM_NODES],
|
|
||||||
cluster_lamports: 100_000_000_000_000,
|
|
||||||
validator_configs: vec![ValidatorConfig::default(); NUM_NODES],
|
|
||||||
native_instruction_processors: [solana_exchange_program!()].to_vec(),
|
|
||||||
..ClusterConfig::default()
|
|
||||||
});
|
|
||||||
|
|
||||||
let drone_keypair = Keypair::new();
|
|
||||||
cluster.transfer(
|
|
||||||
&cluster.funding_keypair,
|
|
||||||
&drone_keypair.pubkey(),
|
|
||||||
2_000_000_000_000,
|
|
||||||
);
|
|
||||||
|
|
||||||
let (addr_sender, addr_receiver) = channel();
|
|
||||||
run_local_drone(drone_keypair, addr_sender, Some(1_000_000_000_000));
|
|
||||||
let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
|
||||||
|
|
||||||
info!("Connecting to the cluster");
|
|
||||||
let (nodes, _) =
|
|
||||||
discover_cluster(&cluster.entry_point_info.gossip, NUM_NODES).unwrap_or_else(|err| {
|
|
||||||
error!("Failed to discover {} nodes: {:?}", NUM_NODES, err);
|
|
||||||
exit(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
let (client, num_clients) = get_multi_client(&nodes);
|
|
||||||
|
|
||||||
info!("clients: {}", num_clients);
|
|
||||||
assert!(num_clients >= NUM_NODES);
|
|
||||||
|
|
||||||
const NUM_SIGNERS: u64 = 2;
|
|
||||||
airdrop_lamports(
|
|
||||||
&client,
|
|
||||||
&drone_addr,
|
|
||||||
&config.identity,
|
|
||||||
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
|
||||||
);
|
|
||||||
|
|
||||||
do_bench_exchange(vec![client], config);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_exchange_bank_client() {
|
|
||||||
solana_logger::setup();
|
|
||||||
let (genesis_config, identity) = create_genesis_config(100_000_000_000_000);
|
|
||||||
let mut bank = Bank::new(&genesis_config);
|
|
||||||
bank.add_instruction_processor(id(), process_instruction);
|
|
||||||
let clients = vec![BankClient::new(bank)];
|
|
||||||
|
|
||||||
let mut config = Config::default();
|
|
||||||
config.identity = identity;
|
|
||||||
config.duration = Duration::from_secs(1);
|
|
||||||
config.fund_amount = 100_000;
|
|
||||||
config.threads = 1;
|
|
||||||
config.transfer_delay = 20; // 0;
|
|
||||||
config.batch_size = 100; // 1500;
|
|
||||||
config.chunk_size = 10; // 1500;
|
|
||||||
config.account_groups = 1; // 50;
|
|
||||||
|
|
||||||
do_bench_exchange(clients, config);
|
|
||||||
}
|
|
2
bench-streamer/.gitignore
vendored
@ -1,2 +0,0 @@
|
|||||||
/target/
|
|
||||||
/farf/
|
|
@ -2,14 +2,17 @@
|
|||||||
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.21.2"
|
version = "0.13.3"
|
||||||
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-clap-utils = { path = "../clap-utils", version = "0.21.2" }
|
solana = { path = "../core", version = "0.13.3" }
|
||||||
solana-core = { path = "../core", version = "0.21.2" }
|
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||||
solana-logger = { path = "../logger", version = "0.21.2" }
|
solana-netutil = { path = "../netutil", version = "0.13.3" }
|
||||||
solana-net-utils = { path = "../net-utils", version = "0.21.2" }
|
|
||||||
|
[features]
|
||||||
|
cuda = ["solana/cuda"]
|
||||||
|
erasure = []
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use clap::{crate_description, crate_name, App, Arg};
|
use clap::{crate_description, crate_name, crate_version, App, Arg};
|
||||||
use solana_core::packet::{Packet, Packets, PacketsRecycler, PACKET_DATA_SIZE};
|
use solana::packet::{Packet, SharedPackets, BLOB_SIZE, PACKET_DATA_SIZE};
|
||||||
use solana_core::result::Result;
|
use solana::result::Result;
|
||||||
use solana_core::streamer::{receiver, PacketReceiver};
|
use solana::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};
|
||||||
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
||||||
@ -14,21 +14,21 @@ use std::time::SystemTime;
|
|||||||
|
|
||||||
fn producer(addr: &SocketAddr, exit: Arc<AtomicBool>) -> JoinHandle<()> {
|
fn producer(addr: &SocketAddr, exit: Arc<AtomicBool>) -> JoinHandle<()> {
|
||||||
let send = UdpSocket::bind("0.0.0.0:0").unwrap();
|
let send = UdpSocket::bind("0.0.0.0:0").unwrap();
|
||||||
let mut msgs = Packets::default();
|
let msgs = SharedPackets::default();
|
||||||
msgs.packets.resize(10, Packet::default());
|
let msgs_ = msgs.clone();
|
||||||
for w in msgs.packets.iter_mut() {
|
msgs.write().unwrap().packets.resize(10, Packet::default());
|
||||||
|
for w in &mut msgs.write().unwrap().packets {
|
||||||
w.meta.size = PACKET_DATA_SIZE;
|
w.meta.size = PACKET_DATA_SIZE;
|
||||||
w.meta.set_addr(&addr);
|
w.meta.set_addr(&addr);
|
||||||
}
|
}
|
||||||
let msgs = Arc::new(msgs);
|
|
||||||
spawn(move || loop {
|
spawn(move || loop {
|
||||||
if exit.load(Ordering::Relaxed) {
|
if exit.load(Ordering::Relaxed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let mut num = 0;
|
let mut num = 0;
|
||||||
for p in &msgs.packets {
|
for p in &msgs_.read().unwrap().packets {
|
||||||
let a = p.meta.addr();
|
let a = p.meta.addr();
|
||||||
assert!(p.meta.size < PACKET_DATA_SIZE);
|
assert!(p.meta.size < BLOB_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;
|
||||||
}
|
}
|
||||||
@ -43,7 +43,7 @@ fn sink(exit: Arc<AtomicBool>, rvs: Arc<AtomicUsize>, r: PacketReceiver) -> Join
|
|||||||
}
|
}
|
||||||
let timer = Duration::new(1, 0);
|
let timer = Duration::new(1, 0);
|
||||||
if let Ok(msgs) = r.recv_timeout(timer) {
|
if let Ok(msgs) = r.recv_timeout(timer) {
|
||||||
rvs.fetch_add(msgs.packets.len(), Ordering::Relaxed);
|
rvs.fetch_add(msgs.read().unwrap().packets.len(), Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -53,7 +53,7 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
let matches = App::new(crate_name!())
|
let matches = App::new(crate_name!())
|
||||||
.about(crate_description!())
|
.about(crate_description!())
|
||||||
.version(solana_clap_utils::version!())
|
.version(crate_version!())
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("num-recv-sockets")
|
Arg::with_name("num-recv-sockets")
|
||||||
.long("num-recv-sockets")
|
.long("num-recv-sockets")
|
||||||
@ -74,9 +74,8 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
let mut read_channels = Vec::new();
|
let mut read_channels = Vec::new();
|
||||||
let mut read_threads = Vec::new();
|
let mut read_threads = Vec::new();
|
||||||
let recycler = PacketsRecycler::default();
|
|
||||||
for _ in 0..num_sockets {
|
for _ in 0..num_sockets {
|
||||||
let read = solana_net_utils::bind_to(port, false).unwrap();
|
let read = solana_netutil::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();
|
||||||
@ -84,13 +83,7 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
let (s_reader, r_reader) = channel();
|
let (s_reader, r_reader) = channel();
|
||||||
read_channels.push(r_reader);
|
read_channels.push(r_reader);
|
||||||
read_threads.push(receiver(
|
read_threads.push(receiver(Arc::new(read), &exit, s_reader, "bench-streamer"));
|
||||||
Arc::new(read),
|
|
||||||
&exit,
|
|
||||||
s_reader,
|
|
||||||
recycler.clone(),
|
|
||||||
"bench-streamer-test",
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let t_producer1 = producer(&addr, exit.clone());
|
let t_producer1 = producer(&addr, exit.clone());
|
||||||
|
4
bench-tps/.gitignore
vendored
@ -1,4 +0,0 @@
|
|||||||
/target/
|
|
||||||
/config/
|
|
||||||
/config-local/
|
|
||||||
/farf/
|
|
@ -2,38 +2,23 @@
|
|||||||
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.21.2"
|
version = "0.13.3"
|
||||||
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"
|
|
||||||
clap = "2.33.0"
|
clap = "2.33.0"
|
||||||
log = "0.4.8"
|
rayon = "1.0.3"
|
||||||
rayon = "1.2.0"
|
serde_json = "1.0.39"
|
||||||
serde = "1.0.102"
|
solana = { path = "../core", version = "0.13.3" }
|
||||||
serde_derive = "1.0.102"
|
solana-client = { path = "../client", version = "0.13.3" }
|
||||||
serde_json = "1.0.41"
|
solana-drone = { path = "../drone", version = "0.13.3" }
|
||||||
serde_yaml = "0.8.11"
|
solana-logger = { path = "../logger", version = "0.13.3" }
|
||||||
solana-clap-utils = { path = "../clap-utils", version = "0.21.2" }
|
solana-metrics = { path = "../metrics", version = "0.13.3" }
|
||||||
solana-core = { path = "../core", version = "0.21.2" }
|
solana-netutil = { path = "../netutil", version = "0.13.3" }
|
||||||
solana-genesis = { path = "../genesis", version = "0.21.2" }
|
solana-sdk = { path = "../sdk", version = "0.13.3" }
|
||||||
solana-client = { path = "../client", version = "0.21.2" }
|
|
||||||
solana-drone = { path = "../drone", version = "0.21.2" }
|
|
||||||
solana-librapay-api = { path = "../programs/librapay_api", version = "0.21.2", optional = true }
|
|
||||||
solana-logger = { path = "../logger", version = "0.21.2" }
|
|
||||||
solana-metrics = { path = "../metrics", version = "0.21.2" }
|
|
||||||
solana-measure = { path = "../measure", version = "0.21.2" }
|
|
||||||
solana-net-utils = { path = "../net-utils", version = "0.21.2" }
|
|
||||||
solana-runtime = { path = "../runtime", version = "0.21.2" }
|
|
||||||
solana-sdk = { path = "../sdk", version = "0.21.2" }
|
|
||||||
solana-move-loader-program = { path = "../programs/move_loader", version = "0.21.2", optional = true }
|
|
||||||
|
|
||||||
[dev-dependencies]
|
|
||||||
serial_test = "0.2.0"
|
|
||||||
serial_test_derive = "0.2.0"
|
|
||||||
solana-local-cluster = { path = "../local-cluster", version = "0.21.2" }
|
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
move = ["solana-librapay-api", "solana-move-loader-program"]
|
cuda = ["solana/cuda"]
|
||||||
|
erasure = []
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
use clap::{crate_description, crate_name, App, Arg, ArgMatches};
|
use std::net::SocketAddr;
|
||||||
use solana_drone::drone::DRONE_PORT;
|
use std::process::exit;
|
||||||
use solana_sdk::fee_calculator::FeeCalculator;
|
use std::time::Duration;
|
||||||
use solana_sdk::signature::{read_keypair_file, Keypair, KeypairUtil};
|
|
||||||
use std::{net::SocketAddr, process::exit, time::Duration};
|
|
||||||
|
|
||||||
const NUM_LAMPORTS_PER_ACCOUNT_DEFAULT: u64 = solana_sdk::native_token::SOL_LAMPORTS;
|
use clap::{crate_description, crate_name, crate_version, App, Arg, ArgMatches};
|
||||||
|
use solana_drone::drone::DRONE_PORT;
|
||||||
|
use solana_sdk::signature::{read_keypair, Keypair, KeypairUtil};
|
||||||
|
|
||||||
/// 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 network_addr: SocketAddr,
|
||||||
pub drone_addr: SocketAddr,
|
pub drone_addr: SocketAddr,
|
||||||
pub id: Keypair,
|
pub id: Keypair,
|
||||||
pub threads: usize,
|
pub threads: usize,
|
||||||
@ -17,49 +17,35 @@ pub struct Config {
|
|||||||
pub tx_count: usize,
|
pub tx_count: 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 write_to_client_file: bool,
|
|
||||||
pub read_from_client_file: bool,
|
|
||||||
pub target_lamports_per_signature: u64,
|
|
||||||
pub multi_client: bool,
|
|
||||||
pub use_move: bool,
|
|
||||||
pub num_lamports_per_account: u64,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Config {
|
impl Default for Config {
|
||||||
fn default() -> Config {
|
fn default() -> Config {
|
||||||
Config {
|
Config {
|
||||||
entrypoint_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
network_addr: SocketAddr::from(([127, 0, 0, 1], 8001)),
|
||||||
drone_addr: SocketAddr::from(([127, 0, 0, 1], DRONE_PORT)),
|
drone_addr: SocketAddr::from(([127, 0, 0, 1], DRONE_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: 500_000,
|
||||||
thread_batch_sleep_ms: 1000,
|
thread_batch_sleep_ms: 0,
|
||||||
sustained: false,
|
sustained: false,
|
||||||
client_ids_and_stake_file: String::new(),
|
|
||||||
write_to_client_file: false,
|
|
||||||
read_from_client_file: false,
|
|
||||||
target_lamports_per_signature: FeeCalculator::default().target_lamports_per_signature,
|
|
||||||
multi_client: true,
|
|
||||||
use_move: false,
|
|
||||||
num_lamports_per_account: NUM_LAMPORTS_PER_ACCOUNT_DEFAULT,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 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>(version: &'b str) -> App<'a, 'b> {
|
pub fn build_args<'a, 'b>() -> App<'a, 'b> {
|
||||||
App::new(crate_name!()).about(crate_description!())
|
App::new(crate_name!()).about(crate_description!())
|
||||||
.version(version)
|
.version(crate_version!())
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("entrypoint")
|
Arg::with_name("network")
|
||||||
.short("n")
|
.short("n")
|
||||||
.long("entrypoint")
|
.long("network")
|
||||||
.value_name("HOST:PORT")
|
.value_name("HOST:PORT")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.help("Rendezvous with the cluster at this entry point; defaults to 127.0.0.1:8001"),
|
.help("Rendezvous with the network at this gossip entry point; defaults to 127.0.0.1:8001"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("drone")
|
Arg::with_name("drone")
|
||||||
@ -67,7 +53,7 @@ pub fn build_args<'a, 'b>(version: &'b str) -> App<'a, 'b> {
|
|||||||
.long("drone")
|
.long("drone")
|
||||||
.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 drone; defaults to network:DRONE_PORT"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("identity")
|
Arg::with_name("identity")
|
||||||
@ -105,16 +91,6 @@ pub fn build_args<'a, 'b>(version: &'b str) -> App<'a, 'b> {
|
|||||||
.long("sustained")
|
.long("sustained")
|
||||||
.help("Use sustained performance mode vs. peak mode. This overlaps the tx generation with transfers."),
|
.help("Use sustained performance mode vs. peak mode. This overlaps the tx generation with transfers."),
|
||||||
)
|
)
|
||||||
.arg(
|
|
||||||
Arg::with_name("use-move")
|
|
||||||
.long("use-move")
|
|
||||||
.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")
|
||||||
@ -130,39 +106,6 @@ pub fn build_args<'a, 'b>(version: &'b str) -> App<'a, 'b> {
|
|||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.help("Per-thread-per-iteration sleep in ms"),
|
.help("Per-thread-per-iteration sleep in ms"),
|
||||||
)
|
)
|
||||||
.arg(
|
|
||||||
Arg::with_name("write-client-keys")
|
|
||||||
.long("write-client-keys")
|
|
||||||
.value_name("FILENAME")
|
|
||||||
.takes_value(true)
|
|
||||||
.help("Generate client keys and stakes and write the list to YAML file"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("read-client-keys")
|
|
||||||
.long("read-client-keys")
|
|
||||||
.value_name("FILENAME")
|
|
||||||
.takes_value(true)
|
|
||||||
.help("Read client keys and stakes from the YAML file"),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("target_lamports_per_signature")
|
|
||||||
.long("target-lamports-per-signature")
|
|
||||||
.value_name("LAMPORTS")
|
|
||||||
.takes_value(true)
|
|
||||||
.help(
|
|
||||||
"The cost in lamports that the cluster will charge for signature \
|
|
||||||
verification when the cluster is operating at target-signatures-per-slot",
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::with_name("num_lamports_per_account")
|
|
||||||
.long("num-lamports-per-account")
|
|
||||||
.value_name("LAMPORTS")
|
|
||||||
.takes_value(true)
|
|
||||||
.help(
|
|
||||||
"Number of lamports per account.",
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses a clap `ArgMatches` structure into a `Config`
|
/// Parses a clap `ArgMatches` structure into a `Config`
|
||||||
@ -173,22 +116,22 @@ pub fn build_args<'a, 'b>(version: &'b str) -> 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();
|
||||||
|
|
||||||
if let Some(addr) = matches.value_of("entrypoint") {
|
if let Some(addr) = matches.value_of("network") {
|
||||||
args.entrypoint_addr = solana_net_utils::parse_host_port(addr).unwrap_or_else(|e| {
|
args.network_addr = solana_netutil::parse_host_port(addr).unwrap_or_else(|e| {
|
||||||
eprintln!("failed to parse entrypoint address: {}", e);
|
eprintln!("failed to parse network address: {}", e);
|
||||||
exit(1)
|
exit(1)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(addr) = matches.value_of("drone") {
|
if let Some(addr) = matches.value_of("drone") {
|
||||||
args.drone_addr = solana_net_utils::parse_host_port(addr).unwrap_or_else(|e| {
|
args.drone_addr = solana_netutil::parse_host_port(addr).unwrap_or_else(|e| {
|
||||||
eprintln!("failed to parse drone address: {}", e);
|
eprintln!("failed to parse drone address: {}", e);
|
||||||
exit(1)
|
exit(1)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if matches.is_present("identity") {
|
if matches.is_present("identity") {
|
||||||
args.id = read_keypair_file(matches.value_of("identity").unwrap())
|
args.id = read_keypair(matches.value_of("identity").unwrap())
|
||||||
.expect("can't read client identity");
|
.expect("can't read client identity");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -220,27 +163,5 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
|
|||||||
|
|
||||||
args.sustained = matches.is_present("sustained");
|
args.sustained = matches.is_present("sustained");
|
||||||
|
|
||||||
if let Some(s) = matches.value_of("write-client-keys") {
|
|
||||||
args.write_to_client_file = true;
|
|
||||||
args.client_ids_and_stake_file = s.to_string();
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(s) = matches.value_of("read-client-keys") {
|
|
||||||
assert!(!args.write_to_client_file);
|
|
||||||
args.read_from_client_file = true;
|
|
||||||
args.client_ids_and_stake_file = s.to_string();
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(v) = matches.value_of("target_lamports_per_signature") {
|
|
||||||
args.target_lamports_per_signature = v.to_string().parse().expect("can't parse lamports");
|
|
||||||
}
|
|
||||||
|
|
||||||
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") {
|
|
||||||
args.num_lamports_per_account = v.to_string().parse().expect("can't parse lamports");
|
|
||||||
}
|
|
||||||
|
|
||||||
args
|
args
|
||||||
}
|
}
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
pub mod bench;
|
|
||||||
pub mod cli;
|
|
@ -1,141 +1,15 @@
|
|||||||
use log::*;
|
mod bench;
|
||||||
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs, generate_keypairs};
|
mod cli;
|
||||||
use solana_bench_tps::cli;
|
|
||||||
use solana_core::gossip_service::{discover_cluster, get_client, get_multi_client};
|
|
||||||
use solana_genesis::Base64Account;
|
|
||||||
use solana_sdk::fee_calculator::FeeCalculator;
|
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
|
||||||
use solana_sdk::system_program;
|
|
||||||
use std::{collections::HashMap, fs::File, io::prelude::*, path::Path, process::exit};
|
|
||||||
|
|
||||||
/// Number of signatures for all transactions in ~1 week at ~100K TPS
|
use crate::bench::do_bench_tps;
|
||||||
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();
|
||||||
solana_metrics::set_panic_hook("bench-tps");
|
solana_metrics::set_panic_hook("bench-tps");
|
||||||
|
|
||||||
let matches = cli::build_args(solana_clap_utils::version!()).get_matches();
|
let matches = cli::build_args().get_matches();
|
||||||
let cli_config = cli::extract_args(&matches);
|
|
||||||
|
|
||||||
let cli::Config {
|
let cfg = cli::extract_args(&matches);
|
||||||
entrypoint_addr,
|
|
||||||
drone_addr,
|
|
||||||
id,
|
|
||||||
num_nodes,
|
|
||||||
tx_count,
|
|
||||||
client_ids_and_stake_file,
|
|
||||||
write_to_client_file,
|
|
||||||
read_from_client_file,
|
|
||||||
target_lamports_per_signature,
|
|
||||||
use_move,
|
|
||||||
multi_client,
|
|
||||||
num_lamports_per_account,
|
|
||||||
..
|
|
||||||
} = &cli_config;
|
|
||||||
|
|
||||||
if *write_to_client_file {
|
do_bench_tps(cfg);
|
||||||
info!("Generating {} keypairs", *tx_count * 2);
|
|
||||||
let (keypairs, _) = generate_keypairs(&id, *tx_count as u64 * 2);
|
|
||||||
let num_accounts = keypairs.len() as u64;
|
|
||||||
let max_fee =
|
|
||||||
FeeCalculator::new(*target_lamports_per_signature, 0).max_lamports_per_signature;
|
|
||||||
let num_lamports_per_account = (num_accounts - 1 + NUM_SIGNATURES_FOR_TXS * max_fee)
|
|
||||||
/ num_accounts
|
|
||||||
+ num_lamports_per_account;
|
|
||||||
let mut accounts = HashMap::new();
|
|
||||||
keypairs.iter().for_each(|keypair| {
|
|
||||||
accounts.insert(
|
|
||||||
serde_json::to_string(&keypair.to_bytes().to_vec()).unwrap(),
|
|
||||||
Base64Account {
|
|
||||||
balance: num_lamports_per_account,
|
|
||||||
executable: false,
|
|
||||||
owner: system_program::id().to_string(),
|
|
||||||
data: String::new(),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
info!("Writing {}", client_ids_and_stake_file);
|
|
||||||
let serialized = serde_yaml::to_string(&accounts).unwrap();
|
|
||||||
let path = Path::new(&client_ids_and_stake_file);
|
|
||||||
let mut file = File::create(path).unwrap();
|
|
||||||
file.write_all(&serialized.into_bytes()).unwrap();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
info!("Connecting to the cluster");
|
|
||||||
let (nodes, _archivers) =
|
|
||||||
discover_cluster(&entrypoint_addr, *num_nodes).unwrap_or_else(|err| {
|
|
||||||
eprintln!("Failed to discover {} nodes: {:?}", num_nodes, err);
|
|
||||||
exit(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
client
|
|
||||||
} else {
|
|
||||||
get_client(&nodes)
|
|
||||||
};
|
|
||||||
|
|
||||||
let (keypairs, move_keypairs, keypair_balance) = if *read_from_client_file && !use_move {
|
|
||||||
let path = Path::new(&client_ids_and_stake_file);
|
|
||||||
let file = File::open(path).unwrap();
|
|
||||||
|
|
||||||
info!("Reading {}", client_ids_and_stake_file);
|
|
||||||
let accounts: HashMap<String, Base64Account> = serde_yaml::from_reader(file).unwrap();
|
|
||||||
let mut keypairs = vec![];
|
|
||||||
let mut last_balance = 0;
|
|
||||||
|
|
||||||
accounts
|
|
||||||
.into_iter()
|
|
||||||
.for_each(|(keypair, primordial_account)| {
|
|
||||||
let bytes: Vec<u8> = serde_json::from_str(keypair.as_str()).unwrap();
|
|
||||||
keypairs.push(Keypair::from_bytes(&bytes).unwrap());
|
|
||||||
last_balance = primordial_account.balance;
|
|
||||||
});
|
|
||||||
|
|
||||||
if keypairs.len() < tx_count * 2 {
|
|
||||||
eprintln!(
|
|
||||||
"Expected {} accounts in {}, only received {} (--tx_count mismatch?)",
|
|
||||||
tx_count * 2,
|
|
||||||
client_ids_and_stake_file,
|
|
||||||
keypairs.len(),
|
|
||||||
);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
// Sort keypairs so that do_bench_tps() uses the same subset of accounts for each run.
|
|
||||||
// This prevents the amount of storage needed for bench-tps accounts from creeping up
|
|
||||||
// across multiple runs.
|
|
||||||
keypairs.sort_by(|x, y| x.pubkey().to_string().cmp(&y.pubkey().to_string()));
|
|
||||||
(keypairs, None, last_balance)
|
|
||||||
} else {
|
|
||||||
generate_and_fund_keypairs(
|
|
||||||
&client,
|
|
||||||
Some(*drone_addr),
|
|
||||||
&id,
|
|
||||||
*tx_count,
|
|
||||||
*num_lamports_per_account,
|
|
||||||
*use_move,
|
|
||||||
)
|
|
||||||
.unwrap_or_else(|e| {
|
|
||||||
eprintln!("Error could not fund keys: {:?}", e);
|
|
||||||
exit(1);
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
||||||
do_bench_tps(
|
|
||||||
vec![client],
|
|
||||||
cli_config,
|
|
||||||
keypairs,
|
|
||||||
keypair_balance,
|
|
||||||
move_keypairs,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
@ -1,85 +0,0 @@
|
|||||||
use serial_test_derive::serial;
|
|
||||||
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs};
|
|
||||||
use solana_bench_tps::cli::Config;
|
|
||||||
use solana_client::thin_client::create_client;
|
|
||||||
use solana_core::cluster_info::VALIDATOR_PORT_RANGE;
|
|
||||||
use solana_core::validator::ValidatorConfig;
|
|
||||||
use solana_drone::drone::run_local_drone;
|
|
||||||
use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster};
|
|
||||||
#[cfg(feature = "move")]
|
|
||||||
use solana_sdk::move_loader::solana_move_loader_program;
|
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
|
||||||
use std::sync::mpsc::channel;
|
|
||||||
use std::time::Duration;
|
|
||||||
|
|
||||||
fn test_bench_tps_local_cluster(config: Config) {
|
|
||||||
#[cfg(feature = "move")]
|
|
||||||
let native_instruction_processors = vec![solana_move_loader_program()];
|
|
||||||
|
|
||||||
#[cfg(not(feature = "move"))]
|
|
||||||
let native_instruction_processors = vec![];
|
|
||||||
|
|
||||||
solana_logger::setup();
|
|
||||||
const NUM_NODES: usize = 1;
|
|
||||||
let cluster = LocalCluster::new(&ClusterConfig {
|
|
||||||
node_stakes: vec![999_990; NUM_NODES],
|
|
||||||
cluster_lamports: 200_000_000,
|
|
||||||
validator_configs: vec![ValidatorConfig::default(); NUM_NODES],
|
|
||||||
native_instruction_processors,
|
|
||||||
..ClusterConfig::default()
|
|
||||||
});
|
|
||||||
|
|
||||||
let drone_keypair = Keypair::new();
|
|
||||||
cluster.transfer(
|
|
||||||
&cluster.funding_keypair,
|
|
||||||
&drone_keypair.pubkey(),
|
|
||||||
100_000_000,
|
|
||||||
);
|
|
||||||
|
|
||||||
let client = create_client(
|
|
||||||
(cluster.entry_point_info.rpc, cluster.entry_point_info.tpu),
|
|
||||||
VALIDATOR_PORT_RANGE,
|
|
||||||
);
|
|
||||||
|
|
||||||
let (addr_sender, addr_receiver) = channel();
|
|
||||||
run_local_drone(drone_keypair, addr_sender, None);
|
|
||||||
let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
|
||||||
|
|
||||||
let lamports_per_account = 100;
|
|
||||||
|
|
||||||
let (keypairs, move_keypairs, _keypair_balance) = generate_and_fund_keypairs(
|
|
||||||
&client,
|
|
||||||
Some(drone_addr),
|
|
||||||
&config.id,
|
|
||||||
config.tx_count,
|
|
||||||
lamports_per_account,
|
|
||||||
config.use_move,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let _total = do_bench_tps(vec![client], config, keypairs, 0, move_keypairs);
|
|
||||||
|
|
||||||
#[cfg(not(debug_assertions))]
|
|
||||||
assert!(_total > 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[serial]
|
|
||||||
fn test_bench_tps_local_cluster_solana() {
|
|
||||||
let mut config = Config::default();
|
|
||||||
config.tx_count = 100;
|
|
||||||
config.duration = Duration::from_secs(10);
|
|
||||||
|
|
||||||
test_bench_tps_local_cluster(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[serial]
|
|
||||||
fn test_bench_tps_local_cluster_move() {
|
|
||||||
let mut config = Config::default();
|
|
||||||
config.tx_count = 100;
|
|
||||||
config.duration = Duration::from_secs(10);
|
|
||||||
config.use_move = true;
|
|
||||||
|
|
||||||
test_bench_tps_local_cluster(config);
|
|
||||||
}
|
|
15
book/art/consensus.msc
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
msc {
|
||||||
|
client,leader,verifier_a,verifier_b,verifier_c;
|
||||||
|
|
||||||
|
client=>leader [ label = "SUBMIT" ] ;
|
||||||
|
leader=>client [ label = "CONFIRMED" ] ;
|
||||||
|
leader=>verifier_a [ label = "CONFIRMED" ] ;
|
||||||
|
leader=>verifier_b [ label = "CONFIRMED" ] ;
|
||||||
|
leader=>verifier_c [ label = "CONFIRMED" ] ;
|
||||||
|
verifier_a=>leader [ label = "VERIFIED" ] ;
|
||||||
|
verifier_b=>leader [ label = "VERIFIED" ] ;
|
||||||
|
leader=>client [ label = "FINALIZED" ] ;
|
||||||
|
leader=>verifier_a [ label = "FINALIZED" ] ;
|
||||||
|
leader=>verifier_b [ label = "FINALIZED" ] ;
|
||||||
|
leader=>verifier_c [ label = "FINALIZED" ] ;
|
||||||
|
}
|
@ -1,19 +0,0 @@
|
|||||||
+------------------------------------------------------------------+
|
|
||||||
| |
|
|
||||||
| +-----------------+ Neighborhood 0 +-----------------+ |
|
|
||||||
| | +--------------------->+ | |
|
|
||||||
| | Validator 1 | | Validator 2 | |
|
|
||||||
| | +<---------------------+ | |
|
|
||||||
| +--------+-+------+ +------+-+--------+ |
|
|
||||||
| | | | | |
|
|
||||||
| | +-----------------------------+ | | |
|
|
||||||
| | +------------------------+------+ | |
|
|
||||||
| | | | | |
|
|
||||||
+------------------------------------------------------------------+
|
|
||||||
| | | |
|
|
||||||
v v v v
|
|
||||||
+---------+------+---+ +-+--------+---------+
|
|
||||||
| | | |
|
|
||||||
| Neighborhood 1 | | Neighborhood 2 |
|
|
||||||
| | | |
|
|
||||||
+--------------------+ +--------------------+
|
|
@ -1,15 +0,0 @@
|
|||||||
+--------------+
|
|
||||||
| |
|
|
||||||
+------------+ Leader +------------+
|
|
||||||
| | | |
|
|
||||||
| +--------------+ |
|
|
||||||
v v
|
|
||||||
+------------+----------------------------------------+------------+
|
|
||||||
| |
|
|
||||||
| +-----------------+ Neighborhood 0 +-----------------+ |
|
|
||||||
| | +--------------------->+ | |
|
|
||||||
| | Validator 1 | | Validator 2 | |
|
|
||||||
| | +<---------------------+ | |
|
|
||||||
| +-----------------+ +-----------------+ |
|
|
||||||
| |
|
|
||||||
+------------------------------------------------------------------+
|
|
@ -1,18 +1,28 @@
|
|||||||
+--------------------+
|
|
||||||
| |
|
+--------------+
|
||||||
+--------+ Neighborhood 0 +----------+
|
| |
|
||||||
| | | |
|
+------------+ Leader +------------+
|
||||||
| +--------------------+ |
|
| | | |
|
||||||
v v
|
| +--------------+ |
|
||||||
+---------+----------+ +----------+---------+
|
v v
|
||||||
| | | |
|
+--------+--------+ +--------+--------+
|
||||||
| Neighborhood 1 | | Neighborhood 2 |
|
| +--------------------->+ |
|
||||||
| | | |
|
+-----------------+ Validator 1 | | Validator 2 +-------------+
|
||||||
+---+-----+----------+ +----------+-----+---+
|
| | +<---------------------+ | |
|
||||||
| | | |
|
| +------+-+-+------+ +---+-+-+---------+ |
|
||||||
v v v v
|
| | | | | | | |
|
||||||
+------------------+-+ +-+------------------+ +------------------+-+ +-+------------------+
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| +---------------------------------------------+ | | |
|
||||||
| Neighborhood 3 | | Neighborhood 4 | | Neighborhood 5 | | Neighborhood 6 |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| | | | | +----------------------+ | |
|
||||||
+--------------------+ +--------------------+ +--------------------+ +--------------------+
|
| | | | | | | |
|
||||||
|
| | | | +--------------------------------------------+ |
|
||||||
|
| | | | | | | |
|
||||||
|
| | | +----------------------+ | | |
|
||||||
|
| | | | | | | |
|
||||||
|
v v v v v v v v
|
||||||
|
+--------------------+ +--------------------+ +--------------------+ +--------------------+
|
||||||
|
| | | | | | | |
|
||||||
|
| Neighborhood 1 | | Neighborhood 2 | | Neighborhood 3 | | Neighborhood 4 |
|
||||||
|
| | | | | | | |
|
||||||
|
+--------------------+ +--------------------+ +--------------------+ +--------------------+
|
||||||
|
30
book/art/fullnode.bob
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
.--------------------------------------.
|
||||||
|
| Fullnode |
|
||||||
|
| |
|
||||||
|
.--------. | .-------------------. |
|
||||||
|
| |---->| | |
|
||||||
|
| Client | | | JSON RPC Service | |
|
||||||
|
| |<----| | |
|
||||||
|
`----+---` | `-------------------` |
|
||||||
|
| | ^ |
|
||||||
|
| | | .----------------. | .------------------.
|
||||||
|
| | | | Gossip Service |<----------| Validators |
|
||||||
|
| | | `----------------` | | |
|
||||||
|
| | | ^ | | |
|
||||||
|
| | | | | | .------------. |
|
||||||
|
| | .---+---. .----+---. .-----------. | | | | |
|
||||||
|
| | | Bank |<-+ Replay | | BlobFetch |<------+ Upstream | |
|
||||||
|
| | | Forks | | Stage | | Stage | | | | Validators | |
|
||||||
|
| | `-------` `--------` `--+--------` | | | | |
|
||||||
|
| | ^ ^ | | | `------------` |
|
||||||
|
| | | | v | | |
|
||||||
|
| | | .--+--------. | | |
|
||||||
|
| | | | Blocktree | | | |
|
||||||
|
| | | `-----------` | | .------------. |
|
||||||
|
| | | ^ | | | | |
|
||||||
|
| | | | | | | Downstream | |
|
||||||
|
| | .--+--. .-------+---. | | | Validators | |
|
||||||
|
`-------->| TPU +---->| Broadcast +--------------->| | |
|
||||||
|
| `-----` | Stage | | | `------------` |
|
||||||
|
| `-----------` | `------------------`
|
||||||
|
`--------------------------------------`
|
@ -1,18 +0,0 @@
|
|||||||
+------------+
|
|
||||||
| Bank-Merkle|
|
|
||||||
+------------+
|
|
||||||
^ ^
|
|
||||||
/ \
|
|
||||||
+-----------------+ +-------------+
|
|
||||||
| Bank-Diff-Merkle| | Block-Merkle|
|
|
||||||
+-----------------+ +-------------+
|
|
||||||
^ ^
|
|
||||||
/ \
|
|
||||||
+------+ +--------------------------+
|
|
||||||
| Hash | | Previous Bank-Diff-Merkle|
|
|
||||||
+------+ +--------------------------+
|
|
||||||
^ ^
|
|
||||||
/ \
|
|
||||||
+---------------+ +---------------+
|
|
||||||
| Hash(Account1)| | Hash(Account2)|
|
|
||||||
+---------------+ +---------------+
|
|
@ -1,19 +0,0 @@
|
|||||||
+---------------+
|
|
||||||
| Block-Merkle |
|
|
||||||
+---------------+
|
|
||||||
^ ^
|
|
||||||
/ \
|
|
||||||
+-------------+ +-------------+
|
|
||||||
| Entry-Merkle| | Entry-Merkle|
|
|
||||||
+-------------+ +-------------+
|
|
||||||
^ ^
|
|
||||||
/ \
|
|
||||||
+-------+ +-------+
|
|
||||||
| Hash | | Hash |
|
|
||||||
+-------+ +-------+
|
|
||||||
^ ^ ^ ^
|
|
||||||
/ | | \
|
|
||||||
+-----------------+ +-----------------+ +-----------------+ +---+
|
|
||||||
| Hash(T1, status)| | Hash(T2, status)| | Hash(T3, status)| | 0 |
|
|
||||||
+-----------------+ +-----------------+ +-----------------+ +---+
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
|||||||
| TVU | |
|
| TVU | |
|
||||||
| | |
|
| | |
|
||||||
| .-------. .------------. .----+---. .---------. |
|
| .-------. .------------. .----+---. .---------. |
|
||||||
.------------. | | Shred | | Retransmit | | Replay | | Storage | |
|
.------------. | | Blob | | Retransmit | | Replay | | Storage | |
|
||||||
| Upstream +----->| Fetch +-->| Stage +-->| Stage +-->| Stage | |
|
| Upstream +----->| Fetch +-->| Stage +-->| Stage +-->| Stage | |
|
||||||
| Validators | | | Stage | | | | | | | |
|
| Validators | | | Stage | | | | | | | |
|
||||||
`------------` | `-------` `----+-------` `----+---` `---------` |
|
`------------` | `-------` `----+-------` `----+---` `---------` |
|
||||||
|
@ -1,60 +0,0 @@
|
|||||||
|
|
||||||
.------------.
|
|
||||||
| Upstream |
|
|
||||||
| Validators |
|
|
||||||
`----+-------`
|
|
||||||
|
|
|
||||||
|
|
|
||||||
.-----------------------------------.
|
|
||||||
| Validator | |
|
|
||||||
| v |
|
|
||||||
| .-----------. .------------. |
|
|
||||||
.--------. | | Fetch | | Repair | |
|
|
||||||
| Client +---->| Stage | | Stage | |
|
|
||||||
`--------` | `---+-------` `----+-------` |
|
|
||||||
| | | |
|
|
||||||
| v v |
|
|
||||||
| .-----------. .------------. |
|
|
||||||
| | TPU |<-->| Blockstore | |
|
|
||||||
| | | | | |
|
|
||||||
| `-----------` `----+-------` |
|
|
||||||
| | |
|
|
||||||
| v |
|
|
||||||
| .------------. |
|
|
||||||
| | Multicast | |
|
|
||||||
| | Stage | |
|
|
||||||
| `----+-------` |
|
|
||||||
| | |
|
|
||||||
`-----------------------------------`
|
|
||||||
|
|
|
||||||
v
|
|
||||||
.------------.
|
|
||||||
| Downstream |
|
|
||||||
| Validators |
|
|
||||||
`------------`
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.------------.
|
|
||||||
| PoH |
|
|
||||||
| Service |
|
|
||||||
`-------+----`
|
|
||||||
^ |
|
|
||||||
| |
|
|
||||||
.-----------------------------------.
|
|
||||||
| TPU | | |
|
|
||||||
| | v |
|
|
||||||
.-------. | .-----------. .---+--------. | .------------.
|
|
||||||
| Fetch +---->| SigVerify +--->| Banking |<--->| Blockstore |
|
|
||||||
| Stage | | | Stage | | Stage | | | |
|
|
||||||
`-------` | `-----------` `-----+------` | `------------`
|
|
||||||
| | |
|
|
||||||
| | |
|
|
||||||
`-----------------------------------`
|
|
||||||
|
|
|
||||||
v
|
|
||||||
.------------.
|
|
||||||
| Banktree |
|
|
||||||
| |
|
|
||||||
`------------`
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
|||||||
.---------------------------------------.
|
|
||||||
| Validator |
|
|
||||||
| |
|
|
||||||
.--------. | .-------------------. |
|
|
||||||
| |---->| | |
|
|
||||||
| Client | | | JSON RPC Service | |
|
|
||||||
| |<----| | |
|
|
||||||
`----+---` | `-------------------` |
|
|
||||||
| | ^ |
|
|
||||||
| | | .----------------. | .------------------.
|
|
||||||
| | | | Gossip Service |<-----------| Validators |
|
|
||||||
| | | `----------------` | | |
|
|
||||||
| | | ^ | | |
|
|
||||||
| | | | | | .------------. |
|
|
||||||
| | .---+---. .----+---. .------------. | | | | |
|
|
||||||
| | | Bank |<-+ Replay | | ShredFetch |<------+ Upstream | |
|
|
||||||
| | | Forks | | Stage | | Stage | | | | Validators | |
|
|
||||||
| | `-------` `--------` `--+---------` | | | | |
|
|
||||||
| | ^ ^ | | | `------------` |
|
|
||||||
| | | | v | | |
|
|
||||||
| | | .--+--------. | | |
|
|
||||||
| | | | Blocktree | | | |
|
|
||||||
| | | `-----------` | | .------------. |
|
|
||||||
| | | ^ | | | | |
|
|
||||||
| | | | | | | Downstream | |
|
|
||||||
| | .--+--. .-------+---. | | | Validators | |
|
|
||||||
`-------->| TPU +---->| Broadcast +---------------->| | |
|
|
||||||
| `-----` | Stage | | | `------------` |
|
|
||||||
| `-----------` | `------------------`
|
|
||||||
`---------------------------------------`
|
|
@ -1,34 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
cd "$(dirname "$0")"
|
|
||||||
|
|
||||||
usage=$(cargo -q run -p solana-cli -- -C ~/.foo --help | sed 's|'"$HOME"'|~|g')
|
|
||||||
|
|
||||||
out=${1:-src/api-reference/cli.md}
|
|
||||||
|
|
||||||
cat src/api-reference/.cli.md > "$out"
|
|
||||||
|
|
||||||
section() {
|
|
||||||
declare mark=${2:-"###"}
|
|
||||||
declare section=$1
|
|
||||||
read -r name rest <<<"$section"
|
|
||||||
|
|
||||||
printf '%s %s
|
|
||||||
' "$mark" "$name"
|
|
||||||
printf '```text
|
|
||||||
%s
|
|
||||||
```
|
|
||||||
|
|
||||||
' "$section"
|
|
||||||
}
|
|
||||||
|
|
||||||
section "$usage" >> "$out"
|
|
||||||
|
|
||||||
in_subcommands=0
|
|
||||||
while read -r subcommand rest; do
|
|
||||||
[[ $subcommand == "SUBCOMMANDS:" ]] && in_subcommands=1 && continue
|
|
||||||
if ((in_subcommands)); then
|
|
||||||
section "$(cargo -q run -p solana-cli -- help "$subcommand" | sed 's|'"$HOME"'|~|g')" "####" >> "$out"
|
|
||||||
fi
|
|
||||||
done <<<"$usage">>"$out"
|
|
@ -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
|
|
@ -3,4 +3,16 @@ set -e
|
|||||||
|
|
||||||
cd "$(dirname "$0")"
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
make -j"$(nproc)" test
|
cargo_install_unless() {
|
||||||
|
declare crate=$1
|
||||||
|
shift
|
||||||
|
|
||||||
|
"$@" > /dev/null 2>&1 || \
|
||||||
|
cargo install "$crate"
|
||||||
|
}
|
||||||
|
|
||||||
|
export PATH=$CARGO_HOME/bin:$PATH
|
||||||
|
cargo_install_unless mdbook mdbook --help
|
||||||
|
cargo_install_unless svgbob_cli svgbob --help
|
||||||
|
|
||||||
|
make -j"$(nproc)"
|
||||||
|
@ -1,41 +1,31 @@
|
|||||||
BOB_SRCS=$(wildcard art/*.bob)
|
BOB_SRCS=$(wildcard art/*.bob)
|
||||||
MSC_SRCS=$(wildcard art/*.msc)
|
|
||||||
MD_SRCS=$(wildcard src/*.md)
|
MD_SRCS=$(wildcard src/*.md)
|
||||||
|
|
||||||
SVG_IMGS=$(BOB_SRCS:art/%.bob=src/.gitbook/assets/%.svg) $(MSC_SRCS:art/%.msc=src/.gitbook/assets/%.svg)
|
SVG_IMGS=$(BOB_SRCS:art/%.bob=src/img/%.svg)
|
||||||
|
|
||||||
TARGET=html/index.html
|
all: html/index.html
|
||||||
TEST_STAMP=src/tests.ok
|
|
||||||
|
|
||||||
all: $(TARGET)
|
test: src/tests.ok
|
||||||
|
|
||||||
svg: $(SVG_IMGS)
|
open: all
|
||||||
|
|
||||||
test: $(TEST_STAMP)
|
|
||||||
|
|
||||||
open: $(TEST_STAMP)
|
|
||||||
mdbook build --open
|
mdbook build --open
|
||||||
|
|
||||||
watch: $(SVG_IMGS)
|
watch: $(SVG_IMGS)
|
||||||
mdbook watch
|
mdbook watch
|
||||||
|
|
||||||
src/.gitbook/assets/%.svg: art/%.bob
|
src/img/%.svg: art/%.bob
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
svgbob < $< > $@
|
svgbob < $< > $@
|
||||||
|
|
||||||
src/.gitbook/assets/%.svg: art/%.msc
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
mscgen -T svg -i $< -o $@
|
|
||||||
|
|
||||||
src/%.md: %.md
|
src/%.md: %.md
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
@cp $< $@
|
@cp $< $@
|
||||||
|
|
||||||
$(TEST_STAMP): $(TARGET)
|
src/tests.ok: $(SVG_IMGS) $(MD_SRCS)
|
||||||
mdbook test
|
mdbook test
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
$(TARGET): $(SVG_IMGS) $(MD_SRCS)
|
html/index.html: src/tests.ok
|
||||||
mdbook build
|
mdbook build
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@ -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 |