chaintool-doc

Chaintool documentation
Log | Files | Refs | README | LICENSE

commit 5f34a3b23379784c4f58d4685857d2a1a03a33b7
parent 6dd41adfa0accb28121dc0673e4afbd25c00fbbb
Author: lash <dev@holbrook.no>
Date:   Sun, 16 Jun 2024 18:55:05 +0100

Add caveat for test_requirements build

Diffstat:
MREADME.in | 14++++++++++++--
MREADME.md | 16+++++++++++++---
Mbuild/deps.svg | 102++++++++++++++++++++++++++++++++++++++++----------------------------------------
3 files changed, 76 insertions(+), 56 deletions(-)

diff --git a/README.in b/README.in @@ -1,7 +1,5 @@ # Chaintool documentation -**chaintool unfortunately does not currently work with python 3.11** - Chaintool is still very much a work-in-progress. So too is its documentation. This README, while still somewhat chaotic, aims to fill the void of a missing structured presentation, and make the introduction to chaintool a bit more friendly. @@ -105,3 +103,15 @@ Aside from the "higher level" components listed above, two known EVM-based imple * [eth-erc20](https://git.defalsify.org/eth-erc20) - an implementation of the ERC20 token, which also includes an example token contract that lets authorized addresses arbitrarily mint tokens at any time. * [eth-erc721](https://git.defalsify.org/eth-erc721) - an implementation of the ERC721 "NFT" token, which also includes an example token contract that creates achievment badges for developed contributions. + + +## Known issues + +The requirements for testing (`test_requirements.txt`) under each repository include dependencies that use rust components which use unstable features. + +The authors have used a "nightly" toolchain provided by the [rustup](https://rustup.rs/) tool to build test requirements. However, this is failing with newer versions of the rust toolchain. + +The authors report having successfully built with the `nightly-2022-11-14` toolchain. Hopefully this will work for others aswell. + +If any other toolchain is succesfully used, please report this and/or submit a git diff of this documentation including the most recent compatible toolchain to: [chaintool@defalsify.org](mailto:chaintool@defalsify.org). + diff --git a/README.md b/README.md @@ -1,7 +1,5 @@ # Chaintool documentation -**chaintool unfortunately does not currently work with python 3.11** - Chaintool is still very much a work-in-progress. So too is its documentation. This README, while still somewhat chaotic, aims to fill the void of a missing structured presentation, and make the introduction to chaintool a bit more friendly. @@ -69,7 +67,7 @@ So far, documentation efforts have been made in four areas, in order of most rec Last time the author remembered to render it, it looked like this: -<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDguMC41ICgwKQogLS0+CjwhLS0gUGFnZXM6IDEgLS0+Cjxzdmcgd2lkdGg9IjY1M3B0IiBoZWlnaHQ9IjU0OHB0Igogdmlld0JveD0iMC4wMCAwLjAwIDY1Mi44NSA1NDguMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgo8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMSAxKSByb3RhdGUoMCkgdHJhbnNsYXRlKDQgNTQ0KSI+Cjxwb2x5Z29uIGZpbGw9IndoaXRlIiBzdHJva2U9Im5vbmUiIHBvaW50cz0iLTQsNCAtNCwtNTQ0IDY0OC44NSwtNTQ0IDY0OC44NSw0IC00LDQiLz4KPCEtLSBjb25maW5pIC0tPgo8ZyBpZD0ibm9kZTEiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmNvbmZpbmk8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSIjY2NjY2NjIiBzdHJva2U9ImJsYWNrIiBjeD0iMTM1LjQ5IiBjeT0iLTQ1MCIgcng9IjQ2Ljc1IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTM1LjQ5IiB5PSItNDQ0Ljk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmxvL2NvbmZpbmk8L3RleHQ+CjwvZz4KPCEtLSBjaGFpbmxpYiAtLT4KPGcgaWQ9Im5vZGU3IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5jaGFpbmxpYjwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIyMTAuNDkiIGN5PSItMzc4IiByeD0iNDAuNiIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxMC40OSIgeT0iLTM3Mi45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5jaGFpbmxpYjwvdGV4dD4KPC9nPgo8IS0tIGNvbmZpbmkmIzQ1OyZndDtjaGFpbmxpYiAtLT4KPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5jb25maW5pJiM0NTsmZ3Q7Y2hhaW5saWI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMTUyLjUsLTQzMy4xMkMxNjIuMjksLTQyMy45OSAxNzQuNzUsLTQxMi4zNiAxODUuNjEsLTQwMi4yMiIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIxODcuNjEsLTQwNS4yIDE5Mi41MywtMzk1LjgyIDE4Mi44NCwtNDAwLjA5IDE4Ny42MSwtNDA1LjIiLz4KPC9nPgo8IS0tIGhleGF0aG9uIC0tPgo8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmhleGF0aG9uPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0iI2NjY2NjYyIgc3Ryb2tlPSJibGFjayIgY3g9IjM5Mi40OSIgY3k9Ii01MjIiIHJ4PSI1NC40MiIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM5Mi40OSIgeT0iLTUxNi45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5sby9oZXhhdGhvbjwvdGV4dD4KPC9nPgo8IS0tIGxldmVsZGlyIC0tPgo8ZyBpZD0ibm9kZTQiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmxldmVsZGlyPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0iI2NjY2NjYyIgc3Ryb2tlPSJibGFjayIgY3g9IjI4Ny40OSIgY3k9Ii0zMDYiIHJ4PSI0OC43OSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI4Ny40OSIgeT0iLTMwMC45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5sby9sZXZlbGRpcjwvdGV4dD4KPC9nPgo8IS0tIGhleGF0aG9uJiM0NTsmZ3Q7bGV2ZWxkaXIgLS0+CjxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+aGV4YXRob24mIzQ1OyZndDtsZXZlbGRpcjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik00MDkuMjgsLTUwNC40MkM0MTguMDYsLTQ5NC42OCA0MjguMDgsLTQ4MS42MiA0MzMuNDksLTQ2OCA0NTEuMjIsLTQyMy4yOSA0NjguMzgsLTM5OS4xOSA0NDAuNDksLTM2MCA0MzcuMjIsLTM1NS40MSAzNzguMDYsLTMzNS43OSAzMzQuMjksLTMyMS43NiIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzMzUuNCwtMzE4LjEzIDMyNC44MSwtMzE4LjQyIDMzMy4yNywtMzI0Ljc5IDMzNS40LC0zMTguMTMiLz4KPC9nPgo8IS0tIGhleGF0aG9uJiM0NTsmZ3Q7Y2hhaW5saWIgLS0+CjxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+aGV4YXRob24mIzQ1OyZndDtjaGFpbmxpYjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0zMzkuNTksLTUxNy4yOEMzMDMuNTEsLTUxMS45IDI1Ny4zNywtNDk4Ljk1IDIyOS40OSwtNDY4IDIxNC43LC00NTEuNTkgMjEwLjQsLTQyNi41NyAyMDkuNTQsLTQwNy4yMyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyMTMuMDIsLTQwNy4yOCAyMDkuMzgsLTM5Ny4zMyAyMDYuMDIsLTQwNy4zOCAyMTMuMDIsLTQwNy4yOCIvPgo8L2c+CjwhLS0gZnVuZ2EgLS0+CjxnIGlkPSJub2RlOSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZnVuZ2E8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMzkyLjQ5IiBjeT0iLTQ1MCIgcng9IjMxLjkiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzOTIuNDkiIHk9Ii00NDQuOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+ZnVuZ2E8L3RleHQ+CjwvZz4KPCEtLSBoZXhhdGhvbiYjNDU7Jmd0O2Z1bmdhIC0tPgo8ZyBpZD0iZWRnZTYiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmhleGF0aG9uJiM0NTsmZ3Q7ZnVuZ2E8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzkyLjQ5LC01MDMuN0MzOTIuNDksLTQ5Ni4yNCAzOTIuNDksLTQ4Ny4zMiAzOTIuNDksLTQ3OC45NyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzOTUuOTksLTQ3OS4xIDM5Mi40OSwtNDY5LjEgMzg4Ljk5LC00NzkuMSAzOTUuOTksLTQ3OS4xIi8+CjwvZz4KPCEtLSBwb3RhYWh0byAtLT4KPGcgaWQ9Im5vZGUzIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5wb3RhYWh0bzwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9IiNjY2NjY2MiIHN0cm9rZT0iYmxhY2siIGN4PSIyOTAuNDkiIGN5PSItNDUwIiByeD0iNTIuMzgiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyOTAuNDkiIHk9Ii00NDQuOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+bG8vcG90YWFodG88L3RleHQ+CjwvZz4KPCEtLSBwb3RhYWh0byYjNDU7Jmd0O2NoYWlubGliIC0tPgo8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPnBvdGFhaHRvJiM0NTsmZ3Q7Y2hhaW5saWI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMjcxLjkzLC00MzIuNzZDMjYxLjMxLC00MjMuNDcgMjQ3LjgyLC00MTEuNjcgMjM2LjE5LC00MDEuNDkiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjM4Ljk1LC0zOTguMzggMjI5LjEyLC0zOTQuNDMgMjM0LjM0LC00MDMuNjUgMjM4Ljk1LC0zOTguMzgiLz4KPC9nPgo8IS0tIGV0aF9jYWNoZSAtLT4KPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZXRoX2NhY2hlPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjI4NC40OSIgY3k9Ii0yMzQiIHJ4PSI0Ni4yMyIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI4NC40OSIgeT0iLTIyOC45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5ldGgmIzQ1O2NhY2hlPC90ZXh0Pgo8L2c+CjwhLS0gbGV2ZWxkaXImIzQ1OyZndDtldGhfY2FjaGUgLS0+CjxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+bGV2ZWxkaXImIzQ1OyZndDtldGhfY2FjaGU8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMjg2Ljc0LC0yODcuN0MyODYuNDIsLTI4MC4yNCAyODYuMDQsLTI3MS4zMiAyODUuNjgsLTI2Mi45NyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyODkuMTQsLTI2Mi45NSAyODUuMjIsLTI1My4xIDI4Mi4xNSwtMjYzLjI1IDI4OS4xNCwtMjYyLjk1Ii8+CjwvZz4KPCEtLSBzaGVwIC0tPgo8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KPHRpdGxlPnNoZXA8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSIjY2NjY2NjIiBzdHJva2U9ImJsYWNrIiBjeD0iMTQ0LjQ5IiBjeT0iLTIzNCIgcng9IjM3LjUzIiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTQ0LjQ5IiB5PSItMjI4Ljk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmxvL3NoZXA8L3RleHQ+CjwvZz4KPCEtLSBjaGFpbnN5bmNlciAtLT4KPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+Y2hhaW5zeW5jZXI8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMjc3LjQ5IiBjeT0iLTE2MiIgcng9IjU0LjkzIiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjc3LjQ5IiB5PSItMTU2Ljk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmNoYWluc3luY2VyPC90ZXh0Pgo8L2c+CjwhLS0gc2hlcCYjNDU7Jmd0O2NoYWluc3luY2VyIC0tPgo8ZyBpZD0iZWRnZTE0IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5zaGVwJiM0NTsmZ3Q7Y2hhaW5zeW5jZXI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMTY5LjE5LC0yMjBDMTg4Ljk1LC0yMDkuNiAyMTcsLTE5NC44NCAyMzkuNTksLTE4Mi45NCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyNDEuMDEsLTE4NS42MyAyNDguMjIsLTE3Ny44NyAyMzcuNzUsLTE3OS40MyAyNDEuMDEsLTE4NS42MyIvPgo8L2c+CjwhLS0gY2hhaW5xdWV1ZSAtLT4KPGcgaWQ9Im5vZGUxMyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+Y2hhaW5xdWV1ZTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIxNDQuNDkiIGN5PSItMTYyIiByeD0iNTIuODkiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNDQuNDkiIHk9Ii0xNTYuOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+Y2hhaW5xdWV1ZTwvdGV4dD4KPC9nPgo8IS0tIHNoZXAmIzQ1OyZndDtjaGFpbnF1ZXVlIC0tPgo8ZyBpZD0iZWRnZTE1IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5zaGVwJiM0NTsmZ3Q7Y2hhaW5xdWV1ZTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0xNDQuNDksLTIxNS43QzE0NC40OSwtMjA4LjI0IDE0NC40OSwtMTk5LjMyIDE0NC40OSwtMTkwLjk3Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE0Ny45OSwtMTkxLjEgMTQ0LjQ5LC0xODEuMSAxNDAuOTksLTE5MS4xIDE0Ny45OSwtMTkxLjEiLz4KPC9nPgo8IS0tIGFpZWUgLS0+CjxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+YWllZTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9IiNjY2NjY2MiIHN0cm9rZT0iYmxhY2siIGN4PSIzNS40OSIgY3k9Ii00NTAiIHJ4PSIzNS40OSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM1LjQ5IiB5PSItNDQ0Ljk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmxvL2FsZWU8L3RleHQ+CjwvZz4KPCEtLSBhaWVlJiM0NTsmZ3Q7Y2hhaW5saWIgLS0+CjxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+YWllZSYjNDU7Jmd0O2NoYWlubGliPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTYyLjgzLC00MzguMDZDOTEuOCwtNDI2LjQ3IDEzNy44MywtNDA4LjA2IDE3MC43OSwtMzk0Ljg4Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjE3Mi4wMSwtMzk3Ljc2IDE4MCwtMzkwLjggMTY5LjQxLC0zOTEuMjYgMTcyLjAxLC0zOTcuNzYiLz4KPC9nPgo8IS0tIGNoYWlubGliX2V0aCAtLT4KPGcgaWQ9Im5vZGU4IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5jaGFpbmxpYl9ldGg8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iNDA5LjQ5IiBjeT0iLTMwNiIgcng9IjU0LjkzIiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDA5LjQ5IiB5PSItMzAwLjk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmNoYWlubGliJiM0NTtldGg8L3RleHQ+CjwvZz4KPCEtLSBjaGFpbmxpYiYjNDU7Jmd0O2NoYWlubGliX2V0aCAtLT4KPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5jaGFpbmxpYiYjNDU7Jmd0O2NoYWlubGliX2V0aDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0yNDEuNTgsLTM2Ni4wNkMyNzQuMDUsLTM1NC42NCAzMjUuMzcsLTMzNi41OSAzNjIuNzMsLTMyMy40NSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzNjMuNiwtMzI2LjUgMzcxLjg3LC0zMTkuODggMzYxLjI3LC0zMTkuOSAzNjMuNiwtMzI2LjUiLz4KPC9nPgo8IS0tIGNoYWlubGliJiM0NTsmZ3Q7Y2hhaW5zeW5jZXIgLS0+CjxnIGlkPSJlZGdlMTAiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlubGliJiM0NTsmZ3Q7Y2hhaW5zeW5jZXI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMjA5LjE4LC0zNTkuNjRDMjA3LjYxLC0zMjkuMSAyMDcuNDcsLTI2NC40MyAyMjkuNDksLTIxNiAyMzQuMzksLTIwNS4yMSAyNDIuMzIsLTE5NS4wOSAyNTAuMzIsLTE4Ni42NSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyNTIuMywtMTg5LjYzIDI1Ni45MywtMTgwLjExIDI0Ny4zNywtMTg0LjY2IDI1Mi4zLC0xODkuNjMiLz4KPC9nPgo8IS0tIGNoYWlubGliJiM0NTsmZ3Q7Y2hhaW5xdWV1ZSAtLT4KPGcgaWQ9ImVkZ2UxMSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+Y2hhaW5saWImIzQ1OyZndDtjaGFpbnF1ZXVlPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTE4OS43LC0zNjIuMDlDMTYyLjQ2LC0zNDEuMTEgMTE1Ljk4LC0zMDAuMDUgOTcuNDksLTI1MiA5MS43NCwtMjM3LjA3IDkxLjgxLC0yMzAuOTYgOTcuNDksLTIxNiAxMDEuNjUsLTIwNS4wMiAxMDkuMjUsLTE5NC44NiAxMTcuMTQsLTE4Ni40MyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIxMTkuMDcsLTE4OS40NSAxMjMuNjksLTE3OS45MSAxMTQuMTMsLTE4NC40OSAxMTkuMDcsLTE4OS40NSIvPgo8L2c+CjwhLS0gY2hhaW5saWJfZXRoJiM0NTsmZ3Q7ZXRoX2NhY2hlIC0tPgo8ZyBpZD0iZWRnZTEyIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5jaGFpbmxpYl9ldGgmIzQ1OyZndDtldGhfY2FjaGU8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzgyLjY3LC0yODkuOThDMzY0LjE4LC0yNzkuNjMgMzM5LjQxLC0yNjUuNzYgMzE5LjM4LC0yNTQuNTQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzIxLjQxLC0yNTEuMTEgMzEwLjk4LC0yNDkuMjcgMzE3Ljk5LC0yNTcuMjEgMzIxLjQxLC0yNTEuMTEiLz4KPC9nPgo8IS0tIGNoYWluZF9ldGggLS0+CjxnIGlkPSJub2RlMTUiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmNoYWluZF9ldGg8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSIjYWFmZmFhIiBzdHJva2U9ImJsYWNrIiBjeD0iNDczLjQ5IiBjeT0iLTE4IiByeD0iNTkuNTQiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NzMuNDkiIHk9Ii0xMi45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5oaS9jaGFpbmQmIzQ1O2V0aDwvdGV4dD4KPC9nPgo8IS0tIGNoYWlubGliX2V0aCYjNDU7Jmd0O2NoYWluZF9ldGggLS0+CjxnIGlkPSJlZGdlMjUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlubGliX2V0aCYjNDU7Jmd0O2NoYWluZF9ldGg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDYxLjE4LC0yOTkuNTNDNTE4LjIsLTI5Mi4zIDYwNC41NywtMjc3LjQyIDYyNC40OSwtMjUyIDY3Ny4wMywtMTg0LjkyIDYxNi4xOSwtMTM0LjY5IDU1OC40OSwtNzIgNTQ2LjMxLC01OC43NyA1MzAuMTEsLTQ3LjU5IDUxNS4xMiwtMzguOTUiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTE2Ljk1LC0zNS40MSA1MDYuNSwtMzMuNjUgNTEzLjU3LC00MS41NCA1MTYuOTUsLTM1LjQxIi8+CjwvZz4KPCEtLSBldGhfbW9uaXRvciAtLT4KPGcgaWQ9Im5vZGUxNiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZXRoX21vbml0b3I8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSIjYWFmZmFhIiBzdHJva2U9ImJsYWNrIiBjeD0iNDg0LjQ5IiBjeT0iLTkwIiByeD0iNjQuNjYiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0ODQuNDkiIHk9Ii04NC45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5oaS9ldGgmIzQ1O21vbml0b3I8L3RleHQ+CjwvZz4KPCEtLSBjaGFpbmxpYl9ldGgmIzQ1OyZndDtldGhfbW9uaXRvciAtLT4KPGcgaWQ9ImVkZ2UyNCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+Y2hhaW5saWJfZXRoJiM0NTsmZ3Q7ZXRoX21vbml0b3I8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDU5Ljk1LC0yOTguMzVDNTExLjk2LC0yOTAuMzQgNTg3Ljg2LC0yNzUuMDIgNjA1LjQ5LC0yNTIgNjQzLjU0LC0yMDIuMjggNTY5LjE2LC0xNDMuMzUgNTIxLjAyLC0xMTIuNDEiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTIzLjExLC0xMDguOTcgNTEyLjc4LC0xMDYuNjEgNTE5LjM4LC0xMTQuODkgNTIzLjExLC0xMDguOTciLz4KPC9nPgo8IS0tIGV0aF9lcmMyMCAtLT4KPGcgaWQ9Im5vZGUxNyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZXRoX2VyYzIwPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0iI2FhZmZhYSIgc3Ryb2tlPSJibGFjayIgY3g9IjU0MS40OSIgY3k9Ii0yMzQiIHJ4PSI1NS40NSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU0MS40OSIgeT0iLTIyOC45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5oaS9ldGgmIzQ1O2VyYzIwPC90ZXh0Pgo8L2c+CjwhLS0gY2hhaW5saWJfZXRoJiM0NTsmZ3Q7ZXRoX2VyYzIwIC0tPgo8ZyBpZD0iZWRnZTIwIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5jaGFpbmxpYl9ldGgmIzQ1OyZndDtldGhfZXJjMjA8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDM3LjQ4LC0yOTAuMTVDNDU2LjgyLC0yNzkuOSA0ODIuNzYsLTI2Ni4xNCA1MDMuOSwtMjU0LjkzIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjUwNS4zNCwtMjU3LjYgNTEyLjUzLC0yNDkuODIgNTAyLjA2LC0yNTEuNDIgNTA1LjM0LC0yNTcuNiIvPgo8L2c+CjwhLS0gZXRoX2VyYzcyMSAtLT4KPGcgaWQ9Im5vZGUxOCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZXRoX2VyYzcyMTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9IiNhYWZmYWEiIHN0cm9rZT0iYmxhY2siIGN4PSI0MDguNDkiIGN5PSItMjM0IiByeD0iNjAuMDUiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MDguNDkiIHk9Ii0yMjguOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+aGkvZXRoJiM0NTtlcmM3MjE8L3RleHQ+CjwvZz4KPCEtLSBjaGFpbmxpYl9ldGgmIzQ1OyZndDtldGhfZXJjNzIxIC0tPgo8ZyBpZD0iZWRnZTIxIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5jaGFpbmxpYl9ldGgmIzQ1OyZndDtldGhfZXJjNzIxPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTQwOS4yNCwtMjg3LjdDNDA5LjEzLC0yODAuMjQgNDA5LC0yNzEuMzIgNDA4Ljg4LC0yNjIuOTciLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDEyLjM3LC0yNjMuMDUgNDA4LjczLC0yNTMuMSA0MDUuMzcsLTI2My4xNSA0MTIuMzcsLTI2My4wNSIvPgo8L2c+CjwhLS0gZnVuZ2EmIzQ1OyZndDtjaGFpbmxpYiAtLT4KPGcgaWQ9ImVkZ2UyMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+ZnVuZ2EmIzQ1OyZndDtjaGFpbmxpYjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0zNjcuMzksLTQzOC40NEMzNjIuMTUsLTQzNi4yOCAzNTYuNjUsLTQzNC4wNCAzNTEuNDksLTQzMiAzMTcuOTUsLTQxOC43NSAyNzkuNjMsLTQwNC40IDI1MS40MiwtMzkzLjk3Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjI1Mi43MiwtMzkwLjM2IDI0Mi4xMywtMzkwLjE4IDI1MC4zLC0zOTYuOTIgMjUyLjcyLC0zOTAuMzYiLz4KPC9nPgo8IS0tIGZ1bmdhX2V0aCAtLT4KPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZnVuZ2FfZXRoPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjM4NS40OSIgY3k9Ii0zNzgiIHJ4PSI0Ni4yMyIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM4NS40OSIgeT0iLTM3Mi45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5mdW5nYSYjNDU7ZXRoPC90ZXh0Pgo8L2c+CjwhLS0gZnVuZ2EmIzQ1OyZndDtmdW5nYV9ldGggLS0+CjxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+ZnVuZ2EmIzQ1OyZndDtmdW5nYV9ldGg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzkwLjc2LC00MzEuN0MzOTAuMDEsLTQyNC4yNCAzODkuMTIsLTQxNS4zMiAzODguMjgsLTQwNi45NyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzOTEuNjcsLTQwNi43MSAzODcuMiwtMzk3LjEgMzg0LjcxLC00MDcuNCAzOTEuNjcsLTQwNi43MSIvPgo8L2c+CjwhLS0gZnVuZ2FfZXRoJiM0NTsmZ3Q7Y2hhaW5saWJfZXRoIC0tPgo8ZyBpZD0iZWRnZTIzIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5mdW5nYV9ldGgmIzQ1OyZndDtjaGFpbmxpYl9ldGg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzkxLjQyLC0zNTkuN0MzOTQuMDMsLTM1Mi4wNyAzOTcuMTcsLTM0Mi45MiA0MDAuMDksLTMzNC40Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQwMy42OSwtMzM1LjcgNDAzLjYyLC0zMjUuMSAzOTcuMDcsLTMzMy40MyA0MDMuNjksLTMzNS43Ii8+CjwvZz4KPCEtLSBldGhfY2FjaGUmIzQ1OyZndDtjaGFpbnN5bmNlciAtLT4KPGcgaWQ9ImVkZ2UxMyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+ZXRoX2NhY2hlJiM0NTsmZ3Q7Y2hhaW5zeW5jZXI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMjgyLjc2LC0yMTUuN0MyODIuMDEsLTIwOC4yNCAyODEuMTIsLTE5OS4zMiAyODAuMjgsLTE5MC45NyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyODMuNjcsLTE5MC43MSAyNzkuMiwtMTgxLjEgMjc2LjcxLC0xOTEuNCAyODMuNjcsLTE5MC43MSIvPgo8L2c+CjwhLS0gY2hhaW5kIC0tPgo8ZyBpZD0ibm9kZTE0IiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5jaGFpbmQ8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSIjYWFmZmFhIiBzdHJva2U9ImJsYWNrIiBjeD0iMjc3LjQ5IiBjeT0iLTkwIiByeD0iNDUuMjEiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNzcuNDkiIHk9Ii04NC45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5oaS9jaGFpbmQ8L3RleHQ+CjwvZz4KPCEtLSBjaGFpbnN5bmNlciYjNDU7Jmd0O2NoYWluZCAtLT4KPGcgaWQ9ImVkZ2UxNiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+Y2hhaW5zeW5jZXImIzQ1OyZndDtjaGFpbmQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMjc3LjQ5LC0xNDMuN0MyNzcuNDksLTEzNi4yNCAyNzcuNDksLTEyNy4zMiAyNzcuNDksLTExOC45NyIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyODAuOTksLTExOS4xIDI3Ny40OSwtMTA5LjEgMjczLjk5LC0xMTkuMSAyODAuOTksLTExOS4xIi8+CjwvZz4KPCEtLSBjaGFpbnN5bmNlciYjNDU7Jmd0O2V0aF9tb25pdG9yIC0tPgo8ZyBpZD0iZWRnZTE5IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5jaGFpbnN5bmNlciYjNDU7Jmd0O2V0aF9tb25pdG9yPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTMxNC40OSwtMTQ4LjQ5QzM0Ny45OCwtMTM3LjE2IDM5Ny41NiwtMTIwLjM5IDQzNC41NSwtMTA3Ljg5Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQzNS4yNywtMTExIDQ0My42MiwtMTA0LjQ4IDQzMy4wMywtMTA0LjM3IDQzNS4yNywtMTExIi8+CjwvZz4KPCEtLSBjaGFpbnF1ZXVlJiM0NTsmZ3Q7Y2hhaW5kIC0tPgo8ZyBpZD0iZWRnZTE3IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5jaGFpbnF1ZXVlJiM0NTsmZ3Q7Y2hhaW5kPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTE3Mi4zNywtMTQ2LjMzQzE5Mi40NSwtMTM1Ljc2IDIxOS43MiwtMTIxLjQgMjQxLjQ1LC0xMDkuOTciLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjQyLjc4LC0xMTIuNjkgMjUwLC0xMDQuOTQgMjM5LjUyLC0xMDYuNSAyNDIuNzgsLTExMi42OSIvPgo8L2c+CjwhLS0gY2hhaW5kJiM0NTsmZ3Q7Y2hhaW5kX2V0aCAtLT4KPGcgaWQ9ImVkZ2UxOCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+Y2hhaW5kJiM0NTsmZ3Q7Y2hhaW5kX2V0aDwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0zMTAuMjksLTc3LjI4QzM0MS45MywtNjUuOTggMzkwLjE3LC00OC43NiA0MjYsLTM1Ljk2Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQyNi45OCwtMzguOTcgNDM1LjIyLC0zMi4zMSA0MjQuNjMsLTMyLjM4IDQyNi45OCwtMzguOTciLz4KPC9nPgo8L2c+Cjwvc3ZnPgo=" /> +<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDExLjAuMCAoMCkKIC0tPgo8IS0tIFBhZ2VzOiAxIC0tPgo8c3ZnIHdpZHRoPSI2NTNwdCIgaGVpZ2h0PSI1NDhwdCIKIHZpZXdCb3g9IjAuMDAgMC4wMCA2NTIuODUgNTQ4LjAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDU0NCkiPgo8cG9seWdvbiBmaWxsPSJ3aGl0ZSIgc3Ryb2tlPSJub25lIiBwb2ludHM9Ii00LDQgLTQsLTU0NCA2NDguODUsLTU0NCA2NDguODUsNCAtNCw0Ii8+CjwhLS0gY29uZmluaSAtLT4KPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5jb25maW5pPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0iI2NjY2NjYyIgc3Ryb2tlPSJibGFjayIgY3g9IjEzNS40OSIgY3k9Ii00NTAiIHJ4PSI0Ni43NSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEzNS40OSIgeT0iLTQ0NC45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5sby9jb25maW5pPC90ZXh0Pgo8L2c+CjwhLS0gY2hhaW5saWIgLS0+CjxnIGlkPSJub2RlNyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+Y2hhaW5saWI8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMjEwLjQ5IiBjeT0iLTM3OCIgcng9IjQwLjYiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTAuNDkiIHk9Ii0zNzIuOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+Y2hhaW5saWI8L3RleHQ+CjwvZz4KPCEtLSBjb25maW5pJiM0NTsmZ3Q7Y2hhaW5saWIgLS0+CjxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+Y29uZmluaSYjNDU7Jmd0O2NoYWlubGliPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTE1Mi41LC00MzMuMTJDMTYyLjE5LC00MjQuMDggMTc0LjUsLTQxMi41OCAxODUuMjksLTQwMi41MiIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIxODcuNTEsLTQwNS4yNCAxOTIuNDMsLTM5NS44NSAxODIuNzMsLTQwMC4xMiAxODcuNTEsLTQwNS4yNCIvPgo8L2c+CjwhLS0gaGV4YXRob24gLS0+CjxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+aGV4YXRob248L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSIjY2NjY2NjIiBzdHJva2U9ImJsYWNrIiBjeD0iMzkyLjQ5IiBjeT0iLTUyMiIgcng9IjU0LjQyIiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzkyLjQ5IiB5PSItNTE2Ljk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmxvL2hleGF0aG9uPC90ZXh0Pgo8L2c+CjwhLS0gbGV2ZWxkaXIgLS0+CjxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+bGV2ZWxkaXI8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSIjY2NjY2NjIiBzdHJva2U9ImJsYWNrIiBjeD0iMjg3LjQ5IiBjeT0iLTMwNiIgcng9IjQ4Ljc5IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjg3LjQ5IiB5PSItMzAwLjk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmxvL2xldmVsZGlyPC90ZXh0Pgo8L2c+CjwhLS0gaGV4YXRob24mIzQ1OyZndDtsZXZlbGRpciAtLT4KPGcgaWQ9ImVkZ2U4IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5oZXhhdGhvbiYjNDU7Jmd0O2xldmVsZGlyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTQwOS4yOCwtNTA0LjQyQzQxOC4wNiwtNDk0LjY4IDQyOC4wOCwtNDgxLjYyIDQzMy40OSwtNDY4IDQ1MS4yMiwtNDIzLjI5IDQ2OC4zOCwtMzk5LjE5IDQ0MC40OSwtMzYwIDQzNy4yMywtMzU1LjQyIDM3OC4zMSwtMzM1Ljg4IDMzNC41NiwtMzIxLjg1Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMzNS44NCwtMzE4LjU5IDMyNS4yNSwtMzE4Ljg4IDMzMy43MSwtMzI1LjI1IDMzNS44NCwtMzE4LjU5Ii8+CjwvZz4KPCEtLSBoZXhhdGhvbiYjNDU7Jmd0O2NoYWlubGliIC0tPgo8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmhleGF0aG9uJiM0NTsmZ3Q7Y2hhaW5saWI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzM5LjU5LC01MTcuMjhDMzAzLjUxLC01MTEuOSAyNTcuMzcsLTQ5OC45NSAyMjkuNDksLTQ2OCAyMTQuODQsLTQ1MS43NSAyMTAuNDgsLTQyNy4wNCAyMDkuNTYsLTQwNy43OCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyMTMuMDYsLTQwNy43OSAyMDkuNCwtMzk3Ljg0IDIwNi4wNiwtNDA3LjkgMjEzLjA2LC00MDcuNzkiLz4KPC9nPgo8IS0tIGZ1bmdhIC0tPgo8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmZ1bmdhPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjM5Mi40OSIgY3k9Ii00NTAiIHJ4PSIzMS45IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzkyLjQ5IiB5PSItNDQ0Ljk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmZ1bmdhPC90ZXh0Pgo8L2c+CjwhLS0gaGV4YXRob24mIzQ1OyZndDtmdW5nYSAtLT4KPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5oZXhhdGhvbiYjNDU7Jmd0O2Z1bmdhPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTM5Mi40OSwtNTAzLjdDMzkyLjQ5LC00OTYuNDEgMzkyLjQ5LC00ODcuNzMgMzkyLjQ5LC00NzkuNTQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzk1Ljk5LC00NzkuNjIgMzkyLjQ5LC00NjkuNjIgMzg4Ljk5LC00NzkuNjIgMzk1Ljk5LC00NzkuNjIiLz4KPC9nPgo8IS0tIHBvdGFhaHRvIC0tPgo8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KPHRpdGxlPnBvdGFhaHRvPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0iI2NjY2NjYyIgc3Ryb2tlPSJibGFjayIgY3g9IjI5MC40OSIgY3k9Ii00NTAiIHJ4PSI1Mi4zOCIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI5MC40OSIgeT0iLTQ0NC45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5sby9wb3RhYWh0bzwvdGV4dD4KPC9nPgo8IS0tIHBvdGFhaHRvJiM0NTsmZ3Q7Y2hhaW5saWIgLS0+CjxnIGlkPSJlZGdlNCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+cG90YWFodG8mIzQ1OyZndDtjaGFpbmxpYjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0yNzEuOTMsLTQzMi43NkMyNjEuNDEsLTQyMy41NiAyNDguMDgsLTQxMS45IDIzNi41MywtNDAxLjc5Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjIzOS4wOSwtMzk5LjM3IDIyOS4yNiwtMzk1LjQyIDIzNC40OCwtNDA0LjY0IDIzOS4wOSwtMzk5LjM3Ii8+CjwvZz4KPCEtLSBldGhfY2FjaGUgLS0+CjxnIGlkPSJub2RlMTEiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmV0aF9jYWNoZTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIyODQuNDkiIGN5PSItMjM0IiByeD0iNDYuMjMiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyODQuNDkiIHk9Ii0yMjguOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+ZXRoJiM0NTtjYWNoZTwvdGV4dD4KPC9nPgo8IS0tIGxldmVsZGlyJiM0NTsmZ3Q7ZXRoX2NhY2hlIC0tPgo8ZyBpZD0iZWRnZTkiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmxldmVsZGlyJiM0NTsmZ3Q7ZXRoX2NhY2hlPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTI4Ni43NCwtMjg3LjdDMjg2LjQzLC0yODAuNDEgMjg2LjA2LC0yNzEuNzMgMjg1LjcxLC0yNjMuNTQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjg5LjIxLC0yNjMuNDYgMjg1LjI4LC0yNTMuNjIgMjgyLjIxLC0yNjMuNzYgMjg5LjIxLC0yNjMuNDYiLz4KPC9nPgo8IS0tIHNoZXAgLS0+CjxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+c2hlcDwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9IiNjY2NjY2MiIHN0cm9rZT0iYmxhY2siIGN4PSIxNDQuNDkiIGN5PSItMjM0IiByeD0iMzcuNTMiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNDQuNDkiIHk9Ii0yMjguOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+bG8vc2hlcDwvdGV4dD4KPC9nPgo8IS0tIGNoYWluc3luY2VyIC0tPgo8ZyBpZD0ibm9kZTEyIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5jaGFpbnN5bmNlcjwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIyNzcuNDkiIGN5PSItMTYyIiByeD0iNTQuOTMiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNzcuNDkiIHk9Ii0xNTYuOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+Y2hhaW5zeW5jZXI8L3RleHQ+CjwvZz4KPCEtLSBzaGVwJiM0NTsmZ3Q7Y2hhaW5zeW5jZXIgLS0+CjxnIGlkPSJlZGdlMTQiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPnNoZXAmIzQ1OyZndDtjaGFpbnN5bmNlcjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0xNjkuMTksLTIyMEMxODguODYsLTIwOS42NCAyMTYuNzUsLTE5NC45NyAyMzkuMjksLTE4My4xIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjI0MC42NywtMTg2LjMzIDI0Ny44OSwtMTc4LjU4IDIzNy40MSwtMTgwLjE0IDI0MC42NywtMTg2LjMzIi8+CjwvZz4KPCEtLSBjaGFpbnF1ZXVlIC0tPgo8ZyBpZD0ibm9kZTEzIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5jaGFpbnF1ZXVlPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjE0NC40OSIgY3k9Ii0xNjIiIHJ4PSI1Mi44OSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE0NC40OSIgeT0iLTE1Ni45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5jaGFpbnF1ZXVlPC90ZXh0Pgo8L2c+CjwhLS0gc2hlcCYjNDU7Jmd0O2NoYWlucXVldWUgLS0+CjxnIGlkPSJlZGdlMTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPnNoZXAmIzQ1OyZndDtjaGFpbnF1ZXVlPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTE0NC40OSwtMjE1LjdDMTQ0LjQ5LC0yMDguNDEgMTQ0LjQ5LC0xOTkuNzMgMTQ0LjQ5LC0xOTEuNTQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMTQ3Ljk5LC0xOTEuNjIgMTQ0LjQ5LC0xODEuNjIgMTQwLjk5LC0xOTEuNjIgMTQ3Ljk5LC0xOTEuNjIiLz4KPC9nPgo8IS0tIGFpZWUgLS0+CjxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+YWllZTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9IiNjY2NjY2MiIHN0cm9rZT0iYmxhY2siIGN4PSIzNS40OSIgY3k9Ii00NTAiIHJ4PSIzNS40OSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM1LjQ5IiB5PSItNDQ0Ljk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmxvL2FsZWU8L3RleHQ+CjwvZz4KPCEtLSBhaWVlJiM0NTsmZ3Q7Y2hhaW5saWIgLS0+CjxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+YWllZSYjNDU7Jmd0O2NoYWlubGliPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTYyLjgzLC00MzguMDZDOTEuNjgsLTQyNi41MiAxMzcuNDMsLTQwOC4yMiAxNzAuMzYsLTM5NS4wNSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIxNzEuNjEsLTM5OC4zMiAxNzkuNTksLTM5MS4zNiAxNjkuMDEsLTM5MS44MiAxNzEuNjEsLTM5OC4zMiIvPgo8L2c+CjwhLS0gY2hhaW5saWJfZXRoIC0tPgo8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmNoYWlubGliX2V0aDwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI0MDkuNDkiIGN5PSItMzA2IiByeD0iNTQuOTMiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MDkuNDkiIHk9Ii0zMDAuOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+Y2hhaW5saWImIzQ1O2V0aDwvdGV4dD4KPC9nPgo8IS0tIGNoYWlubGliJiM0NTsmZ3Q7Y2hhaW5saWJfZXRoIC0tPgo8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlubGliJiM0NTsmZ3Q7Y2hhaW5saWJfZXRoPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTI0MS41OCwtMzY2LjA2QzI3My45MSwtMzU0LjY5IDMyNC45MywtMzM2Ljc0IDM2Mi4yNSwtMzIzLjYyIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjM2My4xNywtMzI3IDM3MS40NCwtMzIwLjM4IDM2MC44NSwtMzIwLjQgMzYzLjE3LC0zMjciLz4KPC9nPgo8IS0tIGNoYWlubGliJiM0NTsmZ3Q7Y2hhaW5zeW5jZXIgLS0+CjxnIGlkPSJlZGdlMTAiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlubGliJiM0NTsmZ3Q7Y2hhaW5zeW5jZXI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMjA5LjE4LC0zNTkuNjRDMjA3LjYxLC0zMjkuMSAyMDcuNDcsLTI2NC40MyAyMjkuNDksLTIxNiAyMzQuMjksLTIwNS40MyAyNDEuOTksLTE5NS41MSAyNDkuODMsLTE4Ny4xOCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyNTIuMjQsLTE4OS43MSAyNTYuODYsLTE4MC4xNyAyNDcuMywtMTg0Ljc1IDI1Mi4yNCwtMTg5LjcxIi8+CjwvZz4KPCEtLSBjaGFpbmxpYiYjNDU7Jmd0O2NoYWlucXVldWUgLS0+CjxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlubGliJiM0NTsmZ3Q7Y2hhaW5xdWV1ZTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0xODkuNywtMzYyLjA5QzE2Mi40NiwtMzQxLjExIDExNS45OCwtMzAwLjA1IDk3LjQ5LC0yNTIgOTEuNzQsLTIzNy4wNyA5MS44MSwtMjMwLjk2IDk3LjQ5LC0yMTYgMTAxLjU3LC0yMDUuMjUgMTA4Ljk0LC0xOTUuMjggMTE2LjY1LC0xODYuOTYiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMTE5LjAyLC0xODkuNTMgMTIzLjYyLC0xNzkuOTggMTE0LjA3LC0xODQuNTggMTE5LjAyLC0xODkuNTMiLz4KPC9nPgo8IS0tIGNoYWlubGliX2V0aCYjNDU7Jmd0O2V0aF9jYWNoZSAtLT4KPGcgaWQ9ImVkZ2UxMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+Y2hhaW5saWJfZXRoJiM0NTsmZ3Q7ZXRoX2NhY2hlPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTM4Mi42NywtMjg5Ljk4QzM2NC4zNCwtMjc5LjcyIDMzOS44NiwtMjY2LjAxIDMxOS45MywtMjU0Ljg1Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMyMS43MywtMjUxLjg1IDMxMS4zLC0yNTAuMDEgMzE4LjMxLC0yNTcuOTUgMzIxLjczLC0yNTEuODUiLz4KPC9nPgo8IS0tIGNoYWluZF9ldGggLS0+CjxnIGlkPSJub2RlMTUiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmNoYWluZF9ldGg8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSIjYWFmZmFhIiBzdHJva2U9ImJsYWNrIiBjeD0iNDczLjQ5IiBjeT0iLTE4IiByeD0iNTkuNTQiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NzMuNDkiIHk9Ii0xMi45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5oaS9jaGFpbmQmIzQ1O2V0aDwvdGV4dD4KPC9nPgo8IS0tIGNoYWlubGliX2V0aCYjNDU7Jmd0O2NoYWluZF9ldGggLS0+CjxnIGlkPSJlZGdlMjUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlubGliX2V0aCYjNDU7Jmd0O2NoYWluZF9ldGg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDYxLjE4LC0yOTkuNTNDNTE4LjIsLTI5Mi4zIDYwNC41NywtMjc3LjQyIDYyNC40OSwtMjUyIDY3Ny4wMywtMTg0LjkyIDYxNi4xOSwtMTM0LjY5IDU1OC40OSwtNzIgNTQ2LjQzLC01OC45IDUzMC40MiwtNDcuOCA1MTUuNTUsLTM5LjIiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTE3LjI3LC0zNi4xNSA1MDYuODMsLTM0LjM4IDUxMy44OSwtNDIuMjggNTE3LjI3LC0zNi4xNSIvPgo8L2c+CjwhLS0gZXRoX21vbml0b3IgLS0+CjxnIGlkPSJub2RlMTYiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmV0aF9tb25pdG9yPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0iI2FhZmZhYSIgc3Ryb2tlPSJibGFjayIgY3g9IjQ4NC40OSIgY3k9Ii05MCIgcng9IjY0LjY2IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDg0LjQ5IiB5PSItODQuOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+aGkvZXRoJiM0NTttb25pdG9yPC90ZXh0Pgo8L2c+CjwhLS0gY2hhaW5saWJfZXRoJiM0NTsmZ3Q7ZXRoX21vbml0b3IgLS0+CjxnIGlkPSJlZGdlMjQiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlubGliX2V0aCYjNDU7Jmd0O2V0aF9tb25pdG9yPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTQ1OS45NSwtMjk4LjM1QzUxMS45NiwtMjkwLjM0IDU4Ny44NiwtMjc1LjAyIDYwNS40OSwtMjUyIDY0My40NiwtMjAyLjM5IDU2OS40NywtMTQzLjU5IDUyMS4zMiwtMTEyLjYxIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjUyMy4zOSwtMTA5Ljc4IDUxMy4wNiwtMTA3LjQyIDUxOS42NiwtMTE1LjcgNTIzLjM5LC0xMDkuNzgiLz4KPC9nPgo8IS0tIGV0aF9lcmMyMCAtLT4KPGcgaWQ9Im5vZGUxNyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZXRoX2VyYzIwPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0iI2FhZmZhYSIgc3Ryb2tlPSJibGFjayIgY3g9IjU0MS40OSIgY3k9Ii0yMzQiIHJ4PSI1NS40NSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU0MS40OSIgeT0iLTIyOC45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5oaS9ldGgmIzQ1O2VyYzIwPC90ZXh0Pgo8L2c+CjwhLS0gY2hhaW5saWJfZXRoJiM0NTsmZ3Q7ZXRoX2VyYzIwIC0tPgo8ZyBpZD0iZWRnZTIwIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5jaGFpbmxpYl9ldGgmIzQ1OyZndDtldGhfZXJjMjA8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDM3LjQ4LC0yOTAuMTVDNDU2LjczLC0yNzkuOTUgNDgyLjUyLC0yNjYuMjcgNTAzLjYxLC0yNTUuMDkiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTA1LC0yNTguMzEgNTEyLjE5LC0yNTAuNTMgNTAxLjcyLC0yNTIuMTMgNTA1LC0yNTguMzEiLz4KPC9nPgo8IS0tIGV0aF9lcmM3MjEgLS0+CjxnIGlkPSJub2RlMTgiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmV0aF9lcmM3MjE8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSIjYWFmZmFhIiBzdHJva2U9ImJsYWNrIiBjeD0iNDA4LjQ5IiBjeT0iLTIzNCIgcng9IjYwLjA1IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDA4LjQ5IiB5PSItMjI4Ljk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmhpL2V0aCYjNDU7ZXJjNzIxPC90ZXh0Pgo8L2c+CjwhLS0gY2hhaW5saWJfZXRoJiM0NTsmZ3Q7ZXRoX2VyYzcyMSAtLT4KPGcgaWQ9ImVkZ2UyMSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+Y2hhaW5saWJfZXRoJiM0NTsmZ3Q7ZXRoX2VyYzcyMTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik00MDkuMjQsLTI4Ny43QzQwOS4xMywtMjgwLjQxIDQwOS4wMSwtMjcxLjczIDQwOC44OSwtMjYzLjU0Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQxMi4zOSwtMjYzLjU3IDQwOC43NSwtMjUzLjYyIDQwNS4zOSwtMjYzLjY3IDQxMi4zOSwtMjYzLjU3Ii8+CjwvZz4KPCEtLSBmdW5nYSYjNDU7Jmd0O2NoYWlubGliIC0tPgo8ZyBpZD0iZWRnZTIyIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5mdW5nYSYjNDU7Jmd0O2NoYWlubGliPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTM2Ny4zOSwtNDM4LjQ0QzM2Mi4xNSwtNDM2LjI4IDM1Ni42NSwtNDM0LjA0IDM1MS40OSwtNDMyIDMxOC4xLC00MTguODEgMjc5Ljk3LC00MDQuNTIgMjUxLjc5LC0zOTQuMTEiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjUzLjE0LC0zOTAuODggMjQyLjU1LC0zOTAuNzEgMjUwLjcyLC0zOTcuNDUgMjUzLjE0LC0zOTAuODgiLz4KPC9nPgo8IS0tIGZ1bmdhX2V0aCAtLT4KPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZnVuZ2FfZXRoPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjM4NS40OSIgY3k9Ii0zNzgiIHJ4PSI0Ni4yMyIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM4NS40OSIgeT0iLTM3Mi45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5mdW5nYSYjNDU7ZXRoPC90ZXh0Pgo8L2c+CjwhLS0gZnVuZ2EmIzQ1OyZndDtmdW5nYV9ldGggLS0+CjxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+ZnVuZ2EmIzQ1OyZndDtmdW5nYV9ldGg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzkwLjc2LC00MzEuN0MzOTAuMDMsLTQyNC40MSAzODkuMTYsLTQxNS43MyAzODguMzQsLTQwNy41NCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzOTEuODIsLTQwNy4yMSAzODcuMzUsLTM5Ny42MSAzODQuODYsLTQwNy45MSAzOTEuODIsLTQwNy4yMSIvPgo8L2c+CjwhLS0gZnVuZ2FfZXRoJiM0NTsmZ3Q7Y2hhaW5saWJfZXRoIC0tPgo8ZyBpZD0iZWRnZTIzIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5mdW5nYV9ldGgmIzQ1OyZndDtjaGFpbmxpYl9ldGg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzkxLjQyLC0zNTkuN0MzOTMuOTgsLTM1Mi4yNCAzOTcuMDMsLTM0My4zMiAzOTkuOSwtMzM0Ljk3Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQwMy4yLC0zMzYuMTMgNDAzLjEzLC0zMjUuNTQgMzk2LjU4LC0zMzMuODYgNDAzLjIsLTMzNi4xMyIvPgo8L2c+CjwhLS0gZXRoX2NhY2hlJiM0NTsmZ3Q7Y2hhaW5zeW5jZXIgLS0+CjxnIGlkPSJlZGdlMTMiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmV0aF9jYWNoZSYjNDU7Jmd0O2NoYWluc3luY2VyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTI4Mi43NiwtMjE1LjdDMjgyLjAzLC0yMDguNDEgMjgxLjE2LC0xOTkuNzMgMjgwLjM0LC0xOTEuNTQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjgzLjgyLC0xOTEuMjEgMjc5LjM1LC0xODEuNjEgMjc2Ljg2LC0xOTEuOTEgMjgzLjgyLC0xOTEuMjEiLz4KPC9nPgo8IS0tIGNoYWluZCAtLT4KPGcgaWQ9Im5vZGUxNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+Y2hhaW5kPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0iI2FhZmZhYSIgc3Ryb2tlPSJibGFjayIgY3g9IjI3Ny40OSIgY3k9Ii05MCIgcng9IjQ1LjIxIiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjc3LjQ5IiB5PSItODQuOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+aGkvY2hhaW5kPC90ZXh0Pgo8L2c+CjwhLS0gY2hhaW5zeW5jZXImIzQ1OyZndDtjaGFpbmQgLS0+CjxnIGlkPSJlZGdlMTYiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWluc3luY2VyJiM0NTsmZ3Q7Y2hhaW5kPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTI3Ny40OSwtMTQzLjdDMjc3LjQ5LC0xMzYuNDEgMjc3LjQ5LC0xMjcuNzMgMjc3LjQ5LC0xMTkuNTQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjgwLjk5LC0xMTkuNjIgMjc3LjQ5LC0xMDkuNjIgMjczLjk5LC0xMTkuNjIgMjgwLjk5LC0xMTkuNjIiLz4KPC9nPgo8IS0tIGNoYWluc3luY2VyJiM0NTsmZ3Q7ZXRoX21vbml0b3IgLS0+CjxnIGlkPSJlZGdlMTkiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWluc3luY2VyJiM0NTsmZ3Q7ZXRoX21vbml0b3I8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzE0LjQ5LC0xNDguNDlDMzQ3LjgzLC0xMzcuMjEgMzk3LjE0LC0xMjAuNTQgNDM0LjA3LC0xMDguMDUiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDM0Ljg0LC0xMTEuNDggNDQzLjE5LC0xMDQuOTcgNDMyLjU5LC0xMDQuODUgNDM0Ljg0LC0xMTEuNDgiLz4KPC9nPgo8IS0tIGNoYWlucXVldWUmIzQ1OyZndDtjaGFpbmQgLS0+CjxnIGlkPSJlZGdlMTciIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlucXVldWUmIzQ1OyZndDtjaGFpbmQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMTcyLjM3LC0xNDYuMzNDMTkyLjI3LC0xMzUuODUgMjE5LjIzLC0xMjEuNjYgMjQwLjg2LC0xMTAuMjgiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjQyLjQ0LC0xMTMuNCAyNDkuNjYsLTEwNS42NCAyMzkuMTgsLTEwNy4yIDI0Mi40NCwtMTEzLjQiLz4KPC9nPgo8IS0tIGNoYWluZCYjNDU7Jmd0O2NoYWluZF9ldGggLS0+CjxnIGlkPSJlZGdlMTgiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWluZCYjNDU7Jmd0O2NoYWluZF9ldGg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzEwLjI5LC03Ny4yOEMzNDEuOCwtNjYuMDMgMzg5Ljc1LC00OC45IDQyNS41NCwtMzYuMTIiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDI2LjU1LC0zOS40OCA0MzQuNzksLTMyLjgyIDQyNC4yLC0zMi44OSA0MjYuNTUsLTM5LjQ4Ii8+CjwvZz4KPC9nPgo8L3N2Zz4K" /> The dependency graph is only available in as an unformatted **graphviz** document located at `$REPO_ROOT/deps.dot`. `make diagram` renders this SVG version. @@ -105,3 +103,15 @@ Aside from the "higher level" components listed above, two known EVM-based imple * [eth-erc20](https://git.defalsify.org/eth-erc20) - an implementation of the ERC20 token, which also includes an example token contract that lets authorized addresses arbitrarily mint tokens at any time. * [eth-erc721](https://git.defalsify.org/eth-erc721) - an implementation of the ERC721 "NFT" token, which also includes an example token contract that creates achievment badges for developed contributions. + + +## Known issues + +The requirements for testing (`test_requirements.txt`) under each repository include dependencies that use rust components which use unstable features. + +The authors have used a "nightly" toolchain provided by the [rustup](https://rustup.rs/) tool to build test requirements. However, this is failing with newer versions of the rust toolchain. + +The authors report having successfully built with the `nightly-2022-11-14` toolchain. Hopefully this will work for others aswell. + +If any other toolchain is succesfully used, please report this and/or submit a git diff of this documentation including the most recent compatible toolchain to: [chaintool@defalsify.org](mailto:chaintool@defalsify.org). + diff --git a/build/deps.svg b/build/deps.svg @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<!-- Generated by graphviz version 8.0.5 (0) +<!-- Generated by graphviz version 11.0.0 (0) --> <!-- Pages: 1 --> <svg width="653pt" height="548pt" @@ -23,8 +23,8 @@ <!-- confini&#45;&gt;chainlib --> <g id="edge2" class="edge"> <title>confini&#45;&gt;chainlib</title> -<path fill="none" stroke="black" d="M152.5,-433.12C162.29,-423.99 174.75,-412.36 185.61,-402.22"/> -<polygon fill="black" stroke="black" points="187.61,-405.2 192.53,-395.82 182.84,-400.09 187.61,-405.2"/> +<path fill="none" stroke="black" d="M152.5,-433.12C162.19,-424.08 174.5,-412.58 185.29,-402.52"/> +<polygon fill="black" stroke="black" points="187.51,-405.24 192.43,-395.85 182.73,-400.12 187.51,-405.24"/> </g> <!-- hexathon --> <g id="node2" class="node"> @@ -41,14 +41,14 @@ <!-- hexathon&#45;&gt;leveldir --> <g id="edge8" class="edge"> <title>hexathon&#45;&gt;leveldir</title> -<path fill="none" stroke="black" d="M409.28,-504.42C418.06,-494.68 428.08,-481.62 433.49,-468 451.22,-423.29 468.38,-399.19 440.49,-360 437.22,-355.41 378.06,-335.79 334.29,-321.76"/> -<polygon fill="black" stroke="black" points="335.4,-318.13 324.81,-318.42 333.27,-324.79 335.4,-318.13"/> +<path fill="none" stroke="black" d="M409.28,-504.42C418.06,-494.68 428.08,-481.62 433.49,-468 451.22,-423.29 468.38,-399.19 440.49,-360 437.23,-355.42 378.31,-335.88 334.56,-321.85"/> +<polygon fill="black" stroke="black" points="335.84,-318.59 325.25,-318.88 333.71,-325.25 335.84,-318.59"/> </g> <!-- hexathon&#45;&gt;chainlib --> <g id="edge3" class="edge"> <title>hexathon&#45;&gt;chainlib</title> -<path fill="none" stroke="black" d="M339.59,-517.28C303.51,-511.9 257.37,-498.95 229.49,-468 214.7,-451.59 210.4,-426.57 209.54,-407.23"/> -<polygon fill="black" stroke="black" points="213.02,-407.28 209.38,-397.33 206.02,-407.38 213.02,-407.28"/> +<path fill="none" stroke="black" d="M339.59,-517.28C303.51,-511.9 257.37,-498.95 229.49,-468 214.84,-451.75 210.48,-427.04 209.56,-407.78"/> +<polygon fill="black" stroke="black" points="213.06,-407.79 209.4,-397.84 206.06,-407.9 213.06,-407.79"/> </g> <!-- funga --> <g id="node9" class="node"> @@ -59,8 +59,8 @@ <!-- hexathon&#45;&gt;funga --> <g id="edge6" class="edge"> <title>hexathon&#45;&gt;funga</title> -<path fill="none" stroke="black" d="M392.49,-503.7C392.49,-496.24 392.49,-487.32 392.49,-478.97"/> -<polygon fill="black" stroke="black" points="395.99,-479.1 392.49,-469.1 388.99,-479.1 395.99,-479.1"/> +<path fill="none" stroke="black" d="M392.49,-503.7C392.49,-496.41 392.49,-487.73 392.49,-479.54"/> +<polygon fill="black" stroke="black" points="395.99,-479.62 392.49,-469.62 388.99,-479.62 395.99,-479.62"/> </g> <!-- potaahto --> <g id="node3" class="node"> @@ -71,8 +71,8 @@ <!-- potaahto&#45;&gt;chainlib --> <g id="edge4" class="edge"> <title>potaahto&#45;&gt;chainlib</title> -<path fill="none" stroke="black" d="M271.93,-432.76C261.31,-423.47 247.82,-411.67 236.19,-401.49"/> -<polygon fill="black" stroke="black" points="238.95,-398.38 229.12,-394.43 234.34,-403.65 238.95,-398.38"/> +<path fill="none" stroke="black" d="M271.93,-432.76C261.41,-423.56 248.08,-411.9 236.53,-401.79"/> +<polygon fill="black" stroke="black" points="239.09,-399.37 229.26,-395.42 234.48,-404.64 239.09,-399.37"/> </g> <!-- eth_cache --> <g id="node11" class="node"> @@ -83,8 +83,8 @@ <!-- leveldir&#45;&gt;eth_cache --> <g id="edge9" class="edge"> <title>leveldir&#45;&gt;eth_cache</title> -<path fill="none" stroke="black" d="M286.74,-287.7C286.42,-280.24 286.04,-271.32 285.68,-262.97"/> -<polygon fill="black" stroke="black" points="289.14,-262.95 285.22,-253.1 282.15,-263.25 289.14,-262.95"/> +<path fill="none" stroke="black" d="M286.74,-287.7C286.43,-280.41 286.06,-271.73 285.71,-263.54"/> +<polygon fill="black" stroke="black" points="289.21,-263.46 285.28,-253.62 282.21,-263.76 289.21,-263.46"/> </g> <!-- shep --> <g id="node5" class="node"> @@ -101,8 +101,8 @@ <!-- shep&#45;&gt;chainsyncer --> <g id="edge14" class="edge"> <title>shep&#45;&gt;chainsyncer</title> -<path fill="none" stroke="black" d="M169.19,-220C188.95,-209.6 217,-194.84 239.59,-182.94"/> -<polygon fill="black" stroke="black" points="241.01,-185.63 248.22,-177.87 237.75,-179.43 241.01,-185.63"/> +<path fill="none" stroke="black" d="M169.19,-220C188.86,-209.64 216.75,-194.97 239.29,-183.1"/> +<polygon fill="black" stroke="black" points="240.67,-186.33 247.89,-178.58 237.41,-180.14 240.67,-186.33"/> </g> <!-- chainqueue --> <g id="node13" class="node"> @@ -113,8 +113,8 @@ <!-- shep&#45;&gt;chainqueue --> <g id="edge15" class="edge"> <title>shep&#45;&gt;chainqueue</title> -<path fill="none" stroke="black" d="M144.49,-215.7C144.49,-208.24 144.49,-199.32 144.49,-190.97"/> -<polygon fill="black" stroke="black" points="147.99,-191.1 144.49,-181.1 140.99,-191.1 147.99,-191.1"/> +<path fill="none" stroke="black" d="M144.49,-215.7C144.49,-208.41 144.49,-199.73 144.49,-191.54"/> +<polygon fill="black" stroke="black" points="147.99,-191.62 144.49,-181.62 140.99,-191.62 147.99,-191.62"/> </g> <!-- aiee --> <g id="node6" class="node"> @@ -125,8 +125,8 @@ <!-- aiee&#45;&gt;chainlib --> <g id="edge1" class="edge"> <title>aiee&#45;&gt;chainlib</title> -<path fill="none" stroke="black" d="M62.83,-438.06C91.8,-426.47 137.83,-408.06 170.79,-394.88"/> -<polygon fill="black" stroke="black" points="172.01,-397.76 180,-390.8 169.41,-391.26 172.01,-397.76"/> +<path fill="none" stroke="black" d="M62.83,-438.06C91.68,-426.52 137.43,-408.22 170.36,-395.05"/> +<polygon fill="black" stroke="black" points="171.61,-398.32 179.59,-391.36 169.01,-391.82 171.61,-398.32"/> </g> <!-- chainlib_eth --> <g id="node8" class="node"> @@ -137,26 +137,26 @@ <!-- chainlib&#45;&gt;chainlib_eth --> <g id="edge5" class="edge"> <title>chainlib&#45;&gt;chainlib_eth</title> -<path fill="none" stroke="black" d="M241.58,-366.06C274.05,-354.64 325.37,-336.59 362.73,-323.45"/> -<polygon fill="black" stroke="black" points="363.6,-326.5 371.87,-319.88 361.27,-319.9 363.6,-326.5"/> +<path fill="none" stroke="black" d="M241.58,-366.06C273.91,-354.69 324.93,-336.74 362.25,-323.62"/> +<polygon fill="black" stroke="black" points="363.17,-327 371.44,-320.38 360.85,-320.4 363.17,-327"/> </g> <!-- chainlib&#45;&gt;chainsyncer --> <g id="edge10" class="edge"> <title>chainlib&#45;&gt;chainsyncer</title> -<path fill="none" stroke="black" d="M209.18,-359.64C207.61,-329.1 207.47,-264.43 229.49,-216 234.39,-205.21 242.32,-195.09 250.32,-186.65"/> -<polygon fill="black" stroke="black" points="252.3,-189.63 256.93,-180.11 247.37,-184.66 252.3,-189.63"/> +<path fill="none" stroke="black" d="M209.18,-359.64C207.61,-329.1 207.47,-264.43 229.49,-216 234.29,-205.43 241.99,-195.51 249.83,-187.18"/> +<polygon fill="black" stroke="black" points="252.24,-189.71 256.86,-180.17 247.3,-184.75 252.24,-189.71"/> </g> <!-- chainlib&#45;&gt;chainqueue --> <g id="edge11" class="edge"> <title>chainlib&#45;&gt;chainqueue</title> -<path fill="none" stroke="black" d="M189.7,-362.09C162.46,-341.11 115.98,-300.05 97.49,-252 91.74,-237.07 91.81,-230.96 97.49,-216 101.65,-205.02 109.25,-194.86 117.14,-186.43"/> -<polygon fill="black" stroke="black" points="119.07,-189.45 123.69,-179.91 114.13,-184.49 119.07,-189.45"/> +<path fill="none" stroke="black" d="M189.7,-362.09C162.46,-341.11 115.98,-300.05 97.49,-252 91.74,-237.07 91.81,-230.96 97.49,-216 101.57,-205.25 108.94,-195.28 116.65,-186.96"/> +<polygon fill="black" stroke="black" points="119.02,-189.53 123.62,-179.98 114.07,-184.58 119.02,-189.53"/> </g> <!-- chainlib_eth&#45;&gt;eth_cache --> <g id="edge12" class="edge"> <title>chainlib_eth&#45;&gt;eth_cache</title> -<path fill="none" stroke="black" d="M382.67,-289.98C364.18,-279.63 339.41,-265.76 319.38,-254.54"/> -<polygon fill="black" stroke="black" points="321.41,-251.11 310.98,-249.27 317.99,-257.21 321.41,-251.11"/> +<path fill="none" stroke="black" d="M382.67,-289.98C364.34,-279.72 339.86,-266.01 319.93,-254.85"/> +<polygon fill="black" stroke="black" points="321.73,-251.85 311.3,-250.01 318.31,-257.95 321.73,-251.85"/> </g> <!-- chaind_eth --> <g id="node15" class="node"> @@ -167,8 +167,8 @@ <!-- chainlib_eth&#45;&gt;chaind_eth --> <g id="edge25" class="edge"> <title>chainlib_eth&#45;&gt;chaind_eth</title> -<path fill="none" stroke="black" d="M461.18,-299.53C518.2,-292.3 604.57,-277.42 624.49,-252 677.03,-184.92 616.19,-134.69 558.49,-72 546.31,-58.77 530.11,-47.59 515.12,-38.95"/> -<polygon fill="black" stroke="black" points="516.95,-35.41 506.5,-33.65 513.57,-41.54 516.95,-35.41"/> +<path fill="none" stroke="black" d="M461.18,-299.53C518.2,-292.3 604.57,-277.42 624.49,-252 677.03,-184.92 616.19,-134.69 558.49,-72 546.43,-58.9 530.42,-47.8 515.55,-39.2"/> +<polygon fill="black" stroke="black" points="517.27,-36.15 506.83,-34.38 513.89,-42.28 517.27,-36.15"/> </g> <!-- eth_monitor --> <g id="node16" class="node"> @@ -179,8 +179,8 @@ <!-- chainlib_eth&#45;&gt;eth_monitor --> <g id="edge24" class="edge"> <title>chainlib_eth&#45;&gt;eth_monitor</title> -<path fill="none" stroke="black" d="M459.95,-298.35C511.96,-290.34 587.86,-275.02 605.49,-252 643.54,-202.28 569.16,-143.35 521.02,-112.41"/> -<polygon fill="black" stroke="black" points="523.11,-108.97 512.78,-106.61 519.38,-114.89 523.11,-108.97"/> +<path fill="none" stroke="black" d="M459.95,-298.35C511.96,-290.34 587.86,-275.02 605.49,-252 643.46,-202.39 569.47,-143.59 521.32,-112.61"/> +<polygon fill="black" stroke="black" points="523.39,-109.78 513.06,-107.42 519.66,-115.7 523.39,-109.78"/> </g> <!-- eth_erc20 --> <g id="node17" class="node"> @@ -191,8 +191,8 @@ <!-- chainlib_eth&#45;&gt;eth_erc20 --> <g id="edge20" class="edge"> <title>chainlib_eth&#45;&gt;eth_erc20</title> -<path fill="none" stroke="black" d="M437.48,-290.15C456.82,-279.9 482.76,-266.14 503.9,-254.93"/> -<polygon fill="black" stroke="black" points="505.34,-257.6 512.53,-249.82 502.06,-251.42 505.34,-257.6"/> +<path fill="none" stroke="black" d="M437.48,-290.15C456.73,-279.95 482.52,-266.27 503.61,-255.09"/> +<polygon fill="black" stroke="black" points="505,-258.31 512.19,-250.53 501.72,-252.13 505,-258.31"/> </g> <!-- eth_erc721 --> <g id="node18" class="node"> @@ -203,14 +203,14 @@ <!-- chainlib_eth&#45;&gt;eth_erc721 --> <g id="edge21" class="edge"> <title>chainlib_eth&#45;&gt;eth_erc721</title> -<path fill="none" stroke="black" d="M409.24,-287.7C409.13,-280.24 409,-271.32 408.88,-262.97"/> -<polygon fill="black" stroke="black" points="412.37,-263.05 408.73,-253.1 405.37,-263.15 412.37,-263.05"/> +<path fill="none" stroke="black" d="M409.24,-287.7C409.13,-280.41 409.01,-271.73 408.89,-263.54"/> +<polygon fill="black" stroke="black" points="412.39,-263.57 408.75,-253.62 405.39,-263.67 412.39,-263.57"/> </g> <!-- funga&#45;&gt;chainlib --> <g id="edge22" class="edge"> <title>funga&#45;&gt;chainlib</title> -<path fill="none" stroke="black" d="M367.39,-438.44C362.15,-436.28 356.65,-434.04 351.49,-432 317.95,-418.75 279.63,-404.4 251.42,-393.97"/> -<polygon fill="black" stroke="black" points="252.72,-390.36 242.13,-390.18 250.3,-396.92 252.72,-390.36"/> +<path fill="none" stroke="black" d="M367.39,-438.44C362.15,-436.28 356.65,-434.04 351.49,-432 318.1,-418.81 279.97,-404.52 251.79,-394.11"/> +<polygon fill="black" stroke="black" points="253.14,-390.88 242.55,-390.71 250.72,-397.45 253.14,-390.88"/> </g> <!-- funga_eth --> <g id="node10" class="node"> @@ -221,20 +221,20 @@ <!-- funga&#45;&gt;funga_eth --> <g id="edge7" class="edge"> <title>funga&#45;&gt;funga_eth</title> -<path fill="none" stroke="black" d="M390.76,-431.7C390.01,-424.24 389.12,-415.32 388.28,-406.97"/> -<polygon fill="black" stroke="black" points="391.67,-406.71 387.2,-397.1 384.71,-407.4 391.67,-406.71"/> +<path fill="none" stroke="black" d="M390.76,-431.7C390.03,-424.41 389.16,-415.73 388.34,-407.54"/> +<polygon fill="black" stroke="black" points="391.82,-407.21 387.35,-397.61 384.86,-407.91 391.82,-407.21"/> </g> <!-- funga_eth&#45;&gt;chainlib_eth --> <g id="edge23" class="edge"> <title>funga_eth&#45;&gt;chainlib_eth</title> -<path fill="none" stroke="black" d="M391.42,-359.7C394.03,-352.07 397.17,-342.92 400.09,-334.4"/> -<polygon fill="black" stroke="black" points="403.69,-335.7 403.62,-325.1 397.07,-333.43 403.69,-335.7"/> +<path fill="none" stroke="black" d="M391.42,-359.7C393.98,-352.24 397.03,-343.32 399.9,-334.97"/> +<polygon fill="black" stroke="black" points="403.2,-336.13 403.13,-325.54 396.58,-333.86 403.2,-336.13"/> </g> <!-- eth_cache&#45;&gt;chainsyncer --> <g id="edge13" class="edge"> <title>eth_cache&#45;&gt;chainsyncer</title> -<path fill="none" stroke="black" d="M282.76,-215.7C282.01,-208.24 281.12,-199.32 280.28,-190.97"/> -<polygon fill="black" stroke="black" points="283.67,-190.71 279.2,-181.1 276.71,-191.4 283.67,-190.71"/> +<path fill="none" stroke="black" d="M282.76,-215.7C282.03,-208.41 281.16,-199.73 280.34,-191.54"/> +<polygon fill="black" stroke="black" points="283.82,-191.21 279.35,-181.61 276.86,-191.91 283.82,-191.21"/> </g> <!-- chaind --> <g id="node14" class="node"> @@ -245,26 +245,26 @@ <!-- chainsyncer&#45;&gt;chaind --> <g id="edge16" class="edge"> <title>chainsyncer&#45;&gt;chaind</title> -<path fill="none" stroke="black" d="M277.49,-143.7C277.49,-136.24 277.49,-127.32 277.49,-118.97"/> -<polygon fill="black" stroke="black" points="280.99,-119.1 277.49,-109.1 273.99,-119.1 280.99,-119.1"/> +<path fill="none" stroke="black" d="M277.49,-143.7C277.49,-136.41 277.49,-127.73 277.49,-119.54"/> +<polygon fill="black" stroke="black" points="280.99,-119.62 277.49,-109.62 273.99,-119.62 280.99,-119.62"/> </g> <!-- chainsyncer&#45;&gt;eth_monitor --> <g id="edge19" class="edge"> <title>chainsyncer&#45;&gt;eth_monitor</title> -<path fill="none" stroke="black" d="M314.49,-148.49C347.98,-137.16 397.56,-120.39 434.55,-107.89"/> -<polygon fill="black" stroke="black" points="435.27,-111 443.62,-104.48 433.03,-104.37 435.27,-111"/> +<path fill="none" stroke="black" d="M314.49,-148.49C347.83,-137.21 397.14,-120.54 434.07,-108.05"/> +<polygon fill="black" stroke="black" points="434.84,-111.48 443.19,-104.97 432.59,-104.85 434.84,-111.48"/> </g> <!-- chainqueue&#45;&gt;chaind --> <g id="edge17" class="edge"> <title>chainqueue&#45;&gt;chaind</title> -<path fill="none" stroke="black" d="M172.37,-146.33C192.45,-135.76 219.72,-121.4 241.45,-109.97"/> -<polygon fill="black" stroke="black" points="242.78,-112.69 250,-104.94 239.52,-106.5 242.78,-112.69"/> +<path fill="none" stroke="black" d="M172.37,-146.33C192.27,-135.85 219.23,-121.66 240.86,-110.28"/> +<polygon fill="black" stroke="black" points="242.44,-113.4 249.66,-105.64 239.18,-107.2 242.44,-113.4"/> </g> <!-- chaind&#45;&gt;chaind_eth --> <g id="edge18" class="edge"> <title>chaind&#45;&gt;chaind_eth</title> -<path fill="none" stroke="black" d="M310.29,-77.28C341.93,-65.98 390.17,-48.76 426,-35.96"/> -<polygon fill="black" stroke="black" points="426.98,-38.97 435.22,-32.31 424.63,-32.38 426.98,-38.97"/> +<path fill="none" stroke="black" d="M310.29,-77.28C341.8,-66.03 389.75,-48.9 425.54,-36.12"/> +<polygon fill="black" stroke="black" points="426.55,-39.48 434.79,-32.82 424.2,-32.89 426.55,-39.48"/> </g> </g> </svg>