This commit is contained in:
number571 2026-05-22 12:04:31 +07:00
parent d25e7c3fa4
commit 499388d726
9 changed files with 243 additions and 161 deletions

View File

@ -79,6 +79,16 @@ func TestInvalidKeys(t *testing.T) {
t.Error("success decrypt with invalid privkey")
return
}
_key := make([]byte, symmetric.CCipherKeySize)
if _, _, err := _scheme.DecryptMessage(symmetric.NewCipherCFB(_key), enc); err == nil {
t.Error("success decrypt with another key type")
return
}
if _, err := _scheme.EncryptMessage(symmetric.NewCipherCFB(_key), enc); err == nil {
t.Error("success encrypt with another key type")
return
}
}
func TestInvalidScheme(t *testing.T) {

View File

@ -4,18 +4,18 @@ const (
errPrefix = "pkg/crypto/scheme/layer2/symmetric = "
)
type SClientError struct {
type SError struct {
str string
}
func (err *SClientError) Error() string {
func (err *SError) Error() string {
return errPrefix + err.str
}
var (
ErrInvalidKeyType = &SClientError{"invalid key type"}
ErrDecryptMessage = &SClientError{"decrypt message"}
ErrLimitMessageSize = &SClientError{"limit message size"}
ErrMessageSize = &SClientError{"message size"}
ErrDecodeMessage = &SClientError{"decode message"}
ErrInvalidKeyType = &SError{"invalid key type"}
ErrDecryptMessage = &SError{"decrypt message"}
ErrLimitMessageSize = &SError{"limit message size"}
ErrInvalidMessageSize = &SError{"invalidmessage size"}
ErrDecodeMessage = &SError{"decode message"}
)

View File

@ -15,7 +15,7 @@ var (
)
const (
cSaltSize = 16 // bytes
cSaltSize = 16 // salt for key generation
)
type sScheme struct {
@ -30,10 +30,7 @@ func NewScheme(pMessageSize uint64) layer2.IScheme {
encKey := make([]byte, symmetric.CCipherKeySize)
cipher := symmetric.NewCipherGCM(encKey)
encMsg, err := scheme.encryptWithPadding(cipher, []byte{}, 0)
if err != nil {
panic(err)
}
encMsg := scheme.encryptWithPadding(cipher, []byte{}, 0)
structSize := uint64(len(encMsg))
if pMessageSize <= structSize {
@ -68,19 +65,17 @@ func (p *sScheme) EncryptMessage(pRecv layer2.IParticipantKey, pMsg []byte) ([]b
if resultSize > payloadLimit {
return nil, ErrLimitMessageSize
}
return p.encryptWithPadding(recv, pMsg, payloadLimit-resultSize)
return p.encryptWithPadding(recv, pMsg, payloadLimit-resultSize), nil
}
func (p *sScheme) DecryptMessage(pListKeys layer2.IKeysContainer, pMsg []byte) (layer2.IParticipantKey, []byte, error) {
var lenMsg = len(pMsg)
if (uint64(lenMsg) != p.fMessageSize) || (lenMsg < cSaltSize+encoding.CSizeUint32) {
return nil, nil, ErrMessageSize
}
listCiphers, ok := pListKeys.(symmetric.IListCiphers)
if !ok {
return nil, nil, ErrInvalidKeyType
}
if uint64(len(pMsg)) != p.fMessageSize {
return nil, nil, ErrInvalidMessageSize
}
salt := pMsg[:cSaltSize]
list := listCiphers.Get()
@ -91,7 +86,7 @@ func (p *sScheme) DecryptMessage(pListKeys layer2.IKeysContainer, pMsg []byte) (
cipher := symmetric.NewCipherGCM(encKey)
decMsg := cipher.DecryptBytes(pMsg[cSaltSize:])
if len(decMsg) < encoding.CSizeUint32 {
if decMsg == nil {
continue
}
@ -114,7 +109,7 @@ func (p *sScheme) encryptWithPadding(
pCipher symmetric.ICipher,
pMsg []byte,
pPadd uint64,
) ([]byte, error) {
) []byte {
var (
rand = random.NewRandom()
salt = rand.GetBytes(cSaltSize)
@ -128,5 +123,5 @@ func (p *sScheme) encryptWithPadding(
return bytes.Join([][]byte{
salt,
symmetric.NewCipherGCM(encKey).EncryptBytes(data),
}, []byte{}), nil
}, []byte{})
}

View File

@ -2,13 +2,41 @@ package symmetric
import (
"bytes"
"fmt"
"testing"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
"github.com/number571/go-peer/pkg/crypto/random"
"github.com/number571/go-peer/pkg/crypto/symmetric"
)
func TestError(t *testing.T) {
t.Parallel()
str := "value"
err := &SError{str}
if err.Error() != errPrefix+str {
t.Error("incorrect err.Error()")
return
}
}
func TestPanicNewScheme(t *testing.T) {
t.Parallel()
tcNewSchemeWithSmallMsgSize(t)
}
func tcNewSchemeWithSmallMsgSize(t *testing.T) {
defer func() {
if r := recover(); r == nil {
t.Error("nothing panics")
return
}
}()
_ = NewScheme(8)
}
func TestScheme(t *testing.T) {
t.Parallel()
@ -22,6 +50,9 @@ func TestScheme(t *testing.T) {
if err != nil {
t.Fatal(err)
}
if _, err := scheme.EncryptMessage(key, make([]byte, 256)); err == nil {
t.Fatal("success encrypt message with overflow")
}
listCiphers := symmetric.NewListCiphers()
listCiphers.Add(symmetric.NewCipherGCM(key.ToBytes()))
@ -30,16 +61,37 @@ func TestScheme(t *testing.T) {
if err != nil {
t.Fatal(err)
}
if _, _, err := scheme.DecryptMessage(listCiphers, []byte{}); err == nil {
t.Fatal("success decrypt with invalid message size")
}
anotherListCiphers := symmetric.NewListCiphers()
anotherListCiphers.Add(symmetric.NewCipherGCM(make([]byte, symmetric.CCipherKeySize)))
if _, _, err := scheme.DecryptMessage(anotherListCiphers, encMsg); err == nil {
t.Fatal("success decrypt with undefined key")
}
if !bytes.Equal(key.ToBytes(), gotKey.ToBytes()) {
t.Fatal("keys are diff")
}
if !bytes.Equal(msg, gotMsg) {
fmt.Println(string(gotMsg))
t.Fatal("msgs are diff")
}
fmt.Println(scheme.GetMessageSize())
fmt.Println(scheme.GetMessageSize() - scheme.GetPayloadLimit())
fmt.Println(scheme.GetPayloadLimit())
if _, _, err := scheme.DecryptMessage(asymmetric.NewMapPubKeys(), []byte{}); err == nil {
t.Error("success decrypt with another key type")
return
}
if _, err := scheme.EncryptMessage(asymmetric.NewPrivKey().GetPubKey(), []byte{}); err == nil {
t.Error("success encrypt with another key type")
return
}
if scheme.GetRandomKey().ToString() == scheme.GetRandomKey().ToString() { //nolint:staticcheck
t.Fatal("random got equal values")
}
// fmt.Println(scheme.GetMessageSize())
// fmt.Println(scheme.GetMessageSize() - scheme.GetPayloadLimit())
// fmt.Println(scheme.GetPayloadLimit())
}

View File

@ -2,6 +2,7 @@ package symmetric
import (
"bytes"
"crypto/des" //nolint:gosec
"testing"
"github.com/number571/go-peer/pkg/encoding"
@ -25,7 +26,6 @@ func testPanicEncrypt(t *testing.T) {
return
}
}()
cipher := &sAESCipher{fMode: 999}
_ = cipher.EncryptBytes([]byte{})
}
@ -94,4 +94,16 @@ func testEncrypt(t *testing.T, c func(pKey []byte) ICipher) {
if cipher.ToString() != encoding.HexEncode(tgKey) {
t.Fatal("string key not equal")
}
block, err := des.NewCipher([]byte("abcdefgh")) //nolint:gosec
if err != nil {
t.Fatal(err)
}
anotherCipher := &sAESCipher{fMode: modeGCM, fBlock: block}
if m := anotherCipher.encryptBytesGCM([]byte{}); m != nil {
t.Fatal("success encrypt message with another cipher")
}
if m := anotherCipher.decryptBytesGCM([]byte{}); m != nil {
t.Fatal("success decrypt message with another cipher")
}
}

View File

@ -12,6 +12,19 @@ type tsSomeStruct struct {
N int `json:"n"`
}
func TestPanic(t *testing.T) {
t.Parallel()
defer func() {
if r := recover(); r == nil {
t.Error("nothing panics")
return
}
}()
_ = NewConverter(func() {})
}
func TestConverter(t *testing.T) {
t.Parallel()

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="96" height="20" role="img" aria-label="code lines: 13125"><title>code lines: 13125</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="96" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="57" height="20" fill="#555"/><rect x="57" width="40" height="20" fill="#4682b4"/><rect width="96" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="295" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">code lines</text><text x="295" y="140" transform="scale(.1)" fill="#fff" textLength="510">code lines</text><text aria-hidden="true" x="770" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="320">13125</text><text x="770" y="140" transform="scale(.1)" fill="#fff" textLength="320">13125</text></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="96" height="20" role="img" aria-label="code lines: 13207"><title>code lines: 13207</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="96" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="57" height="20" fill="#555"/><rect x="57" width="40" height="20" fill="#4682b4"/><rect width="96" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="295" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">code lines</text><text x="295" y="140" transform="scale(.1)" fill="#fff" textLength="510">code lines</text><text aria-hidden="true" x="770" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="320">13207</text><text x="770" y="140" transform="scale(.1)" fill="#fff" textLength="320">13207</text></g></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="96" height="20" role="img" aria-label="coverage: 95%"><title>coverage: 95%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="96" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="35" height="20" fill="#97ca00"/><rect width="96" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">coverage</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">coverage</text><text aria-hidden="true" x="775" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="250">95%</text><text x="775" y="140" transform="scale(.1)" fill="#fff" textLength="250">95%</text></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="96" height="20" role="img" aria-label="coverage: 96%"><title>coverage: 96%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="96" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="35" height="20" fill="#97ca00"/><rect width="96" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">coverage</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">coverage</text><text aria-hidden="true" x="775" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="250">96%</text><text x="775" y="140" transform="scale(.1)" fill="#fff" textLength="250">96%</text></g></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -7,7 +7,7 @@
>
<g>
<rect x="20.000000" y="20.000000" width="988.000000" height="600.000000" style="fill: rgb(9, 125, 66);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="20.000000" y="20.000000" width="988.000000" height="600.000000" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
@ -20,7 +20,7 @@
<g>
<rect x="28.000000" y="41.600000" width="962.070148" height="570.400000" style="fill: rgb(10, 125, 66);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="28.000000" y="41.600000" width="962.046875" height="570.400000" style="fill: rgb(6, 120, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
@ -33,18 +33,18 @@
<g>
<rect x="998.070148" y="41.600000" width="1.929852" height="570.400000" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="998.046875" y="41.600000" width="1.953125" height="570.400000" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="381.568715" y="63.200000" width="454.010347" height="286.478049" style="fill: rgb(3, 114, 60);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="380.119512" y="63.200000" width="455.092998" height="286.478049" style="fill: rgb(3, 112, 59);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(389.568715,78.800000) scale(1.000000)"
transform="translate(388.119512,78.800000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">anonymity/qb</text>
@ -52,25 +52,25 @@
<g>
<rect x="36.000000" y="63.200000" width="337.568715" height="540.800000" style="fill: rgb(19, 141, 74);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="36.000000" y="63.200000" width="336.119512" height="540.800000" style="fill: rgb(11, 128, 67);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(44.000000,78.800000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">crypto</text>
</g>
<g>
<rect x="843.579062" y="445.952821" width="138.491086" height="70.802051" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="843.212510" y="445.952821" width="138.834365" height="70.802051" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(851.579062,461.552821) scale(1.000000)"
transform="translate(851.212510,461.552821) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">encoding</text>
@ -78,12 +78,12 @@
<g>
<rect x="843.579062" y="350.264615" width="138.491086" height="87.688205" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="843.212510" y="350.264615" width="138.834365" height="87.688205" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(851.579062,365.864615) scale(1.000000)"
transform="translate(851.212510,365.864615) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">logger</text>
@ -91,12 +91,12 @@
<g>
<rect x="381.568715" y="357.678049" width="454.010347" height="246.321951" style="fill: rgb(8, 122, 64);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="380.119512" y="357.678049" width="455.092998" height="246.321951" style="fill: rgb(8, 122, 64);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(389.568715,373.278049) scale(1.000000)"
transform="translate(388.119512,373.278049) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">network</text>
@ -104,12 +104,12 @@
<g>
<rect x="843.579062" y="240.504615" width="138.491086" height="101.760000" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="843.212510" y="240.504615" width="138.834365" height="101.760000" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(851.579062,256.104615) scale(1.000000)"
transform="translate(851.212510,256.104615) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">payload</text>
@ -117,12 +117,12 @@
<g>
<rect x="843.579062" y="524.754872" width="86.510378" height="79.245128" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="843.212510" y="524.754872" width="86.731848" height="79.245128" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(851.579062,540.354872) scale(1.000000)"
transform="translate(851.212510,540.354872) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">state</text>
@ -130,12 +130,12 @@
<g>
<rect x="843.579062" y="63.200000" width="138.491086" height="169.304615" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="843.212510" y="63.200000" width="138.834365" height="169.304615" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(851.579062,78.800000) scale(1.000000)"
transform="translate(851.212510,78.800000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">storage</text>
@ -143,25 +143,25 @@
<g>
<rect x="938.089440" y="524.754872" width="43.980708" height="79.245128" style="fill: rgb(23, 148, 78);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="937.944358" y="524.754872" width="44.102517" height="79.245128" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(946.089440,540.354872) scale(0.161925)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
transform="translate(945.944358,540.354872) scale(0.162630)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">types/converter.go</text>
</g>
<g>
<rect x="741.190826" y="270.029405" width="45.936135" height="31.824322" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="740.595155" y="270.029405" width="46.067060" height="31.824322" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(749.190826,285.629405) scale(0.346483)"
transform="translate(748.595155,285.629405) scale(0.347998)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">action.go</text>
@ -169,18 +169,18 @@
<g>
<rect x="795.126961" y="314.278651" width="22.339076" height="27.399397" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="794.662215" y="314.278651" width="22.412721" height="27.399397" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="389.568715" y="84.800000" width="244.739197" height="256.878049" style="fill: rgb(2, 111, 59);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="388.119512" y="84.800000" width="245.352699" height="256.878049" style="fill: rgb(1, 109, 57);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(397.568715,100.400000) scale(1.000000)"
transform="translate(396.119512,100.400000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">anonymity.go</text>
@ -188,18 +188,18 @@
<g>
<rect x="825.466037" y="314.278651" width="2.113025" height="27.399397" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="825.074936" y="314.278651" width="2.137574" height="27.399397" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="795.126961" y="270.029405" width="32.452101" height="36.249247" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="794.662215" y="270.029405" width="32.550295" height="36.249247" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(803.126961,285.629405) scale(0.244823)"
transform="translate(802.662215,285.629405) scale(0.246284)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">head.go</text>
@ -207,12 +207,12 @@
<g>
<rect x="642.307912" y="270.029405" width="90.882914" height="71.648644" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="641.472211" y="270.029405" width="91.122944" height="71.648644" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(650.307912,285.629405) scale(0.371443)"
transform="translate(649.472211,285.629405) scale(0.372634)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">logger/log_builder.go</text>
@ -220,12 +220,12 @@
<g>
<rect x="642.307912" y="84.800000" width="185.271150" height="177.229405" style="fill: rgb(8, 123, 65);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="641.472211" y="84.800000" width="185.740299" height="177.229405" style="fill: rgb(8, 123, 65);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(650.307912,100.400000) scale(1.000000)"
transform="translate(649.472211,100.400000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">queue</text>
@ -233,12 +233,12 @@
<g>
<rect x="741.190826" y="309.853727" width="45.936135" height="31.824322" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="740.595155" y="309.853727" width="46.067060" height="31.824322" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(749.190826,325.453727) scale(0.283486)"
transform="translate(748.595155,325.453727) scale(0.284726)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">settings.go</text>
@ -246,12 +246,12 @@
<g>
<rect x="44.000000" y="284.579130" width="236.556290" height="192.778832" style="fill: rgb(2, 111, 59);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="44.000000" y="282.482276" width="235.480910" height="194.096855" style="fill: rgb(2, 111, 59);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(52.000000,300.179130) scale(1.000000)"
transform="translate(52.000000,298.082276) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">asymmetric</text>
@ -259,12 +259,12 @@
<g>
<rect x="288.556290" y="446.477379" width="77.012425" height="75.136939" style="fill: rgb(12, 129, 68);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="287.480910" y="445.443314" width="76.638602" height="75.682695" style="fill: rgb(12, 129, 68);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(296.556290,462.077379) scale(0.907923)"
transform="translate(295.480910,461.043314) scale(0.902360)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">hashing</text>
@ -272,18 +272,18 @@
<g>
<rect x="363.567253" y="529.614318" width="2.001462" height="66.385682" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="362.162030" y="529.126009" width="1.957483" height="66.873991" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="288.556290" y="284.579130" width="77.012425" height="153.898249" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="287.480910" y="282.482276" width="76.638602" height="154.961038" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(296.556290,300.179130) scale(0.397216)"
transform="translate(295.480910,298.082276) scale(0.394783)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">puzzle/puzzle.go</text>
@ -291,12 +291,12 @@
<g>
<rect x="288.556290" y="529.614318" width="67.010963" height="66.385682" style="fill: rgb(16, 136, 71);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="287.480910" y="529.126009" width="66.681119" height="66.873991" style="fill: rgb(16, 136, 71);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(296.556290,545.214318) scale(0.332103)"
transform="translate(295.480910,544.726009) scale(0.329955)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">random/random.go</text>
@ -304,25 +304,25 @@
<g>
<rect x="44.000000" y="84.800000" width="321.568715" height="191.779130" style="fill: rgb(21, 145, 76);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="44.000000" y="84.800000" width="320.119512" height="189.682276" style="fill: rgb(5, 117, 62);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(52.000000,100.400000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">scheme</text>
</g>
<g>
<rect x="44.000000" y="485.357963" width="236.556290" height="110.642037" style="fill: rgb(114, 194, 100);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="44.000000" y="484.579131" width="235.480910" height="111.420869" style="fill: rgb(89, 182, 95);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(52.000000,500.957963) scale(1.000000)"
transform="translate(52.000000,500.179131) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
data-math="N">symmetric</text>
@ -330,12 +330,12 @@
<g>
<rect x="851.579062" y="467.552821" width="47.924751" height="41.202051" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="851.212510" y="467.552821" width="48.071871" height="41.202051" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(859.579062,483.152821) scale(0.415687)"
transform="translate(859.212510,483.152821) scale(0.417602)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">bytes.go</text>
@ -343,30 +343,30 @@
<g>
<rect x="954.107773" y="508.554530" width="19.962376" height="0.200342" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="954.010940" y="508.554530" width="20.035935" height="0.200342" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="907.503813" y="467.552821" width="38.603959" height="16.601026" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="907.284381" y="467.552821" width="38.726559" height="16.601026" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="907.503813" y="492.153846" width="38.603959" height="16.601026" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="907.284381" y="492.153846" width="38.726559" height="16.601026" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="954.107773" y="467.552821" width="19.962376" height="33.001709" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="954.010940" y="467.552821" width="20.035935" height="33.001709" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(962.107773,483.152821) scale(0.024279)"
transform="translate(962.010940,483.152821) scale(0.024730)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">serialize_yaml.go</text>
@ -374,12 +374,12 @@
<g>
<rect x="851.579062" y="371.864615" width="103.301220" height="58.088205" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="851.212510" y="371.864615" width="103.594017" height="58.088205" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(859.579062,387.464615) scale(1.000000)"
transform="translate(859.212510,387.464615) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">logger.go</text>
@ -387,18 +387,18 @@
<g>
<rect x="962.880283" y="371.864615" width="11.189866" height="58.088205" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="962.806527" y="371.864615" width="11.240348" height="58.088205" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="605.531620" y="379.278049" width="142.235064" height="216.721951" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="604.606648" y="379.278049" width="142.599747" height="216.721951" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(613.531620,394.878049) scale(1.000000)"
transform="translate(612.606648,394.878049) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">conn</text>
@ -406,12 +406,12 @@
<g>
<rect x="755.766684" y="379.278049" width="71.812378" height="146.220947" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="755.206394" y="379.278049" width="72.006115" height="146.220947" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(763.766684,394.878049) scale(0.581379)"
transform="translate(763.206394,394.878049) scale(0.583397)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">connkeeper</text>
@ -419,12 +419,12 @@
<g>
<rect x="389.568715" y="379.278049" width="207.962905" height="216.721951" style="fill: rgb(20, 142, 75);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="388.119512" y="379.278049" width="208.487136" height="216.721951" style="fill: rgb(20, 142, 75);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(397.568715,394.878049) scale(1.000000)"
transform="translate(396.119512,394.878049) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
data-math="N">network.go</text>
@ -432,12 +432,12 @@
<g>
<rect x="755.766684" y="533.498996" width="66.824104" height="62.501004" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="755.206394" y="533.498996" width="67.005733" height="62.501004" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(763.766684,549.098996) scale(0.481289)"
transform="translate(763.206394,549.098996) scale(0.483009)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">settings.go</text>
@ -445,12 +445,12 @@
<g>
<rect x="851.579062" y="262.104615" width="55.572580" height="72.160000" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="851.212510" y="262.104615" width="55.739819" height="72.160000" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(859.579062,277.704615) scale(0.687024)"
transform="translate(859.212510,277.704615) scale(0.689927)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">joiner</text>
@ -458,12 +458,12 @@
<g>
<rect x="915.151643" y="262.104615" width="58.918506" height="32.080000" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="914.952329" y="262.104615" width="59.094546" height="32.080000" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(923.151643,277.704615) scale(0.372556)"
transform="translate(922.952329,277.704615) scale(0.374085)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">payload32.go</text>
@ -471,12 +471,12 @@
<g>
<rect x="915.151643" y="302.184615" width="58.918506" height="32.080000" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="914.952329" y="302.184615" width="59.094546" height="32.080000" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(923.151643,317.784615) scale(0.372556)"
transform="translate(922.952329,317.784615) scale(0.374085)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">payload64.go</text>
@ -484,12 +484,12 @@
<g>
<rect x="851.579062" y="546.354872" width="66.584859" height="49.645128" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="851.212510" y="546.354872" width="66.795256" height="49.645128" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(859.579062,561.954872) scale(0.658657)"
transform="translate(859.212510,561.954872) scale(0.661397)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">state.go</text>
@ -497,12 +497,12 @@
<g>
<rect x="851.579062" y="178.580708" width="122.491086" height="45.923907" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="851.212510" y="178.580708" width="122.834365" height="45.923907" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(859.579062,194.180708) scale(0.924402)"
transform="translate(859.212510,194.180708) scale(0.927382)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">cache/lru.go</text>
@ -510,12 +510,12 @@
<g>
<rect x="851.579062" y="84.800000" width="122.491086" height="85.780708" style="fill: rgb(11, 128, 67);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="851.212510" y="84.800000" width="122.834365" height="85.780708" style="fill: rgb(11, 128, 67);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(859.579062,100.400000) scale(1.000000)"
transform="translate(859.212510,100.400000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">database</text>
@ -523,18 +523,18 @@
<g>
<rect x="799.215678" y="252.302567" width="20.363384" height="1.726838" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="798.774062" y="252.302567" width="20.438448" height="1.726838" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="650.307912" y="106.400000" width="140.907766" height="147.629405" style="fill: rgb(10, 126, 67);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="649.472211" y="106.400000" width="141.301851" height="147.629405" style="fill: rgb(10, 126, 67);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(658.307912,122.000000) scale(1.000000)"
transform="translate(657.472211,122.000000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">queue.go</text>
@ -542,12 +542,12 @@
<g>
<rect x="799.215678" y="106.400000" width="20.363384" height="137.902567" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="798.774062" y="106.400000" width="20.438448" height="137.902567" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(807.215678,122.000000) scale(0.041320)"
transform="translate(806.774062,122.000000) scale(0.042031)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">settings.go</text>
@ -555,12 +555,12 @@
<g>
<rect x="143.768814" y="306.179130" width="128.787477" height="61.338261" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="143.337032" y="304.082276" width="128.143878" height="61.872144" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(151.768814,321.779130) scale(1.000000)"
transform="translate(151.337032,319.682276) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">dsa.go</text>
@ -568,12 +568,12 @@
<g>
<rect x="143.768814" y="375.517392" width="82.221527" height="93.840571" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="143.337032" y="373.954420" width="81.797026" height="94.624711" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(151.768814,391.117392) scale(1.000000)"
transform="translate(151.337032,389.554420) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">kem.go</text>
@ -581,12 +581,12 @@
<g>
<rect x="52.000000" y="306.179130" width="83.768814" height="163.178832" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="52.000000" y="304.082276" width="83.337032" height="164.496855" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(60.000000,321.779130) scale(1.000000)"
transform="translate(60.000000,319.682276) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">key.go</text>
@ -594,12 +594,12 @@
<g>
<rect x="233.990341" y="375.517392" width="38.565950" height="93.840571" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="233.134058" y="373.954420" width="38.346852" height="94.624711" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(241.990341,391.117392) scale(0.167901)"
transform="translate(241.134058,389.554420) scale(0.166271)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">map_pubkeys.go</text>
@ -607,12 +607,12 @@
<g>
<rect x="296.556290" y="468.077379" width="31.954562" height="45.536939" style="fill: rgb(23, 148, 78);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="295.480910" y="467.043314" width="31.738138" height="46.082695" style="fill: rgb(23, 148, 78);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(304.556290,483.677379) scale(0.166193)"
transform="translate(303.480910,482.643314) scale(0.163939)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
data-math="N">hashing.go</text>
@ -620,12 +620,12 @@
<g>
<rect x="336.510852" y="468.077379" width="21.057863" height="45.536939" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="335.219048" y="467.043314" width="20.900464" height="46.082695" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(344.510852,483.677379) scale(0.075266)"
transform="translate(343.219048,482.643314) scale(0.072924)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">hmac.go</text>
@ -633,12 +633,12 @@
<g>
<rect x="271.675258" y="106.400000" width="85.893457" height="162.179130" style="fill: rgb(3, 113, 59);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="269.048626" y="106.400000" width="87.070886" height="160.082276" style="fill: rgb(3, 113, 59);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(279.675258,122.000000) scale(1.000000)"
transform="translate(277.048626,122.000000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">layer1</text>
@ -646,25 +646,25 @@
<g>
<rect x="52.000000" y="106.400000" width="211.675258" height="162.179130" style="fill: rgb(40, 157, 82);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="52.000000" y="106.400000" width="209.048626" height="160.082276" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(60.000000,122.000000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">layer2</text>
</g>
<g>
<rect x="198.510443" y="506.957963" width="74.045848" height="49.241310" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="197.821096" y="506.179131" width="73.659814" height="49.741987" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(206.510443,522.557963) scale(1.000000)"
transform="translate(205.821096,521.779131) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">cfb.go</text>
@ -672,31 +672,31 @@
<g>
<rect x="198.510443" y="564.199272" width="74.045848" height="23.800728" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="197.821096" y="563.921118" width="73.659814" height="24.078882" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="136.976057" y="506.957963" width="53.534386" height="81.042037" style="fill: rgb(64, 168, 88);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="136.576236" y="506.179131" width="53.244860" height="81.820869" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(144.976057,522.557963) scale(0.651639)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
transform="translate(144.576236,521.779131) scale(0.646612)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">gcm.go</text>
</g>
<g>
<rect x="52.000000" y="506.957963" width="76.976057" height="81.042037" style="fill: rgb(250, 253, 182);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="52.000000" y="506.179131" width="76.576236" height="81.820869" style="fill: rgb(250, 253, 182);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(60.000000,522.557963) scale(0.423445)"
transform="translate(60.000000,521.779131) scale(0.420668)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
data-math="N">list_ciphers.go</text>
@ -704,12 +704,12 @@
<g>
<rect x="613.531620" y="400.878049" width="126.235064" height="144.439024" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="612.606648" y="400.878049" width="126.599747" height="144.439024" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(621.531620,416.478049) scale(1.000000)"
transform="translate(620.606648,416.478049) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">conn.go</text>
@ -717,12 +717,12 @@
<g>
<rect x="613.531620" y="553.317073" width="119.842918" height="34.682927" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="612.606648" y="553.317073" width="120.190235" height="34.682927" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(621.531620,568.917073) scale(0.983361)"
transform="translate(620.606648,568.917073) scale(0.986650)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">settings.go</text>
@ -730,12 +730,12 @@
<g>
<rect x="763.766684" y="400.878049" width="55.812378" height="84.575561" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="763.206394" y="400.878049" width="56.006115" height="84.575561" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(771.766684,416.478049) scale(0.319009)"
transform="translate(771.206394,416.478049) scale(0.320562)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">connkeeper.go</text>
@ -743,18 +743,18 @@
<g>
<rect x="763.766684" y="493.453609" width="48.722114" height="24.045386" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="763.206394" y="493.453609" width="48.894325" height="24.045386" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="859.579062" y="283.704615" width="39.572580" height="39.898947" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="859.212510" y="283.704615" width="39.739819" height="39.898947" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(867.579062,299.304615) scale(0.223225)"
transform="translate(867.212510,299.304615) scale(0.224809)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">joiner32.go</text>
@ -762,12 +762,12 @@
<g>
<rect x="859.579062" y="106.400000" width="103.628809" height="56.180708" style="fill: rgb(12, 128, 68);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="859.212510" y="106.400000" width="103.963506" height="56.180708" style="fill: rgb(12, 128, 68);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(867.579062,122.000000) scale(0.829818)"
transform="translate(867.212510,122.000000) scale(0.832988)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">database.go</text>
@ -775,12 +775,12 @@
<g>
<rect x="279.675258" y="128.000000" width="69.893457" height="103.402330" style="fill: rgb(4, 115, 61);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="277.048626" y="128.000000" width="71.070886" height="101.740671" style="fill: rgb(4, 115, 61);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(287.675258,143.600000) scale(0.561390)"
transform="translate(285.048626,143.600000) scale(0.573655)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">message.go</text>
@ -788,13 +788,13 @@
<g>
<rect x="279.675258" y="239.402330" width="62.812234" height="21.176801" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="277.048626" y="237.740671" width="63.882624" height="20.741604" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="60.000000" y="128.000000" width="111.905595" height="132.579130" style="fill: rgb(8, 123, 65);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="60.000000" y="128.000000" width="113.293799" height="130.482276" style="fill: rgb(2, 110, 58);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
@ -807,31 +807,31 @@
<g>
<rect x="179.905595" y="128.000000" width="75.769663" height="132.579130" style="fill: rgb(112, 194, 100);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="181.293799" y="128.000000" width="71.754827" height="130.482276" style="fill: rgb(15, 134, 70);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(187.905595,143.600000) scale(0.691779)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
transform="translate(189.293799,143.600000) scale(0.645310)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">symmetric</text>
</g>
<g>
<rect x="68.000000" y="231.694151" width="90.436880" height="20.884979" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="68.000000" y="230.143053" width="91.752020" height="20.339222" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="68.000000" y="149.600000" width="95.905595" height="74.094151" style="fill: rgb(13, 130, 69);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="68.000000" y="149.600000" width="97.293799" height="72.543053" style="fill: rgb(3, 113, 59);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(76.000000,165.200000) scale(0.924833)"
transform="translate(76.000000,165.200000) scale(0.940900)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">scheme.go</text>
@ -839,13 +839,13 @@
<g>
<rect x="187.905595" y="149.600000" width="59.769663" height="100.803069" style="fill: rgb(102, 189, 99);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="189.293799" y="149.600000" width="55.754827" height="98.613895" style="fill: rgb(15, 134, 71);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(195.905595,165.200000) scale(0.506593)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
transform="translate(197.293799,165.200000) scale(0.460125)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">scheme.go</text>
</g>

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB